[SCM] freeplane packaging branch, master, updated. debian/1.1.3-2-52-g4b68a3f
Felix Natter
fnatter at gmx.net
Sat Apr 6 15:27:21 UTC 2013
The following commit has been merged in the master branch:
commit a81507e178f557c3682cdb5c0bb58c12ce635223
Author: Felix Natter <fnatter at gmx.net>
Date: Fri Jan 18 13:37:09 2013 +0100
Imported Upstream version 1.2.20
diff --git a/JOrtho_0.4_freeplane/.classpath b/JOrtho_0.4_freeplane/.classpath
new file mode 100644
index 0000000..4d24f82
--- /dev/null
+++ b/JOrtho_0.4_freeplane/.classpath
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..306ea0e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/.project
@@ -0,0 +1,17 @@
+<?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
new file mode 100644
index 0000000..b61bbd6
--- /dev/null
+++ b/JOrtho_0.4_freeplane/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..2ff1191
--- /dev/null
+++ b/JOrtho_0.4_freeplane/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..f30fa64
--- /dev/null
+++ b/JOrtho_0.4_freeplane/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#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.xml b/JOrtho_0.4_freeplane/build.xml
new file mode 100644
index 0000000..1660b30
--- /dev/null
+++ b/JOrtho_0.4_freeplane/build.xml
@@ -0,0 +1,66 @@
+<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/license.txt b/JOrtho_0.4_freeplane/license.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/JOrtho_0.4_freeplane/license.txt
@@ -0,0 +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.
diff --git a/JOrtho_0.4_freeplane/makejar.jardesc b/JOrtho_0.4_freeplane/makejar.jardesc
new file mode 100644
index 0000000..84b825c
--- /dev/null
+++ b/JOrtho_0.4_freeplane/makejar.jardesc
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+ <jar path="freeplane/lib/jortho.jar"/>
+ <options buildIfNeeded="true" compress="true" descriptionLocation="/JOrtho_0.4_freeplane/makejar.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+ <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+ <selectedProjects/>
+ <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+ <sealing sealJar="false">
+ <packagesToSeal/>
+ <packagesToUnSeal/>
+ </sealing>
+ </manifest>
+ <selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
+ <javaElement handleIdentifier="=JOrtho_0.4_freeplane/src<com.inet.jortho.i18n"/>
+ <javaElement handleIdentifier="=JOrtho_0.4_freeplane/src<com.inet"/>
+ <javaElement handleIdentifier="=JOrtho_0.4_freeplane/src<com.inet.jortho"/>
+ </selectedElements>
+ <fatjar builder="org.eclipse.jdt.ui.plain_jar_builder" launchConfig=""/>
+</jardesc>
diff --git a/JOrtho_0.4_freeplane/src/SampleApplet.java b/JOrtho_0.4_freeplane/src/SampleApplet.java
new file mode 100644
index 0000000..934efdf
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/SampleApplet.java
@@ -0,0 +1,47 @@
+/*
+ * 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 13.12.2007
+ */
+import javax.swing.JApplet;
+import javax.swing.JEditorPane;
+import javax.swing.JTextPane;
+
+import com.inet.jortho.SpellChecker;
+
+public class SampleApplet extends JApplet {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void start() {
+ // Build the test frame for the sample
+ final JEditorPane text = new JTextPane();
+ text.setText("This is a simppler textt with spellingg errors.");
+ add(text);
+ // Load the configuration from the file dictionaries.cnf and
+ // use the english dictionary as default
+ SpellChecker.registerDictionaries(getCodeBase(), "en");
+ // enable the spell checking on the text component with all features
+ SpellChecker.register(text);
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/SampleApplication.java b/JOrtho_0.4_freeplane/src/SampleApplication.java
new file mode 100644
index 0000000..0267e99
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/SampleApplication.java
@@ -0,0 +1,57 @@
+import javax.swing.JEditorPane;
+import javax.swing.JFrame;
+import javax.swing.JTextPane;
+
+import com.inet.jortho.FileUserDictionary;
+import com.inet.jortho.SpellChecker;
+
+/*
+ * 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 13.02.2008
+ */
+public class SampleApplication extends JFrame {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static void main(final String[] args) {
+ new SampleApplication().setVisible(true);
+ }
+
+ private SampleApplication() {
+ // Build the test frame for the sample
+ super("JOrtho Sample");
+ final JEditorPane text = new JTextPane();
+ text.setText("This is a simppler textt with spellingg errors.");
+ add(text);
+ setSize(200, 160);
+ setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+ setLocationRelativeTo(null);
+ // Create user dictionary in the current working directory of your application
+ SpellChecker.setUserDictionaryProvider(new FileUserDictionary());
+ // Load the configuration from the file dictionaries.cnf and
+ // use the current locale or the first language as default
+ SpellChecker.registerDictionaries(null, null);
+ // enable the spell checking on the text component with all features
+ SpellChecker.register(text);
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/AutoSpellChecker.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/AutoSpellChecker.java
new file mode 100644
index 0000000..e21851f
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/AutoSpellChecker.java
@@ -0,0 +1,257 @@
+/*
+ * 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 05.11.2005
+ */
+package com.inet.jortho;
+
+import java.awt.EventQueue;
+import java.util.Locale;
+
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Highlighter.Highlight;
+
+/**
+ * This class check a <code>JTextComponent</code> automatically (in the background) for orthography. Spell error are
+ * highlighted with a red zigzag line.
+ *
+ * @author Volker Berlin
+ */
+class AutoSpellChecker implements DocumentListener, LanguageChangeListener {
+ private static final RedZigZagPainter painter = new RedZigZagPainter();
+
+ /**
+ * Remove the AutoSpellChecker from the given JTextComponent.
+ *
+ * @param text
+ * the JTextComponent
+ */
+ static void disable(final JTextComponent text) {
+ final AbstractDocument doc = (AbstractDocument) text.getDocument();
+ for (final DocumentListener listener : doc.getDocumentListeners()) {
+ if (listener instanceof AutoSpellChecker) {
+ final AutoSpellChecker autoSpell = (AutoSpellChecker) listener;
+ doc.removeDocumentListener(autoSpell);
+ AutoSpellChecker.removeHighlights(text);
+ }
+ }
+ }
+
+ /**
+ * Refresh the highlighting. This can be useful if the dictionary was modify.
+ *
+ * @param text
+ * the JTextComponent
+ */
+ static void refresh(final JTextComponent text) {
+ final AbstractDocument doc = (AbstractDocument) text.getDocument();
+ for (final DocumentListener listener : doc.getDocumentListeners()) {
+ if (listener instanceof AutoSpellChecker) {
+ final AutoSpellChecker autoSpell = (AutoSpellChecker) listener;
+ autoSpell.checkAll();
+ }
+ }
+ }
+
+ private static void removeHighlights(final JTextComponent text) {
+ final Highlighter highlighter = text.getHighlighter();
+ for (final Highlight highlight : highlighter.getHighlights()) {
+ if (highlight.getPainter() == painter) {
+ highlighter.removeHighlight(highlight);
+ }
+ }
+ }
+
+ private Dictionary dictionary;
+ private final JTextComponent jText;
+ private Locale locale;
+ private final SpellCheckerOptions options;
+
+ public AutoSpellChecker(final JTextComponent text, final SpellCheckerOptions options) {
+ jText = text;
+ this.options = options == null ? SpellChecker.getOptions() : options;
+ jText.getDocument().addDocumentListener(this);
+ SpellChecker.addLanguageChangeLister(this);
+ dictionary = SpellChecker.getCurrentDictionary();
+ locale = SpellChecker.getCurrentLocale();
+ checkAll();
+ }
+
+ /*====================================================================
+ *
+ * Methods of interface DocumentListener
+ *
+ *===================================================================*/
+ /**
+ * {@inheritDoc}
+ */
+ public void changedUpdate(final DocumentEvent ev) {
+ //Nothing
+ }
+
+ /**
+ // * Check the completely text. Because this can consume many times with large Documents that this will do in a thread
+ * in the background step by step.
+ */
+ private void checkAll() {
+ if (jText == null) {
+ //the needed objects does not exists
+ return;
+ }
+ if (dictionary == null) {
+ AutoSpellChecker.removeHighlights(jText);
+ return;
+ }
+ final Thread thread = new Thread(new Runnable() {
+ public void run() {
+ final Document document = jText.getDocument();
+ for (int i = 0; i < document.getLength();) {
+ try {
+ final Element element = ((AbstractDocument) document).getParagraphElement(i);
+ i = element.getEndOffset();
+ checkElement(element);
+ }
+ catch (final java.lang.Exception ex) {
+ return;
+ }
+ }
+ }
+ }, "JOrtho checkall");
+ thread.setPriority(Thread.NORM_PRIORITY - 1);
+ thread.setDaemon(true);
+ thread.start();
+ }
+
+ /**
+ * Check the spelling of the text of an element.
+ *
+ * @param element
+ * the to checking Element
+ */
+ private void checkElement(final javax.swing.text.Element element) {
+ try {
+ if(! EventQueue.isDispatchThread()){
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ checkElement(element);
+ return;
+ }
+ });
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ final int i = element.getStartOffset();
+ final int l = ((AbstractDocument) jText.getDocument()).getLength();
+ final int j = Math.min(element.getEndOffset(), l);
+ if (i >= j) {
+ return;
+ }
+ // prevent a NPE if the dictionary is currently not loaded.
+ final Dictionary dic = dictionary;
+ final Locale loc = locale;
+ if (dic == null || loc == null) {
+ return;
+ }
+ final Tokenizer tok = new Tokenizer(jText, dic, loc, i, j, options);
+ String word;
+ final Highlighter highlighter = jText.getHighlighter();
+ while ((word = tok.nextInvalidWord()) != null) {
+ final int wordOffset = tok.getWordOffset();
+ highlighter.addHighlight(wordOffset, wordOffset + word.length(), painter);
+ }
+ }
+ catch (final BadLocationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void removeHighlighters(final javax.swing.text.Element element) {
+ {
+ final int i = element.getStartOffset();
+ final int j = element.getEndOffset();
+ final Highlighter highlighter = jText.getHighlighter();
+ final Highlight[] highlights = highlighter.getHighlights();
+ for (int k = highlights.length; --k >= 0;) {
+ final Highlight highlight = highlights[k];
+ final int hlStartOffset = highlight.getStartOffset();
+ final int hlEndOffset = highlight.getEndOffset();
+ if ((i <= hlStartOffset && hlStartOffset <= j) || (i <= hlEndOffset && hlEndOffset <= j)) {
+ if (highlight.getPainter() == painter) {
+ highlighter.removeHighlight(highlight);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Check the Elements on the given position.
+ */
+ private void checkElements(int offset, final int length) {
+ final int end = offset + length;
+ final Document document = jText.getDocument();
+ Element element;
+ do {
+ try {
+ // We need to use a ParagraphElement because a CharacterElement produce problems with formating in a word
+ element = ((AbstractDocument) document).getParagraphElement(offset);
+ }
+ catch (final java.lang.Exception ex) {
+ return;
+ }
+ removeHighlighters(element);
+ checkElement(element);
+ offset = element.getEndOffset();
+ } while (offset <= end && offset < document.getLength());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void insertUpdate(final DocumentEvent ev) {
+ checkElements(ev.getOffset(), ev.getLength());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void languageChanged(final LanguageChangeEvent ev) {
+ dictionary = SpellChecker.getCurrentDictionary();
+ locale = SpellChecker.getCurrentLocale();
+ checkAll();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void removeUpdate(final DocumentEvent ev) {
+ checkElements(ev.getOffset(), 0);
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerListener.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerListener.java
new file mode 100644
index 0000000..4d1206f
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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 (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/CheckerMenu.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerMenu.java
new file mode 100644
index 0000000..2dbd74c
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerMenu.java
@@ -0,0 +1,60 @@
+/*
+ * 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 07.11.2005
+ */
+package com.inet.jortho;
+
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+
+/**
+ * @author Volker Berlin
+ */
+class CheckerMenu extends JMenu implements HierarchyListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final CheckerListener listener;
+
+ CheckerMenu(final SpellCheckerOptions options) {
+ super(Utils.getResource("spelling"));
+ listener = new CheckerListener(this, options);
+ super.addHierarchyListener(this);
+ }
+
+ public void hierarchyChanged(final HierarchyEvent ev) {
+ // If this sub menu is added to a parent
+ // then an Listener is added to request show popup events of the parent
+ if (ev.getChangeFlags() == HierarchyEvent.PARENT_CHANGED && ev.getChanged() == this) {
+ final JPopupMenu parent = (JPopupMenu) getParent();
+ if (parent != null) {
+ parent.addPopupMenuListener(listener);
+ }
+ else {
+ ((JPopupMenu) ev.getChangedParent()).removePopupMenuListener(listener);
+ }
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerPopup.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerPopup.java
new file mode 100644
index 0000000..b0d61a9
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerPopup.java
@@ -0,0 +1,40 @@
+/*
+ * 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 07.11.2005
+ */
+package com.inet.jortho;
+
+import javax.swing.JPopupMenu;
+
+/**
+ * @author Volker Berlin
+ */
+class CheckerPopup extends JPopupMenu {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ CheckerPopup(final SpellCheckerOptions options) {
+ final CheckerListener listener = new CheckerListener(this, options);
+ super.addPopupMenuListener(listener);
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Dictionary.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/Dictionary.java
new file mode 100644
index 0000000..5aacb82
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/Dictionary.java
@@ -0,0 +1,238 @@
+/*
+ * 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 02.11.2005
+ */
+package com.inet.jortho;
+
+import java.io.BufferedInputStream;
+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.zip.Deflater;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
+
+/**
+ * A container for a word list.
+ * @author Volker Berlin
+ */
+final class Dictionary extends DictionaryBase {
+ /**
+ * Create an empty Dictionary.
+ */
+ public Dictionary() {
+ tree = new char[10000];
+ tree[size++] = LAST_CHAR;
+ }
+
+ /**
+ * Create an Dictionary from a serialize Dictionary. This is used from the DictionaryFactory.
+ * @see #toArray()
+ * @see DictionaryFactory
+ */
+ public Dictionary(final char[] tree) {
+ super(tree);
+ }
+
+ /**
+ * Add a word to the tree. If it already exist then it has no effect.
+ * @param word the new word.
+ */
+ public void add(final String word) {
+ idx = 0;
+ for (int i = 0; i < word.length(); i++) {
+ final char c = word.charAt(i);
+ searchCharOrAdd(c);
+ if (i == word.length() - 1) {
+ tree[idx + 1] |= 0x8000;
+ return;
+ }
+ final int nextIdx = readIndex();
+ if (nextIdx == 0) {
+ idx = createNewNode();
+ }
+ else {
+ idx = nextIdx;
+ }
+ }
+ }
+
+ /**
+ * Check the size of the array and resize it if needed.
+ * @param newSize the requied size
+ */
+ private final void checkSize(final int newSize) {
+ if (newSize > tree.length) {
+ final char[] puffer = new char[Math.max(newSize, 2 * tree.length)];
+ System.arraycopy(tree, 0, puffer, 0, size);
+ tree = puffer;
+ }
+ }
+
+ /**
+ * Create a new node at end of the array.
+ * On the current idx position is writing the pointer.
+ * The pointer on the current idx position must be 0 without some word end flags (0x8000 on idx+1)
+ * @return Pointer on new node.
+ */
+ private final int createNewNode() {
+ checkSize(size + 1);
+ tree[idx + 1] |= (char) (size >> 16);
+ tree[idx + 2] |= (char) (size);
+ idx = size;
+ tree[idx] = LAST_CHAR;
+ size += 1;
+ return idx;
+ }
+
+ /**
+ * Get the size of chars that this dictionary need in memory.
+ */
+ public int getDataSize() {
+ return size;
+ }
+
+ private void insertChar(final char c) {
+ checkSize(size + 3);
+ System.arraycopy(tree, idx, tree, idx + 3, size - idx);
+ tree[idx] = c;
+ tree[idx + 1] = 0;
+ tree[idx + 2] = 0;
+ size += 3;
+ for (int i = 0; i < size;) {
+ if (tree[i] == LAST_CHAR) {
+ i++;
+ }
+ else {
+ int index = (tree[i + 1] << 16) + tree[i + 2];
+ final int indexValue = index & 0x7fffffff;
+ if (indexValue > idx) {
+ index += 3;
+ tree[i + 1] = (char) (index >> 16);
+ tree[i + 2] = (char) (index);
+ }
+ i += 3;
+ }
+ }
+ }
+
+ /**
+ * Load the directory from a compressed stream.
+ * @param stream the InputStream
+ * @throws IOException if an I/O error occurs.
+ */
+ public void load(final InputStream stream) throws IOException {
+ InputStream zip = new InflaterInputStream(stream);
+ zip = new BufferedInputStream(zip);
+ size = 0;
+ while (zip.available() > 0) {
+ final char c = (char) (zip.read() + (zip.read() << 8));
+ checkSize(size + 1);
+ tree[size++] = c;
+ }
+ zip.close();
+ // Shrinken
+ trimToSize();
+ }
+
+ /**
+ * Load the directory from a compressed file.
+ * @param filename the name of the file.
+ * @throws IOException if an I/O error occurs.
+ */
+ public void load(final String filename) throws IOException {
+ final FileInputStream fos = new FileInputStream(filename);
+ load(fos);
+ }
+
+ /**
+ * Save this dictionary to the OutputStream. The data will be compressed. After finish the OutputStream is closed.
+ * @param stream the OutputStream
+ * @throws IOException if an I/O error occurs.
+ */
+ public void save(final OutputStream stream) throws IOException {
+ final Deflater deflater = new Deflater();
+ deflater.setLevel(Deflater.BEST_COMPRESSION);
+ final DeflaterOutputStream zip = new DeflaterOutputStream(stream, deflater);
+ for (int i = 0; i < size; i++) {
+ zip.write(tree[i]);
+ zip.write(tree[i] >> 8);
+ }
+ zip.flush();
+ zip.close();
+ }
+
+ /**
+ * Save this dictionary to a compressed file.
+ * @param filename the name of the file.
+ * @return the size in bytes that was needed.
+ * @throws IOException if an I/O error occurs.
+ */
+ public long save(final String filename) throws IOException {
+ // Daten komprimieren und speichern
+ final File file = new File(filename);
+ final FileOutputStream fos = new FileOutputStream(file);
+ save(fos);
+ return file.length();
+ }
+
+ private void searchCharOrAdd(final char c) {
+ if (c == LAST_CHAR) {
+ throw new RuntimeException("Invalid Character");
+ }
+ while (idx < size && tree[idx] < c) {
+ idx += 3;
+ }
+ if (idx >= size) {
+ throw new RuntimeException("Internal Error");
+ }
+ if (tree[idx] == c) {
+ return;
+ }
+ insertChar(c);
+ return;
+ }
+
+ /**
+ * Convert the directory tree to char array.
+ * @return a char array that include the data of the dictionary.
+ */
+ public char[] toArray() {
+ final char[] puffer = new char[size];
+ System.arraycopy(tree, 0, puffer, 0, size);
+ return puffer;
+ }
+
+ /**
+ * Trims the capacity of this <tt>Dictionary</tt> instance to be the
+ * current size. An application can use this operation to minimize
+ * the storage of an <tt>Dictionary</tt> instance.
+ * The load methods already call it.
+ */
+ void trimToSize() {
+ final char[] temp = new char[size];
+ System.arraycopy(tree, 0, temp, 0, size);
+ tree = temp;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryBase.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryBase.java
new file mode 100644
index 0000000..393c81e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryBase.java
@@ -0,0 +1,256 @@
+/*
+ * 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 02.11.2005
+ */
+package com.inet.jortho;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Volker Berlin
+ */
+abstract class DictionaryBase {
+ protected static final char LAST_CHAR = 0xFFFF;
+ protected int idx;
+ protected int size;
+ protected char[] tree;
+
+ /**
+ * Empty Constructor.
+ */
+ protected DictionaryBase() {
+ /* empty */
+ }
+
+ DictionaryBase(final char[] tree) {
+ this.tree = tree;
+ size = tree.length;
+ }
+
+ /**
+ * Returns an int that describe the dissimilarity of the characters.
+ * The value is ever larger 0. A value of means only a small difference.
+ * @param a first char
+ * @param b second char
+ * @return the dissimilarity
+ */
+ private int charDiff(char a, char b) {
+ a = Character.toLowerCase(a);
+ b = Character.toLowerCase(b);
+ if (a == b) {
+ return 1;
+ }
+ if (Character.getType(a) != Character.getType(b)) {
+ return 6;
+ }
+ return 5;
+ }
+
+ /**
+ * Check if the word exist in this dictinary.
+ * @param word the word to check. Can't be null.
+ * @return true if the word exist.
+ */
+ public boolean exist(final String word) {
+ idx = 0;
+ for (int i = 0; i < word.length(); i++) {
+ final char c = word.charAt(i);
+ while (idx < size && tree[idx] < c) {
+ idx += 3;
+ }
+ if ((idx >= size || tree[idx] != c)) {
+ return false;
+ }
+ if (i == word.length() - 1 && isWordMatch()) {
+ return true;
+ }
+ idx = readIndex();
+ if (idx <= 0) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if on the current item position a word ends.
+ */
+ private boolean isWordMatch() {
+ return (tree[idx + 1] & 0x8000) > 0;
+ }
+
+ /**
+ * Read the offset in the tree of the next character.
+ */
+ final int readIndex() {
+ return ((tree[idx + 1] & 0x7fff) << 16) + tree[idx + 2];
+ }
+
+ /**
+ * Search if the character exist in the current node. If found then the variable <code>idx</code> point to the location.
+ * If not found then it point on the next character (char value) item in the node.
+ * @param c the searching character
+ * @return true if found
+ */
+ private boolean searchChar(final char c) {
+ while (idx < size && tree[idx] < c) {
+ idx += 3;
+ }
+ if ((idx >= size || tree[idx] != c)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns a list of suggestions if the word is not in the dictionary.
+ * @param word the wrong spelled word. Can't be null.
+ * @return a list of class Suggestion.
+ * @see Suggestion
+ */
+ public List<Suggestion> searchSuggestions(final String word) {
+ if (word.length() == 0 || exist(word)) {
+ return new ArrayList<Suggestion>();
+ }
+ final Suggestions suggesions = new Suggestions(Math.min(20, 4 + word.length()));
+ idx = 0;
+ searchSuggestions(suggesions, word, 0, 0, 0);
+ final List<Suggestion> list = suggesions.getlist();
+ Collections.sort(list);
+ return list;
+ }
+
+ /**
+ * Es wird nach verschiedenen Regeln nach aehnlichen Woertern gesucht.
+ * Je nach Regel gibt es einen anderen diff. Jekleiner der diff desto aehnlicher.
+ * Diese Methode ruft sich rekursiv auf.
+ * @param list Kontainer fuer die gefundenen Woerter
+ * @param chars bis zur charPosition bereits gemappte Buchstaben, danach noch zu mappende des orignal Wortes
+ * @param charPosition Zeichenposition im char array
+ * @param lastIdx Position im Suchindex der zur aktuellen Zeichenposition zeigt.
+ * @param diff Die Unaehnlichkeit bis zur aktuellen Zeichenposition
+ */
+ private void searchSuggestions(final Suggestions list, final CharSequence chars, final int charPosition,
+ final int lastIdx, final int diff) {
+ if (diff > list.getMaxDissimilarity()) {
+ return;
+ }
+ // First with the correct letters to go on
+ idx = lastIdx;
+ char currentChar = chars.charAt(charPosition);
+ if (searchChar(currentChar)) {
+ if (isWordMatch()) {
+ if (charPosition + 1 == chars.length()) {
+ // exact match at this character position
+ list.add(new Suggestion(chars, diff));
+ }
+ else {
+ // a shorter match, we need to cut the string
+ final int length = charPosition + 1;
+ final CharSequence chars2 = chars.subSequence(0, length);
+ list.add(new Suggestion(chars2, diff + (chars.length() - length) * 5));
+ }
+ }
+ idx = readIndex();
+ if (idx <= 0) {
+ // no more characters in the tree
+ return;
+ }
+ if (charPosition + 1 == chars.length()) {
+ searchSuggestionsLonger(list, chars, chars.length(), idx, diff + 5);
+ return;
+ }
+ searchSuggestions(list, chars, charPosition + 1, idx, diff);
+ }
+ // transposed letters and additional letter
+ if (charPosition + 1 < chars.length()) {
+ idx = lastIdx;
+ currentChar = chars.charAt(charPosition + 1);
+ if (searchChar(currentChar)) {
+ final int tempIdx = idx;
+ //transposed letters (German - Buchstabendreher)
+ idx = readIndex();
+ if (idx > 0) {
+ final StringBuilder buffer = new StringBuilder(chars);
+ buffer.setCharAt(charPosition + 1, chars.charAt(charPosition));
+ buffer.setCharAt(charPosition, currentChar);
+ searchSuggestions(list, buffer, charPosition + 1, idx, diff + 3);
+ }
+ // Additional character in the misspelled word
+ idx = tempIdx;
+ final StringBuilder buffer = new StringBuilder();
+ buffer.append(chars, 0, charPosition);
+ buffer.append(chars, charPosition + 1, chars.length());
+ searchSuggestions(list, buffer, charPosition, lastIdx, diff + 5);
+ }
+ }
+ // Missing letters, we need to add one character
+ {
+ int tempIdx = idx = lastIdx;
+ while (idx < size && tree[idx] < LAST_CHAR) {
+ final char newChar = tree[idx];
+ idx = readIndex();
+ if (idx > 0 && newChar != currentChar) {
+ final StringBuilder buffer = new StringBuilder(chars);
+ buffer.insert(charPosition, newChar);
+ searchSuggestions(list, buffer, charPosition + 1, idx, diff + 5);
+ }
+ idx = tempIdx += 3;
+ }
+ }
+ // Typos - wrong letters (One character is replaced with any character)
+ if (charPosition < chars.length()) {
+ currentChar = chars.charAt(charPosition);
+ int tempIdx = idx = lastIdx;
+ while (idx < size && tree[idx] < LAST_CHAR) {
+ if (isWordMatch()) {
+ final StringBuilder buffer = new StringBuilder();
+ buffer.append(chars, 0, charPosition);
+ buffer.append(tree[idx]);
+ list.add(new Suggestion(buffer, diff + 5 + (chars.length() - buffer.length()) * 5));
+ }
+ if (charPosition + 1 < chars.length()) {
+ final char newChar = tree[idx];
+ idx = readIndex();
+ if (idx > 0 && newChar != currentChar) {
+ final StringBuilder buffer = new StringBuilder(chars);
+ buffer.setCharAt(charPosition, newChar);
+ searchSuggestions(list, buffer, charPosition + 1, idx, diff + charDiff(currentChar, newChar));
+ }
+ }
+ idx = tempIdx += 3;
+ }
+ }
+ }
+
+ private void searchSuggestionsLonger(final Suggestions list, final CharSequence chars, final int originalLength,
+ final int lastIdx, final int diff) {
+ idx = lastIdx;
+ while (idx < size && tree[idx] < LAST_CHAR) {
+ if (isWordMatch()) {
+ list.add(new Suggestion(chars.toString() + tree[idx], diff));
+ }
+ idx += 3;
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryEditDialog.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryEditDialog.java
new file mode 100644
index 0000000..f1492ba
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryEditDialog.java
@@ -0,0 +1,187 @@
+/*
+ * 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 24.12.2007
+ */
+package com.inet.jortho;
+
+import java.awt.Container;
+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.KeyEvent;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+
+import javax.swing.AbstractAction;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JList;
+import javax.swing.JScrollPane;
+import javax.swing.KeyStroke;
+import javax.swing.ListModel;
+import javax.swing.WindowConstants;
+
+/**
+ * Implements edit dialog for the user dictionary.
+ * @author Volker Berlin
+ */
+class DictionaryEditDialog extends JDialog {
+ private class DeleteAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Delete the selected entries. The "Delete" Button it the only Listener.
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final int[] selected = list.getSelectedIndices();
+ Arrays.sort(selected);
+ for (int i = selected.length - 1; i >= 0; i--) {
+ ((DefaultListModel) list.getModel()).remove(selected[i]);
+ isModify = true;
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final JButton delete;
+ private boolean isModify;
+ private final JList list;
+
+ DictionaryEditDialog(final JDialog parent) {
+ super(parent, Utils.getResource("userDictionary"), true);
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ final Container content = getContentPane();
+ content.setLayout(new GridBagLayout());
+ final DefaultListModel data = new DefaultListModel();
+ loadWordList(data);
+ list = new JList(data);
+ content.add(new JScrollPane(list), new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH,
+ GridBagConstraints.BOTH, new Insets(8, 8, 8, 8), 0, 0));
+ delete = new JButton(Utils.getResource("delete"));
+ content.add(delete, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH,
+ GridBagConstraints.BOTH, new Insets(0, 8, 8, 8), 0, 0));
+ final DeleteAction deleteAction = new DeleteAction();
+ delete.addActionListener(deleteAction);
+ // DELETE Key
+ getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+ KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), "DELETE");
+ getRootPane().getActionMap().put("DELETE", deleteAction);
+ //ESCAPE Key
+ getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+ KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "ESCAPE");
+ getRootPane().getActionMap().put("ESCAPE", new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ dispose();
+ }
+ });
+ pack();
+ setLocationRelativeTo(parent);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (isModify) {
+ final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
+ if (provider != null) {
+ final ListModel model = list.getModel();
+ final StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < model.getSize(); i++) {
+ if (builder.length() != 0) {
+ builder.append('\n');
+ }
+ builder.append(model.getElementAt(i));
+ }
+ provider.setUserWords(builder.toString());
+ }
+ }
+ }
+
+ /**
+ * A hack for the layout manger to prevent that the dialog is to small to show the title line. The problem occur
+ * only if there are small words in the list. With a empty list there are no problems.
+ */
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension dim = super.getPreferredSize();
+ final String title = getTitle();
+ final int titleWidth = getFontMetrics(getFont()).stringWidth(title) + 80;
+ if (dim.width < titleWidth) {
+ dim.width = titleWidth;
+ }
+ return dim;
+ }
+
+ /**
+ * Load all words from the user dictionary if available
+ * @param data
+ */
+ private void loadWordList(final DefaultListModel data) {
+ try {
+ final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
+ if (provider != null) {
+ final String userWords = provider.getUserWords(SpellChecker.getCurrentLocale());
+ if (userWords != null) {
+ final BufferedReader input = new BufferedReader(new StringReader(userWords));
+ final ArrayList<String> wordList = new ArrayList<String>();
+ String word = input.readLine();
+ while (word != null) {
+ if (word.length() > 1) {
+ wordList.add(word);
+ }
+ word = input.readLine();
+ }
+ // Liste alphabetical sorting with the user language
+ Collections.sort(wordList, Collator.getInstance());
+ for (final String str : wordList) {
+ data.addElement(str);
+ }
+ }
+ }
+ }
+ catch (final IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryFactory.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryFactory.java
new file mode 100644
index 0000000..454cf9d
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryFactory.java
@@ -0,0 +1,243 @@
+/*
+ * 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 15.06.2007
+ */
+package com.inet.jortho;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.zip.InflaterInputStream;
+
+/**
+ * With the DictionaryFactory you can create / load a Dictionary. A Dictionary is list of word with a API for searching.
+ * The list is saved internal as a tree.
+ * @see Dictionary
+ * @author Volker Berlin
+ */
+class DictionaryFactory {
+ /**
+ * A node in the search tree. Every Node can include a list of NodeEnties
+ */
+ private final static class Node extends ArrayList<NodeEntry> {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ Node() {
+ super(1);
+ }
+
+ int save(final DictionaryFactory factory) {
+ int idx;
+ final int start = idx = factory.size;
+ //reserve the needed memory
+ final int newSize = factory.size + size() * 3 + 1;
+ factory.checkSize(newSize);
+ factory.size = newSize;
+ for (int i = 0; i < size(); i++) {
+ final NodeEntry entry = get(i);
+ factory.tree[idx++] = entry.c;
+ final Node nextNode = entry.nextNode;
+ int offset = 0;
+ if (nextNode != null) {
+ offset = nextNode.save(factory);
+ }
+ if (entry.isWord) {
+ offset |= 0x80000000;
+ }
+ factory.tree[idx++] = (char) (offset >> 16);
+ factory.tree[idx++] = (char) (offset);
+ }
+ factory.tree[idx] = DictionaryBase.LAST_CHAR;
+ return start;
+ }
+
+ NodeEntry searchCharOrAdd(final char c) {
+ for (int i = 0; i < size(); i++) {
+ NodeEntry entry = get(i);
+ if (entry.c < c) {
+ continue;
+ }
+ if (entry.c == c) {
+ return entry;
+ }
+ entry = new NodeEntry(c);
+ add(i, entry);
+ trimToSize(); //reduce the memory consume, there is a very large count of this Nodes.
+ return entry;
+ }
+ final NodeEntry entry = new NodeEntry(c);
+ add(entry);
+ trimToSize(); //reduce the memory consume, there is a very large count of this Nodes.
+ return entry;
+ }
+ }
+
+ /**
+ * Descript a single charchter in the Dictionary tree.
+ */
+ private final static class NodeEntry {
+ final char c;
+ boolean isWord;
+ Node nextNode;
+
+ NodeEntry(final char c) {
+ this.c = c;
+ }
+
+ /**
+ * Create a new Node and set it as nextNode
+ * @return the nextNode
+ */
+ Node createNewNode() {
+ return nextNode = new Node();
+ }
+ }
+
+ private final Node root = new Node();
+ private int size;
+ private char[] tree;
+
+ /**
+ * Empty Constructor.
+ */
+ public DictionaryFactory() {
+ /* empty */
+ }
+
+ /**
+ * Add a word to the tree. If it already exist then it has no effect.
+ * @param word the new word.
+ */
+ public void add(final String word) {
+ Node node = root;
+ for (int i = 0; i < word.length(); i++) {
+ final char c = word.charAt(i);
+ final NodeEntry entry = node.searchCharOrAdd(c);
+ if (i == word.length() - 1) {
+ entry.isWord = true;
+ return;
+ }
+ final Node nextNode = entry.nextNode;
+ if (nextNode == null) {
+ node = entry.createNewNode();
+ }
+ else {
+ node = nextNode;
+ }
+ }
+ }
+
+ /**
+ * Check the size of the array and resize it if needed.
+ * @param newSize the requied size
+ */
+ final void checkSize(final int newSize) {
+ if (newSize > tree.length) {
+ final char[] puffer = new char[Math.max(newSize, 2 * tree.length)];
+ System.arraycopy(tree, 0, puffer, 0, size);
+ tree = puffer;
+ }
+ }
+
+ /**
+ * Create from the data in this factory a Dictionary object. If there
+ * are no word added then the Dictionary is empty. The Dictionary need fewer memory as the DictionaryFactory.
+ * @return a Dictionary object.
+ */
+ public Dictionary create() {
+ tree = new char[10000];
+ root.save(this);
+ //shrink the array
+ final char[] temp = new char[size];
+ System.arraycopy(tree, 0, temp, 0, size);
+ tree = temp;
+ return new Dictionary(tree);
+ }
+
+ /**
+ * Load the directory from plain a list of words. The words must be delimmited with newlines. This method can be
+ * called multiple times.
+ *
+ * @param stream
+ * a InputStream with words
+ * @param charsetName
+ * the name of a codepage for example "UTF8" or "Cp1252"
+ * @throws IOException
+ * If an I/O error occurs.
+ * @throws NullPointerException
+ * If stream or charsetName is null.
+ */
+ public void loadPlainWordList(final InputStream stream, final String charsetName) throws IOException {
+ final Reader reader = new InputStreamReader(stream, charsetName);
+ loadPlainWordList(reader);
+ }
+
+ /**
+ * Load the directory from plain a list of words. The words must be delimmited with newlines. This method can be
+ * called multiple times.
+ *
+ * @param reader
+ * a Reader with words
+ * @throws IOException
+ * If an I/O error occurs.
+ * @throws NullPointerException
+ * If reader is null.
+ */
+ public void loadPlainWordList(final Reader reader) throws IOException {
+ final BufferedReader input = new BufferedReader(reader);
+ String word = input.readLine();
+ while (word != null) {
+ if (word.length() > 1) {
+ add(word);
+ }
+ word = input.readLine();
+ }
+ }
+
+ /**
+ * Load the directory from a compressed list of words with UTF8 encoding. The words must be delimmited with
+ * newlines. This method can be called multiple times.
+ *
+ * @param filename
+ * the name of the file
+ * @throws IOException
+ * If an I/O error occurs.
+ * @throws NullPointerException
+ * If filename is null.
+ */
+ public void loadWordList(final URL filename) throws IOException {
+ final URLConnection conn = filename.openConnection();
+ conn.setReadTimeout(5000);
+ InputStream input = conn.getInputStream();
+ input = new InflaterInputStream(input);
+ input = new BufferedInputStream(input);
+ loadPlainWordList(input, "UTF8");
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/FileUserDictionary.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/FileUserDictionary.java
new file mode 100644
index 0000000..5ce16cf
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/FileUserDictionary.java
@@ -0,0 +1,123 @@
+/*
+ * 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 23.12.2007
+ */
+package com.inet.jortho;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Locale;
+
+/**
+ * This is a reference implementation of the interface {@link UserDictionaryProvider}.
+ * It save the user dictionaries on the local disk as text files.
+ * @author Volker Berlin
+ */
+public class FileUserDictionary implements UserDictionaryProvider {
+ private File file;
+ private final String fileBase;
+
+ /**
+ * Create a FileUserDictionary with the dictionaries in the root of the current
+ * application.
+ */
+ public FileUserDictionary() {
+ this("");
+ }
+
+ /**
+ * Create a FileUserDictionary with the dictionaries on a specific location.
+ * @param fileBase the base
+ */
+ public FileUserDictionary(String fileBase) {
+ if (fileBase == null) {
+ fileBase = "";
+ }
+ fileBase = fileBase.trim();
+ fileBase = fileBase.replace('\\', '/');
+ if (fileBase.length() > 0 && !fileBase.endsWith("/")) {
+ fileBase += "/";
+ }
+ this.fileBase = fileBase;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addWord(final String word) {
+ try {
+ final FileOutputStream output = new FileOutputStream(file, true);
+ final Writer writer = new OutputStreamWriter(output, "UTF8");
+ if (file.length() > 0) {
+ writer.write("\n");
+ }
+ writer.write(word);
+ writer.close();
+ }
+ catch (final Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getUserWords(final Locale locale) {
+ file = new File(fileBase + "UserDictionary_" + locale + ".txt");
+ try {
+ final FileInputStream input = new FileInputStream(file);
+ final Reader reader = new InputStreamReader(input, "UTF8");
+ final StringBuilder builder = new StringBuilder();
+ final char[] buffer = new char[4096];
+ int count;
+ while ((count = reader.read(buffer)) > 0) {
+ builder.append(buffer, 0, count);
+ }
+ reader.close();
+ return builder.toString();
+ }
+ catch (final IOException ex) {
+ /* ignore FileNotFound */
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setUserWords(final String wordList) {
+ try {
+ final FileOutputStream output = new FileOutputStream(file);
+ final Writer writer = new OutputStreamWriter(output, "UTF8");
+ writer.write(wordList);
+ writer.close();
+ }
+ catch (final Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeEvent.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeEvent.java
new file mode 100644
index 0000000..949d9f8
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeEvent.java
@@ -0,0 +1,64 @@
+/*
+ * 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 06.12.2007
+ */
+package com.inet.jortho;
+
+import java.util.Locale;
+
+/**
+ * This Event is used by <code>LanguageChangeListener</code>.
+ * @see LanguageChangeListener
+ * @author Volker Berlin
+ */
+public class LanguageChangeEvent {
+ private final Locale currentLocale;
+ private final Locale oldLocale;
+
+ /**
+ * Creates a new LanguageChangeEvent
+ * @param currentLocale the new Locale
+ * @param oldLocale the old Locale
+ */
+ public LanguageChangeEvent(final Locale currentLocale, final Locale oldLocale) {
+ this.currentLocale = currentLocale;
+ this.oldLocale = oldLocale;
+ }
+
+ /**
+ * Get the value of the current Locale after firing this Event.
+ * It general it should be equal to {@link SpellChecker#getCurrentLocale()}.
+ * @return the current Locale
+ * @see SpellChecker#getCurrentLocale()
+ */
+ public Locale getCurrentLocale() {
+ return currentLocale;
+ }
+
+ /**
+ * Gets the value of the old Locale before the firing this Event.
+ * @return the old Locale
+ * @see SpellChecker#getCurrentLocale()
+ */
+ public Locale getOldLocale() {
+ return oldLocale;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeListener.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeListener.java
new file mode 100644
index 0000000..44af34d
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeListener.java
@@ -0,0 +1,41 @@
+/*
+ * 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 06.12.2007
+ */
+package com.inet.jortho;
+
+import java.util.EventListener;
+
+/**
+ * A language change event gets fired whenever the language is changed.
+ * You can register a LanguageChangeListener in the class SpellChecker.
+ * @author Volker Berlin
+ * @see SpellChecker#addLanguageChangeLister(LanguageChangeListener)
+ * @see SpellChecker#removeLanguageChangeLister(LanguageChangeListener)
+ */
+public interface LanguageChangeListener extends EventListener {
+ /**
+ * This method gets called when the language is changed.
+ * This occurs if the user selects another language in the languages menu.
+ * @param ev A LanguageChangeEvent object describing the changes.
+ */
+ public void languageChanged(LanguageChangeEvent ev);
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LetterBasedBreakIterator.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/LetterBasedBreakIterator.java
new file mode 100644
index 0000000..90e7bda
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/LetterBasedBreakIterator.java
@@ -0,0 +1,129 @@
+/*
+ * 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 com.inet.jortho;
+
+import java.text.BreakIterator;
+import java.text.CharacterIterator;
+import java.text.StringCharacterIterator;
+
+
+/**
+ * @author Dimitry Polivaev
+ * Aug 14, 2010
+ */
+class LetterBasedBreakIterator {
+
+ private CharacterIterator text;
+
+ public LetterBasedBreakIterator() {
+ }
+
+ /**
+ * Set a new text string to be scanned. The current scan
+ * position is reset to first().
+ * @param newText new text to scan.
+ */
+ public void setText(String newText)
+ {
+ setText(new StringCharacterIterator(newText));
+ }
+
+ /**
+ * Set a new text for scanning. The current scan
+ * position is reset to first().
+ * @param newText new text to scan.
+ */
+ public void setText(CharacterIterator text){
+ this.text = text;
+ }
+
+ /**
+ * Returns the first boundary. The iterator's current position is set
+ * to the first text boundary.
+ * @return The character index of the first text boundary.
+ */
+ public int first() {
+ return nextBoundary(text.first(), false);
+ }
+
+ private int nextBoundary(char c, boolean wasLetter) {
+ for(;;){
+ if(c == CharacterIterator.DONE){
+ return BreakIterator.DONE;
+ }
+ if(wasLetter != isLetter(c)){
+ return text.getIndex();
+ }
+ c = text.next();
+ }
+ }
+
+ /**
+ * Returns the first boundary following the specified character offset. If the
+ * specified offset equals to the last text boundary, it returns
+ * <code>BreakIterator.DONE</code> and the iterator's current position is unchanged.
+ * Otherwise, the iterator's current position is set to the returned boundary.
+ * The value returned is always greater than the offset or the value
+ * <code>BreakIterator.DONE</code>.
+ * @param offset the character offset to begin scanning.
+ * @return The first boundary after the specified offset or
+ * <code>BreakIterator.DONE</code> if the last text boundary is passed in
+ * as the offset.
+ * @exception IllegalArgumentException if the specified offset is less than
+ * the first text boundary or greater than the last text boundary.
+ */
+ public int following(int wordOffset) {
+ if(wordOffset <= text.getBeginIndex()){
+ return first();
+ }
+ if(wordOffset >= text.getEndIndex()){
+ return BreakIterator.DONE;
+ }
+ int lastIndex = text.getIndex();
+ text.setIndex(wordOffset);
+ boolean wasLetter = isLetter(text.current());
+ int nextBoundary = nextBoundary(text.next(), wasLetter);
+ if(nextBoundary == BreakIterator.DONE){
+ text.setIndex(lastIndex);
+ }
+ return nextBoundary;
+ }
+
+ /**
+ * Returns the boundary following the current boundary. If the current boundary
+ * is the last text boundary, it returns <code>BreakIterator.DONE</code> and
+ * the iterator's current position is unchanged. Otherwise, the iterator's
+ * current position is set to the boundary following the current boundary.
+ * @return The character index of the next text boundary or
+ * <code>BreakIterator.DONE</code> if the current boundary is the last text
+ * boundary.
+ * Equivalent to next(1).
+ * @see #next(int)
+ */
+ public int next() {
+ boolean wasLetter = isLetter(text.current());
+ return nextBoundary(text.next(), wasLetter);
+ }
+
+ private boolean isLetter(char current) {
+ return Character.isDigit(current) || Character.isLetter(current);
+ }
+
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/PopupListener.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/PopupListener.java
new file mode 100644
index 0000000..140d24e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/PopupListener.java
@@ -0,0 +1,58 @@
+/*
+ * 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 06.12.2007
+ */
+package com.inet.jortho;
+
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JPopupMenu;
+
+/**
+ * Implement a MouseListener for Popup Event. It simple show the popup if there are the right mouse event. This should
+ * be part of the standard Java API.
+ *
+ * @author Volker Berlin
+ */
+public class PopupListener extends MouseAdapter {
+ private final JPopupMenu menu;
+
+ public PopupListener(final JPopupMenu menu) {
+ this.menu = menu;
+ }
+
+ private void maybeShowPopup(final MouseEvent ev) {
+ if (ev.isPopupTrigger()) {
+ menu.show(ev.getComponent(), ev.getX(), ev.getY());
+ }
+ }
+
+ @Override
+ public void mousePressed(final MouseEvent ev) {
+ maybeShowPopup(ev);
+ }
+
+ @Override
+ public void mouseReleased(final MouseEvent ev) {
+ maybeShowPopup(ev);
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/RedZigZagPainter.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/RedZigZagPainter.java
new file mode 100644
index 0000000..636a647
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/RedZigZagPainter.java
@@ -0,0 +1,91 @@
+/*
+ * 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 05.11.2005
+ */
+package com.inet.jortho;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.Stroke;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultHighlighter;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+/**
+ * @author Volker Berlin
+ */
+class RedZigZagPainter extends DefaultHighlighter.DefaultHighlightPainter {
+ private static final java.awt.BasicStroke STROKE1 = new java.awt.BasicStroke(0.01F, BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_MITER, 10, new float[] { 1, 3 }, 0);
+ private static final java.awt.BasicStroke STROKE2 = new java.awt.BasicStroke(0.01F, BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_MITER, 10, new float[] { 1, 1 }, 1);
+ private static final java.awt.BasicStroke STROKE3 = new java.awt.BasicStroke(0.01F, BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_MITER, 10, new float[] { 1, 3 }, 2);
+
+ public RedZigZagPainter() {
+ super(Color.red);
+ }
+
+ private void drawZigZagLine(final Graphics g, final Rectangle rect) {
+ final int x1 = rect.x;
+ final int x2 = x1 + rect.width - 1;
+ int y = rect.y + rect.height - 1;
+ final Graphics2D g2 = (Graphics2D) g;
+ Stroke stroke = g2.getStroke();
+ g2.setStroke(STROKE1);
+ g2.drawLine(x1, y, x2, y);
+ y--;
+ g2.setStroke(STROKE2);
+ g2.drawLine(x1, y, x2, y);
+ y--;
+ g2.setStroke(STROKE3);
+ g2.drawLine(x1, y, x2, y);
+ g2.setStroke(stroke);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Shape paintLayer(final Graphics g, final int i, final int j, final Shape shape, final JTextComponent jtext,
+ final View view) {
+ if (jtext.isEditable()) {
+ g.setColor(Color.red);
+ try {
+ final Shape sh = view.modelToView(i, Position.Bias.Forward, j, Position.Bias.Backward, shape);
+ final Rectangle rect = (sh instanceof Rectangle) ? (Rectangle) sh : sh.getBounds();
+ drawZigZagLine(g, rect);
+ return rect;
+ }
+ catch (final BadLocationException badlocationexception) {
+ return null;
+ }
+ }
+ return null;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellChecker.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellChecker.java
new file mode 100644
index 0000000..e37ccf6
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellChecker.java
@@ -0,0 +1,795 @@
+/*
+ * 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 05.12.2007
+ */
+package com.inet.jortho;
+
+import java.awt.Dialog;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseListener;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.WeakHashMap;
+
+import javax.swing.AbstractAction;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenu;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JToggleButton;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.text.JTextComponent;
+
+/**
+ * This class is the major class of the spell checker JOrtho (Java Orthography Checker).
+ * In the most cases this is the only class that you need to add spell checking to your application.
+ * First you need to do a one-time registration of your dictionaries. In standalone applications this can
+ * look like:
+ * <code><pre>
+ * SpellChecker.registerDictionaries( new URL("file", null, ""), "en,de", "de" );
+ * </pre></code>
+ * and in an applet this will look like:
+ * <code><pre>
+ * SpellChecker.registerDictionaries( getCodeBase(), "en,de", "en" );
+ * </pre></code>
+ * After this you can register your text component that should have the spell checker features
+ * (Highlighter, context menu, spell checking dialog).
+ * This looks like:<code><pre>
+ * JTextPane text = new JTextPane();
+ * SpellChecker.register( text );
+ * </pre></code>
+ * @author Volker Berlin
+ */
+public class SpellChecker {
+ private static class ActionToggleButtonModel extends JToggleButton.ToggleButtonModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final LanguageAction action;
+
+ ActionToggleButtonModel(final LanguageAction action) {
+ this.action = action;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isSelected() {
+ return Boolean.TRUE.equals(action.getValue(SELECTED_KEY));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setSelected(boolean b) {
+ // copy from super.setSelected
+ final ButtonGroup group = getGroup();
+ if (group != null) {
+ // use the group model instead
+ group.setSelected(this, b);
+ b = group.isSelected(this);
+ }
+ if (isSelected() == b) {
+ return;
+ }
+ action.setSelected(b);
+ // Send ChangeEvent
+ fireStateChanged();
+ // Send ItemEvent
+ fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, this,
+ this.isSelected() ? ItemEvent.SELECTED : ItemEvent.DESELECTED));
+ }
+ }
+
+ private static class DisableLanguageAction extends LanguageAction {
+ static DisableLanguageAction instance = new DisableLanguageAction();
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private DisableLanguageAction() {
+ super(Utils.getResource("disable"));
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent ev) {
+ if (!isEnabled()) {
+ //because multiple MenuItems share the same action that
+ //also the event occur multiple time
+ return;
+ }
+ setEnabled(false);
+ setSelected(true);
+ try {
+ currentDictionary = null;
+ final Locale oldLocale = currentLocale;
+ currentLocale = null;
+ SpellChecker.fireLanguageChanged(oldLocale);
+ }
+ finally {
+ setEnabled(true);
+ }
+ }
+
+ @Override
+ public int compareTo(final LanguageAction obj) {
+ return equals(obj) ? 0 : 1;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ return this == obj;
+ }
+
+ @Override
+ public int hashCode() {
+ return getClass().hashCode();
+ }
+
+ @Override
+ public void setSelected(final boolean b) {
+ super.setSelected(b);
+ }
+ }
+
+ /**
+ * Action for change the current dictionary language.
+ */
+ private static class LanguageAction extends AbstractAction implements Comparable<LanguageAction> {
+ // the current active (selected) LanguageAction
+ private static LanguageAction currentAction;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final URL baseURL;
+ private final String extension;
+ private final Locale locale;
+
+ LanguageAction(final String name) {
+ super(name);
+ baseURL = null;
+ locale = null;
+ extension = null;
+ }
+
+ LanguageAction(final URL baseURL, final Locale locale, final String extension) {
+ super(locale.getDisplayLanguage());
+ this.baseURL = baseURL;
+ this.locale = locale;
+ this.extension = extension;
+ }
+
+ public void actionPerformed(final ActionEvent ev) {
+ if (!isEnabled()) {
+ //because multiple MenuItems share the same action that
+ //also the event occur multiple time
+ return;
+ }
+ setEnabled(false);
+ setSelected(true);
+ final Locale oldLocale = currentLocale;
+ currentDictionary = null;
+ currentLocale = null;
+ SpellChecker.fireLanguageChanged(oldLocale);
+ final Thread thread = new Thread(new Runnable() {
+ public void run() {
+ try {
+ final DictionaryFactory factory = new DictionaryFactory();
+ try {
+ factory.loadWordList(new URL(baseURL, "dictionary_" + locale + extension));
+ final UserDictionaryProvider provider = userDictionaryProvider;
+ if (provider != null) {
+ final String userWords = provider.getUserWords(locale);
+ if (userWords != null) {
+ factory.loadPlainWordList(new StringReader(userWords));
+ }
+ }
+ }
+ catch (final Exception ex) {
+ JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR_MESSAGE);
+ }
+ currentDictionary = factory.create();
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ currentLocale = locale;
+ SpellChecker.fireLanguageChanged(null);
+ }
+ });
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ finally {
+ setEnabled(true);
+ }
+ }
+ });
+ thread.setPriority(Thread.NORM_PRIORITY);
+ thread.setDaemon(true);
+ thread.start();
+ }
+
+ /**
+ * Sort the displaynames in the order of the current language
+ */
+ public int compareTo(final LanguageAction obj) {
+ return toString().compareTo(obj.toString());
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj instanceof LanguageAction) {
+ return locale.equals(((LanguageAction) obj).locale);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return locale.hashCode();
+ }
+
+ /**
+ * Selects or deselects the menu item.
+ *
+ * @param b
+ * true selects the menu item, false deselects the menu item.
+ */
+ public void setSelected(final boolean b) {
+ if (b) {
+ // because there are some problems with multiple ButtonGroups that we duplicate some of the logic here
+ if (currentAction != null && currentAction != this) {
+ currentAction.setSelected(false);
+ }
+ currentAction = this;
+ }
+ putValue(SELECTED_KEY, Boolean.valueOf(b));
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+ }
+
+ private static String applicationName;
+ private static Dictionary currentDictionary;
+ private static Locale currentLocale;
+ private static final SpellCheckerOptions globalOptions = new SpellCheckerOptions();
+ private final static ArrayList<LanguageAction> languages = new ArrayList<LanguageAction>();
+ private final static java.util.Map<LanguageChangeListener, Object> listeners = Collections
+ .synchronizedMap(new WeakHashMap<LanguageChangeListener, Object>());
+ /**
+ * Duplicate of Action.SELECTED_KEY since 1.6
+ */
+ static final String SELECTED_KEY = "SwingSelectedKey";
+ private static UserDictionaryProvider userDictionaryProvider;
+
+ /**
+ * Adds the LanguageChangeListener. You do not need to remove if the
+ * LanguageChangeListener is not needed anymore.
+ * @param listener listener to add
+ * @see LanguageChangeListener
+ */
+ public static void addLanguageChangeLister(final LanguageChangeListener listener) {
+ listeners.put(listener, null);
+ }
+
+ /**
+ * Creates a menu item "Orthography" (or the equivalent depending on the user language) with a
+ * sub-menu that includes suggestions for a correct spelling.
+ * You can use this to add this menu item to your own popup.
+ * @return the new menu.
+ */
+ public static JMenu createCheckerMenu() {
+ return SpellChecker.createCheckerMenu(null);
+ }
+
+ /**
+ * Creates a menu item "Orthography" (or the equivalent depending on the user language) with a
+ * sub-menu that includes suggestions for a correct spelling.
+ * You can use this to add this menu item to your own popup.
+ * @param options override the default options for this menu.
+ * @return the new menu.
+ */
+ public static JMenu createCheckerMenu(final SpellCheckerOptions options) {
+ return new CheckerMenu(options);
+ }
+
+ /**
+ * Create a dynamic JPopupMenu with a list of suggestion. You can use the follow code sequence:<pre><code>
+ * JPopupMenu popup = SpellChecker.createCheckerPopup();
+ * text.addMouseListener( new PopupListener(popup) );
+ * </code></pre>
+ * @return the new JPopupMenu.
+ * @see #createCheckerMenu()
+ */
+ public static JPopupMenu createCheckerPopup() {
+ return SpellChecker.createCheckerPopup(null);
+ }
+
+ /**
+ * Create a dynamic JPopupMenu with a list of suggestion. You can use the follow code sequence:<pre><code>
+ * JPopupMenu popup = SpellChecker.createCheckerPopup( null );
+ * text.addMouseListener( new PopupListener(popup) );
+ * </code></pre>
+ * @return the new JPopupMenu.
+ * @see #createCheckerMenu(SpellCheckerOptions)
+ */
+ public static JPopupMenu createCheckerPopup(final SpellCheckerOptions options) {
+ return new CheckerPopup(options);
+ }
+
+ /**
+ * Creates a menu item "Languages" (or the equivalent depending on the user language) with a sub-menu
+ * that lists all available dictionary languages.
+ * You can use this to add this menu item to your own popup or to your menu bar.
+ * <code><pre>
+ * JPopupMenu popup = new JPopupMenu();
+ * popup.add( SpellChecker.createLanguagesMenu() );
+ * </pre></code>
+ * @return the new menu.
+ */
+ public static JMenu createLanguagesMenu() {
+ final JMenu menu = new JMenu(Utils.getResource("languages"));
+ final ButtonGroup group = new ButtonGroup();
+ menu.setEnabled(languages.size() > 0);
+ for (final LanguageAction action : languages) {
+ final JRadioButtonMenuItem item = new JRadioButtonMenuItem(action);
+ //Hack that all items of the action have the same state.
+ //http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4133141
+ item.setModel(new ActionToggleButtonModel(action));
+ menu.add(item);
+ group.add(item);
+ }
+ if (languages.size() > 0) {
+ menu.addSeparator();
+ final JRadioButtonMenuItem item = new JRadioButtonMenuItem(DisableLanguageAction.instance);
+ item.setModel(new ActionToggleButtonModel(DisableLanguageAction.instance));
+ menu.add(item);
+ group.add(item);
+ }
+ return menu;
+ }
+
+ /**
+ * Enable or disable the auto spell checking feature (red zigzag line) for a text component.
+ * If you change the document then you need to reenable it.
+ *
+ * @param text
+ * the JTextComponent that should change
+ * @param enable
+ * true, enable the feature.
+ */
+ public static void enableAutoSpell(final JTextComponent text, final boolean enable) {
+ SpellChecker.enableAutoSpell(text, enable, null);
+ }
+
+ /**
+ * Enable or disable the auto spell checking feature (red zigzag line) for a text component. If you change the
+ * document then you need to reenable it.
+ *
+ * @param text
+ * the JTextComponent that should change
+ * @param enable
+ * true, enable the feature.
+ * @param options
+ * override the default options for this menu.
+ */
+ public static void enableAutoSpell(final JTextComponent text, final boolean enable,
+ final SpellCheckerOptions options) {
+ if (enable) {
+ new AutoSpellChecker(text, options);
+ }
+ else {
+ AutoSpellChecker.disable(text);
+ }
+ }
+
+ /**
+ * Enable or disable the popup menu with the menu item "Orthography" and "Languages".
+ * @param text the JTextComponent that should change
+ * @param enable true, enable the feature.
+ */
+ public static void enablePopup(final JTextComponent text, final boolean enable) {
+ if (enable) {
+ final JPopupMenu menu = new JPopupMenu();
+ menu.add(SpellChecker.createCheckerMenu());
+ menu.add(SpellChecker.createLanguagesMenu());
+ text.addMouseListener(new PopupListener(menu));
+ }
+ else {
+ for (final MouseListener listener : text.getMouseListeners()) {
+ if (listener instanceof PopupListener) {
+ text.removeMouseListener(listener);
+ }
+ }
+ }
+ }
+
+ /**
+ * Enable or disable the F7 key. Pressing the F7 key will display the spell check dialog. This also
+ * register an Action with the name "spell-checking".
+ * @param text the JTextComponent that should change
+ * @param enable true, enable the feature.
+ */
+ public static void enableShortKey(final JTextComponent text, final boolean enable) {
+ SpellChecker.enableShortKey(text, enable, null);
+ }
+
+ /**
+ * Enable or disable the F7 key. Pressing the F7 key will display the spell check dialog. This also
+ * register an Action with the name "spell-checking".
+ * @param text the JTextComponent that should change
+ * @param enable true, enable the feature.
+ * @param options override the default options for this menu.
+ */
+ public static void enableShortKey(final JTextComponent text, final boolean enable, final SpellCheckerOptions options) {
+ if (enable) {
+ text.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0), "spell-checking");
+ text.getActionMap().put("spell-checking", new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ SpellChecker.showSpellCheckerDialog(text, options);
+ }
+ });
+ }
+ else {
+ text.getActionMap().remove("spell-checking");
+ }
+ }
+
+ /**
+ * Helper method to fire an Language change event.
+ */
+ private static void fireLanguageChanged(final Locale oldLocale) {
+ final LanguageChangeEvent ev = new LanguageChangeEvent(currentLocale, oldLocale);
+ synchronized(listeners){
+ for (final LanguageChangeListener listener : listeners.keySet()) {
+ listener.languageChanged(ev);
+ }
+ }
+ }
+
+ /**
+ * Get the title of your application.
+ */
+ public static String getApplicationName() {
+ return applicationName;
+ }
+
+ /**
+ * Get the current <code>Dictionary</code>. The current dictionary will be set if the user one select or on calling <code>registerDictionaries</code>.
+ * @return the current <code>Dictionary</code> or null if not set.
+ * @see #registerDictionaries(URL, String, String)
+ */
+ static Dictionary getCurrentDictionary() {
+ return currentDictionary;
+ }
+
+ /**
+ * Gets the current <code>Locale</code>. The current Locale will be set if the user selects
+ * one, or when calling <ode>registerDictionaries</code>.
+ * @return the current <code>Locale</code> or null if none is set.
+ * @see #registerDictionaries(URL, String, String)
+ */
+ public static Locale getCurrentLocale() {
+ return currentLocale;
+ }
+
+ /**
+ * Get the default SpellCheckerOptions. This object is a singleton. That there is no get method.
+ * @return the default SpellCheckerOptions
+ */
+ public static SpellCheckerOptions getOptions() {
+ return globalOptions;
+ }
+
+ /**
+ * Gets the currently set UserDictionaryProvider. If none has been set then null is returned.
+ *
+ * @see #setUserDictionaryProvider(UserDictionaryProvider)
+ */
+ static UserDictionaryProvider getUserDictionaryProvider() {
+ return SpellChecker.userDictionaryProvider;
+ }
+
+ /**
+ * Activate the spell checker for the given <code>JTextComponent</code>. The call is equal to register( text,
+ * true, true ).
+ *
+ * @param text
+ * the JTextComponent
+ * @throws NullPointerException
+ * if text is null
+ */
+ public static void register(final JTextComponent text) throws NullPointerException {
+ SpellChecker.register(text, true, true, true);
+ }
+
+ /**
+ * Activates the spell checker for the given <code>JTextComponent</code>. You do not need to unregister if the
+ * JTextComponent is not needed anymore.
+ *
+ * @param text
+ * the JTextComponent
+ * @param hasPopup
+ * if true, the JTextComponent is to have a popup menu with the menu item "Orthography" and "Languages".
+ * @param hasShortKey
+ * if true, pressing the F7 key will display the spell check dialog.
+ * @param hasAutoSpell
+ * if true, the JTextComponent has a auto spell checking.
+ * @throws NullPointerException
+ * if text is null
+ */
+ public static void register(final JTextComponent text, final boolean hasPopup, final boolean hasShortKey,
+ final boolean hasAutoSpell) throws NullPointerException {
+ if (hasPopup) {
+ SpellChecker.enablePopup(text, true);
+ }
+ if (hasShortKey) {
+ SpellChecker.enableShortKey(text, true);
+ }
+ if (hasAutoSpell) {
+ SpellChecker.enableAutoSpell(text, true);
+ }
+ }
+
+ /**
+ * Registers the available dictionaries. The dictionaries' URLs must have the form "dictionary_xx.xxxxx" and must be
+ * relative to the baseURL. The available languages and extension of the dictionaries is load from a configuration file.
+ * The configuration file must also relative to the baseURL and must be named dictionaries.cnf, dictionaries.properties or
+ * dictionaries.txt. If the dictionary of the active Locale does not exist, the first dictionary is loaded. There is
+ * only one dictionary loaded in memory at a given time. The configuration file has a Java Properties format. Currently
+ * there are the follow options:
+ * <ul>
+ * <li>languages</li>
+ * <li>extension</li>
+ * </ul>
+ *
+ * @param baseURL
+ * the base URL where the dictionaries and configuration file can be found. If null then URL("file", null, "")
+ * is used.
+ * @param activeLocale
+ * the locale that should be loaded and made active. If null or empty then the default locale is used.
+ */
+ public static void registerDictionaries(URL baseURL, final String activeLocale) {
+ if (baseURL == null) {
+ try {
+ baseURL = new URL("file", null, "");
+ }
+ catch (final MalformedURLException e) {
+ // should never occur because the URL is valid
+ e.printStackTrace();
+ }
+ }
+ InputStream input;
+ try {
+ input = new URL(baseURL, "dictionaries.cnf").openStream();
+ }
+ catch (final Exception e1) {
+ try {
+ input = new URL(baseURL, "dictionaries.properties").openStream();
+ }
+ catch (final Exception e2) {
+ try {
+ input = new URL(baseURL, "dictionaries.txt").openStream();
+ }
+ catch (final Exception e3) {
+ System.err.println("JOrtho configuration file not found!");
+ e1.printStackTrace();
+ e2.printStackTrace();
+ e3.printStackTrace();
+ return;
+ }
+ }
+ }
+ final Properties props = new Properties();
+ try {
+ props.load(input);
+ }
+ catch (final IOException e) {
+ e.printStackTrace();
+ return;
+ }
+ final String availableLocales = props.getProperty("languages");
+ final String extension = props.getProperty("extension", ".ortho");
+ SpellChecker.registerDictionaries(baseURL, availableLocales, activeLocale, extension);
+ }
+
+ /**
+ * Registers the available dictionaries. The dictionaries' URLs must have the form "dictionary_xx.ortho" and must be
+ * relative to the baseURL. If the dictionary of the active Locale does not exist, the first dictionary is loaded.
+ * There is only one dictionary loaded in memory at a given time.
+ *
+ * @param baseURL
+ * the base URL where the dictionaries can be found. If null then URL("file", null, "") is used.
+ * @param availableLocales
+ * a comma separated list of locales
+ * @param activeLocale
+ * the locale that should be loaded and made active. If null or empty then the default locale is used.
+ * @see #setUserDictionaryProvider(UserDictionaryProvider)
+ */
+ public static void registerDictionaries(final URL baseURL, final String availableLocales, final String activeLocale) {
+ SpellChecker.registerDictionaries(baseURL, availableLocales, activeLocale, ".ortho");
+ }
+
+ /**
+ * Registers the available dictionaries. The dictionaries' URLs must have the form "dictionary_xx.xxxxx" and must be
+ * relative to the baseURL. The extension can be set via parameter.
+ * If the dictionary of the active Locale does not exist, the first dictionary is loaded.
+ * There is only one dictionary loaded in memory at a given time.
+ *
+ * @param baseURL
+ * the base URL where the dictionaries can be found. If null then URL("file", null, "") is used.
+ * @param availableLocales
+ * a comma separated list of locales
+ * @param activeLocale
+ * the locale that should be loaded and made active. If null or empty then the default locale is used.
+ * @param extension
+ * the file extension of the dictionaries. Some web server like the IIS6 does not support the default ".ortho".
+ * @see #setUserDictionaryProvider(UserDictionaryProvider)
+ */
+ public static void registerDictionaries(URL baseURL, final String availableLocales, String activeLocale,
+ final String extension) {
+ if (baseURL == null) {
+ try {
+ baseURL = new URL("file", null, "");
+ }
+ catch (final MalformedURLException e) {
+ // should never occur because the URL is valid
+ e.printStackTrace();
+ }
+ }
+ for (String locale : availableLocales.split(",")) {
+ locale = locale.trim().toLowerCase();
+ if (locale.length() > 0) {
+ final LanguageAction action = new LanguageAction(baseURL, new Locale(locale), extension);
+ languages.remove(action);
+ languages.add(action);
+ }
+ }
+ //sort the display names in order of the current language
+ Collections.sort(languages);
+
+ setLanguage(activeLocale);
+ }
+
+ public static void setLanguage(String activeLocale) {
+ boolean activeSelected = false;
+ if (activeLocale != null) {
+ activeLocale = activeLocale.trim();
+ for(LanguageAction language:languages){
+ if (language.getLocale().getLanguage().equals(activeLocale)) {
+ language.actionPerformed(null);
+ activeSelected = true;
+ }
+ }
+ }
+ // if nothing selected then select the first entry
+ if (!activeSelected && languages.size() > 0) {
+ DisableLanguageAction.instance.actionPerformed(null);
+ }
+ }
+
+ public static String getLanguage(){
+ return currentLocale == null ? null : currentLocale.getLanguage();
+ }
+
+ /**
+ * Removes the LanguageChangeListener.
+ * @param listener listener to remove
+ */
+ public static void removeLanguageChangeLister(final LanguageChangeListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * Set the title of your application. This valuse is used as title for info boxes (JOptionPane).
+ * If not set then the translated "Spelling" is used.
+ */
+ public static void setApplicationName(final String name) {
+ applicationName = name;
+ }
+
+ /**
+ * Sets the UserDictionaryProvider. This is needed if the user should be able to add their own words.
+ * This method must be called before {@link #registerDictionaries(URL, String, String)}.
+ *
+ * @param userDictionaryProvider the new UserDictionaryProvider or null
+ * @see #getUserDictionaryProvider()
+ * @see #registerDictionaries(URL, String, String)
+ */
+ public static void setUserDictionaryProvider(final UserDictionaryProvider userDictionaryProvider) {
+ SpellChecker.userDictionaryProvider = userDictionaryProvider;
+ }
+
+ /**
+ * Show the Spell Checker dialog for the given JTextComponent. It will be do nothing if
+ * the JTextComponent is not editable or there are no dictionary loaded.
+ * The action for this method can you receive via:
+ * <code><pre>
+ * Action action = text.getActionMap().get("spell-checking");
+ * </pre></code>
+ * The action is only available if you have enable the short key (F7).
+ * @param text JTextComponent to check
+ * @param options override the default options for this menu.
+ */
+ public static void showSpellCheckerDialog(final JTextComponent text, final SpellCheckerOptions options) {
+ if (!text.isEditable()) {
+ // only editable text component have spell checking
+ return;
+ }
+ final Dictionary dictionary = currentDictionary;
+ if (dictionary != null) {
+ final Window parent = SwingUtilities.getWindowAncestor(text);
+ SpellCheckerDialog dialog;
+ if (parent instanceof Frame) {
+ dialog = new SpellCheckerDialog((Frame) parent, true, options);
+ }
+ else {
+ dialog = new SpellCheckerDialog((Dialog) parent, true, options);
+ }
+ dialog.show(text, dictionary, currentLocale);
+ }
+ }
+
+ /**
+ * Removes all spell checker features from the JTextComponent. This does not need to be called
+ * if the text component is no longer needed.
+ * @param text the JTextComponent
+ */
+ public static void unregister(final JTextComponent text) {
+ SpellChecker.enableShortKey(text, false);
+ SpellChecker.enablePopup(text, false);
+ SpellChecker.enableAutoSpell(text, false);
+ }
+
+ /**
+ * There is no instance needed of SpellChecker. All methods are static.
+ */
+ private SpellChecker() {/*nothing*/
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerDialog.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerDialog.java
new file mode 100644
index 0000000..d7c1210
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerDialog.java
@@ -0,0 +1,340 @@
+/*
+ * 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 10.11.2005
+ */
+package com.inet.jortho;
+
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.HeadlessException;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Vector;
+
+import javax.imageio.ImageIO;
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.WindowConstants;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.text.JTextComponent;
+
+/**
+ * The Dialog for continues checking the orthography.
+ * @author Volker Berlin
+ */
+class SpellCheckerDialog extends JDialog implements ActionListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JButton addToDic = new JButton(Utils.getResource("addToDictionary"));
+ final private JButton change = new JButton(Utils.getResource("change"));
+ final private JButton changeAll = new JButton(Utils.getResource("changeAll"));
+ /** Map of change all words */
+ final private HashMap<String, String> changeWords = new HashMap<String, String>();
+ final private JButton close = new JButton(Utils.getResource("close"));
+ private Dictionary dictionary;
+ final private JButton editDic = new JButton(Utils.getResource("editDictionary"));
+ final private JButton ignore = new JButton(Utils.getResource("ignore"));
+ final private JButton ignoreAll = new JButton(Utils.getResource("ignoreAll"));
+ /** List of ignore all words */
+ final private ArrayList<String> ignoreWords = new ArrayList<String>();
+ private boolean isDictionaryModify;
+ private JTextComponent jText;
+ final private JLabel notFound = new JLabel();
+ private final SpellCheckerOptions options;
+ final private JList suggestionsList = new JList();
+ private Tokenizer tok;
+ final private JTextField word = new JTextField();
+
+ SpellCheckerDialog(final Dialog owner) throws HeadlessException {
+ this(owner, false, null);
+ }
+
+ SpellCheckerDialog(final Dialog owner, final boolean modal, final SpellCheckerOptions options) {
+ super(owner, modal);
+ this.options = options == null ? SpellChecker.getOptions() : options;
+ init();
+ }
+
+ SpellCheckerDialog(final Frame owner) {
+ this(owner, false, null);
+ }
+
+ SpellCheckerDialog(final Frame owner, final boolean modal, final SpellCheckerOptions options) {
+ super(owner, modal);
+ this.options = options == null ? SpellChecker.getOptions() : options;
+ init();
+ }
+
+ public void actionPerformed(final ActionEvent ev) {
+ final Object source = ev.getSource();
+ if (source == ignore) {
+ searchNext();
+ }
+ else if (source == close) {
+ dispose();
+ }
+ else {
+ final String newWord = word.getText();
+ final String oldWord = notFound.getText();
+ if (source == ignoreAll) {
+ ignoreWords.add(oldWord);
+ searchNext();
+ }
+ else if (source == addToDic) {
+ final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
+ if (provider != null) {
+ provider.addWord(oldWord);
+ }
+ dictionary.add(oldWord);
+ dictionary.trimToSize();
+ isDictionaryModify = true;
+ searchNext();
+ }
+ else if (source == editDic) {
+ new DictionaryEditDialog(this).setVisible(true);
+ }
+ else if (source == change) {
+ replaceWord(oldWord, newWord);
+ searchNext();
+ }
+ else if (source == changeAll) {
+ changeWords.put(oldWord, newWord);
+ replaceWord(oldWord, newWord);
+ searchNext();
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (isDictionaryModify) {
+ AutoSpellChecker.refresh(jText);
+ }
+ }
+
+ final private void init() {
+ try {
+ final Image image = ImageIO.read(getClass().getResourceAsStream("icon.png"));
+ // setIconImage appeared in Java 6.0 so use reflection to be compatible
+ // with earlier JVMs. Equivalent to calling setIcomImage(image);
+ final Class<Dialog> cls = Dialog.class;
+ final java.lang.reflect.Method m = cls.getMethod("setIconImage", new Class[] { Image.class });
+ m.invoke(this, new Object[] { image });
+ }
+ catch (final Throwable e1) {
+ // can occur in Java 5 or if the icon was removed, then use the default
+ }
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ final Container cont = getContentPane();
+ cont.setLayout(new GridBagLayout());
+ final Insets insetL = new Insets(8, 8, 0, 8);
+ final Insets insetR = new Insets(8, 0, 0, 8);
+ cont.add(new JLabel(Utils.getResource("notInDictionary") + ":"), new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
+ GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, insetL, 0, 0));
+ notFound.setForeground(Color.RED);
+ notFound.setText("xxxxxxxxxx");
+ cont.add(notFound, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.SOUTHWEST,
+ GridBagConstraints.NONE, insetL, 0, 0));
+ cont.add(word, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetL, 0, 0));
+ cont.add(new JLabel(Utils.getResource("suggestions") + ":"), new GridBagConstraints(1, 3, 2, 1, 0.0, 0.0,
+ GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, insetL, 0, 0));
+ final JScrollPane scrollPane = new JScrollPane(suggestionsList);
+ cont.add(scrollPane, new GridBagConstraints(1, 4, 2, 5, 1.0, 1.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.BOTH, new Insets(8, 8, 8, 8), 0, 0));
+ cont.add(ignore, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(ignoreAll, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(addToDic, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(editDic, new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(change, new GridBagConstraints(3, 5, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(changeAll, new GridBagConstraints(3, 6, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(close, new GridBagConstraints(3, 7, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ cont.add(new JLabel(), new GridBagConstraints(3, 8, 1, 1, 0.0, 1.0, GridBagConstraints.NORTHWEST,
+ GridBagConstraints.HORIZONTAL, insetR, 0, 0));
+ ignore.addActionListener(this);
+ ignoreAll.addActionListener(this);
+ addToDic.addActionListener(this);
+ editDic.addActionListener(this);
+ change.addActionListener(this);
+ changeAll.addActionListener(this);
+ close.addActionListener(this);
+ //ESCAPE Taste
+ close.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false),
+ "ESCAPE");
+ close.getActionMap().put("ESCAPE", new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ dispose();
+ }
+ });
+ word.getDocument().addDocumentListener(new DocumentListener() {
+ public void changedUpdate(final DocumentEvent ev) {
+ // disable "Add To Dictionary" if word was changed, not this word would added else the original misspelled word
+ addToDic.setEnabled(false);
+ }
+
+ public void insertUpdate(final DocumentEvent ev) {
+ // disable "Add To Dictionary" if word was changed, not this word would added else the original misspelled word
+ addToDic.setEnabled(false);
+ }
+
+ public void removeUpdate(final DocumentEvent ev) {
+ // disable "Add To Dictionary" if word was changed, not this word would added else the original misspelled word
+ addToDic.setEnabled(false);
+ }
+ });
+ suggestionsList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(final ListSelectionEvent ev) {
+ // Update the word field if a suggestion is click
+ if (!ev.getValueIsAdjusting() && suggestionsList.getSelectedIndex() >= 0) {
+ word.setText((String) suggestionsList.getSelectedValue());
+ addToDic.setEnabled(true);
+ }
+ }
+ });
+ final boolean isUserDictionary = SpellChecker.getUserDictionaryProvider() != null;
+ addToDic.setEnabled(isUserDictionary);
+ editDic.setEnabled(isUserDictionary);
+ pack();
+ }
+
+ private void replaceWord(final String oldWord, final String newWord) {
+ jText.setSelectionStart(tok.getWordOffset());
+ jText.setSelectionEnd(tok.getWordOffset() + oldWord.length());
+ jText.replaceSelection(newWord);
+ tok.updatePhrase();
+ }
+
+ /**
+ * Search the next misspelling word. If found it then refresh the dialog with the new information.
+ * ignoreWords and changeWords will handle automatically.
+ * @return true, if found a spell error.
+ */
+ private boolean searchNext() {
+ String wordStr;
+ while (true) {
+ wordStr = tok.nextInvalidWord();
+ if (wordStr == null) {
+ dispose();
+ String title = SpellChecker.getApplicationName();
+ if (title == null) {
+ title = this.getTitle();
+ }
+ JOptionPane.showMessageDialog(getParent(), Utils.getResource("msgFinish"), title,
+ JOptionPane.INFORMATION_MESSAGE);
+ return false;
+ }
+ if (ignoreWords.contains(wordStr)) {
+ continue;
+ }
+ final String changeTo = changeWords.get(wordStr);
+ if (changeTo != null) {
+ replaceWord(wordStr, changeTo);
+ continue;
+ }
+ break;
+ }
+ word.setText(wordStr);
+ notFound.setText(wordStr);
+ final List<Suggestion> list = dictionary.searchSuggestions(wordStr);
+ final boolean needCapitalization = tok.isFirstWordInSentence() && Utils.isFirstCapitalized(wordStr);
+ final Vector<String> suggestionsVector = new Vector<String>();
+ for (int i = 0; i < list.size() && i < options.getSuggestionsLimitDialog(); i++) {
+ final Suggestion sugestion = list.get(i);
+ String newWord = sugestion.getWord();
+ if (needCapitalization) {
+ newWord = Utils.getCapitalized(newWord);
+ }
+ if (i == 0) {
+ word.setText(newWord);
+ }
+ suggestionsVector.add(newWord);
+ }
+ suggestionsList.setListData(suggestionsVector);
+ addToDic.setEnabled(true);
+ return true;
+ }
+
+ public void show(final JTextComponent jTextComponent, final Dictionary dic, final Locale loc) {
+ jText = jTextComponent;
+ dictionary = dic;
+ change.requestFocus();
+ setTitle(Utils.getResource("spelling") + ": " + loc.getDisplayLanguage());
+ tok = new Tokenizer(jTextComponent, dic, loc, options);
+ if (searchNext()) {
+ // if the JTextComponent is large and has a scrollpane then Java use the bounds
+ // and not the visible rect. This is bad
+ Container parent = jTextComponent;
+ while (parent != null && !(parent instanceof JScrollPane)) {
+ if (parent instanceof JComponent) {
+ final JComponent jcomp = (JComponent) parent;
+ if (jcomp.getVisibleRect().height == jcomp.getBounds().height) {
+ break;
+ }
+ }
+ if (parent.getParent() != null) {
+ parent = parent.getParent();
+ }
+ else {
+ break;
+ }
+ }
+ setLocationRelativeTo(parent);
+ setVisible(true);
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerOptions.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerOptions.java
new file mode 100644
index 0000000..e1761bf
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerOptions.java
@@ -0,0 +1,161 @@
+/*
+ * 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 20.02.2008
+ */
+package com.inet.jortho;
+
+/**
+ * This class contains some options for spell checking. You can change it globally(see ({@link SpellChecker#getOptions()}) or
+ * for every JTextComponent individually on registering.
+ *
+ * @author Volker Berlin
+ */
+public class SpellCheckerOptions {
+ private boolean caseSensitive = true;
+ private boolean ignoreAllCaps = true;
+ private boolean ignoreCapitalization = false;
+ private boolean ignoreNumbers = false;
+ private int suggestionsLimitDialog = 15;
+ private int suggestionsLimitMenu = 15;
+
+ /**
+ * Create SpellCheckerOptions with default values.
+ */
+ public SpellCheckerOptions() {
+ //empty block
+ }
+
+ /**
+ * Return whether capitalized words should be correct if the word is in the dictionary as lower-case.
+ *
+ * @return true, if capitalization is to be ignored
+ */
+ public boolean getIgnoreCapitalization() {
+ return ignoreCapitalization;
+ }
+
+ /**
+ * Get the maximun count of enties for the suggestion list in the spell checker dialog.
+ *
+ * @return the suggestions limit
+ */
+ public int getSuggestionsLimitDialog() {
+ return suggestionsLimitDialog;
+ }
+
+ /**
+ * Get the maximum count of entries for the suggestion menu.
+ *
+ * @return the suggestion limit
+ */
+ public int getSuggestionsLimitMenu() {
+ return suggestionsLimitMenu;
+ }
+
+ /**
+ * Return whether the spell checker is case-sensitive. This only has an effect on the first letter of a word.
+ *
+ * @return whether the spell checker is case-sensitive.
+ */
+ public boolean isCaseSensitive() {
+ return caseSensitive;
+ }
+
+ /**
+ * Whether words entirely in upper-case should be ignored for spell checking.
+ *
+ * @return true, if all entirely upper-case words are to be ignored
+ */
+ public boolean isIgnoreAllCapsWords() {
+ return ignoreAllCaps;
+ }
+
+ /**
+ * Whether words that include a number in any position should be ignored for spell checking.
+ *
+ * @return true, if words with numbers in any position are to be ignored
+ */
+ public boolean isIgnoreWordsWithNumbers() {
+ return ignoreNumbers;
+ }
+
+ /**
+ * Set whether the spell checker is case-sensitive. This only has an effect on the first letter of a word. The default
+ * value is true.
+ *
+ * @param caseSensitive whether the spell checker is to be case-sensitive for the first letter of each word.
+ */
+ public void setCaseSensitive(final boolean caseSensitive) {
+ this.caseSensitive = caseSensitive;
+ }
+
+ /**
+ * Set if words that are entirely in uppercase should be ignored for spell checking. This is most often used for
+ * abbreviations such DNS or HTTP. The default value is true.
+ *
+ * @param ignore
+ * the new value
+ */
+ public void setIgnoreAllCapsWords(final boolean ignore) {
+ ignoreAllCaps = ignore;
+ }
+
+ /**
+ * Set whether capitalized words should be correct if the word is in the dictionary as lower-case. This is often used in a title or in
+ * names. The first word of a sentence will always ignore the capitalization. The default is false.
+ *
+ * @param ignore
+ * the new value
+ */
+ public void setIgnoreCapitalization(final boolean ignore) {
+ ignoreCapitalization = ignore;
+ }
+
+ /**
+ * Set if words that include a number in any position should be ignored for spell checking. The default is false.
+ *
+ * @param ignore
+ * the new value
+ */
+ public void setIgnoreWordsWithNumbers(final boolean ignore) {
+ ignoreNumbers = ignore;
+ }
+
+ /**
+ * Set the maximun count of entries for the suggestion list in the spell checker dialog. The default is 15.
+ *
+ * @param count
+ * the suggestion limit for the spell checker dialog
+ */
+ public void setSuggestionsLimitDialog(final int count) {
+ suggestionsLimitDialog = count;
+ }
+
+ /**
+ * Set the maximun count of entries for the suggestion menu. The default is 15.
+ *
+ * @param count
+ * the suggestion limit for the suggestion menu
+ */
+ public void setSuggestionsLimitMenu(final int count) {
+ suggestionsLimitMenu = count;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestion.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestion.java
new file mode 100644
index 0000000..2da60f4
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestion.java
@@ -0,0 +1,94 @@
+/*
+ * 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 04.11.2005
+ */
+package com.inet.jortho;
+
+/**
+ * This class hold one Suggestion for another spelling.
+ * Note: this class has a natural ordering that is inconsistent with equals.
+ * @author Volker Berlin
+ */
+final class Suggestion implements Comparable<Suggestion> {
+ private final int diff;
+ private final String word;
+
+ /**
+ * Construct a suggestion
+ * @param word the characters of the suggested the word.
+ * @param diff the difference to the original word.
+ */
+ Suggestion(final CharSequence word, final int diff) {
+ this.word = word.toString();
+ this.diff = diff;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int compareTo(final Suggestion sugg) {
+ return diff - sugg.diff;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean equals(final Object sugg) {
+ if (sugg instanceof Suggestion) {
+ return word.equals(((Suggestion) sugg).word);
+ }
+ return false;
+ }
+
+ /**
+ * Return a value that descript dissimilarity to the original word.
+ * A vaulue of 0 means that the value is 100% identical. This should not occur.
+ * @return the dissimilarity, so larger to differ the word.
+ */
+ public int getDissimilarity() {
+ return diff;
+ }
+
+ /**
+ * Get the suggested word.
+ * @return the word
+ */
+ public String getWord() {
+ return word;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode() {
+ return word.hashCode();
+ }
+
+ /**
+ * Return the suggested word and it equals to getWord().
+ */
+ @Override
+ public String toString() {
+ return word;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestions.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestions.java
new file mode 100644
index 0000000..535cc08
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestions.java
@@ -0,0 +1,77 @@
+/*
+ * 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 12.12.2007
+ */
+package com.inet.jortho;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * A hash list of Suggestions. The list is cut with a max dissimilarity. If a suggestion already exist then the
+ * suggestion with the lower dissimilarity will be hold.
+ *
+ * @author Volker Berlin
+ */
+class Suggestions {
+ private final HashMap<Suggestion, Suggestion> map = new HashMap<Suggestion, Suggestion>();
+ private final int maxDiff;
+
+ /**
+ * Create a suggestions list. Suggestion with a larger dissimilarity can not be added.
+ * @param maxDiff the max dissimilarity
+ */
+ Suggestions(final int maxDiff) {
+ this.maxDiff = maxDiff;
+ }
+
+ /**
+ * Add a suggestion.
+ * @param suggestion the suggestion
+ */
+ void add(final Suggestion suggestion) {
+ if (suggestion.getDissimilarity() > maxDiff) {
+ return;
+ }
+ final Suggestion oldSuggestion = map.get(suggestion);
+ if (oldSuggestion != null && oldSuggestion.getDissimilarity() <= suggestion.getDissimilarity()) {
+ return;
+ }
+ map.put(suggestion, suggestion);
+ }
+
+ List<Suggestion> getlist() {
+ final ArrayList<Suggestion> list = new ArrayList<Suggestion>();
+ for (final Suggestion sugg : map.values()) {
+ list.add(sugg);
+ }
+ return list;
+ }
+
+ /**
+ * Get the max dissimilarity. Suggestion with a larger value can not be added.
+ * @return
+ */
+ int getMaxDissimilarity() {
+ return maxDiff;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Tokenizer.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/Tokenizer.java
new file mode 100644
index 0000000..1bc2409
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/Tokenizer.java
@@ -0,0 +1,259 @@
+/*
+ * 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 07.11.2005
+ */
+package com.inet.jortho;
+
+import java.text.BreakIterator;
+import java.util.Locale;
+
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Utilities;
+
+/**
+ * Break the text and words and search for misspelling.
+ * @author Volker Berlin
+ */
+class Tokenizer {
+ private final Dictionary dictionary;
+ private final Document doc;
+ /** end offset of current paragraph */
+ private int endOffset;
+ private boolean isFirstWordInSentence;
+ private final SpellCheckerOptions options;
+ /** start offset of current paragraph */
+ private int paragraphOffset;
+ private String phrase;
+ private String sentence;
+ private final BreakIterator sentences;
+ private int startSentence, endSentence, startWord, endWord;
+ private int wordOffset;
+ private final LetterBasedBreakIterator words;
+
+ /**
+ * Create a tokenizer for the selected range.
+ */
+ Tokenizer(final JTextComponent jText, final Dictionary dictionary, final Locale locale, final int startOffset,
+ final int endOffset, final SpellCheckerOptions options) {
+ this.dictionary = dictionary;
+ doc = jText.getDocument();
+ this.options = options == null ? SpellChecker.getOptions() : options;
+ sentences = BreakIterator.getSentenceInstance(locale);
+ words = new LetterBasedBreakIterator();
+ paragraphOffset = startOffset;
+ this.endOffset = endOffset;
+ //loadSentences();
+ setSentencesText();
+ endSentence = sentences.first();
+ endWord = BreakIterator.DONE;
+ }
+
+ /**
+ * Create a Tokenizer for the current paragraph
+ * @param jText the checking JTextComponent
+ * @param dictionary the used Dictionary
+ * @param locale the used Locale, is needed for the word and sentence breaker
+ * @param offset the current offset.
+ */
+ Tokenizer(final JTextComponent jText, final Dictionary dictionary, final Locale locale, final int offset,
+ final SpellCheckerOptions options) {
+ this(jText, dictionary, locale, Utilities.getParagraphElement(jText, offset).getStartOffset(), Utilities
+ .getParagraphElement(jText, offset).getEndOffset(), options);
+ }
+
+ /**
+ * Create a tokenizer for the completely text document.
+ */
+ Tokenizer(final JTextComponent jText, final Dictionary dictionary, final Locale locale,
+ final SpellCheckerOptions options) {
+ this(jText, dictionary, locale, 0, jText.getDocument().getLength(), options);
+ }
+
+ /**
+ * Get start offset of the last misspelling in the JTextComponent.
+ */
+ int getWordOffset() {
+ return paragraphOffset + wordOffset;
+ }
+
+ /**
+ * Was the last invalid word the first word in a sentence.
+ *
+ * @return true if it was the first word.
+ */
+ boolean isFirstWordInSentence() {
+ return isFirstWordInSentence;
+ }
+
+ /**
+ * Check if the word is a web address. This means a email address or web page address.
+ *
+ * @param word
+ * the word that should be check. It can not be null and can not include any whitespace.
+ * @return true if it is a web address.
+ */
+ private boolean isWebAddress(String word) {
+ if (startWord + 2 >= sentence.length()) {
+ return false;
+ }
+ final char char0 = sentence.charAt(startWord);
+ final char char1 = sentence.charAt(startWord + 1);
+ if (char0 == '@' && (Character.isLetter(char1) ||Character.isDigit(char1))
+ || startWord + 3 < sentence.length() && char0 == ':'
+ && char1 == '/' && sentence.charAt(startWord + 2) == '/') {
+ while (startWord < endWord) {
+ final String next = sentence.substring(startWord, endWord).trim();
+ if (next.length() > 0) {
+ word += next;
+ startWord = endWord;
+ endWord = words.next();
+ }
+ else {
+ break;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Loads the sentences of the current paragraph.
+ */
+ private void loadSentences() {
+ setSentencesText();
+ startSentence = sentences.first();
+ endSentence = sentences.next();
+ nextSentence();
+ }
+
+ /**
+ * Get the next misspelling word. If not found then it return null.
+ */
+ String nextInvalidWord() {
+ isFirstWordInSentence = false;
+ while (true) {
+ if (endWord == BreakIterator.DONE) {
+ startSentence = endSentence;
+ endSentence = sentences.next();
+ if (endSentence == BreakIterator.DONE) {
+ if (!nextParagraph()) {
+ return null;
+ }
+ }
+ else {
+ nextSentence();
+ }
+ }
+ while (endWord != BreakIterator.DONE) {
+ final String word = sentence.substring(startWord, endWord).trim();
+ wordOffset = startSentence + startWord;
+ startWord = endWord;
+ endWord = words.next();
+ //only words with 2 or more characters are checked
+ if (word.length() > 1 && Character.isLetter(word.charAt(0))) {
+ boolean exist = dictionary.exist(word);
+ if (!exist && !options.isCaseSensitive()) {
+ exist = dictionary.exist(Utils.getInvertedCapitalizion(word));
+ }
+ else if (!exist && (isFirstWordInSentence || options.getIgnoreCapitalization())
+ && Character.isUpperCase(word.charAt(0))) {
+ // Uppercase check on starting of sentence
+ final String capitalizeWord = word.substring(0, 1).toLowerCase() + word.substring(1);
+ exist = dictionary.exist(capitalizeWord);
+ }
+ if (!exist && options.isIgnoreAllCapsWords() && Utils.isAllCapitalized(word)) {
+ exist = true;
+ }
+ if (!exist && options.isIgnoreWordsWithNumbers() && Utils.isIncludeNumbers(word)) {
+ exist = true;
+ }
+ if (!exist && !isWebAddress(word)) {
+ return word;
+ }
+ isFirstWordInSentence = false;
+ }
+ }
+ }
+ }
+
+ /**
+ * Initialize the variables for the next paragraph.
+ * @return true, if there is a next paragraph
+ */
+ private boolean nextParagraph() {
+ if (doc instanceof AbstractDocument) {
+ paragraphOffset = ((AbstractDocument) doc).getParagraphElement(paragraphOffset).getEndOffset();
+ if (paragraphOffset >= endOffset) {
+ return false;
+ }
+ }
+ else {
+ return false;
+ }
+ loadSentences();
+ return true;
+ }
+
+ /**
+ * Load the next Sentence in the word breaker.
+ */
+ private void nextSentence() {
+ sentence = phrase.substring(startSentence, endSentence);
+ words.setText(sentence);
+ startWord = words.first();
+ endWord = words.next();
+ isFirstWordInSentence = true;
+ }
+
+ /**
+ * Call sentences.setText( String ) based on the current value of paragraphOffset.
+ */
+ private void setSentencesText() {
+ int end = endOffset;
+ if (doc instanceof AbstractDocument) {
+ end = ((AbstractDocument) doc).getParagraphElement(paragraphOffset).getEndOffset();
+ }
+ try {
+ phrase = doc.getText(paragraphOffset, end - paragraphOffset);
+ }
+ catch (final BadLocationException e) {
+ e.printStackTrace();
+ }
+ sentences.setText(phrase);
+ }
+
+ /**
+ * Update the text after a word was replaced. The changes in the text should be only after the current word offset.
+ */
+ void updatePhrase() {
+ endOffset = doc.getLength();
+ setSentencesText();
+ endSentence = sentences.following(startSentence);
+ sentence = phrase.substring(startSentence, endSentence);
+ words.setText(sentence);
+ startWord = words.following(wordOffset);
+ endWord = words.next();
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/UserDictionaryProvider.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/UserDictionaryProvider.java
new file mode 100644
index 0000000..b10ae6e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/UserDictionaryProvider.java
@@ -0,0 +1,58 @@
+/*
+ * 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 10.12.2007
+ */
+package com.inet.jortho;
+
+import java.util.Locale;
+
+/**
+ * Interface to be implemented by a user dictionary. Adding a new word via {@link #addWord(String)} must
+ * trigger a storing of the dictionary
+ *
+ * @author Volker Berlin
+ */
+public interface UserDictionaryProvider {
+ /**
+ * Adds a new word to the current user dictionary. The implementor must save this word in its own backend.
+ *
+ * @param word the new word.
+ */
+ void addWord(String word);
+
+ /**
+ * Gets the list of user words for this locale. The implementation can decide if there is a
+ * user dictionary for each available language or only one. This method is called before the
+ * language change event is fired if the language is changed and the dictionary is loaded.
+ *
+ * @param locale The locale of the selected language.
+ * @return A list of words delimited with line breaks. It can be null.
+ */
+ String getUserWords(Locale locale);
+
+ /**
+ * Set a completely new word list
+ *
+ * @param wordList
+ * the new word list. Can be empty but not null.
+ */
+ void setUserWords(String wordList);
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Utils.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/Utils.java
new file mode 100644
index 0000000..0eec228
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/Utils.java
@@ -0,0 +1,127 @@
+/*
+ * 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 10.11.2005
+ */
+package com.inet.jortho;
+
+import java.util.ResourceBundle;
+
+/**
+ * @author Volker Berlin
+ */
+class Utils {
+ /**
+ * Create a String where the first letter is written with a uppercase.
+ *
+ * @param word
+ * the word that should be change
+ * @return the new String if needed
+ */
+ static String getCapitalized(final String word) {
+ if ((word.length() > 0) && Character.isLowerCase(word.charAt(0))) {
+ return word.substring(0, 1).toUpperCase() + word.substring(1);
+ }
+ return word;
+ }
+
+ /**
+ * Create a String with inverted case for the first letter. If it is lowercase then it will change to uppercase and
+ * vice versa.
+ *
+ * @param word
+ * the word that should be change
+ * @return the new String if needed
+ */
+ static String getInvertedCapitalizion(final String word) {
+ if (word.length() > 0) {
+ if (Character.isLowerCase(word.charAt(0))) {
+ return word.substring(0, 1).toUpperCase() + word.substring(1);
+ }
+ if (Character.isUpperCase(word.charAt(0))) {
+ return word.substring(0, 1).toLowerCase() + word.substring(1);
+ }
+ }
+ return word;
+ }
+
+ /**
+ * Translate a GUI string in one of the supported languages. If the value was not find then the key is returned.
+ *
+ * @param value
+ * the key of the language resource.
+ * @return the translation result
+ */
+ static String getResource(final String value) {
+ try {
+ final ResourceBundle resource = ResourceBundle.getBundle("com.inet.jortho.i18n.resource");
+ return resource.getString(value);
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ return value;
+ }
+
+ /**
+ * Check if all letter are uppercase. Character that are not letters are ignored.
+ *
+ * @param word
+ * the word that should be check. It can not be null or empty.
+ * @return if all character are a uppercase letter
+ */
+ static boolean isAllCapitalized(final String word) {
+ for (int i = 0; i < word.length(); i++) {
+ final char ch = word.charAt(i);
+ if (Character.isLetter(ch) && !Character.isUpperCase(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Check if the first character is a uppcase letter
+ *
+ * @param word
+ * the word that should be check. It can not be null.
+ * @return true if the first character is a uppercase letter
+ */
+ static boolean isFirstCapitalized(final String word) {
+ return (word.length() > 0) && Character.isUpperCase(word.charAt(0));
+ }
+
+ /**
+ * Check if the word include a digit.
+ *
+ * @param word
+ * the word that should be check. It can not be null.
+ * @return if there is any number in the word.
+ */
+ static boolean isIncludeNumbers(final String word) {
+ for (int i = 0; i < word.length(); i++) {
+ final char ch = word.charAt(i);
+ if (Character.isDigit(ch)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource.properties
new file mode 100644
index 0000000..a540347
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource.properties
@@ -0,0 +1,16 @@
+addDictionaries = Add dictionaries...
+addToDictionary = Add to Dictionary
+change = Change
+changeAll = Change All
+close = Close
+delete = Delete
+disable = Disable Spellchecker
+editDictionary = Edit dictionary
+ignore = Ignore Once
+ignoreAll = Ignore All
+languages = Languages
+msgFinish = The Spell check is finished.
+notInDictionary = Not in Dictionary
+spelling = Spelling
+suggestions = Suggestions
+userDictionary = User dictionary
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
new file mode 100644
index 0000000..e8c5362
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_de.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_de.properties
new file mode 100644
index 0000000..d25c271
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_es.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es.properties
new file mode 100644
index 0000000..9e607d2
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_es_MX.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es_MX.properties
new file mode 100644
index 0000000..9e607d2
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_fr.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_fr.properties
new file mode 100644
index 0000000..56e74b4
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_hr.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_hr.properties
new file mode 100644
index 0000000..5928f43
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_it.properties
new file mode 100644
index 0000000..a47ab6e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_it.properties
@@ -0,0 +1,16 @@
+addDictionaries = Aggiungere dizionari
+addToDictionary = Aggiungere al dizionario
+change = Cambiare
+changeAll = Cambiare tutti
+close = Chiudi
+delete = Eliminare
+disable = Disabilitare Controllo
+editDictionary = Modifica Dizionario
+ignore = Ignorare una volta
+ignoreAll = Ignorare tutti
+languages = Lingue
+msgFinish = Controllo ortografico terminato
+notInDictionary = Non nel dizionario
+spelling = Ortografia
+suggestions = Suggerimenti
+userDictionary = Dizionario Utente
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_nl.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_nl.properties
new file mode 100644
index 0000000..c44b839
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_nl.properties
@@ -0,0 +1,16 @@
+addDictionaries = Voeg woordenlijst toe...
+addToDictionary = Aan woordenlijst toeveoegen
+change = Verander
+changeAll = Verander alles
+close = Sluit
+delete = Wis
+disable = Spellingscontrole uitschakelen
+editDictionary = Bewerk woordenlijst
+ignore = Negeer eenmaal
+ignoreAll = Negeer alles
+languages = Talen
+msgFinish = De spellingscontrole is klaar
+notInDictionary = Niet in de woordenlijst
+spelling = Spelling
+suggestions = Suggesties
+userDictionary = Persoonlijke woordenlijst
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
new file mode 100644
index 0000000..ca43a56
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_ru.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_ru.properties
new file mode 100644
index 0000000..433bb1a
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/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/com/inet/jortho/i18n/resource_sk.properties
new file mode 100644
index 0000000..2aaaea7
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_sk.properties
@@ -0,0 +1,15 @@
+addDictionaries = Prida\u0165 slovn\u00EDky...
+addToDictionary = Prida\u0165 do slovn\u00EDka
+change = Zmeni\u0165
+changeAll = Zmeni\u0165 v\u0161etky
+close = Zru\u0161i\u0165
+delete = Odstr\u00E1ni\u0165
+editDictionary = Upravi\u0165 slovn\u00EDk
+ignore = Ignorova\u0165 raz
+ignoreAll = Ignorova\u0165 v\u0161etky
+languages = Jazyky
+msgFinish = Kontrola pravopisu je dokon\u010Den\u00E1.
+notInDictionary = Nie je v slovn\u00EDku
+spelling = Pravopis
+suggestions = N\u00E1vrhy
+userDictionary = U\u017E\u00EDvate\u013Esk\u00FD slovn\u00EDk
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/icon.png b/JOrtho_0.4_freeplane/src/com/inet/jortho/icon.png
new file mode 100644
index 0000000..25c436c
Binary files /dev/null and b/JOrtho_0.4_freeplane/src/com/inet/jortho/icon.png differ
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/package.html b/JOrtho_0.4_freeplane/src/com/inet/jortho/package.html
new file mode 100644
index 0000000..d2b3687
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jortho/package.html
@@ -0,0 +1,38 @@
+<html>
+<head>
+<meta http-equiv="Content-Language" content="en">
+</head>
+<body>
+<p>This package implements the spell checker JOrtho. With JOrtho is it possible
+very simple to check the orthography from any text in a JTextComponent. The
+<a title="Spell Checker main class" href="SpellChecker.html">
+SpellChecker</a> class is the major class of the Spell Checker JOrtho (Java Orthography Checker).
+In the most cases this is the only class that you need to add spelling feature to your application.
+If you want support for a user dictionary that a user can add its own words then
+you must implements a <a href="UserDictionaryProvider.html">
+UserDictionaryProvider</a>. This UserDictionaryProvider must be register at first:</p>
+<blockquote>
+ <p><code>SpellChecker.setUserDictionaryProvider( new MyUserDictionaryProvider() );</code></p>
+</blockquote>
+<p>After it you need to register your dictionaries one times. In standalone application
+if your dictionaries are in the working directory then this can look like:
+<code> </p>
+<blockquote>
+SpellChecker.registerDictionaries( new URL("file", null, ""), "en,de", "de" );
+</code>
+</blockquote>
+<p>
+and in a applet like:</p>
+<blockquote>
+ <p><code>SpellChecker.registerDictionaries( getCodeBase(), "en,de", "en" );
+ </code></p>
+</blockquote>
+<p>After this you can register your text component that should have all spell checker feature (Highlighter. context menu, spelling dialog).
+This look like:</p>
+<blockquote>
+ <p><code>JTextPane text = new JTextPane();
+<br>
+ SpellChecker.register( text ); </code></p>
+</blockquote>
+</body>
+</html>
\ No newline at end of file
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/AllTests.java b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/AllTests.java
new file mode 100644
index 0000000..4a35115
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/AllTests.java
@@ -0,0 +1,46 @@
+/*
+ * Created on 14.10.2008
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.inet.jorthotests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import com.inet.jortho.SpellChecker;
+
+public class AllTests {
+ private static boolean isInit;
+
+ /**
+ * register the dictionaries
+ */
+ static void init() {
+ if (!isInit) {
+ isInit = true;
+ final int threadCount = Thread.activeCount();
+ SpellChecker.registerDictionaries(null, null);
+ // wait until the dictionaries are loaded.
+ for (int i = 0; i < 50; i++) {
+ if (threadCount >= Thread.activeCount()) {
+ break;
+ }
+ try {
+ Thread.sleep(100);
+ }
+ catch (final InterruptedException e) {
+ break;
+ }
+ }
+ }
+ }
+
+ public static Test suite() {
+ final TestSuite suite = new TestSuite("JOrtho Tests");
+ suite.addTestSuite(EventTest.class);
+ suite.addTestSuite(MemoryTest.class);
+ return suite;
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/EventTest.java b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/EventTest.java
new file mode 100644
index 0000000..60e321e
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/EventTest.java
@@ -0,0 +1,64 @@
+/*
+ * Created on 14.10.2008
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.inet.jorthotests;
+
+import javax.swing.JMenu;
+import javax.swing.JRadioButtonMenuItem;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.inet.jortho.SpellChecker;
+
+public class EventTest extends TestCase {
+ static {
+ AllTests.init();
+ }
+
+ /**
+ * Compare 2 JRadioButtonMenuItem
+ */
+ private void assertEquals(final String description, final JRadioButtonMenuItem item1,
+ final JRadioButtonMenuItem item2) {
+ Assert.assertEquals(description + ": Name", item1.getName(), item2.getName());
+ Assert.assertEquals(description + ": Selected", item1.isSelected(), item2.isSelected());
+ }
+
+ public void testChangeLanguage() throws Exception {
+ final JMenu menu1 = SpellChecker.createLanguagesMenu();
+ final JMenu menu2 = SpellChecker.createLanguagesMenu();
+ Assert.assertEquals("Menucount", menu1.getItemCount(), menu2.getItemCount());
+ Assert.assertTrue("2 languages requied:" + menu1.getItemCount(), menu1.getItemCount() >= 2);
+ final JRadioButtonMenuItem item1_1 = (JRadioButtonMenuItem) menu1.getItem(0);
+ final JRadioButtonMenuItem item1_2 = (JRadioButtonMenuItem) menu1.getItem(1);
+ final JRadioButtonMenuItem item2_1 = (JRadioButtonMenuItem) menu2.getItem(0);
+ final JRadioButtonMenuItem item2_2 = (JRadioButtonMenuItem) menu2.getItem(1);
+ assertEquals("Item 1", item1_1, item2_1);
+ assertEquals("Item 2", item1_2, item2_2);
+ //Change the selected language
+ JRadioButtonMenuItem notSelected = item1_1.isSelected() ? item1_2 : item1_1;
+ JRadioButtonMenuItem selected = item1_1.isSelected() ? item1_1 : item1_2;
+ Assert.assertFalse("Selected", notSelected.isSelected());
+ Assert.assertTrue("Selected", selected.isSelected());
+ notSelected.doClick(0);
+ Assert.assertTrue("Selected", notSelected.isSelected());
+ Assert.assertFalse("Selected", selected.isSelected());
+ assertEquals("Item 1", item1_1, item2_1);
+ assertEquals("Item 2", item1_2, item2_2);
+ Thread.sleep(10); // for loading thread
+ notSelected = item2_1.isSelected() ? item2_2 : item2_1;
+ selected = item2_1.isSelected() ? item2_1 : item2_2;
+ Assert.assertFalse("Selected", notSelected.isSelected());
+ Assert.assertTrue("Selected", selected.isSelected());
+ notSelected.doClick(0);
+ Assert.assertTrue("Selected", notSelected.isSelected());
+ Assert.assertFalse("Selected", selected.isSelected());
+ assertEquals("Item 1", item1_1, item2_1);
+ assertEquals("Item 2", item1_2, item2_2);
+ Thread.sleep(10); // for loading thread
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/MemoryTest.java b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/MemoryTest.java
new file mode 100644
index 0000000..e79bcb5
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/com/inet/jorthotests/MemoryTest.java
@@ -0,0 +1,95 @@
+/*
+ * Created on 14.10.2008
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.inet.jorthotests;
+
+import java.awt.Toolkit;
+
+import javax.swing.JTextPane;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.inet.jortho.SpellChecker;
+
+public class MemoryTest extends TestCase {
+ static {
+ AllTests.init();
+ }
+
+ /**
+ * Create a large amount of languages menus
+ */
+ public void testCreateLanguagesMenu() throws Exception {
+ SpellChecker.createLanguagesMenu();
+ final long memoryBefore = usedMemory();
+ for (int i = 0; i < 10000; i++) {
+ SpellChecker.createLanguagesMenu();
+ }
+ final long memoryAfter = usedMemory();
+ if (memoryBefore + 100000 < memoryAfter) {
+ Assert.fail("Memory Leak SpellChecker.createLanguagesMenu. memory before:" + (memoryBefore / 1024)
+ + " KB memory after:" + (memoryAfter / 1024) + " KB");
+ }
+ }
+
+ /**
+ * Create many JTextPane and register the spell checker
+ */
+ public void testRegister() throws Exception {
+ // Create a large text
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < 1000; i++) {
+ buf.append("This is a very simple sentence.\n");
+ }
+ final String text = buf.toString();
+ buf = null;
+ JTextPane textPane1 = new JTextPane();
+ textPane1.setText(text);
+ SpellChecker.register(textPane1);
+ textPane1 = null;
+ final long memoryBefore = usedMemory();
+ for (int i = 0; i < 100; i++) {
+ final JTextPane textPane = new JTextPane();
+ textPane.setText(text);
+ SpellChecker.register(textPane);
+ // there will be some thread started, we give it a little time
+ System.err.println(usedMemory());
+ Thread.sleep(10);
+ }
+ final long memoryAfter = usedMemory();
+ if (memoryBefore + 1000000 < memoryAfter) {
+ Assert.fail("Memory Leak SpellChecker.register. memory before:" + (memoryBefore / 1024)
+ + " KB memory after:" + (memoryAfter / 1024) + " KB");
+ }
+ }
+
+ /**
+ * Start the gc and caluculate the the current used memory.
+ */
+ private long usedMemory() throws Exception {
+ final Runtime runtime = Runtime.getRuntime();
+ long last = Long.MAX_VALUE;
+ while (true) {
+ Thread.sleep(1);
+ // empty the event loop, because it hold many references
+ if (Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent() != null) {
+ continue;
+ }
+ System.runFinalization();
+ System.gc();
+ Thread.sleep(10);
+ final long current = runtime.totalMemory() - runtime.freeMemory();
+ if (current < last) {
+ // if the value are reduced then wait for more reducing
+ last = current;
+ }
+ else {
+ return last;
+ }
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/dictionaries.cnf b/JOrtho_0.4_freeplane/src/dictionaries.cnf
new file mode 100644
index 0000000..65d49a4
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/dictionaries.cnf
@@ -0,0 +1,2 @@
+extension=.ortho
+languages=de,en,it,fr,es,ru
\ No newline at end of file
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..313ced7
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,33 @@
+<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>
+
+</project>
diff --git a/freeplane/.classpath b/freeplane/.classpath
new file mode 100644
index 0000000..ca4ef43
--- /dev/null
+++ b/freeplane/.classpath
@@ -0,0 +1,17 @@
+<?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.0.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 kind="lib" path="lib/commons-io-2.4.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
new file mode 100644
index 0000000..67af9e9
--- /dev/null
+++ b/freeplane/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..b73111d
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+#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.core.runtime.prefs b/freeplane/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..f5f645f
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Mon Feb 15 22:55:51 CET 2010
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/freeplane/.settings/org.eclipse.jdt.core.prefs b/freeplane/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..dca1344
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,25 @@
+#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
new file mode 100644
index 0000000..8efd713
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..60531d7
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..871fdba
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#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
new file mode 100644
index 0000000..7cc78d0
--- /dev/null
+++ b/freeplane/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,9 @@
+#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
new file mode 100644
index 0000000..9d0fcb2
--- /dev/null
+++ b/freeplane/META-INF/MANIFEST.MF
@@ -0,0 +1,120 @@
+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.0.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/imgscalr-lib-3.2.jar
+Bundle-Activator: org.freeplane.main.osgi.Activator
+Import-Package: org.osgi.framework,
+ org.osgi.service.url;version="1.0.0"
+Export-Package: 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.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
new file mode 100644
index 0000000..5d3932e
--- /dev/null
+++ b/freeplane/META-INF/OLD_MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Main-Class: org.freeplane.main.application.FreeplaneMain
+Class-Path: ../
+ freeplaneeditor.jar
+ freeplaneviewer.jar
+ freeplanemac.jar
+ commons-lang-2.0.jar
+ forms-1.0.5.jar
+ jortho.jar
+ gnu-regexp-1.1.4.jar
+ SimplyHTML.jar
diff --git a/freeplane/ant/ant.properties b/freeplane/ant/ant.properties
new file mode 100644
index 0000000..5e0dfa7
--- /dev/null
+++ b/freeplane/ant/ant.properties
@@ -0,0 +1,12 @@
+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.0.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
diff --git a/freeplane/ant/build.xml b/freeplane/ant/build.xml
new file mode 100644
index 0000000..8acdd8f
--- /dev/null
+++ b/freeplane/ant/build.xml
@@ -0,0 +1,232 @@
+<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="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}:${imgscalr.jar}:${forms.jar}:${SimplyHTML.jar}:${jortho.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">
+ <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="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}">
+ <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}" />
+ </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}" />
+ </jar>
+ </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="jar, osgi_build">
+ <jar jarfile="${freeplaneosgi.jar}">
+ <fileset dir="${build}">
+ <include name="**/osgi/**" />
+ </fileset>
+ </jar>
+ </target>
+
+ <target name="dist" depends="jar, 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="**/*~" />
+ </delete>
+ </target>
+
+</project>
+
diff --git a/freeplane/doc/FilterConsumer.jpg b/freeplane/doc/FilterConsumer.jpg
new file mode 100644
index 0000000..b65c8e8
Binary files /dev/null and b/freeplane/doc/FilterConsumer.jpg differ
diff --git a/freeplane/doc/FilterConsumerEnd.jpg b/freeplane/doc/FilterConsumerEnd.jpg
new file mode 100644
index 0000000..6cf0a45
Binary files /dev/null and b/freeplane/doc/FilterConsumerEnd.jpg differ
diff --git a/freeplane/doc/FilterConsumerUnfold.jpg b/freeplane/doc/FilterConsumerUnfold.jpg
new file mode 100644
index 0000000..def2999
Binary files /dev/null and b/freeplane/doc/FilterConsumerUnfold.jpg differ
diff --git a/freeplane/doc/Images/doc/BackgroundContextMenu.png b/freeplane/doc/Images/doc/BackgroundContextMenu.png
new file mode 100644
index 0000000..70a16e1
Binary files /dev/null and b/freeplane/doc/Images/doc/BackgroundContextMenu.png differ
diff --git a/freeplane/doc/Images/doc/BackgroundContextMenu_nl.png b/freeplane/doc/Images/doc/BackgroundContextMenu_nl.png
new file mode 100644
index 0000000..5f70e55
Binary files /dev/null and b/freeplane/doc/Images/doc/BackgroundContextMenu_nl.png differ
diff --git a/freeplane/doc/Images/doc/HotKeysTable.png b/freeplane/doc/Images/doc/HotKeysTable.png
new file mode 100644
index 0000000..e80ed86
Binary files /dev/null and b/freeplane/doc/Images/doc/HotKeysTable.png differ
diff --git a/freeplane/doc/Images/doc/HotKeysTable_nl.png b/freeplane/doc/Images/doc/HotKeysTable_nl.png
new file mode 100644
index 0000000..47a9b14
Binary files /dev/null and b/freeplane/doc/Images/doc/HotKeysTable_nl.png differ
diff --git a/freeplane/doc/Images/doc/In-lineEditContextMenu.png b/freeplane/doc/Images/doc/In-lineEditContextMenu.png
new file mode 100644
index 0000000..1b4c3a7
Binary files /dev/null and b/freeplane/doc/Images/doc/In-lineEditContextMenu.png differ
diff --git a/freeplane/doc/Images/doc/MenusPropertiesPanel.png b/freeplane/doc/Images/doc/MenusPropertiesPanel.png
new file mode 100644
index 0000000..9b4d112
Binary files /dev/null and b/freeplane/doc/Images/doc/MenusPropertiesPanel.png differ
diff --git a/freeplane/doc/Images/doc/MenusPropertiesPanel_nl.png b/freeplane/doc/Images/doc/MenusPropertiesPanel_nl.png
new file mode 100644
index 0000000..163b6af
Binary files /dev/null and b/freeplane/doc/Images/doc/MenusPropertiesPanel_nl.png differ
diff --git a/freeplane/doc/Images/doc/NodeContextMenu.png b/freeplane/doc/Images/doc/NodeContextMenu.png
new file mode 100644
index 0000000..33c3e89
Binary files /dev/null and b/freeplane/doc/Images/doc/NodeContextMenu.png differ
diff --git a/freeplane/doc/Images/doc/freeplaneApplications.png b/freeplane/doc/Images/doc/freeplaneApplications.png
new file mode 100644
index 0000000..353f04c
Binary files /dev/null and b/freeplane/doc/Images/doc/freeplaneApplications.png differ
diff --git a/freeplane/doc/Images/key/F1.png b/freeplane/doc/Images/key/F1.png
new file mode 100644
index 0000000..3676576
Binary files /dev/null and b/freeplane/doc/Images/key/F1.png differ
diff --git a/freeplane/doc/Images/key/F2.png b/freeplane/doc/Images/key/F2.png
new file mode 100644
index 0000000..d00316b
Binary files /dev/null and b/freeplane/doc/Images/key/F2.png differ
diff --git a/freeplane/doc/Images/key/Ins.png b/freeplane/doc/Images/key/Ins.png
new file mode 100644
index 0000000..c450556
Binary files /dev/null and b/freeplane/doc/Images/key/Ins.png differ
diff --git a/freeplane/doc/Images/key/alt.png b/freeplane/doc/Images/key/alt.png
new file mode 100644
index 0000000..f48bb84
Binary files /dev/null and b/freeplane/doc/Images/key/alt.png differ
diff --git a/freeplane/doc/Images/key/ctrl.png b/freeplane/doc/Images/key/ctrl.png
new file mode 100644
index 0000000..00d570e
Binary files /dev/null and b/freeplane/doc/Images/key/ctrl.png differ
diff --git a/freeplane/doc/Images/key/delete.png b/freeplane/doc/Images/key/delete.png
new file mode 100644
index 0000000..b17bdd6
Binary files /dev/null and b/freeplane/doc/Images/key/delete.png differ
diff --git a/freeplane/doc/Images/key/down.png b/freeplane/doc/Images/key/down.png
new file mode 100644
index 0000000..cc11245
Binary files /dev/null and b/freeplane/doc/Images/key/down.png differ
diff --git a/freeplane/doc/Images/key/end.png b/freeplane/doc/Images/key/end.png
new file mode 100644
index 0000000..f777b10
Binary files /dev/null and b/freeplane/doc/Images/key/end.png differ
diff --git a/freeplane/doc/Images/key/enter.png b/freeplane/doc/Images/key/enter.png
new file mode 100644
index 0000000..6fbbf12
Binary files /dev/null and b/freeplane/doc/Images/key/enter.png differ
diff --git a/freeplane/doc/Images/key/esc.png b/freeplane/doc/Images/key/esc.png
new file mode 100644
index 0000000..e902c56
Binary files /dev/null and b/freeplane/doc/Images/key/esc.png differ
diff --git a/freeplane/doc/Images/key/home.png b/freeplane/doc/Images/key/home.png
new file mode 100644
index 0000000..1a36115
Binary files /dev/null and b/freeplane/doc/Images/key/home.png differ
diff --git a/freeplane/doc/Images/key/insert.png b/freeplane/doc/Images/key/insert.png
new file mode 100644
index 0000000..8bfe836
Binary files /dev/null and b/freeplane/doc/Images/key/insert.png differ
diff --git a/freeplane/doc/Images/key/left.png b/freeplane/doc/Images/key/left.png
new file mode 100644
index 0000000..48b90b4
Binary files /dev/null and b/freeplane/doc/Images/key/left.png differ
diff --git a/freeplane/doc/Images/key/pgdn.png b/freeplane/doc/Images/key/pgdn.png
new file mode 100644
index 0000000..6af8c92
Binary files /dev/null and b/freeplane/doc/Images/key/pgdn.png differ
diff --git a/freeplane/doc/Images/key/pgup.png b/freeplane/doc/Images/key/pgup.png
new file mode 100644
index 0000000..dc6a792
Binary files /dev/null and b/freeplane/doc/Images/key/pgup.png differ
diff --git a/freeplane/doc/Images/key/right.png b/freeplane/doc/Images/key/right.png
new file mode 100644
index 0000000..a2008ea
Binary files /dev/null and b/freeplane/doc/Images/key/right.png differ
diff --git a/freeplane/doc/Images/key/shift.png b/freeplane/doc/Images/key/shift.png
new file mode 100644
index 0000000..107b2a7
Binary files /dev/null and b/freeplane/doc/Images/key/shift.png differ
diff --git a/freeplane/doc/Images/key/space.png b/freeplane/doc/Images/key/space.png
new file mode 100644
index 0000000..c9caa65
Binary files /dev/null and b/freeplane/doc/Images/key/space.png differ
diff --git a/freeplane/doc/Images/key/tab.png b/freeplane/doc/Images/key/tab.png
new file mode 100644
index 0000000..9425a0b
Binary files /dev/null and b/freeplane/doc/Images/key/tab.png differ
diff --git a/freeplane/doc/Images/key/up.png b/freeplane/doc/Images/key/up.png
new file mode 100644
index 0000000..250d57e
Binary files /dev/null and b/freeplane/doc/Images/key/up.png differ
diff --git a/freeplane/doc/Images/mouse/mouse.png b/freeplane/doc/Images/mouse/mouse.png
new file mode 100644
index 0000000..04fc016
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse.png differ
diff --git a/freeplane/doc/Images/mouse/mouse_LB.png b/freeplane/doc/Images/mouse/mouse_LB.png
new file mode 100644
index 0000000..88e2b72
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse_LB.png differ
diff --git a/freeplane/doc/Images/mouse/mouse_LB_2x.png b/freeplane/doc/Images/mouse/mouse_LB_2x.png
new file mode 100644
index 0000000..b2aee65
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse_LB_2x.png differ
diff --git a/freeplane/doc/Images/mouse/mouse_RB.png b/freeplane/doc/Images/mouse/mouse_RB.png
new file mode 100644
index 0000000..d8a94c3
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse_RB.png differ
diff --git a/freeplane/doc/Images/mouse/mouse_SB_click.png b/freeplane/doc/Images/mouse/mouse_SB_click.png
new file mode 100644
index 0000000..84fa899
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse_SB_click.png differ
diff --git a/freeplane/doc/Images/mouse/mouse_SB_scroll.png b/freeplane/doc/Images/mouse/mouse_SB_scroll.png
new file mode 100644
index 0000000..d9e2ce8
Binary files /dev/null and b/freeplane/doc/Images/mouse/mouse_SB_scroll.png differ
diff --git a/freeplane/doc/examplepicture_nl.JPG b/freeplane/doc/examplepicture_nl.JPG
new file mode 100644
index 0000000..7009b64
Binary files /dev/null and b/freeplane/doc/examplepicture_nl.JPG differ
diff --git a/freeplane/doc/freeplane.jpg b/freeplane/doc/freeplane.jpg
new file mode 100644
index 0000000..a34c7b0
Binary files /dev/null and b/freeplane/doc/freeplane.jpg differ
diff --git a/freeplane/doc/freeplane.mm b/freeplane/doc/freeplane.mm
new file mode 100644
index 0000000..9807e4d
--- /dev/null
+++ b/freeplane/doc/freeplane.mm
@@ -0,0 +1,16313 @@
+<map version="freeplane 1.2.0">
+<!--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.2" STYLE_REF="MainMenu" FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1335991726008" VGAP="0">
+<icon BUILTIN="bee"/>
+<hook NAME="MapStyle">
+ <conditional_styles>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <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"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode TEXT="Definition">
+<font ITALIC="true"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Method">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="OptionalValue" COLOR="#cc3300">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Procedure" COLOR="#006666">
+<font BOLD="true"/>
+<edge COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Exception">
+<icon BUILTIN="messagebox_warning"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Refine">
+<icon BUILTIN="xmag"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="ToNote">
+<icon BUILTIN="yes"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Example">
+<icon BUILTIN="../AttributesView"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="MainMenu" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="horizontal" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="SubMenu" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="MenuGroupLabel" COLOR="#000000" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<edge COLOR="#33ffcc" WIDTH="2"/>
+<attribute_layout NAME_WIDTH="78" VALUE_WIDTH="116"/>
+</stylenode>
+<stylenode TEXT="Title" COLOR="#ffffff" BACKGROUND_COLOR="#2ed2a9" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="horizontal"/>
+</stylenode>
+<stylenode TEXT="IsChecked" COLOR="#cc3300">
+<icon BUILTIN="checked"/>
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="UnChecked" COLOR="#cc3300">
+<icon BUILTIN="unchecked"/>
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Revision">
+<icon BUILTIN="revision"/>
+</stylenode>
+<stylenode TEXT="UserGuide">
+<edge STYLE="horizontal"/>
+</stylenode>
+<stylenode TEXT="ProcedureStep">
+<edge STYLE="bezier"/>
+</stylenode>
+<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.predefined" POSITION="right">
+<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.note">
+<edge COLOR="#cc0000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
+</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>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="1">This documentation is unlike a linear text.<br size="1"/><b>Hover</b> over nodes to reveal its content.<br size="1"/><b>Click</b> nodes to unfold.</font><br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_232622736" CREATED="1320005728532" MODIFIED="1330618265586" HGAP="19" VSHIFT="-108" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneFunctions.mm"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <font size="3"><a href="freeplaneFunctions.mm"><b>Functions</b></a></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click the link to open a mind map with the main functions of Freeplane. Hover the text to reveal hidden links to the descriptions of the functions you see in this <i>Quick reference</i> and in <i>Help > Documentation. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ To return from the index map to this map: select <i>Navigate >Go to previous map </i>(icon in tool bar)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<node ID="ID_766584529" CREATED="1320005728532" MODIFIED="1330615790920" HGAP="-85" VSHIFT="28" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneApplications.mm"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <font size="3"><a href="freeplaneFunctions.mm"><b>Applications</b></a></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click the link to open a mind map with the main applications of Freeplane. An Internet connection is needed to follow the links in the index.<i> </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ To return from the index map to this map: select <i>Navigate >Go to previous map </i>(icon in tool bar)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+</node>
+</node>
+<node TEXT="User guide" STYLE_REF="Title" POSITION="left" ID="ID_1405760079" CREATED="1286914216123" MODIFIED="1330615758144" HGAP="-37" VSHIFT="-60" TEXT_SHORTENED="true">
+<icon BUILTIN="gohome"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This <i>User guide</i> contains basic information
+ </p>
+ <p>
+ to understanding and using Freeplane. If
+ </p>
+ <p>
+ node <i>Quick start</i> is displayed, continue
+ </p>
+ <p>
+ there. Otherwise click me to unfold.
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="bezier"/>
+<node TEXT="Goal" STYLE_REF="UserGuide" ID="ID_910734357" CREATED="1314824090302" MODIFIED="1330617424420" TEXT_SHORTENED="true" HGAP="27" VSHIFT="22" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The goal of this documentation is:
+ </p>
+ <ul>
+ <li>
+ to help the user know what are the possibilities and limitations of Freeplane;
+ </li>
+ <li>
+ to help the user know which procedures are necessary for a particular result;
+ </li>
+ <li>
+ to help the user know which methods are involved in these procedures and where these can be found.
+ </li>
+ </ul>
+ <p>
+ This documentation is not a tutorial.
+ </p>
+ <ul>
+ <li>
+ For a tutorial, visit the tutorial Freeplane contained in the Freeplane Help, <i>Getting started</i>.
+ </li>
+ </ul>
+ <p>
+ This documentation is not a course in mind mapping.
+ </p>
+ <ul>
+ <li>
+ To learn more about mind mapping, visit the wiki Tutorial Freeplane. Click the red arrow in <i>Overview</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node STYLE_REF="UserGuide" FOLDED="true" ID="ID_1108028010" CREATED="1309552935597" MODIFIED="1330617373607" HGAP="27" TEXT_SHORTENED="true" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" MIN_WIDTH="80"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane">Overview</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This documentation is additional to the<a href="freeplaneTutorial.mm"> Quick reference </a>of Freeplane, see Freeplane's main menu <i> Help > Getting started</i>. Click the red arrow for an introduction to mind mapping and a tutorial Freeplane on Internet.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ This documentation is unlike a classical linear presentation of information. It is set up as a source of information which can be used in a way wich is most appropriate for a particular user and situation.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The right hand side of this mind map (node <i>Reference</i>) describes the Freeplane menu's and functionality. You could navigate the <i>Reference</i> to find your information by clicking and hovering nodes. This is easy, you are doing this right now. You can also use finding or filtering to get information. This is more powerful but supposes some experience.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ If you are prepared to use filtering, node <i>Chapter</i> contains a number of node collections which may help you to digest the huge amount of information of the <i>Reference</i>. You can go through the information displayed by each chapter in your own way and order. The chapters are numbered and organized from simple to more advanced.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Node <i>Install</i> describes loading and installing Freeplane and tuning it to your wishes. Node Macintosh describes how to use FP on a Macinitosh, because Macintosh uses a slightly different user interface. Node <i>This</i> <i>documentation</i> describes the principles and techniques underlying this mind map , it gives you an example of how to design and build a complex mind map like this one. It may also help you to still better find information. Node FAQ contains some frequently asked questions. More answers are to be found in the reference. It also contains some known bugs which may bother you.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Recognizing content" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1836270960" CREATED="1310900715782" MODIFIED="1313959373704" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To help you orient in this documentation and find information<br/>more easily, different types of content are displayed by
+ </p>
+ <p>
+ different styles. Click me to see these styles.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Definition" STYLE_REF="Definition" ID="ID_228937336" CREATED="1309618770906" MODIFIED="1311402615666" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All definitions can be regognised by this style.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ It is possible to view a list of all definitions by filtering, see the example.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Method" STYLE_REF="Method" ID="ID_516439573" CREATED="1309618777965" MODIFIED="1311402615681" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A method is a Freeplane action as in a menu item.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="OptionalValue" STYLE_REF="OptionalValue" FOLDED="true" ID="ID_1926379292" CREATED="1310845841441" MODIFIED="1311402754927" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An optional value is a value that can be selected in a menu dialog.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="IsChecked" ID="ID_833160047" CREATED="1312143903870" MODIFIED="1312144371887">
+<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" CREATED="1312143954266" MODIFIED="1312144371902">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+</node>
+<node TEXT="Procedure" STYLE_REF="Procedure" ID="ID_414428824" CREATED="1310838858321" MODIFIED="1311402583810" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A procedure is a description of how methods can be used to realize a particular effect.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Exception" STYLE_REF="Exception" ID="ID_609263580" CREATED="1309891278322" MODIFIED="1311402754943" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An exception is behaviour which may be unexpected.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ToNote" STYLE_REF="ToNote" ID="ID_1172516925" CREATED="1309890992904" MODIFIED="1311402754943" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Information to note attracts attention to relevant related behaviour.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Refine" STYLE_REF="Refine" ID="ID_1719115146" CREATED="1309619037550" MODIFIED="1311402754958" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Information with this style gives more background or more details.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example" STYLE_REF="Example" ID="ID_1648027177" CREATED="1309639156705" MODIFIED="1311402754958" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Information with this style describes an example.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_901482560" CREATED="1312144029512" MODIFIED="1312144398734" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To indicate that a node has been modified.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Example Conditional Map Styles.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="MainMenu" STYLE_REF="MainMenu" ID="ID_1534498435" CREATED="1309691442065" MODIFIED="1311402615697" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Information with this style represents a menu in the <i>Main toolbar.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="MenuGroup" STYLE_REF="MenuGroupLabel" ID="ID_1191898047" CREATED="1310838790219" MODIFIED="1311486685783" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Information with this style summarizes a group of related methods.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+</node>
+</node>
+<node TEXT="Basic terms" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1480936832" CREATED="1309419658445" MODIFIED="1322427235636" TEXT_SHORTENED="true" HGAP="30" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Basically, a mind map consists of <b>nodes </b>
+ </p>
+ <p>
+ and <b>relations between nodes. </b> A node
+ </p>
+ <p>
+ has <b>features</b> and <b>properties</b>.
+ </p>
+ <p>
+ Click me to read more.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Nodes" FOLDED="true" ID="ID_1279930643" CREATED="1309419658459" MODIFIED="1313788412438" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>node</b> is the point in the map which carries the information.
+ </p>
+ <p>
+ It is the basic unit information and usually includes text and
+ </p>
+ <p>
+ images. The text you are currently reading has been entered
+ </p>
+ <p>
+ into this node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<node TEXT="Root/Root node" ID="ID_1163921092" CREATED="1309419658455" MODIFIED="1311402583826" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The <b>root node</b> is the central node in the hierarchy from which all others flow. It.is the oval that is present by default at the centre of Freeplane workspace. It cannot be deleted, nor can there be more than one root.
+ </p>
+ </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" CREATED="1309419658464" MODIFIED="1311402583842" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Parent node</b> is the name of a node that precedes another node in the hierarchy.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Child node" STYLE_REF="Definition" ID="ID_1209680113" CREATED="1309419658467" MODIFIED="1311402583857" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>child node </b>is a node that proceeds another node (its parent) in the hierarchy.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Sibling node" STYLE_REF="Definition" ID="ID_1669709193" CREATED="1309419658469" MODIFIED="1311402583857" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>sibling</b> is a node at the same hierarchical level as a particular other node. Thus if you insert a node, and then another one underneath, you have created a sibling.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Relations are relative" ID="ID_1402619445" CREATED="1309420875668" MODIFIED="1312965676970" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ These family terms can be extended to represent the respective relationship, such as grandparent, grandchild, uncle and so on. Note that the designated terms are relative, thus a node is a child to its parent and a parent to its child and so on.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+</node>
+<node TEXT="Relations" STYLE_REF="Definition" FOLDED="true" ID="ID_1688918449" CREATED="1309419658471" MODIFIED="1314024986687" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane can represent several kinds of relations. Edges are logical relations representing a hierarchy. Connectors are user defined conceptual relations. Other types of relations are summary nodes and clouds. These are described later.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<node TEXT="Edge" STYLE_REF="Definition" FOLDED="true" ID="ID_682300475" CREATED="1309419658485" MODIFIED="1311402583873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An <b>edge</b> is the visual representation of the tree structure. It is the line you see underneath and between the nodes, This line can be hidden.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Characteristics of an egde are:
+ </p>
+ <ul>
+ <li>
+ <b>Edge color:</b> The color of the edge connecting nodes.
+ </li>
+ <li>
+ <b>Edge style:</b> The way an edge bends. If an edge is visible or hidden.
+ </li>
+ <li>
+ <b>Edge width:</b> The thickness of the edge.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<node TEXT="Branch" STYLE_REF="Definition" ID="ID_979063484" CREATED="1309513163069" MODIFIED="1310837396416" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>branch</b> isa group of nodes consisting of a node and all its descendents. A main branch is a branch which starts at the child of the root node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>To branch</b> means to tear off the nodes of a branch and export it to another map.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Connector" STYLE_REF="Definition" ID="ID_1063899671" CREATED="1309419658487" MODIFIED="1310837410816" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>connector</b> is a graphical link that allows for connections outside of the main tree hierarchy. It is an arrow or line between two arbitrary nodes expressing an implicit, user defined meaning. This meaning may be made explicit with a label
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Cloud" STYLE_REF="Definition" ID="ID_1605059702" CREATED="1309509385523" MODIFIED="1310837422750" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>cloud</b> is a visual wrapper for a group of nodes which are part of a branch. The group is an attribute of a node and contains this node and all of its descendants.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Summary Node" STYLE_REF="Definition" ID="ID_1358837812" CREATED="1309419658489" MODIFIED="1310837434310" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>summary node</b> is a graphical structure representing a user defined group of siblings. The first and last element of the group are indicated by the end point of an accollade. The central point of the group points to a node, the actual summary node, which contains information about the group.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Node features" ID="ID_1372334594" CREATED="1309631960680" MODIFIED="1311012855822" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Node features</b> are additional features that can be added to a basic node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Examples are notes, attributes, hyperlinks and images.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node properties" ID="ID_395697976" CREATED="1309632189617" MODIFIED="1310196223417" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Node properties</b> are (mostly visible) aspects of nodes, relations and node features. Examples are the color and size of text.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also:</b>
+ </p>
+ <ul>
+ <li>
+ <i>Formatting</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Chapter guide" STYLE_REF="UserGuide" FOLDED="true" ID="ID_919267416" CREATED="1311398738170" MODIFIED="1335990999585" TEXT_SHORTENED="true" HGAP="30" VSHIFT="3"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Guide for learning the Freeplane menu´s </b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To view the following chapters, apply <b> filter rule </b>
+ </p>
+ <ol>
+ <li>
+ <i>Chapter > 1. My first mind map </i> (Chapter,Contains,1)
+ </li>
+ <li>
+ <i>Chapter > 2. Handling nodes </i> (Chapter,Contains,2)
+ </li>
+ <li>
+ <i>Chapter > 3. Main Node features </i>(Chapter,Contains,3)
+ </li>
+ <li>
+ <i>Chapter > 4. Format & Style </i> (Chapter,Contains,4)
+ </li>
+ <li>
+ <i>Chapter > 5. Date, Time & Reminder </i> (Chapter,Contains,5)
+ </li>
+ <li>
+ <i>Chapter > 6. Moving & Publishing maps </i>(Chapter,Contains,6)
+ </li>
+ <li>
+ <i>Chapter > 7. Scripts & Formulas </i>(Chapter,Contains,7)
+ </li>
+ <li>
+ <i>Chapter > 8. Security & Preferences </i>(Chapter,Contains,8)
+ </li>
+ </ol>
+ <p>
+ When filtering, check <b>filer conditions</b>:
+ </p>
+ <ul>
+ <li>
+ Show ancestors: <b>OFF</b>
+ </li>
+ <li>
+ Show descendants: <b>OFF</b>
+ </li>
+ <li>
+ Applies to filtered node <b>OFF</b>
+ </li>
+ <li>
+ Unfold all descendants hidden after filtering: <b>ON</b>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Explanation of filtering in children of <i>1. My first mind map </i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
+<node TEXT="Content" ID="ID_1750213503" CREATED="1311482029110" MODIFIED="1311482095324" HGAP="50" VSHIFT="-10">
+<font BOLD="true"/>
+<edge STYLE="hide_edge"/>
+</node>
+<node TEXT="My first mind map" FOLDED="true" ID="ID_829890234" CREATED="1310822521013" MODIFIED="1314075831024" TEXT_SHORTENED="true" NUMBERED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use filtering to show all nodes for getting started. For this, define and filter (Chapter,Contains,1):
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1. In the first thee fields of the filter menu bar select/enter:
+ </p>
+ <ul>
+ <li>
+ <i>Chapter</i> ( N.B. Type C to scroll to menu item starting with C)
+ </li>
+ <li>
+ <i>Contains</i>
+ </li>
+ <li>
+ <i>1</i>
+ </li>
+ </ul>
+ <p>
+ 2. Check filter conditions:
+ </p>
+ <ul>
+ <li>
+ short cut icon <i>Unfold hidden nodes after filtering </i><b>ON</b>
+ </li>
+ <li>
+ short cut icon <i>Show ancestors </i><b>OFF</b>
+ </li>
+ </ul>
+ <p>
+ 3. Press <i>Esc</i> followed by <i>Alt + Enter </i>to make visible all nodes
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 4. Select short cut icon <i>Quick filter</i> to make appear all nodes of Chapter 1
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 5 Move the cursor in turn over every node to make it show its content. Read the content.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ When finished:
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 6. Select short cut icon <i>No Filtering </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p style="text-align: left">
+ <b>See the nodes to the left for the complete procedure and the icon-buttons that can be used.</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Define filter rule" FOLDED="true" ID="ID_1670868929" CREATED="1310821479686" MODIFIED="1311402544217">
+<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" CREATED="1310820732631" MODIFIED="1313822510587" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If you type C, the windows scrolls down to items beginning with C.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Select: Contains" STYLE_REF="ProcedureStep" ID="ID_1048644932" CREATED="1310820745993" MODIFIED="1313822510603">
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Select/Enter: 1" STYLE_REF="ProcedureStep" ID="ID_48466550" CREATED="1310820789556" MODIFIED="1313822510603">
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Three entry fields in Toolbar" ID="ID_545396005" CREATED="1311317134192" MODIFIED="1311402544233">
+<hook NAME="SummaryNode"/>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+</node>
+<node TEXT="Do filter" STYLE_REF="Procedure" FOLDED="true" ID="ID_1044635142" CREATED="1313822942388" MODIFIED="1313822964806">
+<node TEXT="Press Quick Filter" STYLE_REF="ProcedureStep" ID="ID_1699746394" CREATED="1310820822433" MODIFIED="1313822887328">
+<icon BUILTIN="../apply_quick_filter"/>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_1477283067" CREATED="1310819865458" MODIFIED="1313822887328">
+<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" CREATED="1311316685082" MODIFIED="1311485080494">
+<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" CREATED="1310819950485" MODIFIED="1313822545781">
+<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" CREATED="1310820023813" MODIFIED="1313822545797">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_588285753" CREATED="1310820191451" MODIFIED="1313822545781">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+</node>
+<node TEXT="See icon-buttons in Toolbar" ID="ID_1962045856" CREATED="1310821392950" MODIFIED="1311402544233">
+<attribute NAME="Chapter" VALUE="0"/>
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="To end filter 1. My first mind map" FOLDED="true" ID="ID_1678666271" CREATED="1310821779644" MODIFIED="1313823042462">
+<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" CREATED="1310822117674" MODIFIED="1313823060839">
+<icon BUILTIN="../remove_filtering"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_1663841014" CREATED="1310821238510" MODIFIED="1313823060855">
+<hook NAME="FirstGroupNode"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_1495450969" CREATED="1310821255419" MODIFIED="1313823060855">
+<icon BUILTIN="../fold_all"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Fold all nodes" ID="ID_1931349122" CREATED="1310821426631" MODIFIED="1311402583951">
+<hook NAME="SummaryNode"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+</node>
+</node>
+<node TEXT="Handling nodes" ID="ID_1153833253" CREATED="1309552935597" MODIFIED="1311485855519" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use filtering to show all nodes. For this, define and filter (Chapter,Contains,2):
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1. In the first thee fields of the filter menu bar select/enter:
+ </p>
+ <ul>
+ <li>
+ <i>Chapter</i>
+ </li>
+ <li>
+ <i>Contains</i>
+ </li>
+ <li>
+ <i>2</i>
+ </li>
+ </ul>
+ <p>
+ 2. See the procedure of Chapter <i>1. My first mind map</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Node features" ID="ID_1790476268" CREATED="1311316250037" MODIFIED="1311486045059" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,3).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Format & Style" ID="ID_1115783310" CREATED="1311337025606" MODIFIED="1312922136677" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,4).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Date, Time & Reminder" ID="ID_13139289" CREATED="1311333932581" MODIFIED="1312922146068" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,5).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Moving & Publishing maps" ID="ID_70860166" CREATED="1311343174255" MODIFIED="1312922155678" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,6).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Scripts & Formulas" ID="ID_1425593168" CREATED="1311343136286" MODIFIED="1312922163665" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,7).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Security & Preferences" ID="ID_1563209179" CREATED="1311337201372" MODIFIED="1312922171028" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,8).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="9.Finding & Filtering" ID="ID_1111099001" CREATED="1313955285022" MODIFIED="1313955442084" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="9"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see the nodes of this chapter, filter (Chapter,Contains,9).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>1. My first mind map</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Appendix" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1016814885" CREATED="1313758924679" MODIFIED="1313823254623">
+<node TEXT="Show all definitions" FOLDED="true" ID="ID_1066951352" CREATED="1310722013900" MODIFIED="1311486841550" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Example </b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To show all and only all definitions:
+ </p>
+ <ul>
+ <li>
+ set the 4 conditions as shown for the icon-buttons, in the Filter toolbar.; and
+ </li>
+ <li>
+ define in the Fiter toolbar filter (<i>Class, Contains, Definition);</i> and
+ </li>
+ <li>
+ press <i>icon-Quick filter</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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_235662859" CREATED="1310913088700" MODIFIED="1313823790328" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Check if the icon-buttons shown to the left are all unpressed, or Press to unpress.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_173119044" CREATED="1310819865458" MODIFIED="1313823830794">
+<icon BUILTIN="../show_ancestors"/>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Show Descendants: Off" STYLE_REF="ProcedureStep" ID="ID_685714769" CREATED="1310819950485" MODIFIED="1313823830794">
+<icon BUILTIN="../show_descendants"/>
+</node>
+<node TEXT="Unfold all nodes hidden after filtering: Off" STYLE_REF="ProcedureStep" ID="ID_1351621161" CREATED="1310820023813" MODIFIED="1313823830794">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+</node>
+<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_1625012504" CREATED="1310820191451" MODIFIED="1313823830794">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+</node>
+</node>
+<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1616604166" CREATED="1310913172416" MODIFIED="1313823790343">
+<node TEXT="Select root node (press Esc)" ID="ID_385659674" CREATED="1310821238510" MODIFIED="1310821551509">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Press: Unfold all descendants" ID="ID_1954125202" CREATED="1310821255419" MODIFIED="1310821336463">
+<icon BUILTIN="../unfold_all"/>
+</node>
+</node>
+<node TEXT="Define filter" STYLE_REF="UserGuide" FOLDED="true" ID="ID_989011629" CREATED="1313823175755" MODIFIED="1313823790328">
+<node TEXT="Select: Class" ID="ID_1042564393" CREATED="1310820732631" MODIFIED="1310821479686">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Select: Contains" ID="ID_1553005293" CREATED="1310820745993" MODIFIED="1310820756976"/>
+<node TEXT="Select: Definition" ID="ID_695746856" CREATED="1310820789556" MODIFIED="1310820798012"/>
+<node TEXT="Press Quick Filter" ID="ID_1377895866" CREATED="1310820822433" MODIFIED="1310820854679">
+<icon BUILTIN="../apply_quick_filter"/>
+</node>
+</node>
+<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1694191165" CREATED="1310821779644" MODIFIED="1313823790328">
+<node TEXT="Press: Undo filter" ID="ID_738883159" CREATED="1310822117674" MODIFIED="1310822194279">
+<icon BUILTIN="../remove_filtering"/>
+</node>
+<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_352017968" CREATED="1310821238510" MODIFIED="1313823894052">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_548666264" CREATED="1310821255419" MODIFIED="1313823894052">
+<icon BUILTIN="../fold_all"/>
+</node>
+<node TEXT="Fold all nodes" ID="ID_214673967" CREATED="1310821426631" MODIFIED="1310821850515">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="Show all about filtering" FOLDED="true" ID="ID_1873380309" CREATED="1310134532663" MODIFIED="1311487014492" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Example</b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To view all nodes concerning filtering, define and apply a filter in the following way:
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1 Set the filter rule by selecting in the Filter Tool bar:
+ </p>
+ <ul>
+ <li>
+ <i>Node Text </i>(default value, or select from left drop down menu)
+ </li>
+ <li>
+ <i>Contains (default value, or </i>select from next drop down menu)
+ </li>
+ <li>
+ <i>filter</i> (type "filter" in third, edit window)
+ </li>
+ </ul>
+ <p>
+ 2. Select <i>Esc</i> followed by <i>Alt + End</i> and press <i>Quick filter. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Now all nodes are showing which are related to filtering. Also <i>No Filter</i> is unset.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 3. When you are finished reading the nodes
+ </p>
+ <ul>
+ <li>
+ select No filter to restore the unfilter condition
+ </li>
+ <li>
+ press <i>Esc</i> followed by <i>Fold all nodes</i>
+ </li>
+ </ul>
+ </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" CREATED="1310913088700" MODIFIED="1313823872649" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Check if the icon-buttons shown to the left are all unpressed, or Press to unpress.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Show Ancestors: Off" ID="ID_495695197" CREATED="1310819865458" MODIFIED="1310821392966">
+<icon BUILTIN="../show_ancestors"/>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Show Descendants: Off" ID="ID_878732630" CREATED="1310819950485" MODIFIED="1310819980625">
+<icon BUILTIN="../show_descendants"/>
+</node>
+<node TEXT="Unfold all nodes hidden after filtering: Off" ID="ID_1394638468" CREATED="1310820023813" MODIFIED="1310820087805">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+</node>
+<node TEXT="Applies to filtered nodes: Off" ID="ID_1342621920" CREATED="1310820191451" MODIFIED="1310820292758">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+</node>
+</node>
+<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1859325076" CREATED="1310913172416" MODIFIED="1313823872649">
+<node TEXT="Select root node (press Esc)" ID="ID_956693368" CREATED="1310821238510" MODIFIED="1310821551509">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Press: Unfold all descendants" ID="ID_205411813" CREATED="1310821255419" MODIFIED="1310821336463">
+<icon BUILTIN="../unfold_all"/>
+</node>
+</node>
+<node TEXT="Define filter rule" STYLE_REF="UserGuide" FOLDED="true" ID="ID_226284160" CREATED="1313823317390" MODIFIED="1313823872649">
+<node TEXT="Select: Node text" ID="ID_1734926057" CREATED="1310820732631" MODIFIED="1310821733866">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Select: Contains" ID="ID_7376434" CREATED="1310820745993" MODIFIED="1310820756976"/>
+<node TEXT="Type: filter" ID="ID_1345958489" CREATED="1310820789556" MODIFIED="1310821753693"/>
+<node TEXT="Press Quick Filter" ID="ID_338438421" CREATED="1310820822433" MODIFIED="1310820854679">
+<icon BUILTIN="../apply_quick_filter"/>
+</node>
+</node>
+<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1679478175" CREATED="1310821779644" MODIFIED="1313823872649">
+<node TEXT="Press: Undo filter" ID="ID_407446498" CREATED="1310822117674" MODIFIED="1310822194279">
+<icon BUILTIN="../remove_filtering"/>
+</node>
+<node TEXT="Select root node (press Esc)" ID="ID_647928992" CREATED="1310821238510" MODIFIED="1310821551509">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Press: Fold all descendants" ID="ID_1201115927" CREATED="1310821255419" MODIFIED="1310822238084">
+<icon BUILTIN="../fold_all"/>
+</node>
+<node TEXT="Fold all nodes" ID="ID_426393770" CREATED="1310821426631" MODIFIED="1310821850515">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Install" STYLE_REF="UserGuide" FOLDED="true" ID="ID_931855473" CREATED="1311401499171" MODIFIED="1330617400176" HGAP="26" VSHIFT="4" MIN_WIDTH="80">
+<node TEXT="Download" FOLDED="true" ID="_Freeplane_Link_904501221" CREATED="1270892460638" MODIFIED="1317904760841" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ On the Freeplane wiki separe support pages exist for different operating systems.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Freeplane's homepage" ID="ID_916980386" CREATED="1270892460631" MODIFIED="1271530957733" LINK="http://freeplane.sourceforge.net">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Windows platform" STYLE_REF="Functiegroep" FOLDED="true" ID="_Freeplane_Link_139664576" CREATED="1270892460640" MODIFIED="1321132866236" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000">To install Freeplane on Microsoft Windows, install Java from Sun and install Freeplane using the Freeplane installer.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Download Java Runtime Environment (at least J2RE1.5)" ID="ID_1620747952" CREATED="1270892460639" MODIFIED="1310243329632" LINK="http://java.sun.com/javase/downloads/index.jsp" TEXT_SHORTENED="true">
+<icon BUILTIN="full-1"/>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Most of the times this is done automatically when downloading Freeplane form the Freeplane home page.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Download Freeplane application" ID="_Freeplane_Link_1612101865" CREATED="1270892460640" MODIFIED="1310243335684" LINK="http://freeplane.sourceforge.net" TEXT_SHORTENED="true">
+<icon BUILTIN="full-2"/>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Most of the times this is done automatically when downloading Freeplane form the Freeplane home page.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Install dictionaries for spell check" ID="ID_375945761" CREATED="1310243241880" MODIFIED="1310243496708">
+<icon BUILTIN="full-3"/>
+</node>
+</node>
+<node TEXT="Linux platform" STYLE_REF="Functiegroep" ID="ID_839470339" CREATED="1289029709910" MODIFIED="1310244076935" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">To install Freeplane on Linux, download the Java Runtime Environment and the Freeplane application itself. First install Java, then unpack Freeplane. To run Freeplane, execute freeplane.sh.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Ubuntu" ID="ID_461043347" CREATED="1317904627326" MODIFIED="1317904637466"/>
+<node TEXT=" MAC platform" STYLE_REF="Functiegroep" ID="ID_1956173686" CREATED="1289029737710" MODIFIED="1310244086061" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">To install Freeplane on Mac OS X first use the built in Software Update feature to ensure that you have all the latest available updates, especially Java. Software Update is located under the Apple logo menu in the top left-hand corner of the screen. Then download a Mac-specific version of Freeplane. The .dmg version is easiest to install, though a .zip version may also be available. When the download is complete, the file may be automatically mounted (or un-zipped) depending on your Web browser settings. Otherwise either double-click on the downloaded .dmg file to "mount" it, or double-click on the downloaded .zip file to un-zip it. Now you should see a Freeplane application icon, which you can drag to your Applications folder. Then you may optionally create an alias (short-cut) on the Desktop, and/or on the Dock. To run Freeplane, either double-click on its application icon (in the Applications folder) or on its Desktop short-cut, or click once on its icon in the Dock. The Freeplane Wiki has Macintosh page with more information.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Portable Freeplane" ID="ID_252894978" CREATED="1317904658613" MODIFIED="1317904669815"/>
+<node ID="ID_797098004" CREATED="1321132866220" MODIFIED="1321132971986"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wiki <a href="http://freeplane.sourceforge.net/wiki/index.php/Support">Download help</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+<node TEXT="Install" FOLDED="true" ID="Freeplane_Link_1822195277" CREATED="1270892460697" MODIFIED="1310903701338" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To set preferences
+ </p>
+ <ul>
+ <li>
+ select <i>Tools > Preferences.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="System language" ID="ID_172050805" CREATED="1271856103992" MODIFIED="1310282001239" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To change the language used in Freeplane menu's:
+ </p>
+ <ul>
+ <li>
+ select <i>Tools > Preferences > Environment > Language;</i>
+ </li>
+ <li>
+ select your language
+ </li>
+ <li>
+ restart Freeplane
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ "language"Atomatic chooses the language of your operating system
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Spell check dictionaries" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" CREATED="1271096394315" MODIFIED="1317837958205" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Add-on" ID="ID_622849479" CREATED="1319486393257" MODIFIED="1319486932024" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Particular preferences of Freeplane are installable and kept in the Freeplane user directory (see Tools->Open user directory). An add-on is a package of some or all of these features, which can be installed at once.<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons">Read more...</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Automatic backup" ID="ID_595250711" CREATED="1271096741387" MODIFIED="1310281994968" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Freeplane creates a subfolder named .backup in each folder which contains edited maps. Old map versions are saved there, along with automatically-saved copies of edited maps. These copies are named with the file extension "<i>.autosave</i>". </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">By default, an automatic save happens every minute, and the last 10 autosave files are kept as protection against accidental termination of Freeplane, e.g. on computer shutdown. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">To restore an automatically-saved file, you must manually rename it to remove the ".autosave" extension and the preceding sequence number. By default, sequence numbers range from 1 to 10. For instance, to restore "freeplane.mm" from the most recent autosave file, rename (or copy) ".backup\freeplane.mm.10.autosave" to "freeplane.mm". </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Automatic save and backup can be adjusted to your needs via Tools > Preferences > Environment > Automatic Save.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Set MM indexing in Windows7" ID="ID_952466464" CREATED="1313349075257" MODIFIED="1313350719165" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add the content of mind maps to the Windows 7 filtering mechanism:
+ </p>
+ <ul>
+ <li>
+ Go to Control Panel -> indexing options; or type in Help ""indexing"
+ </li>
+ <li>
+ Choose "Advanced". This gives you a page with two tabs -- "Index Settings" and "File Types"
+ </li>
+ <li>
+ Choose the "File Types" tab
+ </li>
+ <li>
+ Scroll through the list of files there till you come to ".mm"
+ </li>
+ <li>
+ The filter description will say "File Properties Filter"
+ </li>
+ <li>
+ Click the second radio button beneath, which says "Index Properties and File contents. The filter description should now change to "Plain text filter"
+ </li>
+ <li>
+ Choose OK to leave the dialog. The indexing will restart and when it is finished, the index is available.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ Standardly only node properties are indexed, not content. The above procedure also adds the content to the filtering mechanism
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Personalized system icons" ID="ID_1121692870" CREATED="1318534739168" MODIFIED="1318535378334"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All system icons can be replaced by personalized items.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ In de freeplane directory,
+ </p>
+ <ul>
+ <li>
+ Open the freeplane system files and locate the files freeplaneeditar.jar and freeplaneviewe.jar.
+ </li>
+ <li>
+ rename these files into freeplaneeditar.zip and freeplaneviewe.zip
+ </li>
+ <li>
+ Extract both zip directories.
+ </li>
+ <li>
+ find in each extracted directory the image directory, here you find all icon files.
+ </li>
+ <li>
+ find the name of the icon you want to replace
+ </li>
+ </ul>
+ <p>
+ Now open in Freeplane menu Tools > Open user directory
+ </p>
+ <ul>
+ <li>
+ make or open directory resources/images
+ </li>
+ <li>
+ save the new icon with the name you found above
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ Resart Freeplane. The new system icon should be shown in stead of the old.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_480781217" CREATED="1270892460643" MODIFIED="1330617405478" TEXT_SHORTENED="true" HGAP="27" VSHIFT="1" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Freeplane recently added full support for Apple's Mac OS X operating system. Some of the documentation is still oriented toward PC users running Windows or Linux. Mac users will be able to follow along by keeping some differences in mind, listed below.</span></font>
+ </p>
+ <ul>
+ <li>
+ <span onclick="show_folder('1_1')" class="foldclosed" id="show1_1">+</span> <span onclick="hide_folder('1_1')" class="foldopened" id="hide1_1">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Command key versus the Ctrl (control) key</span></font>
+
+ <ul id="fold1_1">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">When Freeplane runs under Mac OS X, you generally will use the Apple Command key rather than the "control" key, which is labelled Ctrl on a PC. The Command key is marked with a cloverleaf ⌘ symbol, and may also be captioned as "command" or "cmd", or be marked with an Apple logo.</span></font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">When you see the Ctrl key mentioned in Freeplane's documentation, in most cases you should use the Command key instead.</span></font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">In a very few cases, even on your Mac, Freeplane actually requires using the "control" key rather than the Command key. In these cases, this document refers to the key explicitly as Control, for emphasis. In other cases, if the documentation refers to the Ctrl key, yet the Command key fails to work as a substitute on your Mac, try the "control" key instead.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_2')" class="foldclosed" id="show1_2">+</span> <span onclick="hide_folder('1_2')" class="foldopened" id="hide1_2">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Mice, Right Clicks and Context Menus</span></font>
+
+ <ul id="fold1_2">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Many Apple-branded mice and trackpads have only one click-able "button." To bring up a context-sensitive menu (or "context menu"), Mac users can hold down the Control key while clicking the mouse (abbreviated as "Control + click"). Yes, use the Control key here, rather than the Command key, because this function is built into Mac OS X so Freeplane cannot change it. Apple makes Control + click equivalent to the "right click" which is available on mice with two buttons.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_3')" class="foldclosed" id="show1_3">+</span> <span onclick="hide_folder('1_3')" class="foldopened" id="hide1_3">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Menu Differences</span></font>
+
+ <ul id="fold1_3">
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">A few menu items are relocated in accordance with Mac OS X standards. These are listed below.</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Help > About is moved to the Freeplane application menu > About Freeplane.</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Tools > Preferences is moved to the Freeplane application menu > Preferences.</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">File > Quit is moved to the Freeplane application menu > Quit Freeplane.</span></font>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_4')" class="foldclosed" id="show1_4">+</span> <span onclick="hide_folder('1_4')" class="foldopened" id="hide1_4">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Zooming</span></font>
+
+ <ul id="fold1_4">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Mac OS X provides a means to zoom in on (magnify) part of the screen, by holding down the Control key while turning the mouse wheel forward. This facility is built into the Mac operating system, so the function is unavailable for Freeplane to use for control of its own Zoom function. So Mac users must use one of the alternate means which Freeplane provides to adjust its zoom level. </span></font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">If you are unfamiliar with OS X's Control + mouse wheel function, be aware that some mouse functions become awkward to use, or even unusable, while zoomed in. To return the screen to normal, hold down the Conrol key and turn the mouse wheel backward to zoom back out all the way.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_5')" class="foldclosed" id="show1_5">+</span> <span onclick="hide_folder('1_5')" class="foldopened" id="hide1_5">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Freeplane Wiki</span></font>
+
+ <ul id="fold1_5">
+ <li>
+ <a target="_blank" href="http://freeplane.sourceforge.net/wiki/index.php/Macintosh"><span class="l">~</span> <font color="#000000" face="SansSerif, sans-serif"><span style="font-family: SansSerif, sans-serif; color: #000000">Visit the Macintosh page on Freeplane's online Wiki to learn more about running Freeplane on a Mac.</span></font> </a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="This Documentation" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1263067716" CREATED="1311401568817" MODIFIED="1330617389863" HGAP="28" VSHIFT="4">
+<node FOLDED="true" ID="ID_518502200" CREATED="1309618730385" MODIFIED="1312922288130"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: centre">
+ Making This Documentation 1.2
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Use Design principles" FOLDED="true" ID="ID_1034693607" CREATED="1309694957628" MODIFIED="1310196223167" TEXT_SHORTENED="true">
+<node TEXT="Easy use" FOLDED="true" ID="ID_971999971" CREATED="1309695171606" MODIFIED="1310196223167" TEXT_SHORTENED="true">
+<node TEXT="Target group: educated laymen" FOLDED="true" ID="ID_650466721" CREATED="1309695100454" MODIFIED="1310196223151" TEXT_SHORTENED="true">
+<node TEXT="The visually limited" ID="ID_1067605334" CREATED="1309695629927" MODIFIED="1310196223151" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ High contrast
+ </li>
+ <li>
+ Limited use of color (grouping only)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Scoped visibility" FOLDED="true" ID="ID_1491781564" CREATED="1309695214007" MODIFIED="1310196223136" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Task related
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Predefined Filters" ID="ID_1063131817" CREATED="1309695826409" MODIFIED="1310196223136" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="Standard content types" FOLDED="true" ID="ID_1568417876" CREATED="1309696476579" MODIFIED="1310196223136" TEXT_SHORTENED="true">
+<node TEXT="Reading guidance" ID="ID_754327054" CREATED="1309696324854" MODIFIED="1310196223120" TEXT_SHORTENED="true"/>
+<node TEXT="Definitions" ID="ID_1594805543" CREATED="1309696223219" MODIFIED="1310196223120" TEXT_SHORTENED="true"/>
+<node TEXT="Methods" ID="ID_1690427045" CREATED="1309696230263" MODIFIED="1310196223105" TEXT_SHORTENED="true"/>
+<node TEXT="Refine information" ID="ID_1224425563" CREATED="1309696253141" MODIFIED="1310196223105" TEXT_SHORTENED="true"/>
+<node TEXT="Exceptions" ID="ID_22860584" CREATED="1310836503572" MODIFIED="1310836515771"/>
+<node TEXT="Examples" ID="ID_1077186776" CREATED="1309696266689" MODIFIED="1310196223105" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="Standard use of node elements" FOLDED="true" ID="ID_1585389386" CREATED="1309696673647" MODIFIED="1310196223089" TEXT_SHORTENED="true">
+<node TEXT="core: title/name" ID="ID_1920924045" CREATED="1309696563043" MODIFIED="1322393587164" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="details: what/how to" ID="ID_715096689" CREATED="1309696579165" MODIFIED="1310196223089" TEXT_SHORTENED="true"/>
+<node TEXT="Rationale" ID="ID_798222829" CREATED="1322393587117" MODIFIED="1322394107221">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p class="MsoNormal">
+ <span lang="EN-US">Freeplane offers two mechanisms to implement this behavior. </span>
+ </p>
+ <ol>
+ <li>
+ <span lang="EN-US">The first mechanism consists of parent (=title) and child (=content) nodes, with folding of children to create overview and fast navigation. What is missing in the current FP, is that it is not possible to define which node contains a title and which node contains the content. As a result it is not possible to force that the content-node is folded by default. This is a big fundamental disadvantage. Besides, as your example documentation shows, when unfolding a content (child) node the text frequently moves out of the visible area. <o p="#DEFAULT"></o>Finally, if you use filtering, than ending/undoing filtering will create a state with nodes staying unfolded. That is, it is not easy to have all content folded. With complex maps this may result in loosing overview (a mess).</span><br/><br/>
+ </li>
+ <li>
+ <span lang="EN-US">The second mechanism is core (=title) and details (=content), with hiding of details to create overview and fast navigation. This mechanism more purely fits the purpose of the logical design. Details can be hidden by design. When details are hidden, focus is on oversight and navigation. When unhiding details, these appear under the node and are less likely to move out of the visible area than a child node would. When unhiding by hovering (tool tip) details are definitely staying in the visible area. <o p="#DEFAULT"/></span>
+ </li>
+ </ol>
+ <p>
+ <span lang="EN-US">In this documentation is chosen for the second soluttion becaus it seems most logical an practical. </span>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Standard Form" FOLDED="true" ID="ID_762818872" CREATED="1309696773167" MODIFIED="1310196223073" TEXT_SHORTENED="true">
+<node TEXT="Styles" ID="ID_1772043588" CREATED="1309695477062" MODIFIED="1310196223073" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="Easy handling" FOLDED="true" ID="ID_41805908" CREATED="1309696039857" MODIFIED="1310196223073" TEXT_SHORTENED="true">
+<node TEXT="Scripts" ID="ID_53029889" CREATED="1309696120205" MODIFIED="1310196223058" TEXT_SHORTENED="true"/>
+</node>
+</node>
+<node TEXT="Easy maintenance" FOLDED="true" ID="ID_684636398" CREATED="1309695019936" MODIFIED="1310196223058" TEXT_SHORTENED="true">
+<node TEXT="Follow structure of Main menu" ID="ID_96415895" CREATED="1309695540344" MODIFIED="1310196223058" TEXT_SHORTENED="true"/>
+<node TEXT="Define content once, use many" ID="ID_599399448" CREATED="1309694968072" MODIFIED="1310196223042" TEXT_SHORTENED="true"/>
+<node TEXT="Use Conditional styles" ID="ID_1144923217" CREATED="1309695364859" MODIFIED="1310196223042" TEXT_SHORTENED="true"/>
+</node>
+</node>
+<node TEXT="Prepare empty mind map" FOLDED="true" ID="ID_548574769" CREATED="1309691330424" MODIFIED="1310196223042" TEXT_SHORTENED="true">
+<node TEXT="Automatic edge color off" ID="ID_1831289663" CREATED="1309618738099" MODIFIED="1310196223027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Deselect <i>View > Properties panel > Automatic edge color</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Attributes invisible" ID="ID_1915815091" CREATED="1309618929144" MODIFIED="1310196223027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Select<i> Attributes > Hide all attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Attribute icon off" ID="ID_1498387169" CREATED="1309618959853" MODIFIED="1310196223011" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Deselect<i> Tools > Show icons for attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Define Category" FOLDED="true" ID="ID_507010795" CREATED="1310838169626" MODIFIED="1310838588667">
+<node TEXT="Content" FOLDED="true" ID="ID_862676309" CREATED="1310838629343" MODIFIED="1310838635553">
+<node TEXT="Definition" ID="ID_611433412" CREATED="1310838201903" MODIFIED="1310838488593" TEXT_SHORTENED="true"/>
+<node TEXT="Method" ID="ID_247256524" CREATED="1310838209149" MODIFIED="1310838488624" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Menu item
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Procedure" ID="ID_528236762" CREATED="1310838217269" MODIFIED="1310838488624" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Series of actions
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="OptionalValue" ID="ID_1278994490" CREATED="1310845769830" MODIFIED="1310848523586" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A possible value of a method
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Exception" ID="ID_1086387726" CREATED="1310838298748" MODIFIED="1310838488624" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Special condition
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Refine" ID="ID_464752434" CREATED="1310838284084" MODIFIED="1310838488609" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ More detailed explanation
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example" ID="ID_1007698430" CREATED="1310838291767" MODIFIED="1310838488609" TEXT_SHORTENED="true"/>
+<node TEXT="ToNote" ID="ID_961458845" CREATED="1310838313685" MODIFIED="1310838488609" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="Structure" FOLDED="true" ID="ID_1577905162" CREATED="1310838651581" MODIFIED="1310838659179">
+<node TEXT="Title" ID="ID_405338718" CREATED="1310838898171" MODIFIED="1310838904381"/>
+<node TEXT="MainMenu" ID="ID_65441144" CREATED="1310838664397" MODIFIED="1310838674382"/>
+<node TEXT="SubMenu" ID="ID_1383579659" CREATED="1310838678803" MODIFIED="1310838690769"/>
+<node TEXT="MainMenuGroupLabel" ID="ID_1034739022" CREATED="1310838719886" MODIFIED="1310838746641"/>
+</node>
+<node TEXT="Revision" ID="ID_1107739085" CREATED="1312101477551" MODIFIED="1312102431789"/>
+</node>
+<node TEXT="Define Chapter" FOLDED="true" ID="ID_362129212" CREATED="1309618782903" MODIFIED="1312101358874" TEXT_SHORTENED="true">
+<node TEXT="Goal" ID="ID_403391885" CREATED="1311327772687" MODIFIED="1311403771425" TEXT_SHORTENED="true">
+<icon BUILTIN="full-0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This filter shows the procedure how to set the filter rule and filter conditions for displaying only the nodes of Scope=GS1.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="Chapter 1. My first mind map" ID="ID_1104918030" CREATED="1311259207123" MODIFIED="1312782904960" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Mastering Chapter 1 means you know:
+ </p>
+ <ul>
+ <li>
+ basic definitions of nodes and relations between nodes
+ </li>
+ <li>
+ how to (re)open and save your first map
+ </li>
+ <li>
+ how to create child nodes and sibling nodes
+ </li>
+ <li>
+ when to use two different ways of editing (in-line or dialog)
+ </li>
+ <li>
+ how to fold (hide) and unfold all descendants
+ </li>
+ <li>
+ the basic difference between menu's <i>Nodes</i> an <i>Node features</i>
+ </li>
+ <li>
+ the basic difference between menu's <i>Format</i> and and <i>Styles</i>.
+ </li>
+ <li>
+ the benefits are of filtering.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 2.Handling nodes" ID="ID_955352628" CREATED="1311258291175" MODIFIED="1312101390464" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You mastered GS2 when you are able to handle nodes more easily:
+ </p>
+ <ul>
+ <li>
+ Know the meaning of all menu/toolbars.
+ </li>
+ <li>
+ Know all about selecting nodes
+ </li>
+ <li>
+ Know how to move nodes
+ </li>
+ <li>
+ Know basic file operations
+ </li>
+ <li>
+ Know additional fold operations
+ </li>
+ <li>
+ Know to find last modified nodes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 3.Basic Node features" ID="ID_1361306471" CREATED="1311327937765" MODIFIED="1312101402429" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You have mastered GS3 if you can handle Node Features:
+ </p>
+ <ul>
+ <li>
+ add and remove Icons
+ </li>
+ <li>
+ add, edit and hide Images
+ </li>
+ <li>
+ add, edit and hide Details
+ </li>
+ <li>
+ add, edit and hide Attributes
+ </li>
+ <li>
+ add, edit and hide Notes; and use the Note Panel
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 4.Format & Style" ID="ID_1181215259" CREATED="1311342024084" MODIFIED="1312101416672">
+<attribute NAME="Chapter" VALUE="4"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 5.Date, Time & Reminder" ID="ID_1315985597" CREATED="1311342048684" MODIFIED="1312101426641">
+<attribute NAME="Chapter" VALUE="5"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 6.Moving & Publishing maps" ID="ID_1822943808" CREATED="1311342076904" MODIFIED="1312101437373">
+<attribute NAME="Chapter" VALUE="6"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 7.Scripts & Formulas" ID="ID_1540834370" CREATED="1311404012843" MODIFIED="1312101446843">
+<attribute NAME="Chapter" VALUE="7"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="Chapter 8.Security & Preferences" ID="ID_390065587" CREATED="1311404075142" MODIFIED="1312101455922">
+<attribute NAME="Chapter" VALUE="8"/>
+<font BOLD="true"/>
+</node>
+</node>
+<node TEXT="Define Styles" FOLDED="true" ID="ID_1310961875" CREATED="1309618758309" MODIFIED="1310196223011" TEXT_SHORTENED="true">
+<node TEXT="Default" ID="ID_150604698" CREATED="1309639080400" MODIFIED="1310196222995" TEXT_SHORTENED="true"/>
+<node TEXT="Definition" STYLE_REF="Defenition" ID="ID_24518950" CREATED="1309618770906" MODIFIED="1310196222995" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Method" ID="ID_255587171" CREATED="1309618777965" MODIFIED="1310196222980" 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" CREATED="1310845841441" MODIFIED="1310848600401">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Procedure" ID="ID_927469794" CREATED="1310838858321" MODIFIED="1310839528312" COLOR="#006666">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Exception" ID="ID_497865634" CREATED="1309891278322" MODIFIED="1310196222933" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ToNote" ID="ID_21237962" CREATED="1309890992904" MODIFIED="1310196222933" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Refine" ID="ID_1208298554" CREATED="1309619037550" MODIFIED="1310196222980" 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" CREATED="1311097198651" MODIFIED="1311097742921">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+</node>
+<node TEXT="MainMenu" ID="ID_349932844" CREATED="1309691442065" MODIFIED="1310196222964" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+</node>
+<node TEXT="SubMenu" ID="ID_843480445" CREATED="1309802400475" MODIFIED="1310196222949" 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" CREATED="1286914216123" MODIFIED="1310242058632"/>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1824312381" CREATED="1312102440033" MODIFIED="1312102451750"/>
+</node>
+<node TEXT="Define Conditional styles" FOLDED="true" ID="ID_475303000" CREATED="1309618798837" MODIFIED="1310196222917" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Define a conditional style for each Class type
+ </li>
+ <li>
+ Set an attribute Class for each node
+ </li>
+ <li>
+ Set an attribute Scope = GettingStarted for all nodes of the introduction
+ </li>
+ <li>
+ Define a groovy script for node Getting started
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Attribute Class defines the style(s) to be applied" ID="ID_813678576" CREATED="1309694697522" MODIFIED="1310196222917" TEXT_SHORTENED="true"/>
+<node TEXT="Class value = list of Style names" ID="ID_864906280" CREATED="1309694751130" MODIFIED="1310196222902" TEXT_SHORTENED="true"/>
+</node>
+</node>
+<node TEXT="Translating This Documention" LOCALIZED_STYLE_REF="default" ID="ID_1796932858" CREATED="1311099007251" MODIFIED="1311931543787" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In translating Freeplane the following points have to be noted:
+ </p>
+ <ul>
+ <li>
+ The look and feel depends on styles and conditional styles. The good functioning of the conditional styles presupposes the existence of the hidden attribute <i>Class</i>.
+ </li>
+ <li>
+ The predefined filtering options presuppose the existence of the hidden attributes <i>Chapter</i> and <i>Class</i>.
+ </li>
+ <li>
+ Formulas and Groovy scripts should stay in tact.
+ </li>
+ <li>
+ The English documentation is saved with a particular folding state.
+ </li>
+ </ul>
+ <p>
+ To make sure that in the translation process these components keep present and consistent:
+ </p>
+ <ul>
+ <li>
+ Make a copy of this English documentation and translate the text in the main node and in Details.
+ </li>
+ <li>
+ Do not translate the attributes. Or load the mind map in an editor like Note++ and use<i> find and replace</i> to translate all attribute values in the same way.
+ </li>
+ <li>
+ Set Save folding in Preferences, then Unfold all, Fold all, Unfold Chapter, Save map.
+ </li>
+ </ul>
+ <p>
+ The next problem is to keep your translation synchronized with modification of the English documentation. To know what has been changed:
+ </p>
+ <ul>
+ <li>
+ Find and read the procedure "<b>Find last modified</b>", see<i> Filter > Quick filter </i>or <i>Edit > Find and replace.</i>.. This shows the modified nodes. It does not show the deleted nodes.
+ </li>
+ </ul>
+ <p>
+ To make the change, the most certain procedure is to:
+ </p>
+ <ul>
+ <li>
+ Copy and paste each modified node to your translated file and translate it (again). In this way you are sure the hidden structure is taken over too.
+ </li>
+ </ul>
+ <p>
+ An alternative is to check all components (basic text and optional icons, formula's, hyperlinks, Details, Attributes, Images, formulas <b>AND</b> Groovy scripts) and make the changes necessary.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ You could perform a spell check to the whole map by loading the documentation mm in a text editor like OpenOffice.
+ </li>
+ <li>
+ If you want to change colors, do this by editing the used style. See <i>Styles > Edit styles.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Version, revisions" FOLDED="true" ID="_Freeplane_Link_784043927" CREATED="1270892460645" MODIFIED="1330617272843" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see which nodes have been revised in a version:
+ </p>
+ <ul>
+ <li>
+ select <i>Styles > Conditional Map Styles</i>
+ </li>
+ <li>
+ check the box before the revision you are interested in. (To undo, remove the check.)
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The nodes revised are marked with a blue icon with "R".
+ </li>
+ <li>
+ Find or filter for these nodes with <i>(Style,IsEqual, Revision)</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="1.2.12_04" ID="ID_605038742" CREATED="1289133018961" MODIFIED="1330618614917"/>
+</node>
+</node>
+<node TEXT="FAQ" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1040911735" CREATED="1312613811349" MODIFIED="1330617395222" TEXT_SHORTENED="true" HGAP="28" VSHIFT="-7" MIN_WIDTH="80">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Frequently asked questions.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Also find/filter for Details AND
+
+ <ul>
+ <li>
+ (Style, Contains, Exception) to look for exceptional cases
+ </li>
+ <li>
+ (Style, Contains, ToNote) to look for important information.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="All new nodes a bubble, a particular font, edge etc." ID="ID_391816540" CREATED="1321645207585" MODIFIED="1322063397368" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A new node gets style <i>Default, </i>new Details<i> </i>get style<i> Details</i> and a new note gets style <i>Note</i>. Style Default can be edited to have a larger font, different edge, bubble, different width, etc, <a href="#ID_1277682010">see.</a> Style Note and style Details can be edited to have a different font, font size color etc.; but not edge, bubble etc. that are connected to the node core.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ A new font size will overrule the font number shown initially in the dialog - until you press the font number.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Paste without format" ID="ID_547441247" CREATED="1322991055865" MODIFIED="1322991099064"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ See Edit > Paste as
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Limitations and known bugs" FOLDED="true" ID="ID_1348021717" CREATED="1314027459750" MODIFIED="1314027482026">
+<node TEXT="Nodes with overlapping text" ID="ID_1348493491" CREATED="1314027785425" MODIFIED="1314027845976" LINK="https://sourceforge.net/apps/mantisbt/freeplane/view.php?id=1210"/>
+<node TEXT="Flash player" ID="ID_1294313915" CREATED="1314041896111" MODIFIED="1314041948698" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4668966"/>
+</node>
+<node TEXT="Map / node not editable" ID="ID_398310650" CREATED="1312614404180" MODIFIED="1321645397219" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use Maps > Mind map editor in stead of Maps > Mind map browser
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Menu's invisible" ID="ID_475459868" CREATED="1312913181290" MODIFIED="1321645391291" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If the menu bars are invisible, click-right on a free background area and select Toolbars.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node does not unfold" ID="ID_582886738" CREATED="1312614555555" MODIFIED="1321645386969" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If this happens after filtering:
+ </p>
+ <ul>
+ <li>
+ undo filtering
+ </li>
+ <li>
+ adapt filter settings to allow for descendants / hidden nodes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Style not applied" ID="ID_834195855" CREATED="1312613817971" MODIFIED="1321645381353" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In Properties Panel: remove all checks. These overrule style settings.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1194109651" CREATED="1319320353184" MODIFIED="1319320467175"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=77">issue with node width</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT=" image access denied (Java applet)" ID="ID_44291998" CREATED="1320257585948" MODIFIED="1320257765526"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This error occurs if the path name contains a directory with space, such as in "Drop box".
+ </p>
+ <p>
+ Solution: Replace the space by an underscore.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Free floating & free positionable node" ID="ID_279153431" CREATED="1321130587153" MODIFIED="1329227590316"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ See <a href="http://freeplane.sourceforge.net/wiki/index.php/Mind_map_gallery#Free_positioned_versus_floating_nodes.">forum</a> for limitatons.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Change default style of new node ( font, bubble, etc)" ID="ID_256904484" CREATED="1321996257631" MODIFIED="1322062107698"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Change the font size of system style <i>Default</i> for node core or style "<i>Note</i>" for notes. This will overrule the font number shown in the dialog - until you press the font number.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Format > Manage styles > Edit styles</i> and edit note <i>Default</i> or node <i>Note</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Script on opening of mindmap" ID="ID_470865141" CREATED="1327335448459" MODIFIED="1329415122189"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Conditional formatting supports scripts as filter condition. <a href="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=161&sid=019395cb323fe8ff8794fb10a3fa0237#p969">link</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Batch jobs" ID="ID_1030060663" CREATED="1330373236727" MODIFIED="1330373480551"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All functions in Freeplane are open for use as batch job, in a command line interface. With this you can for example:
+ </p>
+ <ul>
+ <li>
+ run a function on start up
+ </li>
+ <li>
+ execute a script an leave
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Tool tip not following viewing %" ID="ID_571521721" CREATED="1332704140061" MODIFIED="1332704392629"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To increase readability the viewing % may be increased. However, the text size in the tool tip is not affected by this. A solution is to change the size of the core text: the text size in the tool tip is linked to that of the core text. An easy way is to change this in the (default) style.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Problem installing Java" FOLDED="true" ID="ID_46334346" CREATED="1334319547907" MODIFIED="1334319583944">
+<node TEXT="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207" ID="ID_1177663722" CREATED="1334319586932" MODIFIED="1334319586932" LINK="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207"/>
+</node>
+<node TEXT="Arrow-hyperlink does not work" ID="ID_109939023" CREATED="1335123601556" MODIFIED="1335124349145" LINK="#ID_265935349"/>
+<node TEXT="Setting the default properties" ID="ID_1547921090" CREATED="1337170375273" MODIFIED="1337170394839" 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" CREATED="1330615467171" MODIFIED="1334843601497" VSHIFT="111" TEXT_SHORTENED="true" LINK="#ID_566454554"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ Online doc .
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Most recent information
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Contributers" ID="ID_1675707038" CREATED="1330616960325" MODIFIED="1335124396331" HGAP="-95" VSHIFT="29" LINK="http://freeplane.sourceforge.net/wiki/index.php/Contributors"/>
+</node>
+<node TEXT="Reference" STYLE_REF="Title" POSITION="right" ID="ID_332175012" CREATED="1286914216123" MODIFIED="1330615754041" HGAP="-37" VSHIFT="-64" TEXT_SHORTENED="true">
+<icon BUILTIN="wizard"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane has a main menu bar which gives access to most of its functionality. It has menu's with entries to methods (actions) and to dialog boxes or panels which are sets of related methods. To create oversight, related entries are connected with an accolade and group label. The items (nodes) below are the main menu's. This menu structure is taken as the framework for describing methods and dialog boxes. To enforce a particular result, methods are called upon in a particular order, a so-called a procedure. Essential procedures are described and connected to the actions they rely on. In this way they are easy to find. Methods and procedures have a different appearance (style), hence they are easily to be discriminated. In applying methods and procedures, there may be exceptions. In order to understand the procedures examples may be helpful. Exceptions, examples and other information to note are shown in the vicinity of the methods and procedures they apply to. They are discriminated by their different appearances (styles) and icons.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Click on the green arrow to see the different styles being applied for
+ </p>
+ <ul>
+ <li>
+ (sub)menu's
+ </li>
+ <li>
+ methods and optional values
+ </li>
+ <li>
+ procedures
+ </li>
+ <li>
+ exceptions
+ </li>
+ <li>
+ examples
+ </li>
+ <li>
+ to-note's
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="bezier"/>
+<node TEXT="File" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1242926404" CREATED="1310134532663" MODIFIED="1330617346267" TEXT_SHORTENED="true" MIN_WIDTH="60" HGAP="19" VSHIFT="27">
+<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+<attribute NAME="Chapter" VALUE="1,2,6,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To handle mind maps.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="New map" ID="ID_1310307853" CREATED="1310134532663" MODIFIED="1330375150968" TEXT_SHORTENED="true">
+<icon BUILTIN="../filenew"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Creates a new Freeplane map. This map resides only in memory until it is saved.</span></font>
+ </p>
+ </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" CREATED="1310134532663" MODIFIED="1314446980669" TEXT_SHORTENED="true">
+<icon BUILTIN="../new_map_"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens dialog to choose a map style from which a new map is created. <font face="SansSerif, sans-serif" color="#000000">This map resides only in memory until it is saved.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="New protected (encrypted) map..." ID="ID_1015806590" CREATED="1310134532663" MODIFIED="1330612645585" TEXT_SHORTENED="true">
+<icon BUILTIN="../lock"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Prompts to enter a password required to open the map and creates a new map. This funcion is similar to password protecting a node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>Note</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">This function only works if Tools > Preferences > Environment > Files > Experimental file socling is set.</font>
+ </li>
+ <li>
+ It is possible to create seculity layers by independently password protecting individual nodes.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="" ID="ID_43524792" CREATED="1310756995899" MODIFIED="1312915935500" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Standard this option is disabled. To enable it, check:
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences > Environment > Files > Experimental File Locking</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="New map" ID="ID_177723183" CREATED="1310835372274" MODIFIED="1312964613391">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310134532663" MODIFIED="1330375185653" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesave"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Save a map that has alrerady been created. If you are saving the map for the first time, you will be presented with the Save dialog box. If the map has already been saved once, it is automatically overwritten with the most recent Save. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Note</span></font></b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">This is a controlled save, not an automatic save. (A controlled save is done manually, using any of: File > Save, File > Save As..., the Save or Save As icon on the toolbar, or Ctrl + S.) </span></font>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">See also</span></font></b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Automatic save.</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1,2"/>
+</node>
+<node TEXT="Save map as.." ID="ID_449363060" CREATED="1310134532663" MODIFIED="1335982780210" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesaveas"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens a dialog to save an existing map, which has previously been saved, using a new file name.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Save all open maps" ID="ID_1423263542" CREATED="1310534781892" MODIFIED="1330375202547" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Saves all open maps. Same as Save, but is applied to all open maps.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Restore from local history" ID="ID_1896010117" CREATED="1310534540786" MODIFIED="1323898751424" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Allows you to reverts the map to a previously saved state.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ A controlled save is done manually using any of: File > Save, File > Save As..., the Save or Save As icon on the toolbar, or Ctrl + S.
+ </li>
+ <li>
+ Automatic saves are ignored. <u>This is an unforgiving command</u>, and cannot be reversed with Edit > Undo.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Edit > Undo and Edit > Redo for discreet changes to individual nodes.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Save map" ID="ID_1689022735" CREATED="1310835414628" MODIFIED="1330597584157">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1311925121696" MODIFIED="1312915952582" 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"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ In preferences can be set if/how folding must be saved.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Open saved map..." ID="ID_1284635316" CREATED="1310134532663" MODIFIED="1330375301381" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileopen"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Open a dialog to select and open a map that has already been saved.</span></font>
+ </p>
+ </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" CREATED="1323898287219" MODIFIED="1330375329181" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens dialog to enter URL
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Most recent maps" ID="ID_655783347" CREATED="1310534990519" MODIFIED="1330375349211" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens a list of maps that you have opened recently.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Open map" ID="ID_565242033" CREATED="1310835477153" MODIFIED="1330597595420" LINK="#ID_950384750">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1311925472829" MODIFIED="1312915971021" LINK="#ID_950384750">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Export map" FOLDED="true" ID="ID_1294197740" CREATED="1310134532663" MODIFIED="1330375428912" TEXT_SHORTENED="true">
+<icon BUILTIN="../export"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to select a destination and type of export.
+ </p>
+ </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" CREATED="1266417318562" MODIFIED="1312919285164" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">This exports the entire map as a HTML document. The map is exported "as is"; the HTML document appears just as the map appears in Freeplane. If a node is expanded, it appears expanded in the HTML document. If a node is collapsed at the time of export, it appears collapsed in the HTML document. The HTML document contains JavaScript that allows the collapsed nodes to be unfolded.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Branch as HTML" STYLE_REF="OptionalValue" ID="ID_1222466772" CREATED="1266417322421" MODIFIED="1312919285179" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports only the branch of the map defined by the node selected and all of its children. In all other respects it is identical to the "As HTML" export.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Open Office Writer Document (ODT)..." STYLE_REF="OptionalValue" ID="ID_413819995" CREATED="1266417526828" MODIFIED="1312919311325" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports entire map as an Open Office Writer document.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Portable Network Graphics (PNG)..." STYLE_REF="OptionalValue" ID="ID_1426694137" CREATED="1266417536125" MODIFIED="1312919311559" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports entire map in the PNG image format.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Compressed image (JPEG)..." STYLE_REF="OptionalValue" ID="ID_298130830" CREATED="1266417521765" MODIFIED="1312919311543" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports entire map in the JPEG/JPG image format.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="As XHTML (Javascript version)..." STYLE_REF="OptionalValue" ID="ID_1590599513" CREATED="1266417345906" MODIFIED="1312919311528" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports the entire map with full JavaScript functionality.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="As XHTML (click-able map image version HTML)..." STYLE_REF="OptionalValue" ID="ID_519681176" CREATED="1266417370281" MODIFIED="1312919311528" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports the entire map. The map portion of the page will appear exactly as the map appears in Freeplane. If some nodes are collapsed and others expanded, that's how it will appear in the document. The detail part of the page will contain all of the nodes in outline format.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="As Java Applet (HTML)..." STYLE_REF="OptionalValue" ID="ID_376134497" CREATED="1266417395953" MODIFIED="1330597631534" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Creates a version of the map embedded in an HTML file, suitable for publishing as a Web page. Appears very similar to the actual map: nodes expand and collapse the same as they do in the Freeplane program.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Publish on a website or share" ID="ID_126764093" CREATED="1309808574878" MODIFIED="1312916086753" TEXT_SHORTENED="true" LINK="#ID_1111281504">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">To publish or share a mind map without images, but with standard icons: </font>
+ </p>
+ <ul>
+ <li>
+ Fold the mind map as you want it to be when opening
+ </li>
+ <li>
+ Select <i>File > Export</i> and choose <i>Java Applet</i>. One file and one directory will be created: <i>myFile.html </i>and <i>myFile.html_files</i> respectively.
+ </li>
+ </ul>
+ <p>
+ Now you can move the file <i>myFile.html</i> and the subdirectory <i>myFile.html_files</i> to the location (directory) where you want to it be it accessible. You may rename <i>myFile.html</i> to a name you want, e.g. <i>myName.mm</i>. The subdirectory should not be renamed. You van then open the mind map with<i> myName.mm. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Press on the <i>green arrow</i> for publishing/sharing images too.
+ </li>
+ <li>
+ <i>Tools > Preferences > Appearances > Icons </i>to hide icons.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="As Flash (HTML)..." STYLE_REF="OptionalValue" ID="ID_1234525000" CREATED="1266417407640" MODIFIED="1312919311497" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports a Flash map that appears very similar to the actual map. Nodes expand and collapse the same as they do in the Freeplane map.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Tasks from TASKS mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1188629539" CREATED="1266417449093" MODIFIED="1312919311481" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports to a file that can be loaded from TaskJuggler, an open source project management tool.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Resources from RESOURCES mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1727885349" CREATED="1266417478265" MODIFIED="1312919311481" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports to a file that can be loaded from TaskJuggler, an open source project management tool.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="As TWiki (TW)..." STYLE_REF="OptionalValue" ID="ID_1482055774" CREATED="1266417500265" MODIFIED="1312919311465" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports the entire map to a TWiki formatted file.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Freeplane 1.1" STYLE_REF="OptionalValue" ID="ID_449157790" CREATED="1310762788434" MODIFIED="1312919311450" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="HTML document (HTM) (HTML)" STYLE_REF="OptionalValue" ID="ID_198819817" CREATED="1310762816708" MODIFIED="1312919311450" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="LaTeX document (TEX)" STYLE_REF="OptionalValue" ID="ID_1973701217" CREATED="1310762886823" MODIFIED="1312919311434" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="LaTeX book (TXT)" STYLE_REF="OptionalValue" ID="ID_308084692" CREATED="1310762930260" MODIFIED="1312919311434" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="MS Project 2003 (XML)" STYLE_REF="OptionalValue" ID="ID_1015672283" CREATED="1310762997021" MODIFIED="1312919311419" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Mediawiki (MWIKI)" STYLE_REF="OptionalValue" ID="ID_1345826529" CREATED="1310763063563" MODIFIED="1312919311419" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Oowriter file (OOWRITER)" STYLE_REF="OptionalValue" ID="ID_123526746" CREATED="1310763100184" MODIFIED="1312919311419" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Opml file (OPML)" STYLE_REF="OptionalValue" ID="ID_1024088291" CREATED="1310763140050" MODIFIED="1312919311403" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Plain text (TXT)" STYLE_REF="OptionalValue" ID="ID_581818306" CREATED="1310763169697" MODIFIED="1312919311403" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Word >= 2003 (DOC, XML)" STYLE_REF="OptionalValue" ID="ID_786673808" CREATED="1310763197052" MODIFIED="1312919311356" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="XBEL" STYLE_REF="OptionalValue" ID="ID_1844163113" CREATED="1310763237495" MODIFIED="1312919311356" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_1650734011" CREATED="1310763267456" MODIFIED="1312919311356" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Portable Document Format (PDF)..." STYLE_REF="OptionalValue" ID="ID_603087610" CREATED="1266417575078" MODIFIED="1312919311341" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports entire map in Adobe Acrobat PDF format.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Scalable Vector Graphics (SVG)" STYLE_REF="OptionalValue" ID="ID_1337380062" CREATED="1266417578453" MODIFIED="1312919311341" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">Exports entire map in Scalable Vector Graphics format.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_783046977" CREATED="1310799890904" MODIFIED="1312916121556" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Images are not part of Freeplane, except system icons. Hence images are not exported automatically.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Images </i>
+ </li>
+ <li>
+ <i>Tools > Preferences > Appearance > Icons</i>
+ </li>
+ <li>
+ <i>Tools > Preferences > HTML</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="To other text editor" ID="ID_22164919" CREATED="1286653812825" MODIFIED="1311946353162" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If a branch is copied to a regular text editor, its hierarchical structure appears a levels of indentation. Hyperlinks are shown between brackets. Examples of editors which can handle RTF are OpenOffice/Write, MSWord, Wordpad and Outlook.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+</node>
+</node>
+<node TEXT=" Move branch to new map" ID="ID_995694574" CREATED="1310567044505" MODIFIED="1330375559402" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Saves selected node and descendants as new map. Selected node becomes root of new map with hyperlink to its original location. Selected node gets hyperlink to new map and descendants are deleted.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Import" FOLDED="true" ID="ID_977906606" CREATED="1310134532663" MODIFIED="1330375629810" 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" CREATED="1266417591406" MODIFIED="1312919355286">
+<hook NAME="FirstGroupNode"/>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Linked Branch" STYLE_REF="OptionalValue" ID="ID_282345042" CREATED="1266417599062" MODIFIED="1312919355301">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="(Linked Branch) Without Root" STYLE_REF="OptionalValue" ID="ID_1230060690" CREATED="1266417606156" MODIFIED="1312919355301">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Explorer favourites..." STYLE_REF="OptionalValue" ID="ID_1416306563" CREATED="1266417657421" MODIFIED="1312919355286">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Folder Structure..." STYLE_REF="OptionalValue" ID="ID_379387162" CREATED="1266417664671" MODIFIED="1312919355286">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="MindManager X5 Map..." STYLE_REF="OptionalValue" ID="ID_1880120674" CREATED="1266417677171" MODIFIED="1312919355286">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="See preferences" ID="ID_1138762077" CREATED="1310801095185" MODIFIED="1312916767834" TEXT_SHORTENED="true" LINK="#ID_1711300863">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences > HTML</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Import/Export map" ID="ID_1115722286" CREATED="1310835645851" MODIFIED="1312814205747">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310535299236" MODIFIED="1330375658016" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Presents a dialog box from which you can select formatting for printing a map.</span></font>
+ </p>
+ <ul>
+ <li>
+ <span onclick="show_folder('1_1')" class="foldclosed" id="show1_1">+</span> <span onclick="hide_folder('1_1')" class="foldopened" id="hide1_1">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Fit to one page</span></font>
+
+ <ul id="fold1_1">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">The entire map is condensed to one page. Depending on the size of the map, this may render the typeface too small to be readable.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_2')" class="foldclosed" id="show1_2">+</span> <span onclick="hide_folder('1_2')" class="foldopened" id="hide1_2">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Fit width to one page</span></font>
+
+ <ul id="fold1_2">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">The map is forced to fit the width of the page, but may take up multiple pages depending on the size of the map. Results may vary based on choosing Portrait or Landscape orientation for printing.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_3')" class="foldclosed" id="show1_3">+</span> <span onclick="hide_folder('1_3')" class="foldopened" id="hide1_3">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Fit height to one page</span></font>
+
+ <ul id="fold1_3">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">The map is forced to fit the height of the page, but may take up multiple pages depnding on the size of the map. Results may vary based on choosing Portrait or Landscape orientation for printing.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span onclick="show_folder('1_4')" class="foldclosed" id="show1_4">+</span> <span onclick="hide_folder('1_4')" class="foldopened" id="hide1_4">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">User defined scale</span></font>
+
+ <ul id="fold1_4">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Allows access to Print Zoom Factor where a magnification factor of 0.0 to 2.0 may be entered. This applies to width and height proportionally.</span></font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </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" CREATED="1310134532663" MODIFIED="1311402754677" TEXT_SHORTENED="true">
+<icon BUILTIN="../print_preview"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Presents a view of how the printed map will appear based on the Page Setup settings. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">See also</span></font></b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Page Setup...</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Print map" ID="ID_111478060" CREATED="1310134532663" MODIFIED="1330375679635" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileprint"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens the dialog box associated with the printer on which the map will print.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Print map" ID="ID_682857312" CREATED="1310835584902" MODIFIED="1312964310111">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310134532663" MODIFIED="1330375705700" 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" CREATED="1310134532663" MODIFIED="1330375732278" TEXT_SHORTENED="true">
+<icon BUILTIN="../close"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Closes the map that has focus. If multiple maps are open, focus refers to the tab that you are currently editing.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Quit Freeplane" ID="ID_1770693982" CREATED="1310134532663" MODIFIED="1330375749772" TEXT_SHORTENED="true">
+<icon BUILTIN="../quit"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Close all open maps and exit Freeplane.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Edit" FOLDED="true" ID="ID_1198850460" CREATED="1310134532663" MODIFIED="1322427074784" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To find frequently used edit functions.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="New node" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" CREATED="1309638877685" MODIFIED="1315727299529" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<node TEXT="New child node" ID="ID_1884846033" CREATED="1266249828031" MODIFIED="1314470700998" TEXT_SHORTENED="true">
+<icon BUILTIN="../idea"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Creates a new node as a child of the currently-selected node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>Same effect: </b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">press key <i>Ins</i></font>
+ </li>
+ <li>
+ press icon <i>Bulb</i> in <i>Toolbar</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="New sibling node" ID="ID_1215489649" CREATED="1266249835578" MODIFIED="1314470710779" TEXT_SHORTENED="true">
+<icon BUILTIN="../NewSiblingAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000">Creates a new node below the currently selected node, at the same hierarchical level. </font></span>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000"><b>Same effect:</b> </font></span>
+ </p>
+ <ul>
+ <li>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000">press <i>Enter</i></font></span>
+ </li>
+ <li>
+ if in editing mode: press two times <i>Enter</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="New previous sibling node" ID="ID_819846743" CREATED="1266249852093" MODIFIED="1314470719375" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Creates a new node <b>above</b> the node that is currently selected, at the same hierarchical level.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Same effect:
+ </p>
+ <ul>
+ <li>
+ press <i><Shift>+<Enter></i> key combination.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="New parent node" ID="ID_1596972238" CREATED="1266249870703" MODIFIED="1314470828590" TEXT_SHORTENED="true">
+<icon BUILTIN="../stock_text_indent"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Creates a new node between the current node and its parent node. The new node is a child of the original parent node.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Same effect:
+ </p>
+ <ul>
+ <li>
+ press <i><Shift> + <Insert></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="New free node" ID="ID_389982270" CREATED="1329754325692" MODIFIED="1335982926210" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Creates a free node which is virtually connected to the root node.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="New Summary node (selected nodes)" FOLDED="true" ID="ID_1126176775" CREATED="1304191328224" MODIFIED="1330375881899" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Creates a new <i>Summary node</i> which connects the range of selected siblings by an accolade.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Technically the summary node is a sibling node, below the lowest node in the range.
+ </li>
+ <li>
+ The upper selected node is marked as the first node of the node group.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Begin node group</i> to in/decrease the range of included nodes.
+ </li>
+ <li>
+ <i>Node features > Summary Node</i> to convert the Summary node to a sibbling node.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="" ID="ID_805111336" CREATED="1309875915466" MODIFIED="1310196224212" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Technically the sum node is a sibling, below the group of siblings. See example.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_1070404224" CREATED="1309876392685" MODIFIED="1310196224212" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Error</b>
+ </p>
+ <p>
+ Sometimes an <b>error message</b> appears that it is not possible to create a Summary node for a particular group. It may be that one of the nodes in the group has a check for <i>Node > Begin node group</i>. If so, select <i>Node > Begin node group </i>to uncheck and try again.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Summary node / accollade" FOLDED="true" ID="ID_1919219984" CREATED="1304192858754" MODIFIED="1313693288873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Technically the summary node is a sibling of the node group, below the bottom node of the group. This position becomes apparent if you choose <i>Nodes > Sum node</i> for a particular summary node<i> </i>Selecting <i>Nodes > Summary node </i>again will restore its original position.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Use the up/down keys to move siblings into or out of the node group.
+ </li>
+ <li>
+ Use drag an drop to move into or out of the node group.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="false" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <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" CREATED="1312919088666" MODIFIED="1312919118867">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="1" ID="ID_1351236194" CREATED="1304192867654" MODIFIED="1310196224197" TEXT_SHORTENED="true">
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="2" FOLDED="true" ID="ID_1855113133" CREATED="1304192871203" MODIFIED="1310196224197" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+<edge WIDTH="thin"/>
+<node TEXT="xx" ID="ID_1443415412" CREATED="1305386736429" MODIFIED="1310196224197" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="3" ID="ID_642318706" CREATED="1304192874252" MODIFIED="1310196224181" TEXT_SHORTENED="true">
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="4 = sumary node" ID="ID_1072874332" CREATED="1304192876647" MODIFIED="1310196224181" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="5" ID="ID_24722596" CREATED="1304192881678" MODIFIED="1310196224165" TEXT_SHORTENED="true">
+<edge WIDTH="thin"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Node group" STYLE_REF="SubMenu" FOLDED="true" ID="ID_479655918" CREATED="1313693054166" MODIFIED="1316339429581">
+<node TEXT="Summary node (begin of group)" FOLDED="true" ID="ID_428394610" CREATED="1305384767382" MODIFIED="1330376027741" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Shows if the selected node is marked as first node of a Summary node group. Toggles the selected node as first node of a Summary node group.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The effect depends on three factors:
+
+ <ol>
+ <li>
+ the Summary node being active (See <i>Node > Summary node</i>)
+ </li>
+ <li>
+ the selected node being in the range of the summary node and
+ </li>
+ <li>
+ the selected node not yet being marked as first node
+ </li>
+ </ol>
+ <p>
+ If all three conditions are true, the selected node will be marked as the (new) first node of the Summary node group and the upper range of the Summary node will be decreased to the selected node.
+ </p>
+ </li>
+ <li>
+ If the Summary node is not active, the selected node may still be marked as the first node of a previously active Summary node. In that case the mark will be removed. The effect of this becomes apparent at the moment the inactive Summary node is reactivated, see <i>Node > Summary node</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="Node group" ID="ID_1499184609" CREATED="1312552947980" MODIFIED="1312697277990" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>node group</b> is a group of neighboring siblings (same hierarchical level, same parent) which are within the range of a defined <i>Summary node</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The range can enclose all siblings, or a subset of neighbouring siblings.
+ </li>
+ <li>
+ The upper sibling in the range is called<b> first node</b>.
+ </li>
+ <li>
+ The range may be decreased by defining another node of the node group as is the<i> first node</i>. As a result the siblings above it will be excluded from the node group.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Summary node (set/reset)" ID="ID_1343097813" CREATED="1305384807731" MODIFIED="1330376014731" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Converts the selected node into a (active) summary node or turns a Summary node back into a sibling node (inactive Summary node).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The range of a newly created Summary node group are all siblings above the selected node. There are two exceptions to this:
+ </li>
+ </ul>
+ <ol>
+ <li>
+ If one of the siblings is marked as First node of a Summary node group, the range starts with this node. This may happen if an existing Summary node has been deactivated.
+ </li>
+ <li>
+ At the same hierarchical level, the ranges of two Summary nodes cannot overlap. Hence the range of the newly created Summary node starts directly below the existing Summary node.
+ </li>
+ </ol>
+ <p>
+ See also
+ </p>
+ <ul>
+ <li>
+ <i>Node > Summary node > Begin node group</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Always unfolded node (set/reset)" STYLE_REF="Method" ID="ID_1594802269" CREATED="1330376058560" MODIFIED="1330376165501" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If set, prevents the node from folding. Especially used with clouds.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Add / remove cloud (default)" ID="ID_649516172" CREATED="1310106596579" MODIFIED="1330375972914" TEXT_SHORTENED="true">
+<icon BUILTIN="../Cloud24"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Places a cloud around all of the selected nodes. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">This is useful for highlighting certain nodes. The cloud covers the node selected and all of its child nodes. Multiple clouds can be created at the same time by holding the Ctrl key (for selecting discreet nodes), or the Shift key for selecting all the nodes between the first node selected and the last. SEE ALSO: Format > Cloud Color...</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="Connect" FOLDED="true" ID="ID_1803275985" CREATED="1266249966500" MODIFIED="1317403806450" TEXT_SHORTENED="true">
+<icon BUILTIN="../designer"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Creates a connector between two selected nodes. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The connector can be formatted by opening its context window (right-click on the connector). <font color="#000000" face="SansSerif, sans-serif"> A label can be attached at the binning, middle end the end of the connector. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">See also</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Properties Panel</i> to edit properties
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ A connector can be made by right-clicking and dragging a node to the other node.<br/>If more than two nodes are selected, several connectors are drawn at once, with the last selected node as the (common) destination.
+ </li>
+ <li>
+ By making a self-referenced node it is possible to have a connector appear as a line connected to one node only. Right-click and drag and drop the node on itself.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="Connector" ID="ID_725880686" CREATED="1303722690480" MODIFIED="1335987423132" HGAP="50" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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="line + label for self-referenced node" STARTINCLINATION="92;-47;" ENDINCLINATION="92;-47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="node a" ID="ID_504660350" CREATED="1288535672221" MODIFIED="1335985803899" TEXT_SHORTENED="true">
+<hook NAME="AlwaysUnfoldedNode"/>
+<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" CREATED="1288535688688" MODIFIED="1335985817270" TEXT_SHORTENED="true">
+<edge STYLE="bezier"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="node c" ID="ID_580762900" CREATED="1288535699522" MODIFIED="1310196224119" TEXT_SHORTENED="true"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Link" FOLDED="true" ID="ID_1430712985" CREATED="1303930954062" MODIFIED="1335981737049" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A link can be:
+ </p>
+ <ul>
+ <li>
+ A click-able connection between two nodes.
+ </li>
+ <li>
+ A click-able connection between a node and an external object (website, directory, program,..)
+ </li>
+ <li>
+ A click-able connection between a node and a menu item
+ </li>
+ <li>
+ A click-able email address
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ Each node core can have exactly one arrow-link and/or multiple underlined links. Node details only can have (multiple) underlined links. Underlined links are created in the edit text dialog (in menu Edit). The arrow-links are created with the items of the current menu.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Drag and drop of an image which exists as a file on your computer results in a scalable image. If the image is dropped on the upper part of the node the image is added to this node. If it is dropped at the child side of the node a new child is made with the image. If a copied image is pasted, then a hyperlink is pasted in its child node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The easiest way to enter a hyperlink to an external object is by drag and drop. The
+ </p>
+ <p>
+ In that case the hyperlink will we pasted to a newly created child of the selected node. It is possible to drop more than one address at once.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="Add hyperlink (choose)..." ID="ID_178833757" CREATED="1266249910406" MODIFIED="1330376313311" TEXT_SHORTENED="true">
+<icon BUILTIN="../SetLinkByFileChooserAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to navigate to a directory or file. A hyperlink to the selected directory or file is put into the selected node. The hyperlink appears as a red arrow and can be clicked to open the file or directory.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To remove the hyperlink:
+ </p>
+ <ul>
+ <li>
+ select <i>Hyperlink (Text Field)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </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" CREATED="1266249928203" MODIFIED="1330376304871" TEXT_SHORTENED="true">
+<icon BUILTIN="../SetLinkByTextFieldAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to enter a hyperlink as text, or enter an e-mail address.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ It is easier top use copy & paste.
+ </li>
+ <li>
+ Use it for adding hyperlink to the root node.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1314783614192" MODIFIED="1314783750665" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use Ctrl-C and Ctrl-V to copy and paste in the text field.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Convert link from within text" ID="ID_1049705529" CREATED="1266247483750" MODIFIED="1330376340082" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExtractLinkFromTextAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Converts a text address (URL as http://www.google.com/) in the basic text of the selected node to a click-able hyperlink.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Add local hyperlink" ID="ID_271903009" CREATED="1266251024562" MODIFIED="1314563618992" TEXT_SHORTENED="true">
+<icon BUILTIN="../LinkLocal"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Creates a link between two nodes in the current map. The two nodes must be selected before this command is invoked: The first selected node is the target of the link, which is added to the second node, and represented there as a small green arrow. </span></font>
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Add hyperlink to menu item" FOLDED="true" ID="ID_1477740287" CREATED="1291192827927" MODIFIED="1330376363326" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to choose a menu option to which a hyperlink will be added in the selected node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="Example start script" ID="ID_1605161172" CREATED="1312826014105" MODIFIED="1312919887785" LINK="#ID_840644558" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Press red arrow to see an example in which this link is used to start a script.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Set link anchor" STYLE_REF="Method" ID="ID_232225786" CREATED="1336331814202" MODIFIED="1336332420035" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remembers the currently selected node. Only one node can be remembered. If a new node is set to be the anchor node, the previous anchor node is forgotten.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Make link from anchor" STYLE_REF="Method" ID="ID_617064872" CREATED="1336331823758" MODIFIED="1336332308383" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Creates a link in the anchor node to the currently selected node. The anchor node will show a red or geen arrow.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ The nodes linked may be in different maps.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Make link to anchor" STYLE_REF="Method" ID="ID_209345036" CREATED="1336331834372" MODIFIED="1336332322815" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Makes a link in the currently selected node to the the anchor node. The current node will display a red or green arrow link.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ The nodes linked may be in different maps.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Delete link anchor" STYLE_REF="Method" ID="ID_115302013" CREATED="1336331844006" MODIFIED="1336332447383" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If an anchor is set, it is forgotten.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" CREATED="1305558188109" MODIFIED="1330597806535" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Hyperlink" ID="Freeplane_Link_203858515" CREATED="1270892460675" MODIFIED="1311402835642" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A 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 and appears as a red arrow (external hyperlink) or green arrow (internal hyperlink).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ A hyperlink can be contained in
+ </p>
+ <ul>
+ <li>
+ the basic node text and
+ </li>
+ <li>
+ attribute values.
+ </li>
+ </ul>
+ <p>
+ A hyperlink can be added by drag and drop or menu selection.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Hyperlink(s) by drag and drop" ID="ID_640110372" CREATED="1286651969385" MODIFIED="1311402835673" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The easiest way to add a hyperlink or group of hyperlinks to external objects is by drag and drop.
+ </p>
+ <p>
+ Dropping a copy of a directory, file, file address or webaddress will generate a child node of the selected node which contains a hyperlink to the address of it.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Dropping a group of hyperlinks will genareate a group of child nodes, each containing one of the hyperlinks.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The text of the respective nodes will initially be the address of the hyperlink. This text may be removed, edited or replaced. This will not change the hyperlink itself (red arrow). To edit the hyperlink itself, select <i>Node features > Links > Hyperlink (Text Field)...</i> and edit the address.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<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" CREATED="1270892460675" MODIFIED="1311402835688" LINK="mailto:%20jokro at freeplane.nl" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The simplest way to make an e-mail link is to copy and paste its address into a selected 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 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), select <i>Node features > Links > Hyperlink (Text Field)...</i> and enter:
+ </p>
+ <ul>
+ <li>
+ <i>mailto:emailaddress</i>, e.g. mailto:jokro at freeplane.nl
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Remove hyperlink or e-mail" ID="ID_1464441556" CREATED="1310047903960" MODIFIED="1311402835688" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To remove a hyperlink or e-mail address:
+ </p>
+ <ul>
+ <li>
+ select <i>Hyperlink (Text Field)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hyperlinks relative" ID="ID_1942965129" CREATED="1311925599759" MODIFIED="1317904386624" 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" CREATED="1312540477537" MODIFIED="1317904347765">
+<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="48"/>
+<attribute NAME="See also" VALUE="#ID_278329781"/>
+<attribute NAME="See also" VALUE="#ID_1279811672"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1314782923948" MODIFIED="1317904230359" 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>
+
+ </head>
+ <body>
+ <p>
+ For the following procedure there exists a script. Clik the hyperlink for this.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To link a source node SN in a map SM to a target node TN in map TM:
+ </p>
+ <p>
+ 1. <strong><u>First, link the source node SN to to the target map TM</u></strong>. For this, go to SN in SM, and execute: Node Features ---> Add hyperlin (choose) ... [here you choose thus the target map TM] - This can also be done with the context menu (right mouse click, etc.) - You can also make this link from the value field of an attribute of the source node SN. For this, you have to create the attribute with the option Edit Attribute (not Add Attribute, because this option, unfortunately, does not allow to make the link in the value field). Then select (or simply hover on) the value field of the attribute. Right click and, in the context menu, select Add hyperlink (choose) ... etc.
+ </p>
+ <p>
+ 2. <strong><u>Second, get the identifier of the target node TN</u></strong>. For this, go to TN in TM, and - through Edit (main menu or context menu) click Copy Node ID. You get thus TN's ID in the clipboard.
+ </p>
+ <p>
+ 3. <strong><u>Third, add the node identifier of TN to the link made in the first step</u></strong> (in other words, convert the link to a map into a link to a node). For this, go back to SN (in SM), and execute (through main or context menu): Node features ---> Links ---> Add or modify hyperlink (type). In the pop up menu Input that appears, write (without space) immediately after the .mm the symbol # and paste (without space) the TN's ID that you copied in step 2. Exm.: ...../mytargetmap.mm#ID_123456 Procede similarly in case the hyperlink is in the value field of an attribute.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="In-line hyperlinks" STYLE_REF="ToNote" ID="ID_408844993" CREATED="1315336877701" MODIFIED="1317904130064"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It is possible to have multiple in-line links in Node core, Node details, or Note. 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: Press <a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">Ctrl-click this link</a> to go to the Freeplane Open Forum.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The hyperlink is not displayed by a green or red arrow, but by an underlining.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Contrary to the arrow-link, you can have more than one link.
+ </li>
+ <li>
+ You can retype the text of the hyperlink, without altering the hyperlink.
+ </li>
+ <li>
+ To change the address of the hyperlink, select the whole underlined text and then choose again <i>Add hyperlink (choose)...</i> or <i>Add or modify hyperlink (type).</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+</node>
+</node>
+<node TEXT="Remove node" ID="ID_1954594298" CREATED="1266247035265" MODIFIED="1315727904187" TEXT_SHORTENED="true">
+<icon BUILTIN="../editdelete"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Deletes the node and all of its children. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Undo</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Node" STYLE_REF="MenuGroupLabel" ID="ID_1306487115" CREATED="1315727827575" MODIFIED="1315727962173">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439" CREATED="1315728115638" MODIFIED="1316158994981">
+<node TEXT="Edit core in-line" ID="ID_1162372089" CREATED="1266247401765" MODIFIED="1330376482963" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Puts a node in Edit Mode. </font>Opens an inline editor for fast entering and modifying text. Standard modus when making a new node (<i>Ins</i>) or when double-clicking on the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Context menu</b>. To open the context menu, right-click on the text which is being edited. This menu contains:
+ </p>
+ <ul>
+ <li>
+ <b>Cut</b>
+ </li>
+ <li>
+ <b>Copy</b>
+ </li>
+ <li>
+ <b>Paste</b>
+ </li>
+ <li>
+ <b>Spelling</b>: turn spelling check on/of
+ </li>
+ <li>
+ <b>Languages</b>: choose language for spelling checker
+ </li>
+ <li>
+ <b>Format</b>: bold: italic etc.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i> Node> Edit node in separate Dialog</i>
+ </li>
+ <li>
+ ... for installing your own language
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"> If a node is the last child node, left clicking the node will place it in Edit Mode. Otherwise, a left click will toggle the visibility (folding) of the child nodes</font>
+ </li>
+ <li>
+ The text to be shown cannot start with "=". If it starts with it, it is interpreted as a formula which will be executed and the result shown. (Exception: not in Java Applet)
+ </li>
+ <li>
+ To insert special symbols such as © , copy and paste it from your favourite text editor.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Edit core in dialog" ID="ID_1542197841" CREATED="1266244681296" MODIFIED="1330376497487" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_long_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Open basic node text in a separate dialog for advanced editing±
+ </p>
+ <ul>
+ <li>
+ Including Alignment and Bulleted/Numbered lists.
+ </li>
+ <li>
+ Splitting nodes.
+ </li>
+ <li>
+ Editing HTML-code.
+ </li>
+ </ul>
+ <p>
+ <b>Context menu</b>. To open the context menu, click-right in the text area of the dialog.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node > Edit node </i>for the context menu
+ </li>
+ <li>
+ <i>Languages </i>in the context menu
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The text to be shown cannot start with "=". If it starts with it, it is interpreted as a formula.
+ </li>
+ <li>
+ To insert special symbols such as © , copy and paste it from your favourite text editor.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Join nodes" ID="ID_1720469761" CREATED="1266247462656" MODIFIED="1309687496955" TEXT_SHORTENED="true">
+<icon BUILTIN="../JoinNodesAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">Joins two nodes (the basic text only) into one. Only works on nodes that do not have children.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Split nodes" ID="ID_1796564424" CREATED="1266247473250" MODIFIED="1332023477759" TEXT_SHORTENED="true">
+<icon BUILTIN="../split_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Splits and distributes the basic text of a node over two or more nodes. Split inserts a new node for the splitted text. The split will take place at all line breaks or HTML components.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">The Split Node command may be used on any plain node which contains one or more line breaks, which can be inserted using Shift Enter. Split Node also works on any Rich Formatted (Long or HTML) node which contains multiple paragraphs. In either case the node gets split at the line and/or paragraph breaks. For HTML nodes you can apply the split repeatedly if there are nested elements. A plain node may be split at any point by first converting it using Format > Use Rich Formatting. Then click on the node to open the Edit Long Node window. In that window, place the cursor where you want to split the node, then click the "Split" button at the bottom of the dialog. The part of the node to the right of the cursor will appear below the node from which it was split. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Note</font></b>
+ </p>
+ <p>
+ <a id="bugnotes" name="bugnotes">There two different split node actions. The first is available via menu. It applied to a currently selected node and splits it into paragraphs / lines / html elements. Another one is only available from the editor, splits a node at the cursor position and can be activated by alt+S. The last one can not be displayed in a menu. </a><br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Change revisions background color" FOLDED="true" ID="ID_974319465" CREATED="1266247833890" MODIFIED="1314470318158" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<icon BUILTIN="../RevisionPluginAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles between visibility marking of revisions.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Standard the revision is marked by making background color = yellow.
+ </li>
+ <li>
+ To undo the marking: select the marked node and uncheck the Change box in the Properties Panel.
+ </li>
+ </ul>
+ <p>
+ <b>See also:</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>View > Show modification times</i>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="Set default revision color" ID="ID_1766752356" CREATED="1311925728592" MODIFIED="1312917516963" 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"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To remove a revision, for each node uncheck the checkbox for background color.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ This way of showing/hiding revisions is outdated.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="Alternatives for marking revisions" ID="ID_961541761" CREATED="1312527817946" MODIFIED="1312917516994" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To display a revision:
+ </p>
+ <ul>
+ <li>
+ find/filter by revision date
+
+ <ul>
+ <li>
+ Revisions after a date or whin a period of time can be found and filtered
+ </li>
+ <li>
+ Pro's: revisions are kept automatically; filter rule can be defined once
+ </li>
+ <li>
+ Con's: the revision date is set to the latest revision. It is not possible to know the history of revisions..
+ </li>
+ </ul>
+ </li>
+ <li>
+ find/filter by user defined attribute <i>Revision</i> = <i>nr/date</i>
+
+ <ul>
+ <li>
+ Pro's: History of revision dates pro node (not content) is kept.
+ </li>
+ <li>
+ Con's: to be (un)set manually pro node or selected group of nodes.
+ </li>
+ </ul>
+ </li>
+ <li>
+ use conditional map styles to show a style <i>Revision</i>
+
+ <ul>
+ <li>
+ To be used with revision dates or revision attributes
+ </li>
+ <li>
+ Pro's: see above. Filter rules are kept an managed at map level, in Conditional map styles list.
+ </li>
+ <li>
+ Con's: see above.
+ </li>
+ </ul>
+ </li>
+ <li>
+ (Un)set a discriminating background color pro node
+
+ <ul>
+ <li>
+ Pro's: Simple
+ </li>
+ <li>
+ Con's: Restricted style option. Fully manual.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Image by choice or link" ID="ID_1277752024" CREATED="1266249875046" MODIFIED="1335981700654" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Attach a fixed image to the inner area of the selected node, within the bubble area and replacing the basic node text. If the node already contains a hyperlink to an image, the image will replace the hyperlink. Otherwise the file chooser can be used to select an image file.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Shortened node content</i> to hide/unhide the image
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The image is shown in its original size. To decrease this size, use a paint program.
+ </li>
+ <li>
+ The basic node text is not showing.
+ </li>
+ <li>
+ The extended node editor allows to add an image as HTML code. Example: <i><html><img src="linked/Apple.png"> <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png"></i> The relative link points to an image file in a subdirectory of the directory in which the min map is kept..
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+</node>
+<node TEXT="Icons" STYLE_REF="SubMenu" FOLDED="true" ID="ID_754543229" CREATED="1335981320298" MODIFIED="1335981821133">
+<node TEXT="Icon from table" FOLDED="true" ID="ID_1962266219" CREATED="1309725076165" MODIFIED="1315728680608" TEXT_SHORTENED="true">
+<icon BUILTIN="../designer"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a table from which an icon can be chosen by clicking it.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ This table also contains system icons.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" ID="ID_1761101081" CREATED="1310844234592" MODIFIED="1310844323451" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Contrary to the other icons lists, this table also contains system icons.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Icon by category" ID="ID_80370661" CREATED="1305728952563" MODIFIED="1315728740200" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE=""/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Select node through one of the submenus with icons
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Progress icon %" FOLDED="true" ID="ID_1053622072" CREATED="1303931822760" MODIFIED="1335981675179" TEXT_SHORTENED="true">
+<icon BUILTIN="25%"/>
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Progress is an indicator in which a percentage can be visualized in steps of 10% or 25%.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ The standard is to present the indicator as an icon. This icon cannot be hidden.
+ </li>
+ <li>
+ Additionally an image of the indicator can be shown. This image can be hidden, see images.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="Progress Up" ID="ID_1352152467" CREATED="1304432750435" MODIFIED="1310844546671" TEXT_SHORTENED="true">
+<icon BUILTIN="50%"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Adds progress indicator in selected node resp. moves it up in steps of 25% until 100% and OK.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Progress Down" ID="ID_1503763375" CREATED="1304432902357" MODIFIED="1310844546687" TEXT_SHORTENED="true">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Decreases progress indicator in selected node in steps of 25% and as a last step removes it.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Extended progress 10%" ID="ID_931502203" CREATED="1304432912176" MODIFIED="1310844546687">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Adds a progress indication with extended size that is:
+ </p>
+ <ul>
+ <li>
+ increased 10 %<i> </i>on<i> double Click</i>
+ </li>
+ <li>
+ decreased 10% o<i>n Ctrl + double Click</i>
+ </li>
+ </ul>
+ </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" CREATED="1310803008021" MODIFIED="1310844546687" TEXT_SHORTENED="true">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Adds a progress indicator with extended size that is:
+ </p>
+ <ul>
+ <li>
+ increased 25 %<i> on double Click</i>
+ </li>
+ <li>
+ decreased 25% o<i>n Ctrl + double Click</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook URI="freeplaneresource:/images/svg/Progress_quarter_01.svg" SIZE="1.0" NAME="ExternalObject"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="" ID="ID_1791031466" CREATED="1310017200205" MODIFIED="1312919856289" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="192"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The big indicator is an .svg image. This will not appear in a Java Applet.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="Delete progress" ID="ID_1336453593" CREATED="1304432977103" MODIFIED="1310844546687" 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" CREATED="1310672205671" MODIFIED="1323899309745" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles that the icons present in descendants of a node, are replicated in the node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Show intersections of icons" ID="ID_664401378" CREATED="1310672261152" MODIFIED="1310726026460">
+<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" CREATED="1335981507991" MODIFIED="1335981842364">
+<node TEXT="Remove first icon" ID="ID_1452556696" CREATED="1305728866037" MODIFIED="1311402835361" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_first_icon"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remove firstly added icon in the selected node.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Remove last icon" ID="ID_424983852" CREATED="1305728879991" MODIFIED="1311402835376" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_last_icon"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Removes last icon in selected node
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Remove all icons" ID="ID_1438443252" CREATED="1305728891917" MODIFIED="1311402835376" TEXT_SHORTENED="true">
+<icon BUILTIN="../icon_trash"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remove all icons from selected node
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" CREATED="1305729001930" MODIFIED="1335988037287" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="211"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<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="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<hook NAME="SummaryNode"/>
+<node TEXT="Icon" ID="ID_845839827" CREATED="1309802783787" MODIFIED="1311402835392" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An icon is a mini image.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT=" Examples of icons" ID="ID_835126969" CREATED="1270892460676" MODIFIED="1311402835392" 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" CREATED="1305728960278" MODIFIED="1311402835392" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add ones own icon to the list of selectable icons, put the file myicon.png to in sub directory <i>icons</i> of the user directory which opens by selecting <i>Tools > Open user directory</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Node extensions" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1400990107" CREATED="1315728991618" MODIFIED="1316876395980">
+<node TEXT="Edit details in-line" ID="ID_1807308711" CREATED="1291153533418" MODIFIED="1330376990961" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_details"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens in line editor for editing Details. This editor is similar to the inline editor for basic node text. The text can be hidden, unless selected.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node > Edit node</i>
+ </li>
+ <li>
+ <i>View > Toggle Details </i>
+ </li>
+ <li>
+ <i>Node > Shortened node content</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT=" Edit details in dialog" ID="ID_742575187" CREATED="1309980895003" MODIFIED="1330376975920" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens editor for node details in a separate dialog. Similar to the dialog for basic node text.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Node > Edit node in separate dialog
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Copy extensions from style node" STYLE_REF="Method" ID="ID_1403178597" CREATED="1311948532074" MODIFIED="1330377017683" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To copy into the selected node the <i>Details</i> and <i>Attributes</i> of the styles connected to the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Applies if <i>Details</i> or <i>Attributes</i> in the style have been changed, or if the node has not been connected to the style at a birth.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>New style from selectio</i>n
+ </li>
+ <li>
+ <i>Node features > Attributes > Copy from style</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Remove node details" ID="ID_949038869" CREATED="1291201354423" MODIFIED="1330442258245" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Removes the details text from the selected node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Details text" STYLE_REF="MenuGroupLabel" ID="ID_1543644666" CREATED="1303930434451" MODIFIED="1335988154867" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Content text (details)</b> is an optional text field directly under the basic node text, outside the node area (bubble area). It is the text you are currently reading. It is generally used to extend and describe in detail the basic node text of Title.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Content can be hidden in two ways:
+ </p>
+ <ul>
+ <li>
+ press the triangle to roll up the text; press again to roll down again
+ </li>
+ <li>
+ right-click and select<i> Set hover text (tool tip)</i>.
+ </li>
+ </ul>
+ <p>
+ Hidden content is shown when the cursor is above the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Hover text (tool tip)</i>
+ </li>
+ </ul>
+ </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" CREATED="1266250647515" MODIFIED="1315731589195" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Add sizeable image to the selected node, below the basic node text, outside the bubble area.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ Alternatively, add image with <b>drag and drop </b>or add a hyperlink to the image with <b>copy and paste. </b>Note the difference:
+
+ <ul>
+ <li>
+ <b>Copy & Paste</b>
+
+ <ul>
+ <li>
+ Pasting at the upper part of a node adds a hyperlink to a newly created sibling
+ </li>
+ <li>
+ Pasting at the outer side of a node adds a child node with a hyperlink.
+ </li>
+ </ul>
+ </li>
+ <li>
+ <b>Drag & drop</b>
+
+ <ul>
+ <li>
+ Dropping at the upper part of the node adds an external, scalable image in the selected node.
+ </li>
+ <li>
+ Dropping at the outer side of the node adds an external, scalable image in a newly created child node.
+ </li>
+ <li>
+ Dropping only works if the mind map has been saved.
+ </li>
+ <li>
+ For security reasons dragging and dropping is not possible for internet images.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Shortened node content.</i> It hides/unhides the image.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="" ID="ID_1294427474" CREATED="1312919801516" MODIFIED="1330597874224">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="" ID="ID_1592683562" CREATED="1311880649184" MODIFIED="1311880910313" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Drag and drop images only works if the min map has been saved before.
+ </li>
+ <li>
+ Drag and drop from the Internet is, because of security reasons, not possible. Dropping hyperlinks is. .
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Drag & drop image, copy & paste link" ID="ID_7896368" CREATED="1311883050086" MODIFIED="1332873227652" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add an image <b>drag and drop</b>:
+ </p>
+ <ul>
+ <li>
+ Dropping at the upper part of the node adds an external, scalable image in the selected node.
+ </li>
+ <li>
+ Dropping at the outer side of the node adds an external, scalable image in a newly created child node.
+ </li>
+ <li>
+ Dropping only works if the mind map has been saved.
+ </li>
+ <li>
+ For security reasons dragging and dropping is not possible for internet images. Hence, first drag and drop on your desktop, hence drag and drop on the mind map.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ To add a hyperlink, <b>copy and paste </b>(also from Internet);
+ </p>
+ <ul>
+ <li>
+ Pasting at the upper part of a node adds a hyperlink to a newly created sibling
+ </li>
+ <li>
+ Pasting at the outer side of a node adds a child node with a hyperlink.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Images are not part of the mind map. If the image source in your computer is removed, the image will no longer display.
+ </li>
+ <li>
+ Make sure the image source is not in a temporary file. For example, copy an image available in an e-mail program like Thunderbird first to a permanent directory on your computer.
+ </li>
+ <li>
+ If the image source is on Internet, an internet connection must be active to display the image.
+ </li>
+ <li>
+ If you paste an image copied with PrintScreen, Freeplane first asks you where to save the image.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Change image..." ID="ID_276232981" CREATED="1303931774914" MODIFIED="1335988162105" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Shows the handle of the external image of the selected node by which the size of the image can be changed.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Remove image" ID="ID_1348672374" CREATED="1303931789305" MODIFIED="1335988167441" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remove the external images from the selected node.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Image" ID="ID_1620391394" CREATED="1303931708607" MODIFIED="1330597899995" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An image in Freeplane is a picture with format<b> png, jpeg, gif, </b>or<b> svg</b> . An image can be attached to the internal area of a node (inside the bubble) or to the external area (outside the bubble).
+ </p>
+ <ul>
+ <li>
+ The image in the internal area is fixed in size. It is shown in its actual size. To make it smaller, use a paint program.
+ </li>
+ <li>
+ The image in the external area is sizeable. To resize it, move the cursor over one of the corners until the resize handle appears and drag it to its new size.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Images are NOT included in the mind map .mm. As a result, when moving a mind map images are not automatically moved with the mind map and get disconnected.
+ </li>
+ <li>
+ .<b>svg</b> images can NOT be published on internet, e.g. with Java Applet.
+ </li>
+ </ul>
+ <p>
+ <b>Best practice</b>
+ </p>
+ <ul>
+ <li>
+ Make a directory in which both images and the .mm file are kept. Add images to the mind map from this directory. When this directory is displaced as a whole to a different position, the images keep appearing in the mind map. When publishing the mind map, an additional action is necessary, see below.
+ </li>
+ <li>
+ Use the example script to include images in Details and Notes. See scripts.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Pubishing mind maps</i> with images on Internet.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1309808574878" MODIFIED="1315731685868" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="264"/>
+<attribute NAME="Chapter" VALUE="3,6"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">To publish a mind map with images: </font>
+ </p>
+ <ul>
+ <li>
+ Make sure the images are in the same directory as the mind map
+ </li>
+ <li>
+ Fold the mind map as you want it to be when opening
+ </li>
+ <li>
+ Select <i>File > Export</i> and choose <i>Java Applet</i>. One file and one directory will be created: <i>myFile.html </i>and <i>myFile.html_files</i> respectively.
+ </li>
+ <li>
+ Copy the images to <i>myFyle.html_files</i>
+ </li>
+ </ul>
+ <p>
+ Now you can move the file <i>myFile.html</i> and the subdirectory <i>myFile.html_files</i> to the location (directory) where you want to it be it accessible. Call <i>myFile.html</i> to open the mind map. If publishing on internet, you may rename myFile.html in e.g. index.html. The subdirectory should not be renamed.
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Edit attribute in-line" ID="ID_639830064" CREATED="1266247880359" MODIFIED="1315731980592" TEXT_SHORTENED="true">
+<icon BUILTIN="../EditAttributesAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens dialog to edit names and values of attributes of selected nodes.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy attributes </i>
+ </li>
+ <li>
+ <i>Edit > Paste attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Attribute in dialog" FOLDED="true" ID="ID_984784283" CREATED="1266244687437" MODIFIED="1315732181372" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a table structure below the basic node text with two columns in which a name and value can be entered or selected.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Right-click on the columns to open a context menu.
+ </li>
+ <li>
+ The width of the columns can be changed by dragging the bar above the columns.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy attributes </i>
+ </li>
+ <li>
+ <i>Edit > Paste attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="" FOLDED="true" ID="ID_560316882" CREATED="1312919556690" MODIFIED="1312919576923">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_110645225" CREATED="1310841527098" MODIFIED="1311404452959" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It is possible to add the same attribute and value at once to all selected nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Copy and paste attributes" ID="ID_1118988780" CREATED="1311226498788" MODIFIED="1311404930655" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy attributes </i>
+ </li>
+ <li>
+ <i>Edit > Paste attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Show/hide attribute-icon" ID="ID_395016262" CREATED="1311926417042" MODIFIED="1311926469162" 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" CREATED="1310842038396" MODIFIED="1314781375632" TEXT_SHORTENED="true">
+<icon BUILTIN="../showAttributes"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to manage all attributes of all nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Copy attributes" ID="ID_1688307508" CREATED="1310193998671" MODIFIED="1315732143846" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Copies attributes from the selected node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Paste attributes" ID="ID_1986438286" CREATED="1310194008929" MODIFIED="1315732270003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Pastes attributes in the selected node that before have been copied form another node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Copy attributes </i>
+ </li>
+ <li>
+ <i>Node features > Attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Attributes from style" ID="ID_1359819434" CREATED="1310841915000" MODIFIED="1315732298941" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Copies (imports) attributes from the style of a selected node to the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ Has effect only if the node is connected to a style.
+ </li>
+ <li>
+ Has effect only if the style has one or more attributes.
+ </li>
+ <li>
+ When a node is connected to a style, attributes are not automatically connected.
+ </li>
+ <li>
+ Example: Has been used for the current node. The node was first given Style Method and next attribute Class=Method was imported.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Remove attribute" STYLE_REF="SubMenu" FOLDED="true" ID="ID_187455075" CREATED="1315732300852" MODIFIED="1315732324486">
+<node TEXT="Remove first attribute" ID="ID_869406084" CREATED="1303930754909" MODIFIED="1315731851868" 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" CREATED="1330442368297" MODIFIED="1330442399201"/>
+<node TEXT="Remove all attributes" FOLDED="true" ID="ID_8268990" CREATED="1303930781149" MODIFIED="1310842754478" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="Remove last attribute" ID="ID_412020595" CREATED="1303930767148" MODIFIED="1310842749408" 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" CREATED="1311921084341" MODIFIED="1318967473636" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To hide an attribute, check its name in the list.
+ </p>
+ <p>
+ To hide only a restricted set of values of an attribute, check and define the set.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Node > Shortened node content
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" FOLDED="true" ID="ID_402800324" CREATED="1312919683339" MODIFIED="1312919703167">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_796383862" CREATED="1311921423470" MODIFIED="1311921537007" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Attributes are visible in the Tool Tip, independent of their setting in the Attribute manager.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hide attribute a1, show attribute a2" ID="ID_475109570" CREATED="1288646162992" MODIFIED="1312615263072">
+<font ITALIC="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ text in field notes
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="a1" VALUE="value 1"/>
+<attribute NAME="a2" VALUE="value 2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This node contains 2 attributes, a1 and a2 (may be more)
+ </p>
+ <p>
+ Open <i>Attribute manager</i> to see that attribute a2 is checked visible and a1 is not, hence is hidden.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ a2 keeps visible in the <i>Tool Tip</i> (if you hover with the cursor above the node).
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_510422017" CREATED="1288646162992" MODIFIED="1315981129708" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Show/Hide attribute "hover text<i>" </i>set
+ </p>
+ </body>
+</html>
+</richcontent>
+<font ITALIC="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ text in field notes
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="a1" VALUE="value 1"/>
+<attribute NAME="a2" VALUE="value 2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This node contains 2 attributes, a1 and a2 AND<i> Node > Shortened node content </i>is ON.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Result: text of Details is hidden, and checked attributes stay visible.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ Open <i>Attribute manager </i>to see that attribute a2 is checked visible and a1 is not, hence is hidden.
+ </li>
+ <li>
+ a2 keeps visible in the Tool Tip (if you hover with the cursor above the node).
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Attributes" ID="ID_147715298" CREATED="1303930553284" MODIFIED="1315731833413" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An <b>attribute</b> is an entity with a name and a value, meaning name = value. Attributes are shown in a table with two columns, which appears in the external area of the node, under Details.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View >Properties Panel >Calendar and Attributes (</i>changes one node at a time)
+ </li>
+ <li>
+ <i>View >Shortened node content</i> to show/hide attributes
+ </li>
+ <li>
+ <i>View > Attribute > Show all attributes/Show selected attributes/Hide attributes</i>
+ </li>
+ <li>
+ <i>Node features > Attribute manager</i> to check which nodes are selected.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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 LaTeX formula..." ID="ID_816429133" CREATED="1266250651984" MODIFIED="1311406091422" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opent het bewerkingsvenster voor de LaTeX opmaak.
+ </p>
+ <p>
+
+ </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 TEXT="Edit LaTeX formula..." ID="ID_1933244848" CREATED="1305483582106" MODIFIED="1311406091437" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,7"/>
+</node>
+<node TEXT="Remove LaTeX formula" ID="ID_1339380039" CREATED="1303931933356" MODIFIED="1311406091437" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,7"/>
+</node>
+<node TEXT="LaTeX formula" ID="ID_1750517188" CREATED="1303931890027" MODIFIED="1335988178673" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ LaTeX is a method to define the layout of scientific formulas..
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,7"/>
+<hook NAME="SummaryNode"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="See Internet" ID="ID_1974921327" CREATED="1310061549760" MODIFIED="1312920045876" 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="Note" FOLDED="true" ID="ID_1365598976" CREATED="1303930145801" MODIFIED="1335981689671" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>note</b> is a special text field preceded with a note <b>icon. </b>A note can appear in different ways:
+ </p>
+ <ol>
+ <li>
+ In the external area of the node, below Attributes. Here it can be used as an alternative to Details.
+ </li>
+ <li>
+ In a separate, independent window. Here one can present complete, screen wide documents. See: View
+ </li>
+ <li>
+ In the dialog of the Time managert (Agenda). Here it is used to name an activity or task.
+ </li>
+ </ol>
+ <p>
+ <b>See also </b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Show notes in map</i>
+ </li>
+ <li>
+ <i>View > Toggle Note panel</i>
+ </li>
+ <li>
+ <i>Tools > Preferences</i> to set that the note icon should not be shown
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="Edit note in dialog" ID="ID_924676619" CREATED="1266255695750" MODIFIED="1335988466864" TEXT_SHORTENED="true">
+<icon BUILTIN="../EditNoteInDialogAction"/>
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog for editing the note field of the selected note.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Remove note" ID="ID_142539324" CREATED="1266247870640" MODIFIED="1311402835283" TEXT_SHORTENED="true">
+<icon BUILTIN="../RemoveNoteAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to remove the note field of the selected nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="Edit in note panel" ID="ID_221910481" CREATED="1298574467254" MODIFIED="1330597939837" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">View > Note Panel </font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="165"/>
+<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" CREATED="1310843490041" MODIFIED="1311402835283" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>note</b> is a special text field, generally preceded with a note <b>icon.</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hide note-icons" ID="ID_830303915" CREATED="1311926324089" MODIFIED="1312919765910" LINK="#ID_635307234">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+<node TEXT="Main components" STYLE_REF="MenuGroupLabel" ID="ID_1143096620" CREATED="1315732457858" MODIFIED="1315732504909">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Undo" ID="ID_1899055023" CREATED="1310134532663" MODIFIED="1330442619059" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Reverse previous changes or edits. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>Note</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">The number of Undo actions stored by FreePlane is determined in Preferences. </font>
+ </li>
+ </ul>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>See aslo</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><i>Tools >Preferences > Behavior > Undo</i>.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Redo" ID="ID_807893197" CREATED="1310134532663" MODIFIED="1330442630977" TEXT_SHORTENED="true">
+<icon BUILTIN="../redo"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Reverses an Undo. It is limited to the most recent Undo.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Cut" ID="ID_353410114" CREATED="1310134532663" MODIFIED="1314559544053" TEXT_SHORTENED="true">
+<icon BUILTIN="../editcut"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Cuts the node currently selected and all of its children.</span></font>
+ </p>
+ </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" CREATED="1315733224858" MODIFIED="1315733253109">
+<node TEXT="Copy" ID="ID_1274800359" CREATED="1310134532663" MODIFIED="1314559562383" TEXT_SHORTENED="true">
+<icon BUILTIN="../editcopy"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Copies the node selected and all of its children.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Copy node (single)" ID="ID_1302326175" CREATED="1310134532663" MODIFIED="1330442872504" TEXT_SHORTENED="true">
+<icon BUILTIN="../copy_single"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Copies only the node selected, even if it has children.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Copy node ID" ID="ID_1433358397" CREATED="1310193968260" MODIFIED="1330024725128" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Gets the internal Node ID of the currently selected node and stores it in the system Clipboard. This advanced feature has, for most purposes, been replaced by the menu command Insert > Add Local Hyperlink. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"> It is useful for linking to an node in a different mindmap. In that case the nodeID must be preceded by the (path to) the mindmap and the character "#", e.g. mymap.mm#particularId. To get the full absolute path and nodeID, see Copi node URI. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ Not every program passes #nodeId to the mindmap. Of course a freeplane mindmap does so. If nodeId is not passed, the mindmap opens but the node is not selected.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Copy node URI" STYLE_REF="Method" ID="ID_874062942" CREATED="1330023985952" MODIFIED="1330024987708" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Copy the full, absolute address (pathname/filename.mm#nodeID) of the node. This address can be pasted in a hyperlink in a (different) mindmap or other program to open the mindmap and select the node. To make the address relative in stead of absolute, remove the first part of the pathname, leaving at least the #nodeID (internal node) or mindmapName.mm#nodeID external node in different map in same directory.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ Not every program passes #nodeId to the mindmap. Of course a freeplane mindmap does so. If nodeId is not passed, the mindmap opens but the node is not selected.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Paste" ID="ID_1705754282" CREATED="1310134532663" MODIFIED="1314469475538" TEXT_SHORTENED="true">
+<icon BUILTIN="../editpaste"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Pastes copied text. If the selected node is in edit mode, the text will be added to the contents of the node. If the selected node is not in edit mode, the text will be added as a child node.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Paste as..." ID="ID_1160623822" CREATED="1310885419000" MODIFIED="1314469580370">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Cut, copy and paste" ID="ID_758366226" CREATED="1310835917635" MODIFIED="1312814994718">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1306060121800" MODIFIED="1315732930158" 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" CREATED="1306059969763" MODIFIED="1330442919249" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Changes the position of the node by moving it down through the sibling hierarchy. If already at the bottom, the node is moved to the top. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Hot key</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Down</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Move node (Sibling up)" ID="ID_33657896" CREATED="1306059989034" MODIFIED="1330442926732" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Changes the position of the node by moving it up through the sibling hierarchy. If already at the top, the node is moved to the bottom. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Hot key</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Up</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Sort children" ID="ID_1942706169" CREATED="1266247810468" MODIFIED="1311402755364" TEXT_SHORTENED="true">
+<icon BUILTIN="../SortNodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">Sorts all children of the selected node recursively, in descending alphanumeric order. The node hierarchy is preserved</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Move node (Parents sibling)" ID="ID_1330098607" CREATED="1306059994859" MODIFIED="1330442944939" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Changes the position of the node by making it a sibling of its parent. It is placed below the parent to which it was originally a child. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Hot key</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Left</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Move node (Siblings child)" ID="ID_1588077274" CREATED="1306060092075" MODIFIED="1330442954827" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Changes the position of the node by making it a child of the node directly above it. If there are other child nodes it becomes the sibling of those children, and is placed last among them. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Hot key</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Right</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Vertical space between nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1324029133997" MODIFIED="1324070292271" 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" CREATED="1324029189260" MODIFIED="1324070325642" HGAP="-158" VSHIFT="30">
+<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" CREATED="1317404199533" MODIFIED="1330598022346" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If set, the movement of a node (and its children) are independent of the movements of all other nodes. The node can be recognized by a full blue oval handle for moving the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <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 double-clicking a free place of the mind map. The newly generated free node will have the default properties <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.
+ </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) 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 root node and can be moved from there to any desired position by dragging its (blue) oval handle. Moving a free positioned node onto another parent / sibling by usual drag and drop cancels its free positioned status.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ A free node made by clicking a free space of the mind map is connected to the root node, also if the connecting edge is invisible. This explains why a child node of this free node, if moved onto the upper half of its parent free node, shifts towards the root node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Limitation" STYLE_REF="ToNote" ID="ID_294060265" CREATED="1321125091078" MODIFIED="1321125210592" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 1. The floating nodes with hidden edges are intended for adding meta information to maps like legends, titles, summaries, authors etc. If such informations relates to a whole map, such nodes should have a root node as their parent so that are always visible and their position does not depend on anything else. Sometimes such information is relevant only for a part of a map. In this case a floating node with hidden edge can be attached to a non root node. For understanding of the context (which I find important) its parent edge is usually displayed as a dashed line if a node is selected unless its color was set to the map background color.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 2. The free nodes do not require that you hide their edges. The second use case for them is a better use of map space. The automatic layout algorithm does not allow any map branches to overlap. If you want to create more compact maps you can convert some nodes to free nodes. This way they can be placed flexible. And their logical position relative to other sibling nodes now depends on their coordinates. You can see it too if you change to outline view which always reflect logical node positions.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Reset node position" ID="ID_1003048503" CREATED="1306060582988" MODIFIED="1337369703990" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Returns the node to the position it had when it was first created. If you have moved nodes around and want to reformat your map, this command will do so. <i>Ctrl + A</i> will select all the nodes in a map.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Find..." ID="ID_412879235" CREATED="1310134532663" MODIFIED="1314077793686" TEXT_SHORTENED="true">
+<icon BUILTIN="../filefind"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens the Find dialog box. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><i>Find Next.</i></span></font>
+ </li>
+ </ul>
+ </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" CREATED="1310134532663" MODIFIED="1314559739287" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Searches for the next instance of the string entered in the Find dialog box. (A string is any combination of letters and numbers.) </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Find...</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Find and Replace..." ID="ID_1230019641" CREATED="1310134532663" MODIFIED="1330598041050" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeListAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens a dialog box that lists all of the nodes in a map. When matches are found for the string entered in the Find field, you have the option to apply the value of the Replace field or skip to the next instance of the Find string. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Find and Replace in all Maps.</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Find last modified nodes" ID="ID_1272430146" CREATED="1311098601253" MODIFIED="1314078206993" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To find the list of nodes last modified, click on top of the table Modified to sort the rows top down or bottom up. Next you can see which nodes have been last modified.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ To go the the node, double click on the line the node is in.
+ </li>
+ </ul>
+ <p>
+ <b>See also </b>
+ </p>
+ <ul>
+ <li>
+ Quick filter for a filtterrule to see al nodes modified after a date.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+</node>
+<node TEXT="Find and replace in all maps" ID="ID_4891503" CREATED="1310194040136" MODIFIED="1314077851360" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Same as Find and Replace... but applied to all open maps. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Find and Replace...</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Find and replace" ID="ID_1229770899" CREATED="1310835859572" MODIFIED="1314077779194">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1266240584812" MODIFIED="1322427064582" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<attribute_layout VALUE_WIDTH="216"/>
+<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To change the way the mind map appears to you.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="New map view" ID="ID_1759737398" CREATED="1330374071971" MODIFIED="1330374272886" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a copy of the current map with an index number.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Toolbars" FOLDED="true" ID="ID_1963983857" CREATED="1303929006438" MODIFIED="1311947052465" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Methods are accessible through the main menu-bar as menu-items, the Toolbar and Filter toolbar as icon-buttons, as short-cut keys (F-keys and key combinations) and as context menu's which are connected to objects such as nodes and connectors. It is your own choice which of these possibilities you want to use.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ A menu-bar which is not needed, can be hidden to save screen space. If all bars are hidden, right-click on the screen to display the context menu with which cou can make them visible again.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="Menubar" FOLDED="true" ID="ID_926021846" CREATED="1266247097703" MODIFIED="1335988666432" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Toggles the main toolbar on and off. This is the bar with the menu's for File, Edit, View, Nodes, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ Many menu items show short cut keys/combinations which can be used in stead of pressing the menu items.
+ </li>
+ <li>
+ The icons shown with the menu items are generally available as icon-buttons (short cuts) in toolbars.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="Main menu-bar" ID="ID_1325292461" CREATED="1311183309593" MODIFIED="1311402615603" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="175"/>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">The<b> main menu-bar</b> is the bar with the main textual menu's of Freeplane at the top of the screen. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>Note</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">Many of the menu's display <b>icons</b> which at other places represent<b> icon-buttons</b> that can be pressed and then have the same effect as selecting the textual menu's. </font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">The menu-items also may display <b>short cuts</b> (special keys or combinations of keys) that can be pressed to activate the menu-items. </font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Toolbar" FOLDED="true" ID="ID_1777795790" CREATED="1288423137527" MODIFIED="1335988674576" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles visibility of toolbar on and off.
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ This map contains the most used items of the Main menu-bar as icon-buttons for easy access.
+ </li>
+ <li>
+ Move the cursor over the icon buttons to see their function. The icons are also shown in the Main menu bar.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="Main toolbar" ID="ID_1091232727" CREATED="1311319747381" MODIFIED="1311402583514" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The <b>main toolbar</b> is the bar with icon-buttons for most used map handling, e.g.Previous map, Following map, etc.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Filter toolbar" FOLDED="true" ID="ID_850553052" CREATED="1288423176425" MODIFIED="1311402754787" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of the toolbar with filter methods.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Filter</i> in the main menu.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="Filter toolbar" ID="ID_793475442" CREATED="1311319982419" MODIFIED="1311402583514" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The <b>filter toolbar</b> is the bar containing entry fields for filter rules and icon-buttons for most used filter methods like Undo, Redo, etc.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="F-bar" ID="ID_664958295" CREATED="1266247102156" MODIFIED="1335988689957" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Toggles the Function Key (F-Key) toolbar on and off. This is the bar with F1, F2, F3, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">F-keys on the keyboard are also active if the F-bar is hidden.</font>
+ </li>
+ <li>
+ F-keys must be defined before they can be used, see below.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Tools > Short cuts</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Icons toolbar" ID="ID_1263742214" CREATED="1266247112156" MODIFIED="1335988711629" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Toggles the visibility of the Secondary Toolbar [Icon bar] on and off. This is the bar containing all kinds of icons the user can add to a node and located vertically at the left of the screen (most of the time).</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Node features > Icons</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Display status line" ID="ID_183960920" CREATED="1303929119304" MODIFIED="1314558391133" TEXT_SHORTENED="true">
+<icon BUILTIN="icon_not_found"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of a status line at the bottom of the window.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Context menu's" FOLDED="true" ID="ID_832730564" CREATED="1310672464952" MODIFIED="1335982661462" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="228"/>
+<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Context menus are powerful alternative to using menu-bars.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ To open a context menu, right-click on the object you want to display its context menu.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<node TEXT="Context menu" ID="ID_497182548" CREATED="1310890907946" MODIFIED="1310891033981" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>context menu</b> is a menu associated with a particular object which only contains menu items most relevant for this object. A context menu is opened by right-clicking the object.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Properties panel" FOLDED="true" ID="ID_1783882978" CREATED="1291154608643" MODIFIED="1314476854103" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of the properties panel.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4,5"/>
+<node TEXT="Properties panel" ID="ID_125269399" CREATED="1310714224145" MODIFIED="1311402583530" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<font BOLD="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The<b> properties panel </b>is a dialog to change the basic properties of a node. Properties are distinguihed in format-properties and properties of Calendar & attributes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Assign Properties Panel to F-key" STYLE_REF="ToNote" ID="ID_1019704667" CREATED="1313557428181" MODIFIED="1313557698545" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The properties panel is one of the most used menu's. It makes sense therefore to assign it a hot key.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > hot keys</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Format properties" FOLDED="true" ID="ID_786320758" CREATED="1293305969634" MODIFIED="1311405889214" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To change a property of a selected node in the Properties Panel:
+ </p>
+ <ul>
+ <li>
+ check change box; and
+ </li>
+ <li>
+ select or edit the changed property
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The change takes effect immediately. There is no need to press an OK button or leave the panel.
+ </li>
+ <li>
+ It is possible to select a different node without leaving the Properties Panel
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1313557908459" MODIFIED="1321889459030" LINK="#ID_1362134553">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Automatic edge color" STYLE_REF="UnChecked" ID="ID_502377582" CREATED="1313557989945" MODIFIED="1313559702675" LINK="#ID_1587417548"/>
+<node TEXT="Style" ID="ID_1437890426" CREATED="1313558038564" MODIFIED="1313558689891" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see a list of predefined system and user defined styles
+ </p>
+ <ul>
+ <li>
+ click
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > New style from selection</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node conditional styles applied to node" ID="ID_1460333381" CREATED="1313558316690" MODIFIED="1313559193279" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add or modify,
+ </p>
+ <ul>
+ <li>
+ click
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Styles > Manage conditional styles for map
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Map conditional styles applied to node" ID="ID_1573811748" CREATED="1313558341206" MODIFIED="1313559218395" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add or modify,
+ </p>
+ <ul>
+ <li>
+ click
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > Manage Conditional map styles</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node style" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" CREATED="1313558795581" MODIFIED="1313559035703" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Styles
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Text" ID="ID_158955063" CREATED="1321889497304" MODIFIED="1321889644374">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Background" ID="ID_631849825" CREATED="1321889528980" MODIFIED="1321889538934"/>
+<node TEXT="Color of whole core" STYLE_REF="MenuGroupLabel" ID="ID_1325673734" CREATED="1321889644374" MODIFIED="1321889740408">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Format" FOLDED="true" ID="ID_835341746" CREATED="1321889597815" MODIFIED="1335988815836" FORMAT="NO_FORMAT">
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Standard" STYLE_REF="OptionalValue" ID="ID_1741429260" CREATED="1329424291216" MODIFIED="1329424534999"/>
+<node TEXT="Text" STYLE_REF="OptionalValue" ID="ID_1270028285" CREATED="1329424298568" MODIFIED="1329424572790"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Disables execution of formula
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="#0,####" STYLE_REF="OptionalValue" ID="ID_1336519812" CREATED="1329424306349" MODIFIED="1329424535008" FORMAT="Text#0,####"/>
+<node TEXT="#,00" STYLE_REF="OptionalValue" ID="ID_1407835038" CREATED="1329424374295" MODIFIED="1329424535012" FORMAT="Text#0,####"/>
+<node TEXT="#" STYLE_REF="OptionalValue" ID="ID_963707448" CREATED="1329424397690" MODIFIED="1329424535015" FORMAT="Text#0,####"/>
+<node TEXT="#,##%" STYLE_REF="OptionalValue" ID="ID_1672350213" CREATED="1329424410271" MODIFIED="1329424535017" FORMAT="Text#0,####"/>
+<node TEXT="d-M-yy" STYLE_REF="OptionalValue" ID="ID_65722678" CREATED="1329424460169" MODIFIED="1329424535019" FORMAT="Text#0,####"/>
+<node TEXT="etc." STYLE_REF="OptionalValue" ID="ID_1181579783" CREATED="1329424487659" MODIFIED="1329424535021" FORMAT="Text#0,####"/>
+</node>
+<node TEXT="Node numbering" ID="ID_716321598" CREATED="1321889611457" MODIFIED="1321889629632"/>
+<node TEXT="Core text" STYLE_REF="MenuGroupLabel" ID="ID_1056392580" CREATED="1321889693546" MODIFIED="1321889750689">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Node style" FOLDED="true" ID="ID_1006574881" CREATED="1310714589873" MODIFIED="1321889018010" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Node shape</b> is: the appearance of the node: without surrounding box (Fork), with surrounding box (Bubble), as parent or combined.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Fork" STYLE_REF="OptionalValue" ID="ID_1016917341" CREATED="1321889816700" MODIFIED="1321890015717" STYLE="as_parent">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Bubble" STYLE_REF="OptionalValue" ID="ID_559452645" CREATED="1321889858407" MODIFIED="1321890033782">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Combined" STYLE_REF="OptionalValue" ID="ID_347035916" CREATED="1321889869209" MODIFIED="1321890115963" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Changes to bubble if folded
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="As parent" STYLE_REF="OptionalValue" ID="ID_324797442" CREATED="1321889877812" MODIFIED="1321890069818">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="Min node width" ID="ID_1182377159" CREATED="1321888900299" MODIFIED="1321976459304" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Minimum node width in pixels.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ View > Properties panel
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Max node width" ID="ID_1506239651" CREATED="1321888911727" MODIFIED="1321976454296" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Maximum width of the node in pixels.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ View > Properties panel
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node shape" STYLE_REF="MenuGroupLabel" ID="ID_1665588957" CREATED="1321889018010" MODIFIED="1321889063968">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Node Font" FOLDED="true" ID="ID_724156158" CREATED="1310714589873" MODIFIED="1311405449387" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Node Font</b> is the Font family, size, bold and italic.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Set standard font size" ID="ID_627969850" CREATED="1311926183029" MODIFIED="1312917150316" 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" CREATED="1335124093251" MODIFIED="1335124253846" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If an arrow-link is defined and no underlined link is defined, sets the whole node core to an underlined hyperlink. So the used does not have to click the arrow ican, but can click on the whole core to follow the link
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Edge width" ID="ID_1392877020" CREATED="1310714589889" MODIFIED="1335989275793" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Edge width </b>is the thickness of the edge.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edge style" ID="ID_1060644831" CREATED="1310714589889" MODIFIED="1311405449543" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Edge style</b> is the way an edge bends.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Edge color" ID="ID_211700099" CREATED="1310714589889" MODIFIED="1335989288789" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Edge color</b> is the color of the edge connecting nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Edge properties" STYLE_REF="MenuGroupLabel" ID="ID_1536352077" CREATED="1319987449416" MODIFIED="1319987513205">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Cloud color" FOLDED="true" ID="ID_58140909" CREATED="1310714589889" MODIFIED="1335989342581" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Cloud color</b> is the<b> </b>background color of cloud.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Set standard cloud color" ID="ID_1130479055" CREATED="1311925883476" MODIFIED="1312917150316" 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" CREATED="1310714589889" MODIFIED="1311405449684" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Cloud Shape</b> is its the form of the cloud, e.g. Star, Rectangle or Round rectangle form.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Clouds" STYLE_REF="MenuGroupLabel" ID="ID_1623448777" CREATED="1335989342581" MODIFIED="1335989376076">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Reset style" ID="ID_25667795" CREATED="1310720110705" MODIFIED="1311405449746" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ When a property is checked, its change overrides the value set by Style. To return to the value of the style, uncheck Change.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Not included" FOLDED="true" ID="ID_1971371205" CREATED="1310714589905" MODIFIED="1311405449746" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Not all properties can be set in Properties Panel.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Format
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Blinking node" ID="ID_1863972932" CREATED="1310714589905" MODIFIED="1310716556350" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Blinking node</b> is a node which cycles through a number of colors.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Blend color" ID="ID_661366038" CREATED="1310714589905" MODIFIED="1310716556350">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Map background" ID="ID_657472078" CREATED="1310714589905" MODIFIED="1310716556335" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Map background</b> is the color of background.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hidden edge" ID="ID_1015777202" CREATED="1310714589905" MODIFIED="1310716556335" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Hidden edge</b> is an edge style when the edge is invisible.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Calendar and Attributes" ID="ID_1981388225" CREATED="1310720605287" MODIFIED="1330598413923">
+<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" CREATED="1310720744003" MODIFIED="1311412001798" TEXT_SHORTENED="true" FORMAT="#0.####">
+<icon BUILTIN="icon_not_found"/>
+<icon BUILTIN="../TimeManagementAction"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also </b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Time management</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="year-month-day" ID="ID_144760412" CREATED="1310720753106" MODIFIED="1311405889261">
+<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" CREATED="1312570564893" MODIFIED="1312570588997"/>
+<node TEXT="Reset Calendar" ID="ID_435441461" CREATED="1310720775437" MODIFIED="1312922773400" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Set the calendar to the current time and date.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Insert Date in Selection" ID="ID_63295810" CREATED="1310720786116" MODIFIED="1335989635745" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add a date text according to standard date format
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Edit Script..." ID="ID_252404367" CREATED="1312535206255" MODIFIED="1335989655745" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens dialog to enter a script which will be executed at the time of the reminder, if the mind map is open at this time.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Edit script
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Reminder triggers script" ID="ID_121096889" CREATED="1312569727978" MODIFIED="1312917319233" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This example contains a script that will add the ok-icon to the present node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do</b>
+ </p>
+ <ul>
+ <li>
+ Open Edit script, see it contains:
+
+ <pre class="code">node.<span class="me1">getIcons</span><span class="br0">()</span>.<span class="me1">addIcon</span><span class="br0">(</span><span class="st0">"button_ok"</span><span class="br0">)</span></pre>
+ </li>
+ <li>
+ Add a reminder to the node at 2 minutes from now.
+ </li>
+ <li>
+ Keep the mindmap in memory (do nothing to close it).
+ </li>
+ <li>
+ Wait 2 minutes.
+ </li>
+ <li>
+ See the reminder going active: clock is flashing; see ok-button added.
+ </li>
+ <li>
+ remove the ok-button if you want to try again.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Remind me at this date" ID="ID_721277173" CREATED="1310720824358" MODIFIED="1312571253753" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To set a reminder at the date and time set.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ The reminder wil also trigger the script, if defined AND the mindmap is open. It is not necessary that the map is visible.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Edit script... [Execute script]
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Remind later" ID="ID_760755432" CREATED="1329424755694" MODIFIED="1329424855894" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remind later a number of minutes to years.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Remove reminder" ID="ID_1320064607" CREATED="1310720836910" MODIFIED="1330598537382">
+<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" CREATED="1312569522171" MODIFIED="1312917331432" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Also removes script
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Remind me at this date</i> to change date/time without deleting the script
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+<node TEXT="Attributes" FOLDED="true" ID="ID_1738195082" CREATED="1310720848133" MODIFIED="1311412804759" TEXT_SHORTENED="true">
+<icon BUILTIN="../showAttributes"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Attributes</i>
+ </li>
+ <li>
+ <i>View > Attributes</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="New attribute" ID="ID_682004984" CREATED="1310720854444" MODIFIED="1311402834908">
+<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" CREATED="1310720862656" MODIFIED="1311402834940">
+<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" CREATED="1311410715399" MODIFIED="1335989687344" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To format the attribute value, select and modify on of the format templates.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ See also
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Table of attributes" ID="ID_110950554" CREATED="1310720873662" MODIFIED="1311414481419" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An <b>attribute</b> has a name and value/data, meaning name=value.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The list of attributes consists of two columns. The left column can contain the attribute's name and the right column its value.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The attribute's value can be automatically formatted, see Preferences.
+ </li>
+ <li>
+ To prevent automatic data formatting incidentally, type as a first character a non-number. The entered text will be treated as text, also if the first character is deleted afterwards. Examples:
+
+ <ul>
+ <li>
+ When you enter 1,2,,3 this will transform in 123 (except if you defined the template to be #,#,#)
+ </li>
+ <li>
+ When you enter "1,2,3 and next remove ", you will keep 1,2,3
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Attribute data formatting</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_1128827136" CREATED="1310841040542" MODIFIED="1329425066371" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It is possible to add or edit the attribute of one node at the time.
+ </p>
+ <p>
+ URL's aure automatically recognised.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Attributes</i> to add the same attribute at once to a group of selected nodes.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Zoom in" ID="ID_1817335801" CREATED="1310134532663" MODIFIED="1314888682936" TEXT_SHORTENED="true">
+<icon BUILTIN="../ZoomIn24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Makes the font size and the distance between nodes larger; fits less of the map on the screen.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Zoom out" ID="ID_1176192683" CREATED="1310134532663" MODIFIED="1314558375002" TEXT_SHORTENED="true">
+<icon BUILTIN="../ZoomOut24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Makes the font size and the distance between nodes smaller; fits more of the map on the screen.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Zoom to fit page" ID="ID_1360497080" CREATED="1266249692203" MODIFIED="1310721457900" TEXT_SHORTENED="true">
+<icon BUILTIN="../FitToPage"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Adjusts the font size and distance between nodes to fit the entire map on the screen. If many nodes are visible (unfolded), the font may be rendered too small to be readable.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Center selected node" ID="ID_1435118166" CREATED="1310134532663" MODIFIED="1330598573012" TEXT_SHORTENED="true">
+<icon BUILTIN="../CenterSelectedNodeAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Brings the selected node to the centre of the screen, moving the surrounding nodes with it.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Short cut</b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Alt + C</i>
+ </li>
+ <li>
+ icon-button
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Scroll/move map" ID="ID_1548435797" CREATED="1311407287938" MODIFIED="1312915841416" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="12"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To move the whole map, click in an empty part of the screen and drag the map, ore use the scrollbars at the sides of the screen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Center selected node automatically" ID="ID_1299718023" CREATED="1335982472005" MODIFIED="1335982683146">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="View settings" ID="ID_1492135940" CREATED="1335978381041" MODIFIED="1335978389341">
+<node TEXT="Outline view" ID="ID_519734292" CREATED="1266247214640" MODIFIED="1310721911393" TEXT_SHORTENED="true">
+<icon BUILTIN="../outline_view"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Toggles the display of the map between default (radial view) or list (outline view). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Node spacing may be fine-tuned using Preferences. </font>
+ </p>
+ </li>
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Some aspects of visual appearance are simplified while in Outline view, and more information may be visible on-screen at one time than in the normal Mind Map view. </font>This view may be handy in printing a large maps.
+ </p>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Full screen mode" FOLDED="true" ID="ID_1526004925" CREATED="1310672109364" MODIFIED="1314888524183" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Hide or show all menu/tool bars. </font>
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="" ID="ID_1272735653" CREATED="1310716776303" MODIFIED="1310716821153" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Once in full screen mode, the only way to change back to normal screen mode is to right click on the screen and UNCHECK Full Screen mode.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Presentation mode" STYLE_REF="Method" ID="ID_1924930800" CREATED="1335978488875" MODIFIED="1335980840453" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Greys all nodes except the selected nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Rectangular selection" ID="ID_1851007191" CREATED="1266247206859" MODIFIED="1310721457822" TEXT_SHORTENED="true">
+<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Toggles the appearance of selecting a node. When in Rectangular selection mode, the selected node has a solid line around it, with rounded corners. When not in Rectangular mode, the selected node has a grey background color. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif"><i>Tools > Preferences > Appearance > Selection Colors.</i></span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Highlight formulas" ID="ID_1847984972" CREATED="1303929296863" MODIFIED="1337170665678" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggle between not marking or marking the visibility of formula's by a rectangular, colored surrounding. defaultt is a surrounding.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Minimize node" ID="ID_180063018" CREATED="1319034903387" MODIFIED="1319035575687" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Press to (un)hide node features like node details, image, hyperlink (underlined). Also the node core is shortened and formatting is removed.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The hidden text and hyperlinks are shown when hovering with the cursor above the node core (tool tip). Images are not shown when hovering.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ If you need a hyperlink in the node core, use the <a href="#ID_1430712985">arrow-link</a>.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hide details" ID="ID_734978433" CREATED="1291155323140" MODIFIED="1330443183598" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of the Details field under the basic node text.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Alternative: Click the triangle button below the node
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Tool tips" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1599182564" CREATED="1315733540501" MODIFIED="1318607345794">
+<node TEXT="Display tool tips" FOLDED="true" ID="ID_152459666" CREATED="1310673142140" MODIFIED="1318607339351" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of Tool Tips.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Show notes in map </i>
+ </li>
+ <li>
+ View > Attributes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Tool Tips" ID="ID_1399586746" CREATED="1310718250232" MODIFIED="1311402583545" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Tool Tip is a window that opens when the mouse cursor is over a node and View > Display Tootips is set. You are reading the current text in a Tool Tip window.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The window shows otherwise hidden content, see <i>Node > Shortened node content</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Set width tool tip" ID="ID_383683750" CREATED="1311926079888" MODIFIED="1311926122758" LINK="#ID_215853027"/>
+</node>
+<node TEXT="Display Node styles in Tool Tip" ID="ID_499630441" CREATED="1312541024559" MODIFIED="1330443234175" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles visibility of the list of styles which apply to the selected node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Display Tool tips for Nodes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT=" Display modification times" ID="ID_208481180" CREATED="1266247851640" MODIFIED="1330443254766" TEXT_SHORTENED="true">
+<icon BUILTIN="../kword"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles visibility of modification times when the cursor hovers over the node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Date/time of last creation/modification
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Node attributes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_353026241" CREATED="1266249735046" MODIFIED="1330443304428" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of attributes as set by <i>Node features > Attribute manger. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Options are:
+ </p>
+ <ul>
+ <li>
+ Show Selected attributes
+ </li>
+ <li>
+ Show all attributes
+ </li>
+ <li>
+ Hide All attributes
+ </li>
+ </ul>
+ <p>
+ See also
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>Node features > Attribute manger </i>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Show selected attributes" ID="ID_1402645350" CREATED="1314448290221" MODIFIED="1314448307739"/>
+<node TEXT="Show All attributes" ID="ID_906654506" CREATED="1314448308870" MODIFIED="1314448324377"/>
+<node TEXT="Hide all attributes" ID="ID_1832714818" CREATED="1314448325024" MODIFIED="1314448335430"/>
+<node TEXT="Show icon of attributes" ID="ID_1771820903" CREATED="1323899477512" MODIFIED="1323899595126" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Displays icon if the node contains attributes
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Show/hide icon-attributes" ID="ID_94712823" CREATED="1310727590558" MODIFIED="1311923396872" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="228"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences > Appearances > Icons</i> to standardly Show icons for attributes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Notes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_838550014" CREATED="1315733725196" MODIFIED="1315733763620">
+<node TEXT="Display note pane" FOLDED="true" ID="ID_1073686439" CREATED="1266249699921" MODIFIED="1330443339023" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Toggles the Note panel visible or hidden. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Note position
+ </li>
+ <li>
+ Show notes in map
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Note panel" ID="ID_1985668082" CREATED="1310725021296" MODIFIED="1310725159902" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note panel</b> is a window which is independently placed of the selected node, in which the Note content of the selected node is shown and can be edited.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT=" Note panel position" ID="ID_1996327153" CREATED="1266249705546" MODIFIED="1330443347223" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Determines the placement of the Note panel. Options are Top, Left, Right, and Bottom.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Display notes in map" ID="ID_389897702" CREATED="1291155591515" MODIFIED="1314906699834" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toggles the visibility of a node's note text below its basic node text.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Shortened node content</i>
+ </li>
+ <li>
+ <i>Note panel</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Show note icons" ID="ID_1472695653" CREATED="1323899192263" MODIFIED="1330443128674" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Displays a note-icon if the node has a note
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Notes view" ID="ID_1709371267" CREATED="1306012919034" MODIFIED="1310727306434" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="215"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences > Appearances > Icons</i> to standardly NOT show icons for notes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Icons view" ID="ID_382172833" CREATED="1310672383972" MODIFIED="1323899286402" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="160"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Preferences > Appearances > Icons</i> to standardly:
+
+ <ul>
+ <li>
+ Show icons for attributes
+ </li>
+ <li>
+ Not show icons for notes
+ </li>
+ <li>
+ Structured icons tool bar
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ With Java Applet the following are always showing
+
+ <ul>
+ <li>
+ Icons for attributes (bug)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="Format" FOLDED="true" ID="ID_258919699" CREATED="1266240683718" MODIFIED="1322427054161" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To change the appearance of a node. Select <i>View > Properties Panel</i> to display most of the properties that can be changed. Check the property you want to change and enter a new value to change it. Select <i>View > Properties Panel</i> again to close the panel. Alternatively properties can be changed through menu <i>Format</i>. For example, to change the text colour of the node, choose <i>Format > Change node color</i> or press <i>Alt+Shift+F</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Properties that can be changed in the <i>Properties panel</i> are:
+ </p>
+ <ul>
+ <li>
+ <b>Node shape:</b> The appearance of the node: without surrounding box (Fork), with surrounding box (Bubble), as parent or combined.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>Node Font:</b> the Font family, size, bold and italic.
+ </li>
+ <li>
+ <b>Node colors:</b> The color of Text or Background. For hiding an edge, see below.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>Edge color:</b> The color of the edge connecting nodes.
+ </li>
+ <li>
+ <b>Edge style:</b> The way an edge bends.
+ </li>
+ <li>
+ <b>Edge width:</b> The thickness of the edge.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>Cloud color:</b> background color of cloud.
+ </li>
+ <li>
+ <b>Cloud Shape:</b> Star, Rectangle or Round rectangle form.
+ </li>
+ </ul>
+ <p>
+ You can also have properties automatically set. Check in <i>Properties Panel</i>:
+ </p>
+ <ul>
+ <li>
+ <b>Automatic Layout:</b> automatically gives all nodes on a particualr hierarchical level a unique appearance. This automated appearance can be changed in Menu Styles.
+ </li>
+ <li>
+ <b>Automatic edge color:</b> automatically selects a different edge color each time a new node is made.
+ </li>
+ </ul>
+ <p>
+ In addition you can set also the following properties in <i>Menu Format</i>:
+ </p>
+ <ul>
+ <li>
+ <b>Blinking node:</b> node which cycles through a number of colors.
+ </li>
+ <li>
+ <b>Blend color</b>
+ </li>
+ <li>
+ <b>Map background:</b> color of background.
+ </li>
+ <li>
+ <b>Edge styles > Hide edge:</b> Makes edge invisible.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="Apply style" FOLDED="true" ID="ID_512501370" CREATED="1291199304490" MODIFIED="1315735285080" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens a list of node styles. The selected style will be appied to the selected node(s). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Note </font>
+ </p>
+ <ul>
+ <li>
+ You can only apply one style at a time. Use conditional styles to apply multiple styles.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also </b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > User defined styles</i>
+ </li>
+ <li>
+ <i>View > Properties panel : Styles, Conditional Node styles, Conditional map styles</i>
+ </li>
+ <li>
+ <i>Styles > Manage Conditional Node Styles</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Default" ID="ID_1111398038" CREATED="1310066467081" MODIFIED="1322064137683" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This style is applied to each new node core. The style includes aspects like buble, edge style etc.
+ </p>
+ <p>
+ So if you want each new node to have a bubble, set it in style Default.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Details" ID="ID_1577454061" CREATED="1310066475584" MODIFIED="1322063880626" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A speciasl style which is automatically applied to each new Details of a node. It will set the font type, size color, but not e.g. bubble and edge. So if you want each Details to have a specific color, set it here.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If you apply this node as a regular style, you can also set edge, bubble etc. But this is not the basic purpose of this style.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Note" ID="ID_985652023" CREATED="1310066511975" MODIFIED="1322063830690" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A speciasl style which is automatically applied to each new note of a node. It will set the font type, size color, but not e.g. bubble and edge. So if you want each note to have a specific color, set it here.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If you apply this node as a regular style, you can also set edge, bubble etc. But this is not the basic purpose of this style.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Floating node" STYLE_REF="OptionalValue" ID="ID_114978489" CREATED="1319831491288" MODIFIED="1329227651936" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A special style which is automatically applied if you press <i>Control</i> and click a free space of the map. The style is then automatically combined with the Edit > Free posinoned node status.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If you apply this node as a regular style, the Free posioned node status will not be set.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hierarchical Level styles" STYLE_REF="Method" ID="ID_1923695111" CREATED="1311948335133" MODIFIED="1312920119258"/>
+<node TEXT="For default size, bubble, etc." ID="ID_1228191937" CREATED="1322064137683" MODIFIED="1322064342192">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="User defined styles" ID="ID_948529232" CREATED="1291550475365" MODIFIED="1311405450074" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens a list of user defined node styles. The selected style will be appied to the selected node(s). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also </b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > New style from selection</i>
+ </li>
+ <li>
+ <i>Styles > Edit style</i>
+ </li>
+ <li>
+ <i>Styles > predefined styles</i>
+ </li>
+ <li>
+ <i>View > Properties panel </i>
+ </li>
+ <li>
+ <i>Styles > Manage Conditional Styles</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="Automatic layout" FOLDED="true" ID="ID_1362134553" CREATED="1310063210078" MODIFIED="1330611071867" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use or don't use level styles. The nodes automatically get the predefined styles related to their node level.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ The predifined number of level styles is 5. It is possible to increase or decrease this number by adding or removing styles in the window that opens after <i>Format > Manage styles > Edit styles....</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > Level style</i> submenu
+ </li>
+ <li>
+ <i>View > Properties Panel</i> check box for <i>Level style</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="for no leaves" STYLE_REF="OptionalValue" ID="ID_1030603587" CREATED="1330463948147" MODIFIED="1330464002202"/>
+<node TEXT="for all nodes" STYLE_REF="OptionalValue" ID="ID_1569605151" CREATED="1330463959886" MODIFIED="1330464002218"/>
+<node TEXT="disabled" STYLE_REF="OptionalValue" ID="ID_1863350006" CREATED="1330463972436" MODIFIED="1335990106098">
+<icon BUILTIN="checked"/>
+</node>
+<node TEXT="default styles" FOLDED="true" ID="ID_188699461" CREATED="1330596445994" MODIFIED="1330610917885">
+<hook NAME="SummaryNode"/>
+<node TEXT="Root" ID="ID_912205112" CREATED="1310066388858" MODIFIED="1331059645334" 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" CREATED="1310066388858" MODIFIED="1331059651262" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Level 2" ID="ID_1792037977" CREATED="1310066388858" MODIFIED="1331059658968" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Level 3" ID="ID_33761254" CREATED="1310066388858" MODIFIED="1331059665083" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Level 4" ID="ID_730037876" CREATED="1310066388858" MODIFIED="1331059670996" 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" CREATED="1315734178011" MODIFIED="1315734321797" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Styles (classes) are a means to quickly apply or change a group of visual properties or content for all related nodes at once. Styles (classes) can be used to find, select or filter nodes which are associated with a particular type of content or structure. You can attach one or more styles to a node by selecting the style name(s) from a list. With filter rules you can automatically decide if a particular style should be applied to a particular node or not.. There is a predefined set of styles for 5 different hierarchical node levels which can be applied right away.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Example</b>. The <i>Freeplane Documentation</i> you are reading, contains visually discriminating styles for classes of information indicating respectively methods, exceptions, examples etc. Each node is attached to all the styles (classes) it belongs to. As a result you can see form the appearance of the node which type of information it contains. Also you can display only nodes containing one particular type of information, by filtering for for style (class) <i>Definition</i>. For example you can display only (all) definitions.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If a defined style has Attributes or Details, these are copied to the node being attached to the style, but only if the node has been newly created, or if the method for this is applied.
+ </li>
+ <li>
+ Single styles are available through a drop-down menu in the Toolbar.
+ </li>
+ <li>
+ It is possible to assign styles to the F-keys such that they can be easily applied.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Attributes > Copy from style</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="New style from selection" FOLDED="true" ID="ID_643671716" CREATED="1291389456052" MODIFIED="1311960465723" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to enter the name under which the selected node will be saved as a user style.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ In the style are copied:
+
+ <ul>
+ <li>
+ icons
+ </li>
+ <li>
+ Basic node text format
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i> Styles > Edit style</i> to add/change a style
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="Style Details and Attributes" ID="ID_1105873514" CREATED="1311959895499" MODIFIED="1312920137354" 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>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <i>Details</i> and <i>Attributes</i> can be added to a Style ONLY in the edit styles panel
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Style > Edit styles> Edit t</i>o add Details and Attributes
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Redefine style" STYLE_REF="Functie" ID="ID_1559299046" CREATED="1291196112325" MODIFIED="1311405450120" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Change the standard node style to the one of the selected node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Manage conditional styles for map" FOLDED="true" ID="ID_1169167186" CREATED="1291196254933" MODIFIED="1314563971989" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Opens a dialog to define the rules for automatically applying a particular style for each node. </font>A particular node may trigger different rules at once. In that case the different styles will be applied to the same node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ If the conditions of the rule are true, the style is applied to the node. Multiple rules may fire at once, hence a node can display multiple styles. The list of rules is evaluated from top rule to bottom rule. If a rule triggers and <i>Stop</i> is set for that rule, the rules below will not be evaluated and not fire. The style rule itself is similar to a filter rule.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do</b>
+ </p>
+ <ul>
+ <li>
+ In the conditional styles window select <i>New</i> . A rule is added.
+ </li>
+ <li>
+ Double-click on the last, new row to open the <i>Filter composer</i>.
+ </li>
+ <li>
+ Select or define and select a new rule, see <i>Filter Composer</i>. (One rule is highlighted !
+ </li>
+ <li>
+ Click OK).
+ </li>
+ <li>
+ Click on <i>Default</i> and select the style you want from the drop down menu of syles.
+ </li>
+ <li>
+ Click OK.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Filter composer
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1312551108410" MODIFIED="1312920188678">
+<node TEXT="Empty" ID="ID_805739790" CREATED="1312551143432" MODIFIED="1312557189580" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Initially the table is empty.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="New" STYLE_REF="Method" ID="ID_322783972" CREATED="1312550032317" MODIFIED="1312920188741" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Press to add a new rule.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Edit" STYLE_REF="Method" ID="ID_338804554" CREATED="1312550065693" MODIFIED="1312920188725" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To edit the selected rule.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_44463838" CREATED="1312550073844" MODIFIED="1312920188725" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To remove the selected rule(s).
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Up" STYLE_REF="Method" ID="ID_1131478979" CREATED="1312550078001" MODIFIED="1312920188710" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Move the selected rule one place up. Hence it will be evaluated earlier.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Down" STYLE_REF="Method" ID="ID_198508283" CREATED="1312550083485" MODIFIED="1312920188694" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To move the position of the selected rule one place down. Hence it will be evaluated later.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Active" ID="ID_1882394254" CREATED="1312550251133" MODIFIED="1312557158473" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If is Checked, the rule behind it will be evaluated. Otherwise not.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1073372746" CREATED="1312550256444" MODIFIED="1312920212921" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The condition, set with a filter rule, when the rule will fire. If the rule fires, the style will be applied. Otherwise the style will not be applied.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Always" ID="ID_894528691" CREATED="1312550827305" MODIFIED="1312557178956" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Default filter rule: it will fire any time.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_1230882400" CREATED="1312550264190" MODIFIED="1312920212936">
+<node TEXT="Default" ID="ID_1640996661" CREATED="1312550406517" MODIFIED="1312557178956" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The style <i>Default</i>. Double-click to open a drop down list of possible styles.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Stop" ID="ID_496187218" CREATED="1312550090044" MODIFIED="1312557210952" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If is checked and this rule fires, the rules below this rule are not evaluated.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_1129555835" CREATED="1312920269658" MODIFIED="1312920329937">
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<node TEXT="Revision" ID="ID_1791624318" CREATED="1312115683651" MODIFIED="1312144957668" TEXT_SHORTENED="true" LINK="#_Freeplane_Link_784043927">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This map contains conditional map styles for displaying revisions of this map.
+ </p>
+ <p>
+ Click the green arrow to read more.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_362867811" CREATED="1310102673082" MODIFIED="1311405450136" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Only works with newly created mind maps (= Freeplane 1.2, not 1.3) or if the mapstyle is copied from a Freeplane 1.2 map with copy mapstyle.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Templates" ID="ID_1796388799" CREATED="1310103103356" MODIFIED="1312920269658" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <pre wrap="">The same nodes on the style map are used as templates and as styles.
+They are used as styles either if style is explicitly assigned by user or if
+style condition is met . Only formatting including colors, shapes clouds and
+icons are relevant for styles and conditional styles. All these features have
+in common that they can not be edited, they can be only attached or removed,
+and style basically means that they are virtually attached to relevant nodes.
+
+Actually style conditions build a chain so that many styles are applied to the
+same node if many conditions are satisfied.
+For instance if you have conditional styles
+
+Node text contains "Important" => styleOne,
+Node text contains "error" => styleTwo,
+
+the both styles are applied to node with the both words in the node text, and
+all formatting features not addressed by styleOne but addressed by styleTwo
+are applied to the node. For instance if styleOne means bold text and styleTwo
+means red background, the node becomes bold on the red background.
+
+Other node features like attributes or details are editable. Therefore they
+are interpreted as a part of template. It is possible to include other features
+like notes or even child nodes in the future. The templates are applied
+as follows:
+
+There are many ways to insert new nodes: before, after, as a child, as a parent,
+as summary node. After the new node is inserted you can apply a template for
+it just assigning the corresponding style. In this case its content is copied
+into the new created node.
+
+And if you want to copy the template elements later you can do it using only
+one action (which currently copies only the attributes but it could be improved
+to copy the details and everything else too). Assign this action to a short
+cut and you can do it by hitting only one hot key. I can change this action
+so that it works with the conditional styles too so that the first or even all
+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" CREATED="1311948482849" MODIFIED="1314563993455" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to define and connect multiple style rules to the selected node. If the conditions of the rule are true, the style is applied to the node. Multiple rules may fire at once, hence a node can display multiple styles.
+ </p>
+ <p>
+ The list of rules is evaluated from top rule to bottom rule. If a rule triggers and <i>Stop</i> is set for that rule, the rules below will not be evaluated and not fire. The style rule itself is similar to a filter rule.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do</b>
+ </p>
+ <ul>
+ <li>
+ In the conditional styles window select <i>New</i>
+ </li>
+ <li>
+ Double-click on the last, new row to open the <i>Filter composer</i>.
+ </li>
+ <li>
+ Select or define and select a new rule, see <i>Filter Composer</i>. (One rule is highlighted !
+ </li>
+ <li>
+ Click OK).
+ </li>
+ <li>
+ Click on <i>Default</i> and select the style you want from the drop down menu of syles.
+ </li>
+ <li>
+ Click OK.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Filter composer
+ </li>
+ <li>
+ <i>Styles > Edit styles</i>. In the panel that opens it is possible do define node styles too.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="Table of style rules." STYLE_REF="Method" FOLDED="true" ID="ID_278157696" CREATED="1312551108410" MODIFIED="1312920588616">
+<hook NAME="FirstGroupNode"/>
+<node TEXT="Empty" ID="ID_1858267405" CREATED="1312551143432" MODIFIED="1312557189580" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Initially the table is empty.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="New" STYLE_REF="Method" ID="ID_1731631753" CREATED="1312550032317" MODIFIED="1312920588679" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Press to add a new rule.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Edit" STYLE_REF="Method" ID="ID_1266620968" CREATED="1312550065693" MODIFIED="1312920588663" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To edit the selected rule.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_1025560603" CREATED="1312550073844" MODIFIED="1312920588647" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To remove the selected rule(s).
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Up" STYLE_REF="Method" ID="ID_1559495569" CREATED="1312550078001" MODIFIED="1312920588647" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Move the selected rule one place up. Hence it will be evaluated earlier.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Down" STYLE_REF="Method" ID="ID_128011628" CREATED="1312550083485" MODIFIED="1312920588632" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To move the position of the selected rule one place down. Hence it will be evaluated later.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Active" ID="ID_1788623449" CREATED="1312550251133" MODIFIED="1312557158473" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If is Checked, the rule behind it will be evaluated. Otherwise not.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1272337891" CREATED="1312550256444" MODIFIED="1312920604326" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The condition, set with a filter rule, when the rule will fire. If the rule fires, the style will be applied. Otherwise the style will not be applied.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Always" ID="ID_386830428" CREATED="1312550827305" MODIFIED="1312557178956" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Default filter rule: it will fire any time.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_654077801" CREATED="1312550264190" MODIFIED="1312920604326">
+<node TEXT="Default" ID="ID_563202841" CREATED="1312550406517" MODIFIED="1312557178956" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The style <i>Default</i>. Double-click to open a drop down list of possible styles.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Stop" ID="ID_293594044" CREATED="1312550090044" MODIFIED="1312557210952" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If is checked and this rule fires, the rules below this rule are not evaluated.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_8484574" CREATED="1312920515374" MODIFIED="1312920554249">
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Conditional node style" ID="ID_589037277" CREATED="1312530388253" MODIFIED="1312531097782" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This node you are reading is made using Conditional Node styles. The styles applied are shown at the top of the Tool Tip.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Open the window Styles > Manage Conditional Node Styles to see the two rules, one for applying style Example and one for style ToNote. Both rules are of type: always apply this style. This is the most simple use of conditional node styles: to apply more than one style to the same node at once.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Copy map style from..." ID="ID_13843990" CREATED="1291196992351" MODIFIED="1311405450183" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog for choosing a map style. These styles are in fact mind maps.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <i>File > New map</i> uses the style <i>standard.mm</i>. You can define a user map as standard.mm by naming it that way and putting it in the directory that opens by selecting <i>Tools > Open user directory > templates. </i>
+ </li>
+ <li>
+ <i>In Tools > Preferences</i> can be defined that the standard mind map should have a different name.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Edit styles" STYLE_REF="Functie" ID="ID_1277682010" CREATED="1291196100290" MODIFIED="1311405450183" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to edit all styles, add and remove styles.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To define a new user style in this mode:
+ </p>
+ <ul>
+ <li>
+ Select the standard node style
+ </li>
+ <li>
+ Click-right and select <i>Save selection as user style</i>
+ </li>
+ <li>
+ Save it under a new name
+ </li>
+ <li>
+ Modify the newly created, saved style with <i>View > Properties Panel</i>
+ </li>
+ <li>
+ Leave the dialog; it has no OK button.
+ </li>
+ <li>
+ When ask to save, press OK.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="More" STYLE_REF="Aggregatie als Toelichting" ID="ID_1132402390" CREATED="1305876789039" MODIFIED="1330597501820" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute NAME="Chapter" VALUE="4"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Style (and Node template)" ID="ID_1305038685" CREATED="1310847063806" MODIFIED="1311405450198" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<attribute NAME="Chapter" VALUE="4"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>style</b> for a node is a set of node properties and a basic content structure that can be applied to the node by calling the name of the style.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node template" ID="ID_1252291426" CREATED="1310925308234" MODIFIED="1311959880220" 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="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If a style has Attributes or Details, Details these are copied to the node being attached to the style, but ONLY if the node has been newly created.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Attributes > Copy attributes from style</i> to copy the content later
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example style" ID="ID_1379615942" CREATED="1291305410190" MODIFIED="1311405450230" 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" CREATED="1310065922176" MODIFIED="1311405450230" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Styles are stored in the configuration file "patterns.xml" (note : this file name can be customized by the user under <i>Tools > Preferences > Environment</i>).
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Wiki" ID="ID_422433135" CREATED="1310926117459" MODIFIED="1311405450230" LINK="http://freeplane.sourceforge.net/wiki/index.php/Node_styles">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+</node>
+<node TEXT="Copy format" ID="ID_165229421" CREATED="1310134532663" MODIFIED="1315728436024" TEXT_SHORTENED="true">
+<icon BUILTIN="../colorpicker"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Copies the formatting of a node, but not the content of the node. SEE ALSO: Paste Format.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Paste format" ID="ID_85344174" CREATED="1310134532663" MODIFIED="1315728444548" TEXT_SHORTENED="true">
+<icon BUILTIN="../color_fill"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Pastes the formatting of a node, but not the contents of the node. SEE ALSO: Copy Format.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Styles" STYLE_REF="MenuGroupLabel" ID="ID_177552803" CREATED="1315735285080" MODIFIED="1315735303691">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Map Background color" FOLDED="true" ID="ID_1564352042" CREATED="1266252207296" MODIFIED="1330596604249" TEXT_SHORTENED="true">
+<icon BUILTIN="../MapBackgroundColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Sets the background color of the entire map using a color chooser dialog.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="" ID="ID_307696782" CREATED="1310109164393" MODIFIED="1310196222387" 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>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This option is not available in <i>View > Properties Panel</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_39827582" CREATED="1315734560228" MODIFIED="1316159037710">
+<node TEXT="Bold" ID="ID_25890496" CREATED="1266251692562" MODIFIED="1335990179233" TEXT_SHORTENED="true">
+<icon BUILTIN="../Bold16"/>
+<font NAME="SansSerif" BOLD="true" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Changes font to Bold in whole basic node and Details.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Icon for Bold
+ </li>
+ <li>
+ Exception
+ </li>
+ </ul>
+ </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" CREATED="1266251689531" MODIFIED="1310882979815" TEXT_SHORTENED="true">
+<icon BUILTIN="../Italic16"/>
+<font ITALIC="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Changes font to Italic in whole basic node and Details.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Icon for Italic
+ </li>
+ <li>
+ Exception
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Larger font" ID="ID_349364472" CREATED="1266251662328" MODIFIED="1335990193772" TEXT_SHORTENED="true">
+<icon BUILTIN="../IncreaseNodeFontAction"/>
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Increases font size in whole basic node and Details.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Font size in menu bar
+ </li>
+ <li>
+ Exception
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Smaller font" ID="ID_533544086" CREATED="1266251685593" MODIFIED="1335990187688" TEXT_SHORTENED="true">
+<icon BUILTIN="../DecreaseNodeFontAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Decreases font size in whole basic node and Details.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Font size in menu bar
+ </li>
+ <li>
+ Exception
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node ID="ID_863447007" CREATED="1310105197652" MODIFIED="1311405450432" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Font <b>whole</b> basic node text
+ </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"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ These actions effect the whole basic node text. and overrule WYSIWYG formatting in the edit windows and in the context menu of the inline editor. The action initially affects Details, but can be refined/undone by formatting in the edit dialog.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ It was originally meant for easy, fast formatting. However, the formatting with the inline editor context menu makes these functions more or less obsolete.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To undo, select <i>Format > Remove Format</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy format </i>
+ </li>
+ <li>
+ <i>Edit > Paste forma</i>t
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node color" ID="ID_1085935601" CREATED="1266251694000" MODIFIED="1310882979737" COLOR="#ff3366" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Sets the foreground color of the selected node(s) using a color chooser dialog. The color is applied to all text in the node.</span></font><font color="#333333">.</font>
+ </p>
+ </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" CREATED="1266252279859" MODIFIED="1311405450479" COLOR="#663300" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<icon BUILTIN="../xeyes"/>
+<edge COLOR="#000000"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Cause the node to blink. The node cycles through different colors while blinking.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="" ID="ID_1509903999" CREATED="1310113382439" MODIFIED="1310196222449" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This property is not available in <i>View > Properties Panel</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Blend color" ID="ID_1238551182" CREATED="1266251704359" MODIFIED="1335990268566" COLOR="#663300" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeColorBlendAction"/>
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Changes the foreground color of the selected node(s) to be closer to its background color. May be applied multiple times. Can be reset by choosing Format > Node Color... > Use default.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="" ID="ID_1316784379" CREATED="1310113382439" MODIFIED="1310196222449" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This property is not available in <i>View > Properties Panel</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node ID="ID_1370207590" CREATED="1310105407161" MODIFIED="1311405450526" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Color <b>whole</b> basic node text
+ </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"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ These actions effect the whole basic node text. and overrule WYSIWYG formatting in the edit windows and in the context menu of the inline editor.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ It was meant for easy, fast formatting. However, the formatting with the inline editor context menu makes these functions more or less obsolete.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To undo, select <i>Format > Remove Format</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy format </i>
+ </li>
+ <li>
+ <i>Edit > Paste forma</i>t
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Node Background Color..." ID="ID_1529197837" CREATED="1266252194281" MODIFIED="1310882979675" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeBackgroundColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Sets the background color of the selected node(s) using a color chooser dialog. Formatting will apply to the entire node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Copy format </i>
+ </li>
+ <li>
+ <i>Edit > Paste forma</i>t
+ </li>
+ </ul>
+ </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" CREATED="1310105995582" MODIFIED="1311405450588" 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" CREATED="1266251650156" MODIFIED="1310882979862" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Undo set Bubble and show a horizontal line below the node's content. This is the default format, and it is used for this node and for most of the other nodes in this document. The alternative is Bubble format.</span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Format > Bubble</i>
+ </li>
+ <li>
+ <i>View > Properites Panel > Fork / Bubble</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Bubble" ID="ID_1235732708" CREATED="1266251659609" MODIFIED="1335990299518" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Surround the inner area of the node with a round-cornered Bubble. The Bubble format has been applied to this node. The alternative is Fork format.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Format ></i> <i>Fork.</i>
+ </li>
+ <li>
+ <i>View > Properties Panel > Bubble/Fork </i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Bubble central node area" ID="ID_5209411" CREATED="1310105269631" MODIFIED="1314887901617" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Properties Panel</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Remove Format" ID="ID_640761139" CREATED="1291193542440" MODIFIED="1311405450604" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Restores format to standar style
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See alo</b>
+ </p>
+ <ul>
+ <li>
+ Work bar <i>Default</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="Use plain text" STYLE_REF="Method" ID="ID_437526710" CREATED="1330596697169" MODIFIED="1330596716468"/>
+</node>
+<node TEXT="Add cloud or change style" FOLDED="true" ID="ID_759607649" CREATED="1291193913924" MODIFIED="1330596991473" 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" CREATED="1330596991473" MODIFIED="1330597060932"/>
+<node TEXT="Star" STYLE_REF="OptionalValue" ID="ID_158500016" CREATED="1330597001667" MODIFIED="1330597089573"/>
+<node TEXT="Rectangle" STYLE_REF="OptionalValue" ID="ID_217797528" CREATED="1330597007166" MODIFIED="1330597089573"/>
+<node TEXT="Round rectangle" STYLE_REF="OptionalValue" ID="ID_988146678" CREATED="1330597037344" MODIFIED="1330597089573"/>
+</node>
+<node TEXT="Cloud color" ID="ID_1092192366" CREATED="1266252268093" MODIFIED="1310882979628" TEXT_SHORTENED="true">
+<icon BUILTIN="../Colors24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Changes the color of the cloud. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Format > Cloud</i>.
+ </li>
+ <li>
+ <i>Properties Panel > Cloud</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Cloud properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_1759348470" CREATED="1305837722596" MODIFIED="1312966331141" 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" CREATED="1266252322375" MODIFIED="1330597265495" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens dialog to select an edge style. Options are:</span></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">As Parent</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Linear</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Bezier</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Sharp Linear</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Sharp Bezier</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Horizontal</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Hide Edge</span></font>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Properties Panel</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="" ID="ID_831160653" CREATED="1288536745875" MODIFIED="1330597248647" 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" CREATED="1310115852702" MODIFIED="1310196222340" TEXT_SHORTENED="true"/>
+<node TEXT="Linear" ID="ID_479844675" CREATED="1288538234095" MODIFIED="1310196222325" HGAP="30" TEXT_SHORTENED="true">
+<edge STYLE="linear" WIDTH="4"/>
+</node>
+<node TEXT="Bezier curve" ID="ID_622749170" CREATED="1288538240451" MODIFIED="1310196222325" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="bezier" WIDTH="4"/>
+</node>
+<node TEXT="Sharp Linear" ID="ID_1385668433" CREATED="1288538242377" MODIFIED="1310196222309" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="sharp_linear" WIDTH="4"/>
+</node>
+<node TEXT="Sharp Bezier" ID="ID_925061428" CREATED="1288538470332" MODIFIED="1310196222309" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="sharp_bezier" WIDTH="4"/>
+</node>
+<node TEXT="Horizontal" ID="ID_1255718418" CREATED="1310115825254" MODIFIED="1310196222309" TEXT_SHORTENED="true">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Hide Edge" ID="ID_846030610" CREATED="1288538507390" MODIFIED="1310196222293" BACKGROUND_COLOR="#00ffff" HGAP="50" TEXT_SHORTENED="true">
+<edge STYLE="hide_edge" WIDTH="4"/>
+</node>
+</node>
+</node>
+<node TEXT="Edge Width" ID="ID_1718207662" CREATED="1266252326750" MODIFIED="1335990060264" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens dialog to select the style to be applied to the selected node(s). </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Options are: </span></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Parent</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Thin</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">1</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">2</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">4</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">8</span></font>
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">The difference between "Thin" and "1" may not be apparent at lower zoom percentages.</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Edge color" ID="ID_865389195" CREATED="1266252317187" MODIFIED="1310882979628" TEXT_SHORTENED="true">
+<edge COLOR="#ff0000"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Sets the color of the fork (or bubble) of the selected node(s) using a color chooser dialog. Also sets the color of the connectors between parent and child nodes.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Automatic edge color" ID="ID_1587417548" CREATED="1291194199529" MODIFIED="1335990065427" TEXT_SHORTENED="true">
+<icon BUILTIN="../AutomaticEdgeColorHookAction"/>
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">See Forma<i> > Automatic edge color</i></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Edge properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" CREATED="1305835940519" MODIFIED="1311946117727" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An edge is a lineage between parent and child. The flow of the edge can be altered by clicking on it and drawing it to a different location. Technically an edge belongs to the child and edge properties like color can be changed in the child node. See <i>View > Properties panel. </i>An edge can be hidden, see Egde style.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Set node width limits" ID="ID_601879583" CREATED="1266251602796" MODIFIED="1322427684948" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Change the width of the node
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also </font></b>
+ </p>
+ <ul>
+ <li>
+ View > Properties panel > Min node width
+ </li>
+ <li>
+ View > Properties panel > Max node width
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ All child nodes of node Reference have minimum width 80. In this way all (direct) children of Reference nicely line up.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Navigate" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" CREATED="1310134532663" MODIFIED="1322427031494" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<attribute NAME="Chapter" VALUE="1,2,6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To move between maps and nodes and to fold nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Previous map" ID="ID_1925064048" CREATED="1310134532663" MODIFIED="1314564157661" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_PrevMM"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Moves to the previous map listed under the Maps menu. This only works if multiple maps are open.</span></font>
+ </p>
+ </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" CREATED="1310134532663" MODIFIED="1314564142466" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_NextMM"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Moves to the next map listed under the Maps menu. This only works if multiple maps are open.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2.6"/>
+</node>
+<node TEXT="Move to map" ID="ID_913517126" CREATED="1310828960234" MODIFIED="1311402807608">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310134532663" MODIFIED="1315734783394" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toggles the nodes that are children of the selected node between being visible/hidden. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Short cut </font></b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">Space</font>
+ </li>
+ </ul>
+ </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" CREATED="1335990413579" MODIFIED="1335990429509">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="(Un)fold children" ID="ID_383325209" CREATED="1310134532663" MODIFIED="1314564131765" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">This command toggles folding and unfolding nodes that are one child level removed from the node that is selected. As an example, below this node (that you are reading) is "(Un)fold Children 2", and below "Unfold Children 2" are four nodes, "Child 1", Child 2", Child 3", Child 4". From this node, using the "Toggle Folded" command, the node "(Un)fold Children 2" will toggle visible/hidden. Using the "(Un)fold Children" command, the nodes that are children of "(Un)fold Children 2" will toggle visible/hidden.</span></font>
+ </p>
+ <ul>
+ <li>
+ <span onclick="show_folder('1_1')" class="foldclosed" id="show1_1">+</span> <span onclick="hide_folder('1_1')" class="foldopened" id="hide1_1">-</span> <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">(Un)fold Children 2</span></font>
+
+ <ul id="fold1_1">
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Child 1</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Child 2</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Child 3</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">Child 4</span></font>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Unfold one Level" ID="ID_321295556" CREATED="1310134532663" MODIFIED="1314564126944" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Progressively unfolds the descendants of the selected node. Clicking once unfolds the children, clicking again unfolds the grandchildren, etc.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Fold one Level" ID="ID_831251421" CREATED="1310134532679" MODIFIED="1314564166241" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Progressively folds the descendants of the selected node, starting at the deepest level in the hierarchy. If four levels exist, clicking once folds the great grandchildren, clicking again folds the grandchildren, clicking again folds the children, etc.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Unfold all" ID="ID_933325044" CREATED="1310134532679" MODIFIED="1314564170250" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Unfolds (makes visible) all nodes that are descendants of the selected node, including all children, grandchildren, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Hot key</b>
+ </p>
+ <ul>
+ <li>
+ press <i>Space; or</i>
+ </li>
+ <li>
+ single click on the node; or
+ </li>
+ <li>
+ click icon-button in <i>Toolbar</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Fold all" ID="ID_657829947" CREATED="1310134532679" MODIFIED="1314564178393" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Folds (hides) all nodes that are descendants of the selected node, including all children, grandchildren, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Hot key</b>
+ </p>
+ <ul>
+ <li>
+ press <i>Space; or</i>
+ </li>
+ <li>
+ single click on the node; or
+ </li>
+ <li>
+ click icon-button in Toolbar
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Folding node(s)" ID="ID_101814873" CREATED="1310828754782" MODIFIED="1312964029404" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="202"/>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Folding</b> is hiding the descendants of a node. A small circle appears as an indicator of hidden descendants. Unfolding is making the descendants reappear.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Select all visible nodes" ID="ID_166465072" CREATED="1310134532663" MODIFIED="1330598748109" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Selects all nodes visible on the map.</span></font>
+ </p>
+ </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" CREATED="1310134532663" MODIFIED="1311226360018" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Selects all the currently-visible (unfolded) children of the node which is already selected.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Select" ID="ID_222729198" CREATED="1310835972305" MODIFIED="1310886250857">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Goto root" ID="ID_1564476202" CREATED="1310134532679" MODIFIED="1330598823325" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Moves the selection focus to the root node (the parent of all other nodes). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Short cut </b>
+ </p>
+ <ul>
+ <li>
+ press <i>Esc; or</i>
+ </li>
+ <li>
+ single click root
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<attribute_layout VALUE_WIDTH="156"/>
+<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" CREATED="1310191716143" MODIFIED="1330598835066" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to enter the ID of a node and moves the selection focus to this node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Goto previous node" ID="ID_482454762" CREATED="1310134532679" MODIFIED="1330598868020" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Moves the selection focus to the previous node in the map's hierarchy. If the previous node is currently hidden, the map will be unfolded to display the node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Short cut</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Alt + Left Arrow</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Goto next node" ID="ID_43445328" CREATED="1310134532679" MODIFIED="1330598877364" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Moves the selection focus to the next node in the map's hierarchy. If the next node is currently hidden, the map will be unfolded to display the node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Short cut</b>
+ </p>
+ <ul>
+ <li>
+ <i>Ctrl + Alt + Right Arrow</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Goto previous node (fold)" ID="ID_303327981" CREATED="1310134532679" MODIFIED="1330598884045" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Moves the selection focus to the previous node in the map's hierarchy and, if possible, hide the current node by folding.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Goto next node (fold)" ID="ID_230717042" CREATED="1310134532679" MODIFIED="1330598891027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Move the selection focus to the next node in the map's hierarchy and, if possible, hide the current node by folding.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Unfold next presentation item" ID="ID_1509753321" CREATED="1335990492554" MODIFIED="1335990513726">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Go backward" ID="ID_449527632" CREATED="1310134532679" MODIFIED="1315734927071" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_PrevNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Moves the selection focus to the node that was selected prior to the node that is currently selected. Each time this is used, the selection will continue to move through the history of previously-selected nodes.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Go forward" ID="ID_602013651" CREATED="1310134532679" MODIFIED="1315734940218" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_NextNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Retraces the nodes selected by using the Back command.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Selecting nodes" ID="ID_1414672331" CREATED="1310828830380" MODIFIED="1330598906789">
+<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" CREATED="1309423158240" MODIFIED="1311402615759" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To <b>select a node </b>is to bring it into focus and to <b>un-select a node </b>is to remove the focus. The node in focus is can be acted upon by menu functions.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The currently selected node is highlighted by either a selection rectangle or a shaded node. The rectangle is the default. This can be changed in <i>View > Rectangular selection</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To <b>un-select</b> a selected node(s), click outside the node, in an empty place of the background; or
+ </p>
+ <p>
+ click on an other node, which wil be selected next.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ The node under the cursor is automatically selected. To <b>keep this selection</b> when moving around the mouse cursor, keep <i>Shift</i> pressed. If you dislike this behaviour, you can turn automatic selection off in menu <i>Tools > Preferences</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Alternative ways of selecting a node or group of nodes are by pressing a special key or key combination.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<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" CREATED="1311313093106" MODIFIED="1311402615775" 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="1,2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To keep a selection when moving the cursor around, keep <i>Shift</i> pressed.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Tools > Preferences to disable automatic selection
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Select First/last sibling" STYLE_REF="Method" ID="ID_1705866199" CREATED="1309546732183" MODIFIED="1311402755270" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select the first or last sibling of the currently selected node press <i>PgUp </i>respectively<i> PgDown. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Navigate</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Select All Descendants" STYLE_REF="Method" FOLDED="true" ID="ID_228451346" CREATED="1309424361071" MODIFIED="1337370032830" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select all descendants of a selected node:
+ </p>
+ <ul>
+ <li>
+ press <i>Alt + End </i>to unfold all hidden descendants
+ </li>
+ <li>
+ press <i>Ctrl + Shift + A </i>to select all visible descendants
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Navigate</i>
+ </li>
+ <li>
+ icon-buttons in the <i>Toolbar</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1310803337034" MODIFIED="1311053879745">
+<icon BUILTIN="../unfold_all"/>
+</node>
+<node TEXT="Icon-button to hide all descendants" ID="ID_70318547" CREATED="1310803411047" MODIFIED="1311053889011">
+<icon BUILTIN="../fold_all"/>
+</node>
+</node>
+<node TEXT="Select All nodes" STYLE_REF="Method" FOLDED="true" ID="ID_1432526079" CREATED="1309424361078" MODIFIED="1311402755301" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select all nodes of a mind map:
+ </p>
+ <ul>
+ <li>
+ press <i>Esc</i> to select the root node
+ </li>
+ <li>
+ press <i>Alt + End </i>to unfold all hidden descendants
+ </li>
+ <li>
+ press <i>Als + Shift + A </i>to select all visible descendants
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Navigate</i>
+ </li>
+ <li>
+ icon-buttons in the <i>Toolbar</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1310803337034" MODIFIED="1311053879745">
+<icon BUILTIN="../unfold_all"/>
+</node>
+<node TEXT="Icon-button to hide all descendants" ID="ID_389342260" CREATED="1310803411047" MODIFIED="1311053889011">
+<icon BUILTIN="../fold_all"/>
+</node>
+</node>
+<node TEXT="Select All filtered nodes" STYLE_REF="Method" ID="ID_1432270723" CREATED="1309424361092" MODIFIED="1311402755301" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select all filtered nodes, see
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Select Group of siblings" STYLE_REF="Method" ID="ID_1664441735" CREATED="1309424361085" MODIFIED="1311402755317" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select a group of siblings, click the first and last node while keeping <i>Shift</i> pressed.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Select Arbitrary nodes" STYLE_REF="Method" ID="ID_1374755186" CREATED="1309424361089" MODIFIED="1311402755333" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select two or more arbitrary nodes, keep <i>Ctrl</i> pressed while clicking the nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Select Using arrow keys" STYLE_REF="Method" ID="ID_81219304" CREATED="1309546028707" MODIFIED="1311402755333" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Use the arrow keys to move the selection focus from one node to another node. The focus moves in the direction of the arrows.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also:</b>
+ </p>
+ <ul>
+ <li>
+ Main menu <i>Nodes</i>
+ </li>
+ <li>
+ Main menu <i>Navigate</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="With Hidden Text in Tool Tip" ID="ID_390018350" CREATED="1304485524408" MODIFIED="1335990541588" TEXT_SHORTENED="true" COLOR="#407000">
+<font NAME="SansSerif"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hidden text shown in a Tool Tip may hide a sibling under the current node. To move to the node below and show its tool tip, use the down arrow key.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To finish the appearance of the Too Tip, move the cursor up, above the node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<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="2"/>
+</node>
+</node>
+<node TEXT="Follow Link" ID="ID_1084969591" CREATED="1310134532679" MODIFIED="1311184745576" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">If the node is hyperlinked, this command will execute the link. </span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif"><b>See also</b> </span></font>
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Hyperlink(Text Field)..</i>.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Filter" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" CREATED="1266240693156" MODIFIED="1322427016627" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">To display only a subset of nodes. Build and use filters with the Filter Toolbar or the Filter Menu. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Method<b> Quick filter</b> does the major filtering (other options are available).</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b> Filter rules</b> are build from thee elements:
+ </p>
+ <ul>
+ <li>
+ <i>Node <b>component</b></i> (Node Text, Details, Icon, etc.)
+ </li>
+ <li>
+ <b><i>Type of rule: </i></b> component <i>exists, contains, =</i>, > etc.
+ </li>
+ <li>
+ <b><i>Value</i></b> of component
+ </li>
+ <li>
+ If value is text, relevancy of <b><i>case</i></b>
+ </li>
+ </ul>
+ <p>
+ <b>Filter options</b> to set <b>before</b> applying <i>Quick filter </i>are:
+ </p>
+ <ul>
+ <li>
+ Apply to selected nodes only
+ </li>
+ <li>
+ Apply to already filtered nodes (refine)
+ </li>
+ </ul>
+ <p>
+ <b>Filter option</b>s that can be set <b>before or after</b> applying <i>Quick filter</i> are:
+ </p>
+ <ul>
+ <li>
+ Unfold hidden nodes
+ </li>
+ <li>
+ Show Ancestors
+ </li>
+ <li>
+ Show Descendants
+ </li>
+ <li>
+ Select all matching
+ </li>
+ </ul>
+ <p>
+ To return to the condition before filtering
+ </p>
+ <ul>
+ <li>
+ Unselect <i>No Filter</i>
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Nodes hidden before the filter was applied, keep hidden.
+ </li>
+ <li>
+ All nodes left visible move towards each other along the their edges.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="9"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<node TEXT="Undo filter action" ID="ID_619416419" CREATED="1310134532663" MODIFIED="1330598955866" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Reverses the effect of the previously-used filtering command.</font>
+ </p>
+ </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" CREATED="1310134532663" MODIFIED="1330598964228" TEXT_SHORTENED="true">
+<icon BUILTIN="../redo_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Re-applies the previously-used filtering command, after Filter > Undo has been used.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Reapply filter action" ID="ID_1748016122" CREATED="1310134532663" MODIFIED="1335990592320" TEXT_SHORTENED="true">
+<icon BUILTIN="../reapply_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Updates the effect of filtering after changes have been made to the map.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Quick filter" FOLDED="true" ID="ID_1552136796" CREATED="1310134532663" MODIFIED="1313955597436" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hides all visible nodes which do not fit the filter rules and options. Icon keeps unset..
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>No Filter</i> to finish filtering.
+ </li>
+ <li>
+ Tool Tip menu Filter (hover the cursor over menu Filter to see its hidden text !)
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Nodes hidden before the filter was applied, keep hidden.
+ </li>
+ <li>
+ All nodes left visible move towards each other along the their edges.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="Find last modified nodes" ID="ID_1539236846" CREATED="1311098601253" MODIFIED="1314077884276" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2,9"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To filter for all nodes modified after a certain date, ser a filterrrule (Date filter<i>, Modified after, date, xxx)</i> and <i>Quick filter</i> for all modified nodes.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Find and replace all nodes...</i> for an alternative way.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Filter selected nodes" ID="ID_402507556" CREATED="1310134532663" MODIFIED="1314077950435" TEXT_SHORTENED="true">
+<icon BUILTIN="../filter_selected_nodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Display only the currently-selected node(s) and, optionally, their ancestors and/or descendants. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <i><font color="#000000" face="SansSerif, sans-serif">Filter > Show Ancestors</font> </i>
+ </li>
+ <li>
+ <i><font color="#000000" face="SansSerif, sans-serif">Filter > Show Descendants</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Select all matching nodes" ID="ID_164487469" CREATED="1310134532663" MODIFIED="1314907052777" TEXT_SHORTENED="true">
+<icon BUILTIN="../select_all_found_nodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Filter and select all matching descendants (visible and invisible) of the node in focus and show and select also the nodes in between.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="No filtering" ID="ID_1978139715" CREATED="1310134532663" MODIFIED="1330599001234" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Removes the effect of any filters which were applied; this is the default. Un-sets icon.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Compose filter" FOLDED="true" ID="ID_1142884544" CREATED="1310134532663" MODIFIED="1330599010312" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_filtering_condition"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens the Filter Composer dialog to create and edit filter rules / manage filters. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">The first row contains three entries to define a filter rule, filled with (Node text, Contains, empty filed). and a check box for indicating if the Case of letters is relevant (<i>Match case</i>). The box below these editable fields contains the list of predefined rules. Initially it is empty. Two or more of these rules can be combined to form a more complex rule with AND and OR operators using the buttons to the right. A rule can be named with buttond Set Name. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Do</font></b>
+ </p>
+ <ol>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">select or enter the conditions of the filter rule, e.g. (Node text, Contains, filter); Match Case unchecked.</font>
+ </li>
+ <li>
+ press <i>Add </i>to add it to the list of rules.
+ </li>
+ <li>
+ repeat for all rules you need.
+ </li>
+ <li>
+ press OK
+ </li>
+ </ol>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ To combine two or more rules with AND or OR operators, select the rules and press AND resp. OR
+ </li>
+ <li>
+ To connect a rule to a label, select the rule and press<i> Set Name</i>.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > Conditional Map styles</i> for example use of <i>Filter Composer </i>
+ </li>
+ <li>
+ <i>Styles > Conditional Node styles</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1312123492440" MODIFIED="1314078031259">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="Node Text (default)" ID="ID_440014122" CREATED="1312123267776" MODIFIED="1312123719962">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Parent Text" ID="ID_58128801" CREATED="1312123283057" MODIFIED="1312123720196">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Details" ID="ID_1976565775" CREATED="1312123289164" MODIFIED="1312123720181">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Icon" ID="ID_265220662" CREATED="1312123306722" MODIFIED="1312123720150">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Hyperlink" ID="ID_1229040721" CREATED="1312123310770" MODIFIED="1312123720118">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Connector label" ID="ID_725547789" CREATED="1312123356611" MODIFIED="1312123720103">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Connector" ID="ID_1614932096" CREATED="1312123365245" MODIFIED="1312123720087">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Date filter" ID="ID_1276079599" CREATED="1312123370370" MODIFIED="1312123720072">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Priority" ID="ID_30298697" CREATED="1312123376602" MODIFIED="1312123720056">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Node" ID="ID_863184223" CREATED="1312123395954" MODIFIED="1312123720040">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Style" ID="ID_1110522569" CREATED="1312123399644" MODIFIED="1312123720025">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Node level" ID="ID_1102698985" CREATED="1312123420696" MODIFIED="1312123720009">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Reminder" ID="ID_988583509" CREATED="1312123426101" MODIFIED="1312123720009">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Script filter" ID="ID_1339780088" CREATED="1312123431320" MODIFIED="1312123719994">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="and user defined styles..." ID="ID_1524254052" CREATED="1312123439299" MODIFIED="1312123719994">
+<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" CREATED="1312123543788" MODIFIED="1314078043256">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="Contains (default)" ID="ID_1227202337" CREATED="1312123550505" MODIFIED="1312123823391">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Is equal to" ID="ID_39134629" CREATED="1312123556784" MODIFIED="1312123823453">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Is not equal to" ID="ID_1364103252" CREATED="1312123568866" MODIFIED="1312123823437">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT=">" ID="ID_877198724" CREATED="1312123576922" MODIFIED="1312123823437">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT=">=" ID="ID_1015544739" CREATED="1312123587882" MODIFIED="1312123823422">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="<=" ID="ID_1164055784" CREATED="1312123591711" MODIFIED="1312123823406">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT=">" ID="ID_1681290681" CREATED="1312123597631" MODIFIED="1312123823406">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Matches regexpr" ID="ID_91821609" CREATED="1312123615252" MODIFIED="1312123823406">
+<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" CREATED="1312123628941" MODIFIED="1314078054644">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="empty text field (default)" STYLE_REF="OptionalValue" ID="ID_1473584730" CREATED="1312123652068" MODIFIED="1312920883566"/>
+</node>
+<node TEXT="Check box" STYLE_REF="Method" FOLDED="true" ID="ID_191687274" CREATED="1312123857125" MODIFIED="1314078066515">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="Match case" ID="ID_939695594" CREATED="1312123867351" MODIFIED="1312123893606">
+<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" CREATED="1312142902004" MODIFIED="1314078079619">
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Buttons of Filter composer" STYLE_REF="Method" FOLDED="true" ID="ID_1027349840" CREATED="1312142569809" MODIFIED="1314078099275">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="Add" STYLE_REF="Method" ID="ID_1309133157" CREATED="1312142576136" MODIFIED="1312920971020"/>
+<node TEXT="And" STYLE_REF="Method" ID="ID_1757300074" CREATED="1312142621789" MODIFIED="1312920971067"/>
+<node TEXT="Or" STYLE_REF="Method" ID="ID_1457390872" CREATED="1312142626695" MODIFIED="1312920971067"/>
+<node TEXT="Split" STYLE_REF="Method" ID="ID_473058214" CREATED="1312142630728" MODIFIED="1312920971051" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To split a filter rule which was composed with AND and OR.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_1607587118" CREATED="1312142647630" MODIFIED="1312920971051"/>
+<node TEXT="Set Name" STYLE_REF="Method" ID="ID_1779620539" CREATED="1312142655048" MODIFIED="1312920971051"/>
+<node TEXT="Right" STYLE_REF="Method" ID="ID_208287444" CREATED="1312142731636" MODIFIED="1312920971035">
+<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" CREATED="1312142849292" MODIFIED="1312920971035"/>
+<node TEXT="Apply" STYLE_REF="Method" ID="ID_1375530764" CREATED="1312142661031" MODIFIED="1312920971035"/>
+<node TEXT="Cancel" STYLE_REF="Method" ID="ID_23661885" CREATED="1312142699056" MODIFIED="1312920971035"/>
+<node TEXT="Save" STYLE_REF="Method" ID="ID_1878373607" CREATED="1312142707706" MODIFIED="1312920971035"/>
+<node TEXT="Load" STYLE_REF="Method" ID="ID_1746410510" CREATED="1312142713221" MODIFIED="1312920971020"/>
+<node TEXT="Bottom" ID="ID_1789678903" CREATED="1312142752033" MODIFIED="1312143004256">
+<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" CREATED="1310496676053" MODIFIED="1330599024165">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1312144688348" MODIFIED="1312964442165" LINK="#_Freeplane_Link_784043927" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click green arrow to move to an example.
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+</node>
+<node TEXT="Applies to filtered nodes (refine)" ID="ID_1768599003" CREATED="1310134532663" MODIFIED="1314078111178" TEXT_SHORTENED="true">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toggle Apply to filtered (visible) nodes, i.e. add an additional filter condition, to further narrow the results.</font>
+ </p>
+ </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" CREATED="1310134532663" MODIFIED="1313955633644" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toggles Display all ancestor nodes of nodes which match the filter when filtering is in effect (Applies to Filtered Nodes is set) </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Can be set before or after <i>Quick filter</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Show descendants" ID="ID_347749612" CREATED="1310134532663" MODIFIED="1313955647559" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Togles Display all descendant nodes of nodes which match the filter when filtering is in effect (Applies to Filtered Nodes is set)</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Can be set before or after <i>Quick filter</i> has been issued.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Filter conditions / states" ID="ID_1103140596" CREATED="1310496750715" MODIFIED="1330599319677">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310134532663" MODIFIED="1314078123299" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Expand all nodes in a map that match the filter. This is not a toggle switch: once the nodes are expanded, they can only be collapsed using other commands (such as Filter > Undo, which may be used immediately after this command). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Toggle Folded</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Fold All</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Fold One Level.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+</node>
+<node TEXT="Find previous" ID="ID_132872030" CREATED="1310134532663" MODIFIED="1314078151067" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_previous"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Find text or other criteria in the selected node. The searching direction is opposite to Find Next. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ The found node is selected.
+ </li>
+ <li>
+ If the found node is folded, it is unfolded.
+ </li>
+ <li>
+ If the found node is outside the screen, the mind map is shifted to bring it in the visible are of the screen.
+ </li>
+ </ul>
+ </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" CREATED="1310134532663" MODIFIED="1314078164390" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Find text or other criteria in the selected node and all its descendant nodes. And if not found, search further in other branches. This is called depth first search.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ The found node is selected.
+ </li>
+ <li>
+ If the found node is folded, it is unfolded.
+ </li>
+ <li>
+ If the found node is outside the screen, the mind map is shirgted to bring it in the visible are of the screen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="Finding / searching" ID="ID_721920269" CREATED="1310496838340" MODIFIED="1313955685514">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1266240695203" MODIFIED="1322427093692" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+<attribute NAME="Chapter" VALUE="3,6,7,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To fit your Freeplane to your wishes and advanced features.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Time management" FOLDED="true" ID="ID_1959496513" CREATED="1303932101749" MODIFIED="1335353698393" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The Time manager allows you to set dates, times (reminders) and tasks (reminder texts) in selected nodes. The date appears as basic node text. A clock icon signals that a reminder is set. This icon appears in the note and its predecessors, except nodes which are within a Sum node group. A flasing clock icon signals that a reminder time has been reached.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ There are two locations where these functions can be set of edited.
+ </p>
+ <ul>
+ <li>
+ <i>Node features > Time management </i>
+ </li>
+ <li>
+ <i>View > Properties panel > Calendar and Attribute</i>s
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<node TEXT="Manage time [Show Calendar...]" ID="ID_1104707017" CREATED="1267746559867" MODIFIED="1330599359394" TEXT_SHORTENED="true">
+<icon BUILTIN="../TimeManagementAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to set ar 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 flases at the reminder time. Also a red exclamation mark flashes in the root node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Properties Panel > Calendar & Attributes</i> for an alternative dialog
+ </li>
+ </ul>
+ </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" CREATED="1310058100675" MODIFIED="1314563773401" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+<node TEXT="Insert date in selection" STYLE_REF="Method" ID="ID_77223280" CREATED="1288907062597" MODIFIED="1314563783026" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+<node TEXT="Remind me at this date" STYLE_REF="Method" ID="ID_1905175036" CREATED="1310058020709" MODIFIED="1314563800654" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+<node TEXT="Remind later" STYLE_REF="Method" FOLDED="true" ID="ID_482088279" CREATED="1327336499621" MODIFIED="1329732742890">
+<hook NAME="plugins/TimeManagementReminder.xml">
+ <Parameters REMINDUSERAT="1643041920000" PERIOD="10" UNIT="YEAR"/>
+</hook>
+<node TEXT="minutes" ID="ID_488965894" CREATED="1327336533700" MODIFIED="1327336556251"/>
+<node TEXT="hours" ID="ID_12255581" CREATED="1327336557096" MODIFIED="1327336562998"/>
+<node TEXT="days" ID="ID_1083871034" CREATED="1327336564011" MODIFIED="1327336566509"/>
+<node TEXT="weeks" ID="ID_1691377285" CREATED="1327336567364" MODIFIED="1327336571035"/>
+<node TEXT="years" ID="ID_1891442163" CREATED="1327336571867" MODIFIED="1327336576834"/>
+</node>
+<node TEXT="Remove reminder (time)" STYLE_REF="Method" ID="ID_1600844387" CREATED="1310058040514" MODIFIED="1314563806005" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+</node>
+<node TEXT="Manage tasks [Show Time Scheduler List...]" ID="ID_1106133151" CREATED="1266247905093" MODIFIED="1314563746085" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<icon BUILTIN="../TimeListAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Opens a window which displays the reminders of all nodes. For each reminder are displayed: </font>
+ </p>
+ <ul>
+ <li>
+ date
+ </li>
+ <li>
+ basic node text
+ </li>
+ <li>
+ icons
+ </li>
+ <li>
+ time created
+ </li>
+ <li>
+ time last modified
+ </li>
+ <li>
+ notes
+ </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="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_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Remove reminder" ID="ID_148977369" CREATED="1303932208426" MODIFIED="1311405889339" TEXT_SHORTENED="true">
+<icon BUILTIN="../ReminderHookAction"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remove the reminder of the selected node. For alternatives:
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Show Calendar..</i>.
+ </li>
+ <li>
+ <i>View Properties Panel > Calendar & Attribute</i>s
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_517678813" CREATED="1288542096079" MODIFIED="1312919951425" 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" CREATED="1303931982176" MODIFIED="1314906861318" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Encryption</b> is a method to protect (only) the descendants of a node from viewing and editing. unless the right encryption key has been entered.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The algorithm used is "PBEWithMD5AndDES" of javax.crypto.Cipher"
+ </li>
+ <li>
+ Use a sentence or long key with capitals, non capitals and special characters to be more safe.
+ </li>
+ <li>
+ The information in the source file is unreadable too.
+ </li>
+ <li>
+ Example use: safety lock for private information.<br/>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Maps > Map browser</i> to protect a mind map from editing, but keep it readable
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<node TEXT="Enter password" ID="ID_1020968664" CREATED="1266247815921" MODIFIED="1330600393924" TEXT_SHORTENED="true">
+<icon BUILTIN="../lock"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens a dialog to add and use a password to protect the descendants of the selected node form being displayed and edited. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>Note</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">The selected node itself is not protected, its information keeps being displayed and editable.</font>
+ </li>
+ <li>
+ Multiple layer protection is possible: protect a child of a protected parent with a different password.
+ </li>
+ <li>
+ Closing the map will automatically protect the node (toggle <i>Encrypted</i>).
+ </li>
+ <li>
+ To protect a whole map: see<i> File > New protected map.</i>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Node feutures > Link > Hyperlink (Menu Entry)</i> to make the lock clickable.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+</node>
+<node TEXT="" ENCRYPTED_CONTENT="/xWFGOIZ0dg= gT0iwj5Mr9ZIUJGRpaqO8Htqqrsf2WP03ZNL+++X2kTszPq0YnO2ZeUGmygvV6OwMQ0CXGau4qbnLlt5ODSMosrdy5dZ6ZqDB4hELxsH/uvBkCIhukwfQA7ExofI6u2MbKWGXK/WWJ5cB+65yJVcWqjeLTsDYwNc4stftw3OcVG4ui/40qfkmCCuSemvAOV2sNjrxV5qyDnwzJWVCS0VtwHzUeDKlKRPNz08FmIdhXWpX3YtWYhIn7CLC9rzh9OI" ID="ID_866287848" CREATED="1312574380161" MODIFIED="1335353766242" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Example</b>
+ </p>
+ <p>
+ This node is protected: my children are visible only after entering a password.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do</b>
+ </p>
+ <ul>
+ <li>
+ Select <i>Enter password and </i>enter password <i>freeplane </i>
+ </li>
+ <li>
+ See that I have two child nodes.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Remove password" ID="ID_136268743" CREATED="1303932060947" MODIFIED="1330599890135" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog to enter a password and remove the protection from the selected node. Next time it is not necessary to enter a password to display the descendants of the node.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+</node>
+<node TEXT="Add-ons" STYLE_REF="Method" ID="ID_100406395" CREATED="1319034423088" MODIFIED="1330600557725" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane is extensible via add-ons, packages that can be downloaded from a central locations and that provide some non-standard functionality. See<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons"> wiki</a>.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Assign hot key" ID="ID_764902206" CREATED="1271849865669" MODIFIED="1330600819992" TEXT_SHORTENED="true">
+<icon BUILTIN="../SetAcceleratorOnNextClickAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Allows assigning a hotkey combination to most menu commands, or reassigning the current hotkeys. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Opens a dialog to:
+ </p>
+ <ol>
+ <li>
+ select by navigating the menu item to connect to
+ </li>
+ <li>
+ enter the key, key combination, or F-key
+ </li>
+ </ol>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Hot Key Presets > Save presets</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Different sets can be saved for different uses
+ </li>
+ </ul>
+ </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" CREATED="1266248138750" MODIFIED="1311405939509">
+<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" CREATED="1289732931429" MODIFIED="1312921190263" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a list of previously saved hot key sets to choose from.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ If there is no user defined set, none is shown.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="Save hot key set" ID="ID_918316602" CREATED="1266248179781" MODIFIED="1319567914879" COLOR="#000000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens a dialog to save all the currently-defined hot key short-cuts to a dedicated file, which may be used to share the keystroke sets among multiple computers.The dialog prompts for the name of the file, which is automatically given the ".properties" extension. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>Note</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">The file is created in the "accelerators" subdirectory of the User Directory.</font>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Tools > Open User Directory
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="Remove hot key set" STYLE_REF="Functiegroep" ID="ID_978833755" CREATED="1293376890432" MODIFIED="1312921175833" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Select <i>Tools > Open User directory</i> and delete the set name in directory <i>accelerators</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Short cuts" FOLDED="true" ID="ID_1175856403" CREATED="1310739595312" MODIFIED="1311405939556">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<node TEXT="" ID="ID_1466182220" CREATED="1312921094954" MODIFIED="1330600843424">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Short cut or hot key" ID="ID_812201013" CREATED="1310823944773" MODIFIED="1311405939571" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <b>hot key</b> is a special key or key combination which can be used to trigger a menu item without having to navigate to the menu item.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="F-keys" ID="ID_435839537" CREATED="1289732578947" MODIFIED="1311405939571" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ F-keys (F1 - F-12) are hot keys. See above for assigning, selecting and deleting.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="Reference card for special system keys" ID="ID_1818761339" CREATED="1286915483579" MODIFIED="1311405939587" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Key Reference</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="Unassigned F-keys" STYLE_REF="ToNote" ID="ID_572257004" CREATED="1313323930393" MODIFIED="1330600871238" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <pre wrap=""> Unassigned F-Key are passed through if the focused component is a JTextComponent. (1.2.8_05</pre>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node ID="ID_1243435937" CREATED="1313324062197" MODIFIED="1313324062197" 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" CREATED="1267746871633" MODIFIED="1330601031029" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">Displays a hierarchical menu of Groovy scripts which have been added to the user's scripts directory.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Execute selected node scripts" ID="ID_894921324" CREATED="1266247915812" MODIFIED="1311405964531" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">Runs all scripts which are attached to the currently selected node(s).</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Execute all scripts" ID="ID_1362957476" CREATED="1266248076859" MODIFIED="1311405964547" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExecuteScriptForAllNodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">Runs all the scripts which are local to the current map, having been created using the Script Editor.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Edit script..." ID="ID_1785517002" CREATED="1310737755450" MODIFIED="1330600989047">
+<icon BUILTIN="../ScriptEditor"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">Displays a window for creating scripts which become attached to individual nodes, and are saved local to the current map file.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Formulas..." STYLE_REF="Functie" FOLDED="true" ID="ID_394104724" CREATED="1291201976731" MODIFIED="1311405964578" BACKGROUND_COLOR="#ffffff"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In Freeplane there are 3 types of formulas:
+ </p>
+ <ul>
+ <li>
+ a formula in a text, written in LaTeX
+ </li>
+ <li>
+ a simple formula as in a Spread Sheet (Excel) which is executed at once. This type of formula is written in the basic node text and starts with "=", followed by a regular expression like 3 + 5. The node calculates and shows the result (8) in stead of the formula. This type of node can be recognized by a colored border.
+ </li>
+ <li>
+ an advanced formula defined in Groovy script language.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>View > Don't mark formulas with a border</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1291201995803" MODIFIED="1310883758950">
+<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" CREATED="1310739619133" MODIFIED="1317661330776" TEXT_SHORTENED="true" LINK="#ID_1528894906">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ In preferences formula evaluation can be deactivated.
+ </li>
+ <li>
+ Scrips do not work in published mindmaps (Java Applets)
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Click the green arrow to see the preferences.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" FOLDED="true" ID="ID_1643451776" CREATED="1312921132339" MODIFIED="1312921156208">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Wiki Formulas" ID="ID_1130453106" CREATED="1310826300439" MODIFIED="1311405964594" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formulas">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Wiki Groovy scripts" ID="ID_1846416316" CREATED="1310826176176" MODIFIED="1311405964594" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Wiki Example scripts" ID="ID_1734570187" CREATED="1312707186361" MODIFIED="1312707225956" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts"/>
+<node TEXT="Example script to Load image in Details" ID="ID_840644558" CREATED="1312703533603" MODIFIED="1312826164583" 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.getResourceController().getResource(path))
}

def builder = new SwingBuilder()
def dial = builder.dialog(title:'Insert Image', id:'insertImage', modal:true,
 locationRelativeTo:ui.frame, owner:ui.frame, pack:true, show:true) {
 panel() {
 JTextField urlField
 boxLayout(axis:BXL.Y_AXIS)
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('URL')
 urlField = textField(id:'url', columns:30)
 button(action:action(closure:{
 def chooser = fileChooser(fileSelectionMode:JFileChooser.FILES_ONLY)
 if (chooser.showOpenDialog() == JFileChooser.APPROVE_OPTION)
 urlField.text = chooser.selectedFile.toURL()
 }), icon:getIcon("/images/fileopen.png"))
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('Width:')
 textField(id:'width', columns:3)
 glue()
 label('Height:')
 textField(id:'height', columns:3)
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('Target:')
 buttonGroup().with { group -> 
 radioButton(id:'text', text:'Node Text', selected:true, buttonGroup:group) 
 radioButton(id:'details', text:'Node Details', buttonGroup:group) 
 } 
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.RIGHT)
 button(action:action(name:'OK', defaultButton:true, mnemonic:'O',
 enabled:bind(source:urlField, sourceProperty:'text',
 converter:{ it ? true : false }),
 closure:{variables.ok = true; dispose()}))
 button(action:action(name:'Cancel', mnemonic:'C', closure:{dispose()}))
 }
 }
}

def String insertTag(String text, String htmlTag) {
 if (text == null)
 text = ""
 if ( ! text.startsWith("<html>"))
 text = "<html><head/><body>${text}</body></html>"
 return text.replace("</body>", htmlTag + "</body>")
}

def String imageTag(url, width, height) {
 def attribs = [ "src='${url}'" ]
 if (width)
 attribs << "width='${width}'"
 if (height)
 attribs << "height='${height}'"
 "<img ${attribs.join(' ')} />"
}

def vars = builder.variables
if (vars.ok) {
 def imageTag = imageTag(vars.url.text, vars.width.text, vars.height.text)
 if (vars.details.selected)
 node.details = insertTag(node.detailsText, imageTag)
 else
 node.text = insertTag(node.text, imageTag)
}

"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To load an image in Details you can execute the script defined in this node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do </b>
+ </p>
+ <ul>
+ <li>
+ Copy this node to your mind map
+ </li>
+ <li>
+ Make sure to have put in <i>Tools > Preferences >Plugins</i> a check before:
+
+ <ul>
+ <li>
+ run scrips
+ </li>
+ <li>
+ allow read files
+ </li>
+ <li>
+ allow write file
+ </li>
+ </ul>
+ </li>
+ <li>
+ Click on the copied node to open the dialog which will insert the image.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ You can also copy the script contained in this node to your node.
+ </p>
+ </li>
+ <li>
+ The original script can be found in the wiki with example scripts.
+ </li>
+ <li>
+ The current node contains a link to <i>Tools > Execute node scrips</i> which activates the script
+ </li>
+ <li>
+ The example has one draw back: the script must be in the node where the image is needed. See the example below for a solution which is more generic.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Generic use of same script" ID="ID_776458088" CREATED="1312823815065" MODIFIED="1312825892220" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To make available the example script to insert an image to Details from any node, you should install it in directory scrips.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Do</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Open User directory</i>
+ </li>
+ <li>
+ Define or open the submenu <i>scripts</i>
+ </li>
+ <li>
+ Download the script from the wiki with script examples
+
+ <ul>
+ <li>
+ <font size="3">Goto wiki with example scrips</font>
+ </li>
+ <li>
+ <font size="3">Find file: <i>Inserts an inline image into node text or details</i></font>
+ </li>
+ <li>
+ Press download script, choose save; <i>InsertInlineImage.groovy</i> is downloaded
+ </li>
+ <li>
+ Copy this file to the directory scrips
+ </li>
+ </ul>
+ </li>
+ <li>
+ If you close and restart Freeplane (!) the saved file will become visible in <i>Tools >Scripts</i>
+ </li>
+ </ul>
+ <p>
+ Now you can select a node and start the script with:
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Script > InsertInlineImage</i> (or the name you used to save the script)
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Make sure to have put in <i>Tools > Preferences >Plugins</i> a check before:
+
+ <ul>
+ <li>
+ run scrips
+ </li>
+ <li>
+ allow read files
+ </li>
+ <li>
+ allow write file
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Execute external command" ID="ID_1044042899" CREATED="1313260327763" MODIFIED="1313260463827" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <code>To execute an external command, save the script: </code>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <code>// @ExecutionModes(on_single_node) </code>
+ </p>
+ <p>
+ <code> 'C:\path\to\my\command'.execute() </code>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><code>Note</code></b>
+ </p>
+ <p>
+ <code>You can bind the command to a hotkey.</code>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Open user directory" FOLDED="true" ID="ID_4259182" CREATED="1303933344973" MODIFIED="1314907243581">
+<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" CREATED="1310759742065" MODIFIED="1311353618620">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="directory-.backup" FOLDED="true" ID="ID_692458643" CREATED="1310759556908" MODIFIED="1310883473236" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ automatic backups
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<node TEXT="" ID="ID_1708394985" CREATED="1310825788339" MODIFIED="1312921208187">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you lost your map, look here.
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="directory-templates" ID="ID_366822599" CREATED="1310759536089" MODIFIED="1311405837797" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Contains all styles, .mm format.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ default.mm is the system file used with New map.
+ </li>
+ <li>
+ You can exchange styles with other users here.
+ </li>
+ </ul>
+ </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" CREATED="1310759542634" MODIFIED="1310883473236" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ user defined scripts
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="directory-icons" ID="ID_7040911" CREATED="1310759549880" MODIFIED="1311405837797" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Contains user defined icons.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Note
+ </p>
+ <ul>
+ <li>
+ You can put your own icons here, or exchange icons with other users.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="directory-xml" ID="ID_912917878" CREATED="1310885156896" MODIFIED="1310885260200" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Optional, to be added by the user.
+ </p>
+ <p>
+ Used to store user defined menu structure.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="directory-accelerators" ID="ID_390138300" CREATED="1310825223726" MODIFIED="1311406257921" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Contains hot key sets.
+ </p>
+ <p>
+ These can be exchanged between users.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6,8"/>
+</node>
+<node TEXT="Import/export" ID="ID_877249660" CREATED="1310825608361" MODIFIED="1312921263364" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6,8"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You can exchange icons, styles, short key sets with other users here.
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Preferences ..." ID="ID_827606855" CREATED="1310134532679" MODIFIED="1312967785134" TEXT_SHORTENED="true">
+<icon BUILTIN="../PropertyAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The present node is used in Finding and Filtering only. Descriptions are lacking.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1310756725581" MODIFIED="1311405939587">
+<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" CREATED="1310756756821" MODIFIED="1311924479311">
+<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" CREATED="1311706805194" MODIFIED="1311708348283">
+<attribute_layout NAME_WIDTH="33" VALUE_WIDTH="137"/>
+<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" CREATED="1310756773801" MODIFIED="1311924479295">
+<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" CREATED="1310756739294" MODIFIED="1311483332938">
+<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" CREATED="1310756795196" MODIFIED="1312921288917">
+<node TEXT="Automatic" ID="ID_1563480497" CREATED="1311708441781" MODIFIED="1311708471843">
+<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" CREATED="1310756813075" MODIFIED="1312921288933">
+<node TEXT="25" ID="ID_707557773" CREATED="1311708478168" MODIFIED="1311708512364">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Automatically open last map" ID="ID_196332959" CREATED="1310756835047" MODIFIED="1311924479295">
+<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" CREATED="1310756850593" MODIFIED="1311924592723">
+<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" CREATED="1310756870115" MODIFIED="1311924479280">
+<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" CREATED="1310756884507" MODIFIED="1311924479280">
+<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" CREATED="1310756905403" MODIFIED="1312921304221">
+<node TEXT="standard.mm" ID="ID_706234894" CREATED="1310756919873" MODIFIED="1311482969704">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Files" STYLE_REF="Method" ID="ID_1889550390" CREATED="1310756806514" MODIFIED="1312921304252">
+<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" CREATED="1310757398287" MODIFIED="1312921304236">
+<node TEXT="60,000" ID="ID_1936163905" CREATED="1311710082273" MODIFIED="1311710111930">
+<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" CREATED="1310757416031" MODIFIED="1311924479264">
+<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" CREATED="1311710239748" MODIFIED="1311924479264">
+<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" CREATED="1310757444914" MODIFIED="1312921337698"/>
+<node TEXT="Delete Automatic Saves At Exit" ID="ID_1981866727" CREATED="1310757462254" MODIFIED="1311924567521">
+<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" CREATED="1310757485006" MODIFIED="1312921337683">
+<node TEXT="10" ID="ID_205157037" CREATED="1311710082273" MODIFIED="1311710711041">
+<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" CREATED="1310757520629" MODIFIED="1312921337683">
+<node TEXT="2" ID="ID_1142741407" CREATED="1311710082273" MODIFIED="1311710744909">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Automatic Save" ID="ID_650602318" CREATED="1310757388200" MODIFIED="1311483332953">
+<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" CREATED="1310757551768" MODIFIED="1312921337667" TEXT_SHORTENED="true">
+<node TEXT="Never" ID="ID_689273752" CREATED="1311710082273" MODIFIED="1311710858729">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Always" ID="ID_702281311" CREATED="1311710082273" MODIFIED="1311710837513">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="If map is changed" ID="ID_1299958092" CREATED="1311710082273" MODIFIED="1311710921269">
+<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" CREATED="1310757564052" MODIFIED="1312921337667"/>
+<node TEXT="Save" ID="ID_619771458" CREATED="1310757542352" MODIFIED="1311925029243">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310757608637" MODIFIED="1312921337667">
+<node TEXT="Load from map or fold all" ID="ID_1843878856" CREATED="1311710082273" MODIFIED="1311711108181">
+<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" CREATED="1311710082273" MODIFIED="1311711145403">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Unfold all" ID="ID_98026410" CREATED="1311710082273" MODIFIED="1311711162984">
+<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" CREATED="1310757621062" MODIFIED="1329504807645" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ >you can define how many nodes you want to see and the Freeplane unfolds them automatically and lets the rest folded. The property is actice only if "On load" is set to "Fold all" or "Load from map or fold all
+ </body>
+</html>
+</richcontent>
+<node TEXT="20" ID="ID_1759313322" CREATED="1311710082273" MODIFIED="1311711208708">
+<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" CREATED="1310757640710" MODIFIED="1312921365061">
+<node TEXT="Default" ID="ID_198865739" CREATED="1311710082273" MODIFIED="1311711259423">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="..." ID="ID_1437522671" CREATED="1311710082273" MODIFIED="1311711289305">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Load" ID="ID_950384750" CREATED="1310757604557" MODIFIED="1311483332953">
+<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" CREATED="1311711318523" MODIFIED="1312921365045">
+<node TEXT="Relative" ID="ID_1185657954" CREATED="1311710082273" MODIFIED="1311711344919">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Absolute" ID="ID_252889669" CREATED="1311710082273" MODIFIED="1311711401321">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Hyperlink Types" ID="ID_1309284534" CREATED="1310757657738" MODIFIED="1311711469041">
+<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" CREATED="1311483101532" MODIFIED="1311924533693">
+<hook NAME="FirstGroupNode"/>
+<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" CREATED="1310757670366" MODIFIED="1311483332953">
+<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" CREATED="1311483188239" MODIFIED="1312921365045">
+<node TEXT="Show report dialog" ID="ID_1017882911" CREATED="1311483193598" MODIFIED="1311483296605">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Always send" ID="ID_920549965" CREATED="1311483233541" MODIFIED="1311483296621">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Never send" ID="ID_1237652835" CREATED="1311483239570" MODIFIED="1311483296621">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Automatic bug report" ID="ID_849413397" CREATED="1310757685958" MODIFIED="1311483332953">
+<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" CREATED="1266242716593" MODIFIED="1312967080497" 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" ID="ID_702879709" CREATED="1311711679398" MODIFIED="1312921365030">
+<node TEXT="Default" ID="ID_1366474327" CREATED="1311483239570" MODIFIED="1311711744124">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Nimbus" ID="ID_801561072" CREATED="1311483239570" MODIFIED="1311711781509">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Metal" ID="ID_1239129408" CREATED="1311483239570" MODIFIED="1311711797047">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="CDE/Motiv" ID="ID_1852646607" CREATED="1311483239570" MODIFIED="1311711894313">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Windows" ID="ID_1713648658" CREATED="1311483239570" MODIFIED="1311711847950">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Windows classic" ID="ID_850989941" CREATED="1311483239570" MODIFIED="1311711865422">
+<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" CREATED="1337169567729" MODIFIED="1337169616794"/>
+<node TEXT="User defined screen resolution (dpi)" STYLE_REF="Method" ID="ID_1436875119" CREATED="1337169642248" MODIFIED="1337169863197">
+<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038" CREATED="1337169873733" MODIFIED="1337169894594"/>
+</node>
+<node TEXT="Use Tabs" ID="ID_678230606" CREATED="1310755710026" MODIFIED="1311924298928">
+<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" CREATED="1310755787737" MODIFIED="1311924298928">
+<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" CREATED="1310755814000" MODIFIED="1311924298912">
+<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" CREATED="1271849999714" MODIFIED="1312967116985">
+<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" CREATED="1310755845061" MODIFIED="1311924437893">
+<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" CREATED="1310755835707" MODIFIED="1312967168762">
+<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" CREATED="1310755901626" MODIFIED="1312921407477">
+<node TEXT="Yellow background" ID="ID_17029124" CREATED="1311483239570" MODIFIED="1311712048831">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="White background for printing" ID="ID_1915067515" CREATED="1310755911352" MODIFIED="1311924298897">
+<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" CREATED="1310755933481" MODIFIED="1312921407462">
+<node TEXT="#f0f0f0" ID="ID_327342349" CREATED="1311483239570" MODIFIED="1311712152088">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Default Colors" ID="ID_415228347" CREATED="1310755860823" MODIFIED="1312967181382">
+<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" CREATED="1310755963730" MODIFIED="1311924298897">
+<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" CREATED="1310755988837" MODIFIED="1312921407462" LINK="#ID_922308916">
+<node TEXT="#002080" ID="ID_1345958852" CREATED="1311483239570" MODIFIED="1311712219371">
+<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" CREATED="1310756005584" MODIFIED="1312921407446">
+<node TEXT="#d2d2d2" ID="ID_1819028753" CREATED="1311483239570" MODIFIED="1311712256499">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Selection Colors" ID="ID_1053593738" CREATED="1310755953441" MODIFIED="1312967195906">
+<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" CREATED="1310756047331" MODIFIED="1312921407431"/>
+<node TEXT="Root node appearance" ID="ID_329983622" CREATED="1310756026277" MODIFIED="1312967207216">
+<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" CREATED="1310756074170" MODIFIED="1312921407415">
+<node TEXT="Antialias Edges" ID="ID_1654348959" CREATED="1311483457645" MODIFIED="1311483550591">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Antialias all" ID="ID_627671109" CREATED="1311483468403" MODIFIED="1311483542121">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="No Antialias" ID="ID_1212369653" CREATED="1311483477473" MODIFIED="1311483542121">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Antialias" ID="ID_1408904285" CREATED="1311483550591" MODIFIED="1312967220398">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310756107165" MODIFIED="1312921407399">
+<hook NAME="FirstGroupNode"/>
+<node TEXT="100" ID="ID_602426240" CREATED="1311483477473" MODIFIED="1311712335560">
+<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" CREATED="1310756120854" MODIFIED="1312921407399">
+<node TEXT="600" ID="ID_1544215822" CREATED="1311483477473" MODIFIED="1311712370598">
+<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" CREATED="1310756134699" MODIFIED="1312921407384">
+<attribute NAME="Chapter" VALUE="1"/>
+<node TEXT="600" ID="ID_1670353099" CREATED="1311483477473" MODIFIED="1311712383312">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Size Limits" ID="ID_1349141635" CREATED="1310756096393" MODIFIED="1312967235186">
+<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" CREATED="1310756199330" MODIFIED="1312921407368">
+<node TEXT="#000000" ID="ID_1523516109" CREATED="1311483477473" MODIFIED="1311712415276">
+<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" CREATED="1310756211084" MODIFIED="1312921407368">
+<node TEXT="80" ID="ID_1305662372" CREATED="1311483477473" MODIFIED="1311712432186">
+<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" CREATED="1310756227987" MODIFIED="1312921407353">
+<node TEXT="Curve" ID="ID_53878188" CREATED="1311483477473" MODIFIED="1311712481904">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Line" ID="ID_210394121" CREATED="1311483477473" MODIFIED="1311712497878">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Linear path" ID="ID_972235482" CREATED="1311483477473" MODIFIED="1311712514570">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Simulate edge" ID="ID_441814953" CREATED="1311483477473" MODIFIED="1311712554015">
+<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" CREATED="1310756243034" MODIFIED="1312921444559">
+<node TEXT="2" ID="ID_22643760" CREATED="1311483477473" MODIFIED="1311712592563">
+<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" CREATED="1310756269499" MODIFIED="1312921444559">
+<node TEXT="SansSerif" ID="ID_1484575894" CREATED="1311483477473" MODIFIED="1311712626867">
+<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" CREATED="1310756305651" MODIFIED="1312921444543">
+<node TEXT="12" ID="ID_589330080" CREATED="1311483477473" MODIFIED="1311712644152">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Connectors" ID="ID_1984458992" CREATED="1310756191506" MODIFIED="1312967247916">
+<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" CREATED="1310756385375" MODIFIED="1311924369526">
+<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" CREATED="1310756348428" MODIFIED="1311924298881">
+<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" CREATED="1310756407465" MODIFIED="1312921444543">
+<node TEXT="150" ID="ID_1551290999" CREATED="1311483477473" MODIFIED="1311712739718">
+<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" CREATED="1310756426130" MODIFIED="1312921444543">
+<node TEXT="600" ID="ID_1973666685" CREATED="1311483477473" MODIFIED="1311712754904">
+<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" CREATED="1310756407465" MODIFIED="1312921444527">
+<node TEXT="400" ID="ID_164780892" CREATED="1311483477473" MODIFIED="1311712766690">
+<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" CREATED="1310756426130" MODIFIED="1312921444527">
+<node TEXT="900" ID="ID_1286106720" CREATED="1311483477473" MODIFIED="1311712779037">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Edit Long Node Window" ID="ID_991611253" CREATED="1310756332632" MODIFIED="1312967260583">
+<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" CREATED="1310756536143" MODIFIED="1312921444527">
+<node TEXT="5" ID="ID_1567487763" CREATED="1311483477473" MODIFIED="1311712789029">
+<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" CREATED="1310756547226" MODIFIED="1312921444512">
+<node TEXT="15" ID="ID_1756020932" CREATED="1311483477473" MODIFIED="1311712804013">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Outline view" ID="ID_1466344690" CREATED="1310756525838" MODIFIED="1312967270848">
+<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" CREATED="1310756571579" MODIFIED="1311924402668">
+<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" CREATED="1310756586125" MODIFIED="1311924298881">
+<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" CREATED="1310756602810" MODIFIED="1311924185648">
+<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" CREATED="1311923205552" MODIFIED="1311923312554" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ In <i>Java Applet</i> attribute icons are displayed, whatever the setting.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Icons" ID="ID_1409698218" CREATED="1310756566609" MODIFIED="1312967282517">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="46"/>
+<attribute NAME="Chapter" VALUE="3,8"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+<node TEXT="Keystrokes" FOLDED="true" ID="ID_190794373" CREATED="1271849091114" MODIFIED="1312967306541">
+<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" CREATED="1271850151778" MODIFIED="1312921444512"/>
+</node>
+<node TEXT="Behaviour" FOLDED="true" ID="ID_1251832106" CREATED="1271849242668" MODIFIED="1312967409408" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Provides control over various aspects of the user interface.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1310757864314" MODIFIED="1312921444496">
+<node TEXT="Last" ID="ID_1088081628" CREATED="1311829566642" MODIFIED="1311829638285">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="First" ID="ID_460059219" CREATED="1311829583482" MODIFIED="1311829638285">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Drag and drop" ID="ID_937187121" CREATED="1310757901793" MODIFIED="1311829691218">
+<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" CREATED="1310757872183" MODIFIED="1311829789799">
+<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" CREATED="1310757926214" MODIFIED="1312921475415"/>
+<node TEXT="Folding Symbol Width" STYLE_REF="Method" FOLDED="true" ID="ID_162608451" CREATED="1310757944645" MODIFIED="1312921475384">
+<node TEXT="6" ID="ID_917162640" CREATED="1311829819524" MODIFIED="1311829867799">
+<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" CREATED="1310757958974" MODIFIED="1312921475369">
+<node TEXT="10" ID="ID_230800785" CREATED="1311829828003" MODIFIED="1311829867815">
+<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" CREATED="1310757979449" MODIFIED="1311829925504">
+<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" CREATED="1310757895934" MODIFIED="1312921475353">
+<node TEXT="Overwrite content" ID="ID_906283996" CREATED="1311829944995" MODIFIED="1311830017793">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Do nothing" ID="ID_238703082" CREATED="1311829953520" MODIFIED="1311830017809">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Add sibling node" ID="ID_1320405878" CREATED="1311829975665" MODIFIED="1311830017793">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Add child node" ID="ID_1310255165" CREATED="1311829984253" MODIFIED="1311830017793">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Behaviour" ID="ID_171435040" CREATED="1310757843354" MODIFIED="1312967339613">
+<attribute_layout NAME_WIDTH="73" VALUE_WIDTH="103"/>
+<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" CREATED="1310758053597" MODIFIED="1311830112220">
+<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" CREATED="1311430948225" MODIFIED="1311431214666">
+<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" CREATED="1310758092136" MODIFIED="1312921475337">
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="#0.####" ID="ID_599272734" CREATED="1311430882736" MODIFIED="1311431228035">
+<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" CREATED="1310758109725" MODIFIED="1312921475322">
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="SHORT" ID="ID_1799574764" CREATED="1311430899060" MODIFIED="1311431243666">
+<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" CREATED="1310758124522" MODIFIED="1312921475306">
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="SHORT,SHORT" ID="ID_1489062870" CREATED="1311430911643" MODIFIED="1311431257269">
+<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" CREATED="1310758158959" MODIFIED="1312921475291">
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="Automatic (List with languages)" ID="ID_1141766183" CREATED="1311430933973" MODIFIED="1311431271793">
+<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" CREATED="1310758029673" MODIFIED="1312967350034" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="149"/>
+<attribute NAME="Chapter" VALUE="4,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Properties panel . Calendar & Attributes .> Date/time and number formatting</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="Display inline editor for all new nodes" ID="ID_1855645772" CREATED="1310758187367" MODIFIED="1311830174901">
+<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" CREATED="1310758210931" MODIFIED="1311830174964">
+<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" CREATED="1310758229220" MODIFIED="1311926557786">
+<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" CREATED="1310758243815" MODIFIED="1311830174917">
+<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" CREATED="1310758175346" MODIFIED="1312967364636">
+<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" CREATED="1310758275032" MODIFIED="1312921475275">
+<node TEXT="Ask" ID="ID_1722707084" CREATED="1311830230522" MODIFIED="1311830274983">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Yes" ID="ID_1038355271" CREATED="1311830236224" MODIFIED="1311830274968">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="No" ID="ID_1904863532" CREATED="1311830240475" MODIFIED="1311830274968">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Delete nodes without confirmation" ID="ID_815571706" CREATED="1310758292152" MODIFIED="1311830340176">
+<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" CREATED="1310758330411" MODIFIED="1311830340238">
+<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" CREATED="1310758343023" MODIFIED="1311830340223">
+<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" CREATED="1310758266552" MODIFIED="1312967378301">
+<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" CREATED="1310758381166" MODIFIED="1311830340207">
+<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" CREATED="1310758369224" MODIFIED="1312967396538">
+<hook NAME="SummaryNode"/>
+<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" CREATED="1310758403896" MODIFIED="1312921505414">
+<node TEXT="Delayed" ID="ID_844433841" CREATED="1311830373100" MODIFIED="1311830428293">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Direct" ID="ID_1150077727" CREATED="1311830379081" MODIFIED="1311830428293">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="By click" ID="ID_942709712" CREATED="1311830385486" MODIFIED="1311830428293">
+<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" CREATED="1310758414699" MODIFIED="1312921505414">
+<node TEXT="200" ID="ID_1264808816" CREATED="1311830585298" MODIFIED="1311830634720">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Center selected nodes" ID="ID_266453260" CREATED="1310758432162" MODIFIED="1311830679149">
+<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" CREATED="1310758392609" MODIFIED="1312967425164">
+<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" CREATED="1310758457856" MODIFIED="1312921505399">
+<node TEXT="80" ID="ID_324161648" CREATED="1311830697922" MODIFIED="1311830742157">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Mouse wheel" ID="ID_897961065" CREATED="1310758446257" MODIFIED="1312967436692">
+<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" CREATED="1310758473472" MODIFIED="1312921505383">
+<node TEXT="20" ID="ID_1492439142" CREATED="1311830705918" MODIFIED="1311830742157">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Scrollbar" ID="ID_1429616466" CREATED="1310758465133" MODIFIED="1312967448454">
+<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" CREATED="1310758490757" MODIFIED="1311830800642">
+<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" CREATED="1310758500919" MODIFIED="1311830800642">
+<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" CREATED="1310758524296" MODIFIED="1311830831967">
+<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" CREATED="1310758546066" MODIFIED="1311830800626">
+<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" CREATED="1310758559973" MODIFIED="1312921505383">
+<node TEXT="15" ID="ID_1785386989" CREATED="1311830855375" MODIFIED="1311830894648">
+<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" CREATED="1310758588794" MODIFIED="1312921505383">
+<node TEXT="15" ID="ID_223576174" CREATED="1311830863962" MODIFIED="1311830894663">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Spell checker options" ID="ID_1152047272" CREATED="1310758481013" MODIFIED="1312967460295">
+<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" CREATED="1310758646858" MODIFIED="1311830949170">
+<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" CREATED="1310758666943" MODIFIED="1312921505367">
+<node TEXT="750" ID="ID_970116987" CREATED="1311830976493" MODIFIED="1311831070109">
+<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" CREATED="1310758676622" MODIFIED="1312921505367">
+<node TEXT="4,000" ID="ID_578810629" CREATED="1311830995018" MODIFIED="1311831070109">
+<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" CREATED="1310758685896" MODIFIED="1312921505367">
+<node TEXT="500" ID="ID_1312285366" CREATED="1311831002732" MODIFIED="1311831070109">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Tooltip times" ID="ID_1779710506" CREATED="1310758612654" MODIFIED="1312967472775">
+<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" CREATED="1310758707535" MODIFIED="1312921505367">
+<node TEXT="80" ID="ID_980366954" CREATED="1311831029088" MODIFIED="1311831070125">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Editor settings" ID="ID_433167342" CREATED="1310758697339" MODIFIED="1312967490122">
+<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" CREATED="1310758724476" MODIFIED="1312921505352">
+<node TEXT="100" ID="ID_933957391" CREATED="1311831038549" MODIFIED="1311831070125">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Undo" ID="ID_1615979770" CREATED="1310758720396" MODIFIED="1312967504178">
+<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" CREATED="1271849323057" MODIFIED="1312967527734" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Controls interaction with a Web browser, plus options for HTML Import and Export.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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" CREATED="1310758826172" MODIFIED="1312921544695">
+<node TEXT="cmd.exe/c start"" "{0}"" ID="ID_1405736836" CREATED="1311831132641" MODIFIED="1311831254064">
+<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" CREATED="1310758851561" MODIFIED="1312921544711">
+<node TEXT="command.com /c start "{0}"" ID="ID_1915045103" CREATED="1311831164051" MODIFIED="1311831254049">
+<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" CREATED="1310758874485" MODIFIED="1312921544695">
+<node TEXT="xdg-open {0}" ID="ID_155698917" CREATED="1311831197693" MODIFIED="1311831254049">
+<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" CREATED="1310758897815" MODIFIED="1312921544695">
+<node TEXT="open {0}" ID="ID_1454396895" CREATED="1311831216218" MODIFIED="1311831254064">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Browser" ID="ID_592493497" CREATED="1310758924498" MODIFIED="1312967518889">
+<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" CREATED="1310758955934" MODIFIED="1312921544680">
+<attribute NAME="Chapter" VALUE="6"/>
+<node TEXT="No Folding" ID="ID_734831498" CREATED="1311831296620" MODIFIED="1312813942871">
+<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" CREATED="1311831265428" MODIFIED="1312813942871">
+<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" CREATED="1311831304101" MODIFIED="1312813942871">
+<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" CREATED="1311831322876" MODIFIED="1312813942871">
+<icon BUILTIN="pencil"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+</node>
+<node TEXT="Export Icons In Html" ID="ID_700548117" CREATED="1310758971244" MODIFIED="1311831423052">
+<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" CREATED="1310758942104" MODIFIED="1312967540744">
+<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" CREATED="1310759009575" MODIFIED="1312813688731">
+<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" CREATED="1310758992624" MODIFIED="1312967548279">
+<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" CREATED="1310759053262" MODIFIED="1312781878338">
+<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" CREATED="1310759087090" MODIFIED="1311831580433">
+<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" CREATED="1310759073402" MODIFIED="1317661534808">
+<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" CREATED="1310759105693" MODIFIED="1317661405563">
+<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" CREATED="1310759060166" MODIFIED="1312967556360">
+<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" CREATED="1310759163843" MODIFIED="1317403552575">
+<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" CREATED="1317403453032" MODIFIED="1317403524246">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+</node>
+<node TEXT="Permit File/Read Operations" ID="ID_881249705" CREATED="1310759181789" MODIFIED="1312782111075">
+<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" CREATED="1310759202748" MODIFIED="1312782119281">
+<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" CREATED="1310759224097" MODIFIED="1312782130575">
+<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" CREATED="1310759242325" MODIFIED="1312782138328">
+<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" CREATED="1310759263674" MODIFIED="1312966483156">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Optional User Key Alias for Signing" STYLE_REF="Method" ID="ID_1319215468" CREATED="1310759282714" MODIFIED="1312921573976">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Script search path" STYLE_REF="Method" FOLDED="true" ID="ID_1885113964" CREATED="1310759307198" MODIFIED="1312921573961">
+<attribute NAME="Chapter" VALUE="7"/>
+<node TEXT="scripts" ID="ID_1078878417" CREATED="1311831645227" MODIFIED="1312782089313">
+<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" CREATED="1310759327486" MODIFIED="1312921573961">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="Scripting" ID="ID_1528894906" CREATED="1310759127432" MODIFIED="1312781721246">
+<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" CREATED="1310134532679" MODIFIED="1322427102599" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To select and handle mind maps.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Mind map editor" ID="ID_327363055" CREATED="1310134532679" MODIFIED="1311405837828" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">The mode in which mind maps are created and edited.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Map browser" ID="ID_524078813" CREATED="1310134532679" MODIFIED="1310883817139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">This is a read-only mode for browsing maps rather than editing them. It is has two main uses: First, when using Export > As Java Applet..., the applet opens the map only for reading, because editing maps is not supported via the Web. Second, Freeplane's Help file, when accessed via Help > Documentation or F1, is opened in read-only mode in order to preserve its contents while users learn various Freeplane features. Otherwise this Map Browser mode is generally unused.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="File explorer" ID="ID_1982200889" CREATED="1310134532679" MODIFIED="1311405837859" 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" CREATED="1310198658417" MODIFIED="1310883817139">
+<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" CREATED="1310241684255" MODIFIED="1312921628748" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">To publish or share a mind map: </font>
+ </p>
+ <ul>
+ <li>
+ Fold the mind map as you want it to be when opening
+ </li>
+ <li>
+ Select <i>File > Export</i> and choose <i>Java Applet</i>.
+ </li>
+ <li>
+ One file and one directory will be created: <i>myFile.html </i>and <i>myFile.html_files</i> respectively.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ You can move the file <i>myFile.html</i> and the subdirectory <i>myFile.html_files</i> to the location (directory) where you want to it be it accessible. Call <i>myFile.html</i> to open the mind map.
+ </li>
+ <li>
+ If publishing on internet, you may rename myFile.html in e.g. index.html. The subdirectory should NOT be renamed.
+ </li>
+ </ul>
+ <p>
+ <b>Note also</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">In the Freeplane applet, you can only use the Browse mode; you cannot edit remote maps. Click a node to toggle folding or to follow a link. Drag the background to move the map. To search the map, use the node context menu.</font>
+ </p>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">Small maps can also use Export as Flash which also offers limited browsing functionality.</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">LaTeX and SVG images are not displayed in the Freeplane Applet nor in the Flash browser.</font>
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Embed a mind map on a web page or wiki
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Embed mind map on wiki" ID="ID_590309579" CREATED="1310926331342" MODIFIED="1310927934949" 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>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To embed a mind map in a web site or wiki, see Inernet
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Help" FOLDED="true" ID="ID_278329781" CREATED="1310134532679" MODIFIED="1322427114018" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Methods to help you to solve problems in using Freeplane.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Check for updates" ID="ID_1783314150" CREATED="1310198902331" MODIFIED="1310199751621" TEXT_SHORTENED="true">
+<icon BUILTIN="../update"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Manually check whether a newer version of Freeplane has been released. This check will be done automatically if the corresponding checkbox is enabled at the bottom of the dialog which opens.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Freeplane's home page" ID="ID_797729331" CREATED="1271855734459" MODIFIED="1310883865062" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a web browser containing the home page of the Freeplane web site.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Ask for help" FOLDED="true" ID="ID_1043826397" CREATED="1271856103992" MODIFIED="1311402584107" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a Web browser window to Freeplane's Open Discussion Forum. A confirmation dialog alerts you to the fact that this function requires that you log in to SourceForge.net where you can easily create a free account. After logging in, you may check for information related to your question by using the Search function, located under the Forums menu heading. If you then want to ask your own question, scroll down toward the bottom of the page to find the Add a Topic heading, type a short title in the line labelled "Enter topic title", then enter your message in the larger text box below.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<node TEXT="Troubleshooting" ID="ID_389902247" CREATED="1310925961805" MODIFIED="1310925972645" LINK="http://freeplane.sourceforge.net/wiki/index.php/Troubleshooting"/>
+</node>
+<node TEXT="Report a bug" ID="ID_1404935411" CREATED="1271855833848" MODIFIED="1310883875436" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens een web browser containing the page of Mantis Bug tracker. You can report a bug here.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Request a feature" ID="ID_800979042" CREATED="1271855982412" MODIFIED="1310883879804" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens een web browser containing Freeplane's Feature Request page in Mantis Tracker. You can leave your request here.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Licence" ID="ID_1881309718" CREATED="1271857117445" MODIFIED="1310883885233" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a window displaying a short summary of Freeplane's copyright and licensing information, including information about where to find full copies of the GNU General Public License.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="About" ID="ID_1959296182" CREATED="1272489323245" MODIFIED="1311402584122" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens a dialog with copyright, version, and technical information.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Tutorial" ID="ID_1373709444" CREATED="1310134532679" MODIFIED="1335990788885" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens mind map with Freeplane tutorial
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Documentation" ID="ID_604224444" CREATED="1271855545007" MODIFIED="1311402584122" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens the main help file in read-only modus.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="Documentation Maps Online" ID="ID_566454554" CREATED="1323898504458" MODIFIED="1335990840601" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Opens documentation from Internet. This gives the most recent information.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font size="1">Note</font></b>
+ </p>
+ <p>
+ <font size="1">It is possible to link to this documentation through URL: http://</font><font size="1" face="Times New Roman,serif">freeplane.sourceforge.net/doc/1.2.x/freeplane.mm. </font>
+ </p>
+ <p>
+ <font size="1" face="Times New Roman,serif">To link to the FAQ node: </font><font size="1">http://</font><font size="1" face="Times New Roman,serif">freeplane.sourceforge.net/doc/1.2.x/freeplane.mm#</font><font size="1" face="Calibri,sans-serif"> ID_1040911735</font><font size="1"> </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font size="1">In the same way it is possible to link to the online tutorial: http://</font><font size="1" face="Times New Roman,serif">freeplane.sourceforge.net/doc/1.2.x/freeplaneTutorial.mm</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Key reference" ID="ID_711310932" CREATED="1330601996542" MODIFIED="1330602039803" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Overview of hot keys / short cuts
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Scripting API" ID="ID_1515623567" CREATED="1303933416063" MODIFIED="1336551200257" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Mind map with links to functions which can be called from a script
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneApplications.mm b/freeplane/doc/freeplaneApplications.mm
new file mode 100644
index 0000000..4d35a2e
--- /dev/null
+++ b/freeplane/doc/freeplaneApplications.mm
@@ -0,0 +1,534 @@
+<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
new file mode 100644
index 0000000..aaddac7
--- /dev/null
+++ b/freeplane/doc/freeplaneApplications_ja.mm
@@ -0,0 +1,540 @@
+<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
new file mode 100644
index 0000000..649811c
--- /dev/null
+++ b/freeplane/doc/freeplaneApplications_nl.mm
@@ -0,0 +1,540 @@
+<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
new file mode 100644
index 0000000..eec01b0
--- /dev/null
+++ b/freeplane/doc/freeplaneFunctions.mm
@@ -0,0 +1,1539 @@
+<map version="freeplane 1.2.0">
+<!--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">
+<icon BUILTIN="bee"/>
+<font BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties 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">
+<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 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 TEXT="Reference">
+<icon BUILTIN="help"/>
+<edge STYLE="hide_edge"/>
+<font BOLD="true"/>
+<cloud COLOR="#99ffff" SHAPE="ROUND_RECT"/>
+</stylenode>
+<stylenode TEXT="Note" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hover with the cursor over the different texts to unhide links to <b><i><i>Tutorial</i></i></b> and <b><i>Documentation</i></b>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ N.B. This is text is a <b>Note text</b>..
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To switch lthe<b> Note panel</b> on/off:
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <i>View > Notes > Displaly note panel. </i>
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In <b>node core</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1337127972">Basic map</a>
+ </li>
+ <li>
+ <i>Help > Documentation</i> <a href="freeplane.mm#ID_1154882439">Edit > Node core</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#000099" WIDTH="2"/>
+<node ID="ID_1266354824" CREATED="1319799106394" MODIFIED="1334839359981" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <b>Text </b> with <a href="http://www.freeplane.org">in-line</a> hyperlink(s), and:
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_265318117">Edit > Node core text</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1162372089">Edit > Node core > text...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132729252" HGAP="316" VSHIFT="-75" STYLE="bubble"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="Images/doc/freeplaneApplications.png"/>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="http://freeplaneTutorial.mm#ID_1795262306">Image (node core)</a>
+ </li>
+ <li>
+ <i>Help > Documentation</i> <a href="http://freeplane.mm#ID_1277752024">Edit > Node core > Image</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1323786286031" LINK="#ID_784697063" HGAP="21" VSHIFT="-2" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Internal arrow-link (one), or:<br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1830541497">Green arrow link</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_271903009">Edit > Link > Add local hyperlink</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1913035829">Red arrow link</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_178833757">Edit > Link > Add hyperlink</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Icons" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323786415950" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="closed"/>
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_715025500">Icons</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_835126969">Edit > Node core > Icon...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Progress %" ID="ID_1826346574" CREATED="1319793474635" MODIFIED="1323786473670">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_707469329">Progress</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1053622072">Edit > Node core > Progress.</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node TEXT="Automatic node number" ID="ID_1097461051" CREATED="1305277030363" MODIFIED="1323786528270" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1531819965">Automatic node numbering</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node TEXT="Node width" ID="ID_713840726" CREATED="1323095840947" MODIFIED="1323786722366" TEXT_SHORTENED="true">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ See
+ </p>
+ <ul>
+ <li>
+ <a href="freeplaneTutorial.mm#ID_15604512"><i>Tutorial</i></a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Free positionable node" POSITION="left" ID="ID_1280208201" CREATED="1319797134021" MODIFIED="1320074445132" HGAP="140" VSHIFT="19" TEXT_SHORTENED="true">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_128387683">Free (floating) node</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_572207726">Edit > Free positioned node (set/reset)</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ State
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1320076203902" VSHIFT="10" TEXT_SHORTENED="true">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_128387683">Free (floating) node</a>
+ </li>
+ <li>
+ <i>Help > Documentation: </i>Menu <a href="freeplane.mm#ID_114978489">Format > Apply style > Floating node</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Standard Style
+ </p>
+ </body>
+</html>
+</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">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ (double-click free area)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_128387683">Free (floating) node</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_572207726">Edit > Free positioned node (set/reset)</a>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Below node core:</i>
+ </p>
+ <p>
+ <b>Node extensions</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_143196514">Node extensions</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_1400990107">Edit > Node extensions</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<font ITALIC="false"/>
+<attribute NAME="a1" VALUE="value1"/>
+<attribute NAME="a2" VALUE="value2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Text </b> with <a href="http://www.freeplane.org">in-line</a> hyperlink(s), and:
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Node details</b> (text)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_898889730">Edit text in node details</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_742575187">Edit > Node extensions > Edit node detalis in-line/ in dialog</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Can be </i>
+ </p>
+ <p>
+ <i>hidden </i>
+ </p>
+ <p>
+ <i>(<b>tooltip</b>)</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_288274844">Show in tool tip (hover text)</a>
+ </li>
+ <li>
+ <i>Help > Documentation</i> <a href="freeplane.mm#ID_180063018">View > Minimize node</a>
+ </li>
+ <li>
+ <i>Help > Documentation</i> <a href="freeplane.mm#ID_152459666">View > Tool tips > Display tooltips</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Attributes" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1320248348563" HGAP="240" VSHIFT="59">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_1324773677">Attributes in node extensions</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_147715298">Edit > Attributes</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_353026241">View > Attributes</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Scientific <b>formula</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_616494746">Scientific formula</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1750517188">Edit > Node extensions > LaTeX formula</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Sizeable <b>image</b> (one)
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_575269438">Image</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1620391394">Edit > Node extensions > Image?</a>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Drag here </i>
+ </p>
+ <p>
+ <i>to resize</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1812601804">Properties panel,</a> </b> <a href="freeplanefreeplane.mm#ID_1492225657">Edges</a> and <a href="freeplaneTutorial.mm#ID_1005719714">Automatic edge colour</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_881523974">Format > Edge styles/width/colour; automatic edge colour</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<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">
+<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" 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="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="takkleur" ID="ID_939577724" CREATED="1288536788635" MODIFIED="1288542068616">
+<edge COLOR="#ff0066"/>
+</node>
+</node>
+</node>
+</node>
+<node POSITION="right" ID="ID_1125102706" CREATED="1319918074662" MODIFIED="1320001831898" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Below node extensions </i>
+ </p>
+ <p>
+ <i>or in separate window</i>: <b>Note</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_274601394">Note</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1365598976">Edit > Note</a>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_1150908697">Cloud node group</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1759348470">Format > Cloud properties</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1150908697">Cloud node group</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_759607649">View > Add cloud or change style</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="star" ID="ID_1434127019" CREATED="1305277804466" MODIFIED="1319921172289">
+<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1150908697">Cloud node group</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_759607649">View > Add cloud or change style</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Relations" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1330611653263" STYLE="fork" HGAP="-56" VSHIFT="27"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplaneTutorial.mm#ID_448981847"> xx</a>
+ </p>
+ </body>
+</html>
+</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">
+<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">
+<edge STYLE="bezier" WIDTH="thin"/>
+<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323787460834" HGAP="0" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Indicator <b>tool tip</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Indicator <b>Unfold</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This text only
+ </p>
+ <p>
+ appears in
+ </p>
+ <p>
+ <b>tool tip</b>
+ </p>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Connector</b>
+ </p>
+ <p>
+ (bilateral)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_1073407528">Connector</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Edit > Connect</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_1073407528">Connector</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Edit > Connect</a>
+ </li>
+ </ul>
+ </body>
+</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>
+<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1329859481362" HGAP="541" VSHIFT="183"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Connector</b>
+ </p>
+ <p>
+ (unilateral)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > <b> </b></i><b><i>Tutorial</i></b> <a href="freeplaneTutorial.mm#ID_1073407528">Connector</a>
+ </li>
+ <li>
+ <i>Help > Documentation<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Edit > Connect</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1778719162">Formatting and styling</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_39827582">Format > Node core</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1320003893255" STYLE="bubble" VSHIFT="110"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Node core in <b>bubble</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Color" ID="ID_1602479950" CREATED="1288536644733" MODIFIED="1320005140877">
+<node TEXT="Node color" ID="ID_1350125844" CREATED="1288536652401" MODIFIED="1320005085890" COLOR="#ff0066"/>
+<node TEXT="Node background color" ID="ID_113421480" CREATED="1288536658726" MODIFIED="1320005121096" BACKGROUND_COLOR="#00ff00"/>
+<node TEXT="achtergrondkleur mindmap" ID="ID_1843027739" CREATED="1288536750875" MODIFIED="1288542075698"/>
+</node>
+<node TEXT="Font" ID="ID_8536216" CREATED="1270892460659" MODIFIED="1320005168639">
+<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="Blinking" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1320005179849" VSHIFT="-13">
+<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
+</node>
+</node>
+<node TEXT="Special" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1319991650705" VSHIFT="20">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Protect</b> with password
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1232153769">Protecting nodes</a>
+ </li>
+ <li>
+ <i>Help > Documentation: </i>Menu <a href="freeplane.mm#ID_83654353">Tools > Password protection</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_49859005" CREATED="1319800320485" MODIFIED="1320074545705" HGAP="30" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Calculate</b> =3+4
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_448338872">Perform calculation</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Wiki</i> <a href="freeplane.mm#ID_1130453106">Formula evaluation</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="=3 + 4" ID="ID_38981929" CREATED="1319800292281" MODIFIED="1320162604957" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The calculated result
+ </p>
+ <p>
+ does not show if the
+ </p>
+ <p>
+ map is in read only mode !
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1320074842745" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Reminder (<b>Calendar</b>)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="plugins/TimeManagementReminder.xml">
+ <Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1959496513">Date and time actions</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1959496513">Tools > Time management</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Other" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1320075121393" VSHIFT="30">
+<node ID="ID_1987204825" CREATED="1319925023100" MODIFIED="1320075051224" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Filter</b> & S<b>ort</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_828862571">Filtering and finding nodes</a> resp. <a href="freeplaneTutorial.mm#ID_1014457432">Sorting</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1254354349">Filter</a> resp. <a href="freeplane.mm#ID_1942706169">Edit > Move and sort</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_1603681371" CREATED="1319875570304" MODIFIED="1323787030981" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Template</b> & <b>Style</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_1268042238">Template-like information</a> resp. <a href="freeplaneTutorial.mm#ID_1838680824">Styles</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_258919699">Format</a> resp. <a href="freeplane.mm#ID_1796388799">Templates</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Publish & share" ID="ID_671406309" CREATED="1330890243562" MODIFIED="1330891132190"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i><i> <a href="freeplaneTutorial.mm#ID_1613405030">7. Publishing and sharing</a></i>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="freeplane.mm#ID_1111281504">Publish images</a> resp. <a href="freeplane.mm#ID_126764093">Publish on a website or share</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1058310897" CREATED="1319923489096" MODIFIED="1320075051224" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Script</b> & <b>Add-on</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_519455593">Writing and using scripts</a> resp. <a href="freeplaneTutorial.mm#ID_1156954596">Add-ons</a>
+ </li>
+ <li>
+ <i>Help > Documentation: Menu</i> <a href="freeplane.mm#ID_1890181858">Tools > Scripts</a> resp. <a href="freeplane.mm#ID_100406395">Tools > Add-ons</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_739070756" CREATED="1319915355170" MODIFIED="1320075051224" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Spell check</b> & Academic Writing suite
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="freeplaneTutorial.mm#ID_141336344">Spelling dictionaries</a> resp. <a href="freeplaneTutorial.mm#ID_170927482">Academic writing suite</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+<node TEXT="Summary node
(accolade)" POSITION="left" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1323786930205" HGAP="40">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > </i><i>Tutorial</i> <a href="http://freeplaneTutorial.mm#ID_651594550">Summary node group</a>
+ </li>
+ <li>
+ <i>Help > Documentation:</i> <a href="http://freeplane.mm#ID_1700918771">Edit > Node group > New summary node group (selected nodes)</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#ff00ff" WIDTH="3"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneFunctions_ja.mm b/freeplane/doc/freeplaneFunctions_ja.mm
new file mode 100644
index 0000000..4d25ba3
--- /dev/null
+++ b/freeplane/doc/freeplaneFunctions_ja.mm
@@ -0,0 +1,1516 @@
+<map version="freeplane 1.2.0">
+<!--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">
+<icon BUILTIN="bee"/>
+<font BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties 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">
+<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 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 TEXT="Reference">
+<icon BUILTIN="help"/>
+<edge STYLE="hide_edge"/>
+<font BOLD="true"/>
+<cloud COLOR="#99ffff" SHAPE="ROUND_RECT"/>
+</stylenode>
+<stylenode TEXT="Note" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>チュートリアル</b>や<b>マニュアル</b>へのリンクを表示させるには、それぞれのテキスト上でカーソルをホバーリング[カーソルを置いた状態でしばらく待つこと]させてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このテキストは<b>ノートテキスト</b>です。
+ </li>
+ <li>
+ <b>ノートパネル</b>の表示/非表示の切り替えは、<i>「表示 > ノート > ノートパネルを表示」</i>を実行。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node POSITION="left" ID="ID_1556354626" HGAP="1" VSHIFT="-32" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードコアの機能</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」:</i> <a href="freeplaneTutorial_ja.mm#ID_1337127972">基本マップ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」:</i> <a href="freeplane_ja.mm#ID_1154882439">編集 > ノードコア</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#000099" WIDTH="2"/>
+<node ID="ID_1266354824" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: left">
+ <a href="http://www.freeplane.org">インライン</a> ハイパーリンク機能付き(複数可)テキスト、及び
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_265318117">編集> ノードコアテキスト</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:メニュー <a href="freeplane_ja.mm#ID_1162372089">編集 > ノードコア関連 >テキスト...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node ID="ID_1519332680" LINK="#ID_784697063" HGAP="21" VSHIFT="-2" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 矢印型リンク-同一マップ内向け(1つ)、又は<br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_1830541497">緑の矢印型リンク</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>: <i>メニュー</i> <a href="freeplane_ja.mm#ID_271903009">編集 >リンク > ローカルリンクを付加</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="矢印型リンク-外部オブジェクト向け(1つ)、及び" ID="ID_1537075496" LINK="http://kioo.nl/" HGAP="21" VSHIFT="-3" TEXT_SHORTENED="true">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_1830541497">赤の矢印型リンク</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>: メニュー<i> </i> <a href="freeplane_ja.mm#ID_178833757">編集 > リンク > ハイパーリンクを付加</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="アイコン(複数可)" ID="ID_233656995" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="closed"/>
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_715025500">アイコン</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<i> メニュー</i> <a href="freeplane_ja.mm#ID_835126969">編集 > ノードコア関連 > アイコン...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_300419503" HGAP="296" VSHIFT="-3" STYLE="bubble"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="Images/doc/freeplaneApplications.png"/>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="http://freeplaneTutorial_ja.mm#ID_1795262306">画像(ノードコア)</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>: <a href="http://freeplane_ja.mm#ID_1277752024">編集> ノードコア関連 > 画像</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="進捗度表示 %" ID="ID_1826346574" TEXT_SHORTENED="true">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_707469329">進捗度</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<i> メニュー</i> <a href="freeplane_ja.mm#ID_1053622072">編集 > ノードコア関連 > 進捗度</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node TEXT="自動振り付けノード番号" ID="ID_1097461051" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_1531819965">ノードへの自動番号振り</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node TEXT="ノードの表示幅" ID="ID_713840726" TEXT_SHORTENED="true">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i><a href="freeplaneTutorial_ja.mm#ID_15604512">チュートリアル</a></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="フリーポジションノード" FOLDED="true" POSITION="left" ID="ID_1280208201" HGAP="140" VSHIFT="19" TEXT_SHORTENED="true">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_128387683">フリー(フローティング)ノード</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_572207726">編集 > フリーポジションノードに指定/解除</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 状態
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="フローティングノード" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" VSHIFT="10" TEXT_SHORTENED="true">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_128387683">フリー(フローティング)ノード</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:メニュー <a href="freeplane_ja.mm#ID_114978489">書式t > スタイルを適用 > フローティングノード</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準スタイル
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="フリー + フローティング ノード" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" HGAP="427" VSHIFT="63" TEXT_SHORTENED="true">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ (空白部分でダブルクリックして作成)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_128387683">フリー(フローティング)ノード</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_572207726">編集 > フリーポジションノードに指定/解除</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node POSITION="right" ID="ID_1077719150" VGAP="0" HGAP="-10" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノード拡張情報 </b>
+ </p>
+ <p>
+ (ノードコアの下)
+ </p>
+ <p>
+ <b> の機能</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><i>参 照</i></b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_143196514">ノード拡張情報</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>: <a href="freeplane_ja.mm#ID_1400990107">編集 > ノード拡張情報</a>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b>チュートリアル</b>」</i>:<b><a href="freeplaneTutorial_ja.mm#ID_1812601804">Pプロパティパネル</a>、</b><a href="freeplanefreeplane_ja.mm#ID_1492225657">線(エッジ)</a> 及び<a href="freeplaneTutorial_ja.mm#ID_1005719714">A線の色を自動選択</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b><i> </i>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_881523974">書式t > 線の形状/太さ/色;線の色を自動選択</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<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">
+<edge WIDTH="2"/>
+</node>
+<node TEXT="8ポイント" ID="ID_1828139471" HGAP="42" VSHIFT="5">
+<edge WIDTH="8"/>
+</node>
+</node>
+<node TEXT="線の形状" ID="ID_784697063" HGAP="21" VSHIFT="1">
+<node TEXT="直線" ID="ID_884692926" HGAP="53" VSHIFT="-1">
+<edge STYLE="linear" WIDTH="4"/>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="曲線" ID="ID_609820168" HGAP="57" VSHIFT="9">
+<edge STYLE="bezier" WIDTH="4"/>
+</node>
+<node TEXT="先細直線" ID="ID_1647821228" HGAP="60" VSHIFT="10">
+<edge STYLE="sharp_linear" WIDTH="4"/>
+</node>
+<node TEXT="先細曲線" ID="ID_895403951" HGAP="70" VSHIFT="15">
+<edge STYLE="sharp_bezier" WIDTH="4"/>
+</node>
+<node TEXT="線を隠す" ID="ID_1675552701" HGAP="77" VSHIFT="18" BACKGROUND_COLOR="#00ffff">
+<edge STYLE="hide_edge" WIDTH="4"/>
+</node>
+</node>
+<node TEXT="線の色" ID="ID_939577724">
+<edge COLOR="#ff0066"/>
+</node>
+</node>
+</node>
+<node TEXT="このノードコアの下方を参照:" ID="ID_1010722858" STYLE="bubble" VGAP="0" HGAP="16" VSHIFT="-1">
+<font ITALIC="false"/>
+<attribute NAME="a1" VALUE="value1"/>
+<attribute NAME="a2" VALUE="value2"/>
+<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"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="http://www.freeplane.org">インライン</a> ハイパーリンク
+ </p>
+ <p>
+ 機能付き(複数可)<b>テキスト</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node STYLE_REF="Reference" ID="ID_965583686" HGAP="238" VSHIFT="-1"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードの詳細</b> (テキスト)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_898889730">ノードの詳細のテキスト編集</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_742575187">編集 > ノード拡張情報 >ノードの詳細をインライン/ダイアログ編集</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>非表示に </i>
+ </p>
+ <p>
+ <i>できます。</i>
+ </p>
+ <p>
+ <i>(ツールチップ)</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_288274844">ツールチップ表示(ホバーテキスト)</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>: <a href="freeplane_ja.mm#ID_180063018">表示 > ノードを短縮表示</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_152459666">表示 > ツールチップ > ツールチップを表示</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属 性" STYLE_REF="Reference" ID="ID_1546010515" HGAP="240" VSHIFT="67">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_1324773677">ノード拡張情報の属性</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_147715298">編集 > 属性</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_353026241">表示> 属性</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 科学<b>算式</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_616494746">科学算式</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」:</i><b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_1750517188">編集 > ノード拡張情報 > LaTeX 数式</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 拡大/縮小可能な<b>画像</b> (単一)
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル」</b></i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_575269438">画 像</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_1620391394">編集 > ノード拡張情報 > 画像?</a>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>サイズ変更は、ここ </i>
+ </p>
+ <p>
+ <i>をドラッグします。</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>(拡張情報の下方、又は
+ </p>
+ <p>
+ 独立ウィンドウ表示)<b>の機能</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_274601394">ノート</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:メニュー <a href="freeplane_ja.mm#ID_1365598976">編集 > ノート</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="雲" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" HGAP="522" VSHIFT="91"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_1150908697">雲によるノードグループ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」:</i><b>メニュー</b><i> </i> <a href="freeplane_ja.mm#ID_1759348470">書式 > 雲のプロパティ</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_1150908697">雲囲いノードグループ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_759607649">書式 > 雲を付加 or 形を変更</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="トゲトゲ" ID="ID_1434127019">
+<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b> チュートリアル</b>」</i><b>:</b> <a href="freeplaneTutorial_ja.mm#ID_1150908697">雲囲いノードグループ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_759607649">書式 > 雲を付加 or 形を変更</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="関係付け" POSITION="right" ID="ID_441663322" STYLE="fork" HGAP="-56" VSHIFT="27"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplaneTutorial_ja.mm#ID_448981847"> xx</a>
+ </p>
+ </body>
+</html>
+</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">
+<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">
+<edge STYLE="bezier" WIDTH="thin"/>
+<node ID="ID_1947425814" HGAP="0" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ツールチップ </b>
+ </p>
+ <p>
+ <b>表示可能</b>の印
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>折り畳み中</b>の印
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このテキストは、
+ </p>
+ <p>
+ <b>ツールチップ</b>にし
+ </p>
+ <p>
+ か表示されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="etc." ID="ID_1829616131"/>
+</node>
+<node TEXT="コネクタ
(2ノード間)" STYLE_REF="Reference" ID="ID_389809087" HGAP="140" VSHIFT="79"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b>チュートリアル</b>」</i>:<a href="freeplaneTutorial_ja.mm#ID_1073407528">コネクタ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュ</b>ー<i> </i> <a href="freeplane_ja.mm#ID_1803275985">編集 > コネクタを付加</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b>チュートリアル</b>」</i>:<a href="freeplaneTutorial_ja.mm#ID_1073407528">コネクタ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュ</b>ー<i> </i> <a href="freeplane_ja.mm#ID_1803275985">編集 > コネクタを付加</a>
+ </li>
+ </ul>
+ </body>
+</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>
+<node TEXT="コネクタ
(相方ノード無し)" STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" HGAP="541" VSHIFT="183">
+<hook NAME="FreeNode"/>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > <b>チュートリアル</b>」</i>:<a href="freeplaneTutorial_ja.mm#ID_1073407528">コネクタ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュ</b>ー<i> </i> <a href="freeplane_ja.mm#ID_1803275985">編集 > コネクタを付加</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_1778719162">書式とスタイル</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_39827582">書式 > ノードコア関係</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_549836127" STYLE="bubble" VSHIFT="110"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>囲み</b>表示のノードコア
+ </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>
+<node TEXT="フォント" ID="ID_609278590">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Times New Roman" ID="ID_634001381">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node TEXT="Verdana" ID="ID_595317478">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node TEXT="Dialog font" ID="ID_365055995">
+<font NAME="Dialog" SIZE="21"/>
+</node>
+</node>
+<node TEXT="点滅" ID="ID_381735248" VSHIFT="-13">
+<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
+</node>
+</node>
+<node TEXT="特殊機能" POSITION="left" ID="ID_206364326" VSHIFT="20">
+<hook NAME="FirstGroupNode"/>
+<node ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" TEXT_SHORTENED="true" HGAP="30"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ パスワードを使った<b>データ保護</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_1232153769">ノードを保護</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b> <a href="freeplane_ja.mm#ID_83654353">ツール >パスワードで保護</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_49859005" HGAP="30" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>計算</b> =3+4
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_448338872">計算を実行</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:Wiki <a href="freeplane_ja.mm#ID_1130453106">計算を実行</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="=3 + 4" ID="ID_38981929" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ閲覧モード
+ </p>
+ <p>
+ では、計算結果は
+ </p>
+ <p>
+ 表示されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node ID="ID_1885496887" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リマインダ(<b>カレンダ</b>)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="plugins/TimeManagementReminder.xml">
+ <Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_1959496513">日付・時刻関連</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b> <a href="freeplane_ja.mm#ID_1959496513">ツール > 時間管理</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="その他の機能" POSITION="left" ID="ID_454770946" VSHIFT="30">
+<node ID="ID_1987204825" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>フィルタ</b>と<b>並べ替え</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_828862571">ノードのフィルタと検索</a>。<a href="freeplaneTutorial_ja.mm#ID_1014457432">並べ替え</a> にも留意。
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b> <a href="freeplane_ja.mm#ID_1254354349">フィルタ</a> 。<a href="freeplane_ja.mm#ID_1942706169">編集 > 移動と並べ替え</a> にも留意。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_1603681371" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>テンプレート</b>と<b>スタイル</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_1268042238">テンプレート型情報</a>。<a href="freeplaneTutorial_ja.mm#ID_1838680824">スタイル</a><b> </b>に留意。
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b><a href="freeplane_ja.mm#ID_258919699">書式</a> 。<a href="freeplane_ja.mm#ID_1796388799">テンプレート</a><b> </b>に留意。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="マップの公開とシェア" ID="ID_671406309"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<i><a href="freeplaneTutorial_ja.mm#ID_1613405030">7. マップの公表とシェア</a></i>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="freeplane_ja.mm#ID_1111281504">画像の公表</a> 。<a href="freeplane_ja.mm#ID_126764093">ウェブ上での公表やシェア</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1058310897" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>スクリプト</b>と<b>アドオン</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>: <a href="freeplaneTutorial_ja.mm#ID_519455593">スクリプトの作成と使用</a>。<a href="freeplaneTutorial_ja.mm#ID_1156954596">アドオン</a> にも留意。
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<b>メニュー</b> <a href="freeplane_ja.mm#ID_1890181858">ツール > スクリプト</a> 。<a href="freeplane_ja.mm#ID_100406395">ツール > アドオン</a> にも留意。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_739070756" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>スペルチェック</b>とアカデミック
+ </p>
+ <p>
+ ライティング・パッケージ
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="freeplaneTutorial_ja.mm#ID_141336344">スペルチェック用辞書</a>。<a href="freeplaneTutorial_ja.mm#ID_170927482">A科学論文執筆パッケージ</a> にも留意。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+<node TEXT="まとめノード
(波括弧)" POSITION="left" ID="ID_499898058" HGAP="40">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > チュートリアル」</i>:<a href="http://freeplaneTutorial_ja.mm#ID_651594550">まとめノードグループ</a>
+ </li>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>:<a href="http://freeplane_ja.mm#ID_1700918771">編集 > ノードグループ > 新規まとめノード(選択ノード群</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#ff00ff" WIDTH="3"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneFunctions_nl.mm b/freeplane/doc/freeplaneFunctions_nl.mm
new file mode 100644
index 0000000..815822b
--- /dev/null
+++ b/freeplane/doc/freeplaneFunctions_nl.mm
@@ -0,0 +1,1390 @@
+<map version="freeplane 1.2.0">
+<!--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">
+<icon BUILTIN="bee"/>
+<font BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties 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">
+<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 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 TEXT="Reference">
+<icon BUILTIN="help"/>
+<edge STYLE="hide_edge"/>
+<font BOLD="true"/>
+<cloud COLOR="#99ffff" SHAPE="ROUND_RECT"/>
+</stylenode>
+<stylenode TEXT="Note" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Beweeg met de cursor over de teksten om hyperlinks zichtbaar te maken naar de <b><i>Handleiding</i></b> en de <i><b>Documentatie</b></i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ N.B. Dit is een <b>Notitie tekst</b>..
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om het notitiepaneel aan/uit te schakeln:
+ </p>
+ <ul>
+ <li>
+ <i>Beeld > Notities > Toon notitievenster. </i>
+ </li>
+ </ul>
+ </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">
+<font BOLD="false"/>
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>See</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1337127972">Basis mindmap</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_1154882439">Bewerken > Knoopkern</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#000099" WIDTH="2"/>
+<node ID="ID_1266354824" CREATED="1319799106394" MODIFIED="1321029393560" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <b>Tekst </b> met <a href="http://www.freeplane.org">onderstreepte hyperlink(s)</a>, en:
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_268413071">Bewerken > Knoopkern tekst</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1162372089">Bewerken > Knoopkern > tekst...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132643156" HGAP="363" VSHIFT="-71" STYLE="bubble"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="Images/doc/freeplaneApplications.png"/>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1795262306">Afbeelding (knoopkern)</a>
+ </li>
+ <li>
+ <i>Help > Documentatie</i> <a href="freeplane.mm#ID_1277752024">Bewerken > Knoopkern > Afbeelding</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1830541497">Groene-pijl koppeling</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_271903009">Bewerken > Koppeling </a>
+ </li>
+ </ul>
+ </body>
+</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">
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1913035829">Rode-pijlkoppeling</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_178833757">Bewerken > Koppeling</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Pictogrammen" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323788954544" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="closed"/>
+<edge STYLE="horizontal" WIDTH="thin"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_715025500">Pictogrammen</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_835126969">Bewerken > Knoopkern > Pictogram...</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="% Schijf" ID="ID_1826346574" CREATED="1319793474635" MODIFIED="1323788989785">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_707469329">% Schijf</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1053622072">Bewerken > Knoopkern > %Schijf.</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal" WIDTH="thin"/>
+</node>
+<node TEXT="Automatisch knoopnummer" ID="ID_1097461051" CREATED="1305277030363" MODIFIED="1323789027334" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1531819965">Automatische knoopnummering</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1401167294">Vrije (zwevende) knoop</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_572207726">Bewerken > Vrij positioneerbare knoop(set/reset)</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Toestand
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Zwevende knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1323789155332" VSHIFT="10" TEXT_SHORTENED="true">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1401167294">Vrije (zwevende) knoop</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: </i>Menu <a href="freeplane.mm#ID_114978489">Format > Toepassen stijl > Zwevende knoop</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Standard Style
+ </p>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Onder de knoopkern:</i>
+ </p>
+ <p>
+ <b>Knoopuitbreidingen</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_143196514">Knoopuitbreiding</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_1400990107">Bewerken > Knoopuitbreiding</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<font ITALIC="false"/>
+<attribute NAME="a1" VALUE="waarde 1"/>
+<attribute NAME="a2" VALUE="waarde 2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Tekst </b>met <a href="http://www.freeplane.org">onderstreepte hyperlink(s)</a>, en:
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Knoopdetails</b> (tekst)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i><b></b> <a href="freeplaneTutorial_nl.mm#ID_898889730">Bewerken text in knoopdetails</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_742575187">Bewerken > Knoopuitbreiding > Bewerken knoopdetails in-line/ in venster</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Kan verborgen </i>
+ </p>
+ <p>
+ <i>zijn (<b>tooltip</b>)</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_288274844">Toon in tooltip (zweeftekst)</a>
+ </li>
+ <li>
+ <i>Help > Documentation</i> <a href="freeplane.mm#ID_180063018">Beeld > Minimaliseren knoop</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_152459666">View > Tooltips > Tonen tooltips</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Attributen" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1321038090373" HGAP="260" VSHIFT="59">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i> <a href="freeplaneTutorial_nl.mm#ID_1324773677">Attributen in knoopuitbreiding</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_147715298">Bewerken > Attributen</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_353026241">Beeld > Attributen</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wetenschappelijke <b>formule</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i><b></b> <a href="freeplaneTutorial_nl.mm#ID_616494746">Wetenschappelijke formule</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1750517188">Bewerken > Knoopuitbreiding > LaTeX formule</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Schaalbaar <b>plaatje</b> (één)
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i> <a href="freeplaneTutorial_nl.mm#ID_575269438">Afbeelding</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1620391394">Bewerken > Knoopuitbreiding > Afbeelding</a>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Stel hier </i>
+ </p>
+ <p>
+ <i>grootte in</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i><b> <a href="freeplaneTutorial_nl.mm#ID_1812601804">Opmaakpaneel,</a> </b> <a href="freeplaneTutorial#ID_1492225657">Takken</a> and <a href="freeplaneTutorial_nl.mm#ID_1005719714">Automatische takkleur</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: <b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_881523974">Opmaak > Takstijl/dikte/kleur; automatische takkleur</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<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">
+<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" 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="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="takkleur" ID="ID_939577724" CREATED="1288536788635" MODIFIED="1288542068616">
+<edge COLOR="#ff0066"/>
+</node>
+</node>
+</node>
+</node>
+<node POSITION="right" ID="ID_1125102706" CREATED="1319918074662" MODIFIED="1321011244096" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Onder knoopuitbreidingen </i>
+ </p>
+ <p>
+ <i>of in apart vester: </i><b>Notitie</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_274601394">Note</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1365598976">Bewerken > Note</a>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i> <a href="freeplaneTutorial_nl.mm#ID_1150908697">Groep knopen binnen een wolk</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1759348470">Opmaken > Wolkeigenschappen</a>
+ </li>
+ </ul>
+ </body>
+</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">
+<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1150908697">Cloud node group</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_759607649">View > Toevoegen wolk of veranderen stijl</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ster" ID="ID_1434127019" CREATED="1305277804466" MODIFIED="1321038476333">
+<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1150908697">Knoopgroep wolk</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_759607649">View > Toevoegen wolk of veranderen stijl</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Relaties" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1321011073861" STYLE="fork" HGAP="-41" VSHIFT="37"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplaneTutorial_nl.mm#ID_448981847"> xx</a>
+ </p>
+ </body>
+</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">
+<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">
+<edge STYLE="bezier" WIDTH="thin"/>
+<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323790434784" HGAP="5" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Indicator <b>tool tip</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+<icon BUILTIN="yes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Indicator <b>Openvouwen</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This text only
+ </p>
+ <p>
+ appears in
+ </p>
+ <p>
+ <b>tool tip</b>
+ </p>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Verbinding</b>
+ </p>
+ <p>
+ (bilateraal)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i> <a href="freeplaneTutorial_nl.mm#ID_1073407528">Verbindingslijn</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Bewerken > Toevoegen verbindingslijn</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i> <a href="freeplaneTutorial_nl.mm#ID_1073407528">Verbinding</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Bewerken > Toevoegen verbindingslijn</a>
+ </li>
+ </ul>
+ </body>
+</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>
+<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1321010997120" HGAP="524" VSHIFT="189"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Verbindingslijn</b>
+ </p>
+ <p>
+ (unilateraal)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<font BOLD="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding:<b> </b></i><b></b> <a href="freeplaneTutorial_nl.mm#ID_1073407528">Verbinding</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:<b> </b></i><b>Menu</b><i> </i> <a href="freeplane.mm#ID_1803275985">Bewerken > Verbindt</a>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1778719162">Opmaken en stylen</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_39827582">Opmaken > Knoopkern</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Omlijnde knoopkern" ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1321037674632" STYLE="bubble" VSHIFT="110"/>
+<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"/>
+<node TEXT="achtergrondkleur mindmap" ID="ID_1843027739" CREATED="1288536750875" MODIFIED="1288542075698"/>
+</node>
+<node TEXT="Lettertype" ID="ID_8536216" CREATED="1270892460659" MODIFIED="1321037788341">
+<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="Knipperen" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1321037796874" VSHIFT="-13">
+<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">
+<hook NAME="FreeNode"/>
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ (double-click free area)
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1401167294">Free (floating) node</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_572207726">Bewerken > Vrij postitioneerbare knoop</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Speciaal" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1321009985956" VSHIFT="20">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1232153769">Beveiligen knoop</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: </i>Menu <a href="freeplane.mm#ID_83654353">Extra > Knoopbeveiliging</a>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_448338872">Berekeningen uitvoeren</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Wiki</i> <a href="freeplane.mm#ID_1130453106">Formule evalueren</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="=3 + 4" ID="ID_38981929" CREATED="1319800292281" MODIFIED="1320162604957" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The calculated result
+ </p>
+ <p>
+ does not show if the
+ </p>
+ <p>
+ map is in read only mode !
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Herinnering (Agenda)" ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1321035618625" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true">
+<hook NAME="plugins/TimeManagementReminder.xml">
+ <Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
+</hook>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1959496513">Datum en tijdacties</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1959496513"> Extra > Agenda</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Overig" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1321011282877" HGAP="10" VSHIFT="30">
+<node TEXT="Filter en sorteer" ID="ID_1987204825" CREATED="1319925023100" MODIFIED="1321035763908" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_828862571">Filteren en zoeken</a> resp. <a href="freeplaneTutorial_nl.mm#ID_1014457432">Knopen sorteren</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1254354349">Filter</a> resp. <a href="freeplane.mm#ID_1942706169">Bewerken > Verplaatsen en sorteren</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Formaat & stijl" ID="ID_1603681371" CREATED="1319875570304" MODIFIED="1323790015455" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_183210534">Sjablonen</a> resp. <a href="freeplaneTutorial_nl.mm#ID_1724703419">Stijlen</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_258919699">Opmaken</a> resp. <a href="freeplane.mm#ID_1796388799">Sjablonen</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_1058310897" CREATED="1319923489096" MODIFIED="1321036106672" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Script</b> & <b>Add-on</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_519455593">Gebruiken en maken van een script</a> resp. <a href="freeplaneTutorial_nl.mm#ID_1156954596">Add-on</a>
+ </li>
+ <li>
+ <i>Help > Documentatie: Menu</i> <a href="freeplane.mm#ID_1890181858">Tools > Scripts</a> resp. <a href="freeplane.mm#ID_100406395">Tools > Add-ons</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node ID="ID_739070756" CREATED="1319915355170" MODIFIED="1321037295491" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Spellingscontrole </b> & Academische schrijver suite
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i><a href="freeplaneTutorial_nl.mm#ID_141336344">Woordenlijsten voor spellingcontrole</a> resp. <a href="freeplaneTutorial_nl.mm#ID_170927482">Academische schrijvers suite</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+<node TEXT="Groepsknoop
met accollade" POSITION="left" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1321037578474" HGAP="40">
+<font BOLD="true"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Zie</b>
+ </p>
+ <ul>
+ <li>
+ <i>Help > Handleiding: </i> <a href="freeplaneTutorial_nl.mm#ID_1700918771">Groepsknoop met accollade</a>
+ </li>
+ <li>
+ <i>Help > Documentatie:</i> <a href="freeplane.mm#ID_1700918771">Bewerken > Knoopgroep > Nieuwe groepsknoop (geselecteerde knopen)</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#ff00ff" WIDTH="3"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneTutorial.jpg b/freeplane/doc/freeplaneTutorial.jpg
new file mode 100644
index 0000000..e90c9b1
Binary files /dev/null and b/freeplane/doc/freeplaneTutorial.jpg differ
diff --git a/freeplane/doc/freeplaneTutorial.mm b/freeplane/doc/freeplaneTutorial.mm
new file mode 100644
index 0000000..b30ddc2
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial.mm
@@ -0,0 +1,5526 @@
+<map version="freeplane 1.2.0">
+<!--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" CREATED="1283093380553" MODIFIED="1334247734742" BACKGROUND_COLOR="#00ff66">
+<icon BUILTIN="bee"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Tutorial </b>
+ </p>
+ <p>
+ <b>Freeplane 1.2</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="MapStyle">
+ <conditional_styles>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <conjunct_condition user_name="Example">
+ <time_condition_modified_after DATE="1335514983501"/>
+ <time_condition_modified_before DATE="1335515403501"/>
+ </conjunct_condition>
+ </conditional_style>
+ </conditional_styles>
+ <properties 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="defaultstyle.details">
+<font SIZE="8"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="default" FORMAT_AS_HYPERLINK="true">
+<edge COLOR="#808080" WIDTH="thin"/>
+<font SIZE="8"/>
+</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="AutomaticLayout.level.root" COLOR="#000000">
+<font SIZE="12"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
+<font SIZE="12"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode TEXT="Beginner" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Advanced" COLOR="#000000" BACKGROUND_COLOR="#ffff00" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Professional" BACKGROUND_COLOR="#ff9900" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="TitlesContent" STYLE="fork">
+<edge STYLE="hide_edge"/>
+</stylenode>
+<stylenode TEXT="Example">
+<icon BUILTIN="../AttributesView"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Revision">
+<icon BUILTIN="revision"/>
+</stylenode>
+<stylenode TEXT="MyTemplate">
+<icon BUILTIN="females"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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="Method" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.topic" POSITION="right" COLOR="#18898b" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subtopic" POSITION="right" COLOR="#cc3300" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subsubtopic" POSITION="right" COLOR="#669900">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.important" POSITION="right">
+<icon BUILTIN="yes"/>
+</stylenode>
+</stylenode>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <font size="3"><a href="freeplaneFunctions.mm"><b>Functions index</b></a></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click the link to open a mind map with the main functions of Freeplane. Hover the text to reveal hidden links to the descriptions of the functions you see in this <i>Quick reference</i> and in <i>Help > Documentation. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ To return from the index map to this map: select <i>Navigate >Go to previous map </i>(icon in tool bar)
+ </li>
+ </ul>
+ </body>
+</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="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">
+
+<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/Tutorial_Freeplane">Wiki Tutorial Freeplane</a> contains concrete examples of <a href="freeplaneApplications.mm">application areas.</a>
+ </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">
+
+<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 sections are color coded, with the following meaning:<br/>
+ </p>
+ <ol>
+ <li>
+ <b>Beginner</b> (lighter-blue/green): You learn basic elements which could be used for simple but productive tasks like taking notes and brainstorming.
+ </li>
+ <li>
+ <b>Advanced</b> (yellow): You learn additional elements which could be used for better organizing information and better communicating meaning.
+ </li>
+ <li>
+ <b>Professional</b> (orange/brown): You learn about setting preferences and using production and technical tools.
+ </li>
+ </ol>
+ <p>
+ <b><font color="#ff0000">IMPORTANT</font></b><font color="#ff0000"> </font>
+ </p>
+ <p>
+ <font color="#ff0000">Check <a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29">here</a> if there exists a language pack add-on for your language. </font>
+ </p>
+ <p>
+ <font color="#ff0000">Check <i>Help > Documentation Maps Online</i> if video guides are available.</font>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Right-click in free place of background
+ </p>
+ </body>
+</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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Shot cuts</i> or <i>hot keys </i>for most functions.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Hot keys table" ID="ID_1337797684" CREATED="1333278113064" MODIFIED="1341130885855" HGAP="-76" VSHIFT="190">
+<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">
+<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">
+
+<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"/>
+</hook>
+</node>
+</node>
+<node TEXT="Family relations" STYLE_REF="Beginner" FOLDED="true" ID="ID_1971514033" CREATED="1314122290117" MODIFIED="1335300198085" TEXT_SHORTENED="true">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All nodes are connected through lines called <b>edges.</b> The line you see at the left is an
+ </p>
+ <p>
+ edge. Aseries of connected nodes are similar to branches of a <b>tree</b>. All trees begin in
+ </p>
+ <p>
+ the root node. Together these branches form a family descendancy. Nodes closer to
+ </p>
+ <p>
+ the root are called (grand)<b>parents</b> of nodes further away called (grand)<b>children</b>.
+ </p>
+ <p>
+ 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
+ </p>
+ <p>
+ to this rule is the so-called<b> free node</b> which can be positioned independently of all other
+ </p>
+ <p>
+ nodes.
+ </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">
+<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"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Folding nodes" STYLE_REF="Beginner" FOLDED="true" ID="ID_1338867820" CREATED="1314122456335" MODIFIED="1335300198085">
+<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">
+
+<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 following node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Exceptions</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ Clicking the circle with +/- folds/unfolds immediately; clicking elsewhere in the node core folds with a short delay.
+ </p>
+ </li>
+ <li>
+ It is possible to keep a node from folding by setting <i>Edit > Node Group > Always unfolded node (set/unset)</i>. This can be useful in cloud groups.
+ </li>
+ <li>
+ If a node being folded has a connector to one of its hidden children. a line (and possibly a label) is visible which can be right-clicked to open the context menu and jump to the connected node..
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Unfold one level" STYLE_REF="ConsumerTopic" ID="ID_321295556" CREATED="1310134532663" MODIFIED="1323465426246" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../unfold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Progressively unfolds the descendants of the selected node. Clicking once unfolds the children, clicking again unfolds the grandchildren, etc.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Fold one level" STYLE_REF="ConsumerTopic" ID="ID_831251421" CREATED="1310134532679" MODIFIED="1323465426246" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Progressively folds the descendants of the selected node, starting at the deepest level in the hierarchy. If four levels exist, clicking once folds the great grandchildren, clicking again folds the grandchildren, clicking again folds the children, etc.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</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">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Unfolds (makes visible) all nodes that are descendants of the selected node, including all children, grandchildren, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Hot key</b>
+ </p>
+ <ul>
+ <li>
+ press <i>Space; or</i>
+ </li>
+ <li>
+ single click on the node; or
+ </li>
+ <li>
+ click icon-button in <i>Toolbar</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Fold all" STYLE_REF="ConsumerTopic" ID="ID_657829947" CREATED="1310134532679" MODIFIED="1323465426246" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Folds (hides) all nodes that are descendants of the selected node, including all children, grandchildren, etc. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Hot key</b>
+ </p>
+ <ul>
+ <li>
+ press <i>Space; or</i>
+ </li>
+ <li>
+ single click on the node; or
+ </li>
+ <li>
+ click icon-button in Toolbar
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Edit > Node group > Always unfolded" STYLE_REF="Method" ID="ID_64183058" CREATED="1337203492981" MODIFIED="1337203523932"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To open a mind map on Internet, this map must first be copied to your local computer. Menu <i>File > Open map from URL </i>does just this.
+ </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">
+<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">
+
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Core text <i>in-line</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="bezier"/>
+<node ID="ID_265318117" CREATED="1323437723250" MODIFIED="1341131023466" HGAP="-95" VSHIFT="150" 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 want to edit an existing node, left-click the node text while keeping <i>Control</i> pressed (META omn MAC OS). It is that simple. You can now easily create a simple map.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b><br/>
+ </p>
+ <ul>
+ <li>
+ To add a new line, press <i>Shift + Enter.</i>
+ </li>
+ <li>
+ If you right-click when editing text, a so called <b>context menu</b> for editing text opens, giving quick access to formatting functions like copy and paste.
+ </li>
+ <li>
+ If you first select a text and then right-click, a <i>Format</i> menu is displayed to make text bold etc. This formatting only applies to the selected text.
+ </li>
+ <li>
+ Editing can be only started using home, end, F2, double click or by starting to type a text
+ </li>
+ </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="New map" STYLE_REF="BeginnerTopic" ID="ID_1310307853" CREATED="1310134532663" MODIFIED="1323726805884" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../filenew"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look up in the toolbar at the top of the screen.
+ </p>
+ </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="Open saved map.." STYLE_REF="BeginnerTopic" ID="ID_1284635316" CREATED="1310134532663" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fileopen"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look up in the toolbar
+ </p>
+ </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="Print map" STYLE_REF="BeginnerTopic" ID="ID_111478060" CREATED="1310134532663" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fileprint"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Opens the dialog box associated with the printer on which the map will print.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Cut" STYLE_REF="BeginnerTopic" ID="ID_353410114" CREATED="1310134532663" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../editcut"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Cuts the node currently selected and all of its children.</span></font>
+ </p>
+ </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="Copy" STYLE_REF="BeginnerTopic" ID="ID_1274800359" CREATED="1310134532663" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../editcopy"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Copies the node selected and all of its children.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Paste" STYLE_REF="BeginnerTopic" ID="ID_1705754282" CREATED="1310134532663" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../editpaste"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Pasts copied text. If the selected node is in edit mode, the text will be added to the contents of the node. If the selected node is not in edit mode, the text will be added as a child node.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="New child node" STYLE_REF="BeginnerTopic" ID="ID_942355748" CREATED="1266249828031" MODIFIED="1323438013786" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../idea"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Creates a new node as a child of the currently-selected node. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>Same effect: </b></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">press key <i>Ins</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Ins> New child node" ID="ID_45308529" CREATED="1316701840462" MODIFIED="1323438013786" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Shift>+<Enter> New line" ID="ID_396169297" CREATED="1316702242678" MODIFIED="1323438013786" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Enter> Finish edit, select node" ID="ID_780427702" CREATED="1316702397734" MODIFIED="1323438013786" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="2*<Enter> New sibling node" ID="ID_420903085" CREATED="1316701822921" MODIFIED="1323438013786" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Right-click: contextmenu" ID="ID_435495519" CREATED="1316724447049" MODIFIED="1323438013802" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" CREATED="1314126040831" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Core text <i>in dialog</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_1433249332" CREATED="1323438495734" MODIFIED="1341131039869" HGAP="-100" VSHIFT="114" 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 available wen performing in-line editing.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ You can also open the edit window in the main menu bar. Choose <i>Edit </i>and then <i>Node core </i>and you will see<i> Edit node core in dialog.</i> In the following we write this procedure as <i>Edit > Node core > Edit node core in dialog</i>.
+ </li>
+ </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="Has menu's of its own" ID="ID_1425310908" CREATED="1316724523734" MODIFIED="1329769343603">
+<edge STYLE="horizontal"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
+</hook>
+</node>
+<node TEXT="<Enter>: New line" ID="ID_1043315983" CREATED="1316724531504" MODIFIED="1329769358251">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Right-click: contextmenu" ID="ID_1846126640" CREATED="1316724447049" MODIFIED="1323438577431">
+<edge STYLE="horizontal"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Save the map you just made by pressing the floppy-disk icon in the menu bar (work menu) above, or choose menu <i>File > Save map</i>. Thereafter you can open another map with the map-icon or <i>File > Open saved map</i>.
+ </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="Save map" STYLE_REF="BeginnerTopic" ID="ID_1253878525" CREATED="1310134532663" MODIFIED="1323726957514" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesave"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look in the toolbar for the icon button to save the current map.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Save map as..." STYLE_REF="BeginnerTopic" ID="ID_449363060" CREATED="1310134532663" MODIFIED="1323438758087" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesaveas"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look up in the toolbar
+ </p>
+ </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="Close current map" STYLE_REF="BeginnerTopic" ID="ID_1018458898" CREATED="1310134532663" MODIFIED="1323438758087" TEXT_SHORTENED="true">
+<icon BUILTIN="../close"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Closes the map that has focus. If multiple maps are open, focus refers to the tab that you are currently editing.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you keep <i>Control</i> pressed and click at any free place of a mindmap, a so-called free positional, free floating node opens. This node behaves like a paper post-it: you can move it anywhere, independent of the nodes which are part of the root-hierarchy. The format of this node is determined by the system style <i>Floating node</i>. This standard style can be edited, giving all floating nodes this edited style. A post-it node can be conected to a hierarchical node by dragging and dropping it on the node of your choice: it will become a child node of this node. For examples of different types of free floating nodes, see the wiki <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Floating_nodes">Tutorial Freeplane</a>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>The floating nodes with hidden edges are intended for adding meta information to maps like legends, titles, summaries, authors etc. If such informations relates to a whole map, these nodes should have a root node as their parent so that they are always visible and their position does not depend on anything else. Sometimes such information is relevant only for a part of a map. In this case a floating node with hidden edge can be attached to a non root node. For understanding of the context, its parent edge is usually displayed as a dashed line if a node is selected unless its color was set to the map background color. </i>
+ </p>
+ <p>
+ <i>The free nodes do not require that you hide their edges. The second use case for them is a better use of map space. The automatic layout algorithm does not allow any map branches to overlap. If you want to create more compact maps you can convert some nodes to free nodes. This way they can be placed flexible. And their logical position relative to other sibling nodes now depends on their coordinates. You can see it too if you change to outline view which always reflect logical node positions.</i>
+ </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">
+<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">
+
+<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 floating node onto another parent / sibling by usual drag and drop cancels its free positioned status.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ A free node made by clicking a free space of the mind map will be connected to the root node, also if the connecting edge is invisible. This explains why a child node of this free node, if moved onto the upper half of its parent free node, shifts towards the root node.
+ </li>
+ </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">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hover with the cursor over the left side of me and see my blue, filled oval. Drag me around with this blue handle.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Icons" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" CREATED="1323433444639" MODIFIED="1335300258068" STYLE="combined" MIN_WIDTH="80">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="idea"/>
+<node ID="ID_715025500" CREATED="1323437305973" MODIFIED="1335982080280" HGAP="-56" VSHIFT="153" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ An icon is a small picture. Freeplane has a library with icons. There are several menu's to select and an icon:
+ </p>
+ <ol>
+ <li>
+ The bar of icons which is showing at the side of the screen. If it is not showing, select <i>View > Toolbars > Icons toolbar.</i>
+ </li>
+ <li>
+ A table of icons which is displayed when you select <i>Edit > Icons > Icon from table.</i>
+ </li>
+ <li>
+ The structured menu of icons showing when you select <i>Edit > Icons > Icons by category. </i>
+ </li>
+ </ol>
+ <p>
+ 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>
+ </p>
+ <ul>
+ <li>
+ You can add more icons to the same node core.
+ </li>
+ <li>
+ Icons cannot be added to node details or note fields.
+ </li>
+ <li>
+ It is possible to define and add your own icons to the tool bar.
+ </li>
+ </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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ Node extensions for adding a scalable image.
+ </li>
+ </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">
+<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">
+
+<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. This hyperlink appears as a red arrow. After pasting, also the textual path to the image will appear. You can safely erase it or replace it with your own text.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ It is possible to drop an image in stead of a hyperlink-to-an-image by keeping <i>Ctrl</i> pressed while dropping. In this case the image is not in the core, but in node details (resizable image).
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Inline-hyperlinks (underlined hyperlinks). With these it is possible to have multiple links in the text.
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Professional users can add images within text with so-called HTML-code. There is also a script for this. See <i>Help > Documentation</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To add a small progress indicator, select <i>Edit > Core > Progress >Up. </i>To increase the amount of progress, press<i> </i> <i>Edit > Core > Progress >Up </i>again (repeatedly).
+ </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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ Two images are displayed. The smaller one is a pictogram which is being displayed in the node core. The larger picture is an image displayed in node details.
+ </li>
+ <li>
+ <b>IMPORTANT</b>. The larger image (svg file) cannot be displayed in a Java Applet !
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ This only works well if the node doesn't contain other node components like node details.
+ </li>
+ <li>
+ Hot key: <i>Ctrl + J</i>
+ </li>
+ </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">
+<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">
+
+<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>
+ A selected, multiline node core can be distributed over several nodes with each node containing one line by selecting the node and choosing menu <i>Edit > Node core > Split node.</i>
+ </li>
+ <li>
+ When editing a node, the text can be split at the cursor and distributed over two nodes. In the dialog editor, press the <i>Split button. Or</i> in the in-line editor press <i>Alt + S</i>.
+ </li>
+ </ol>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Other components like node details are not splitted.
+ </li>
+ <li>
+ See Help > Documentation for the details.
+ </li>
+ </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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ Scrips can be used to do calculations over branches, hence emulating spreadsheet like behaviour. Click the red arrow to go to the wiki page where this is explained.
+ </li>
+ <li>
+ As a standard setting a node core containing a formula is surrouded by a kind of bubble. You can remove this in<i> View > Node core > Don't mark formula's with a border</i>.
+ </li>
+ <li>
+ The automatic calculation can be prevented by opening the properties panel and setting field <i>Format</i> to <i>Text</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You can drag the whole map by:
+ </p>
+ <ul>
+ <li>
+ clicking in the background and drag the map around; or
+ </li>
+ <li>
+ pan the map with Ctrl+Shift+Cursor up/down/left/right
+ </li>
+ </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>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You can select a node by just hovering the cursor over it. After a short delay the node will show a blue border indicating it is selected. This is called <b>automatic selection</b>. You can also click a node to select it. Finally also the Goto actions in menu <i>Navigate </i>and method <i>Find</i> will select a node.
+ </p>
+ </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>
+</node>
+<node TEXT="Keeping the selection" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" CREATED="1314248859369" MODIFIED="1335300393587" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The automatic selection of a node can be unpractical in some conditions. You can keep a node selected while moving the cursor over other nodes: select the node and then keep <i>Shift</i> pressed when you move the cursor over other nodes.
+ </p>
+ </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>
+<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">
+<edge STYLE="bezier"/>
+<node ID="ID_279008116" CREATED="1323507943923" MODIFIED="1335095192568" HGAP="-81" VSHIFT="23"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ With a big map it is easy to get lost. If you press <i>Escape</i> the selection will jump to the root at once.
+ </p>
+ </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>
+</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>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To disconnect a node from its current parent and connect it to another parent you can simply click and drag it to its new location. As you can read below it makes a difference at which position of the target node you drop. You can also move nodes by sorting.
+ </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">
+<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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Each node has two positions where you can drop another node. These positions are visible if the cursor is above it.
+ </p>
+ <ol>
+ <li>
+ If the cursor is near the top of the target node, the whole upper half lights up. If you drop a node here, the node will become a sibling above the target node.
+ </li>
+ <li>
+ If the cursor is near the child side of the target node, the left or right side of the node lights up. If you drop the node here it will be connected as a child node.
+ </li>
+ </ol>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ In case of the root it is possible to drop a node to the left or the right side. This is also true in case of a node with a hidden edge.
+ </p>
+ </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>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It is possible to move a whole group of nodes including the summary node:
+ </p>
+ <ol>
+ <li>
+ Select the group : with <i>Shift</i> pressed first select the first node and then select the summary node.
+ </li>
+ <li>
+ Keep <i>Shift</i> pressed and drag the group to its new location.
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ After displacing nodes they can be set to their original positions. Select the nodes and choose <i>Edit > Reset node position.</i>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You may want to sort nodes alphabetically. If you select a node, you can sort its children by right-cliking the node and choosing<i> Sort children. </i>More sorting options are available in<i> Edit > Moving and sorting</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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="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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Edges are basic relations which define the node hierarchy. You can change the curving of edges, their color and thickness and you can hide edges. The place to do so is in the <b>Properties panel</b> described below, or menu <b>Format</b>.
+ </p>
+ </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>
+</node>
+<node TEXT="Connectors" STYLE_REF="Beginner" FOLDED="true" ID="ID_1073407528" CREATED="1314129123086" MODIFIED="1335300437485" STYLE="combined">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ <p>
+ Alternatively you can SHIFT + CTRL + left click to define a connector.
+ </p>
+ </li>
+ <li>
+ <p>
+ You can also select two nodes, then right-click the second node and choose <i>Add connector </i>while keeping<i> Ctrl </i>pressed. After entering a lable, press Enter.
+ </p>
+ </li>
+ <li>
+ For a connector without begin, a <b>unilateral</b> connector, right-click the node and drag onto itself.
+ </li>
+ </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"/>
+<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" ID="ID_273400211" CREATED="1314130940427" MODIFIED="1323517479815">
+<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>
+</node>
+</node>
+<node TEXT="Summary node group" STYLE_REF="Advanced" FOLDED="true" ID="ID_1700918771" CREATED="1314129783832" MODIFIED="1335300437485" STYLE="combined">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ There are also more advanced options. Read more about these in the documentation.
+ </li>
+ </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">
+<hook NAME="FirstGroupNode"/>
+</node>
+<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">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="Cloud node group" STYLE_REF="Advanced" FOLDED="true" ID="ID_1150908697" CREATED="1314130460475" MODIFIED="1335300437485" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It is possible to visually group a whole branch of nodes with a common background called <b>cloud</b>. Right-click the parent of the branch and choose <i>Nodes > Add cloud. </i>You can modify<i> </i>the color and style of the cloud in the <i>Properties panel </i>described below. To prevent the nodes in the node group from folding, select<i> Edit > Node group > All unfolded nodes.</i>
+ </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">
+<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">
+<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"/>
+</node>
+<node STYLE_REF="AdvancedTopic" ID="ID_649516172" CREATED="1310106596579" MODIFIED="1323517675474" TEXT_SHORTENED="true">
+<icon BUILTIN="../Cloud24"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ icon-button for <i>Add default cloud</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Find this icon button in the toolbar
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="bezier"/>
+</node>
+</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="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 be multiple underlined hyperlinks in each node. There can only be one arrow-link or e-mail address pro node. The arrow-icon is shown in the Node core. Besides there can be hyperlinks in socalled attributes. Finally it is possible to link from another application to a particular node in a map. To activate the underlined hyperlink, double-click it." ID="ID_840626562" CREATED="1323768812292" MODIFIED="1335095319398" HGAP="-82" VSHIFT="97">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The following procudure makes it easy to make a link between two nodes, especially if two nodes are far apart in the map or are in different maps:
+ </p>
+ <ul>
+ <li>
+ right-click one of the nodes to be linked and select <i>Link > Set link anchor</i>
+ </li>
+ <li>
+ right-click the other node to be linked and select Link > Make link from anchor or <i>Link > Make link to anchor</i>.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <i>Set link anchor </i>will automatically replace the previous anchor.
+ </li>
+ <li>
+ The anchor will be lost after exiting Freeplane.
+ </li>
+ <li>
+ See below for a different procedure if nodes are more close to each other.
+ </li>
+ <li>
+ See attributes how to set a link in an attribute value. There is an easy way to link to other nodes as well.
+ </li>
+ </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"/>
+<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">
+
+<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 hyperlink itself.
+ </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:
+ </p>
+ <ul>
+ <li>
+ select <i>Add or modify hyperlink (type)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ The appearance of the arrow-hyperlink can be changed in Properties panel, to show the whole node core as underlined text. This is only possible if no other underlined hyperlink(s) is active,
+ </li>
+ <li>
+ If dropping an image file on a node, the image may be shown in stead of the hyperlink. For this keep Ctrl pressed while dropping.
+ </li>
+ </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>
+</node>
+<node TEXT="Internal link" STYLE_REF="Beginner" FOLDED="true" ID="ID_1942100751" CREATED="1314360169447" MODIFIED="1335300461119" LINK="#ID_86446891" STYLE="combined">
+<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">
+
+<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:
+ </p>
+ <ul>
+ <li>
+ select <i>Add or modify hyperlink (type)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </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>
+</node>
+<node TEXT="Email link" STYLE_REF="Professional" FOLDED="true" ID="ID_869144882" CREATED="1270892460675" MODIFIED="1335300461119" LINK="mailto:%20jokro at freeplane.nl">
+<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">
+
+<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:
+ </p>
+ <ul>
+ <li>
+ <i>mailto:emailaddress</i><br/> e.g. mailto:jokro at freeplane.nl
+ </li>
+ </ul>
+ <p>
+ To remove a hyperlink (arrow-link) or e-mail address, right-click the node and:
+ </p>
+ <ul>
+ <li>
+ select <i>Add or modify hyperlink (type)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </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" CREATED="1315336877701" MODIFIED="1335300461119" STYLE="combined"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Underlined <a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">hyperlinks</a> .
+ </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">
+
+<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 color="#ff0000"><i><a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">This</a></i></font><a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1"> link</a> brings you to the Freeplane Open Forum.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ To change the text of the hyperlink, simply retype it. This will not alter the hyperlink address.
+ </li>
+ <li>
+ To change the address of the hyperlink, select the whole underlined text and then choose again <i>Add hyperlink (choose)...</i> or <i>Add or modify hyperlink (type).</i>
+ </li>
+ <li>
+ There can be multiple underlined hyperlinks in one Node core, Node details or Note field.
+ </li>
+ <li>
+ If the text is unformatted, or is formatted with the properties panel, the links are blue. If the text is formatted with the menu's of the edit-dialog, it has the color and size set in this dialog.
+ </li>
+ <li>
+ Ta add an internal hyperlink to another node, put #NodeId as address. To get the NodeID, right-click the node and select <i>Copy NodeId</i>. Then paste the NodeId with Ctrl + V in the link address which opens when you selct <i>Add or modify hyperlink (type)</i>. Don't forget to put # before the nodeId.
+ </li>
+ <li>
+ To link to a node in a different mind map, see<a href="#ID_1418102707"> Link from outside to a particular node</a>.
+ </li>
+ <li>
+ To link to a node in the same mindmap, the address should contain #NodeID. NodeID is got by rightclicking and selecting <i>Copy node ID</i>. It can be pasted with<i> Ctrl + V</i> in the fiield for the link address.
+ </li>
+ <li>
+ To remove the address and the text of an underlined hyperlink, delete all underlined text of the hyperlink. To delete only the address, leaving the text:
+
+ <ul>
+ <li>
+ put the cursor inside the underlined text (do not select the text)
+ </li>
+ <li>
+ Choose Edit > Add or modify hyperlink (type)..
+ </li>
+ <li>
+ Delete the address in the dialog that opens.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Hyperlink to menu item" STYLE_REF="Professional" FOLDED="true" ID="ID_350080162" CREATED="1314359739019" MODIFIED="1335300461119" STYLE="combined">
+<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">
+
+<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:
+ </p>
+ <ul>
+ <li>
+ select <i>Add or modify hyperlink (type)... </i>or press<i> Ctrl + K; </i>and
+ </li>
+ <li>
+ delete the text in the text field ( the address)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="F-keys" STYLE_REF="Professional" FOLDED="true" ID="ID_1819697018" CREATED="1314526511158" MODIFIED="1335300461119" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you want to activate a menu item, you have to to navigate to it and click the menu item. To be able to work faster, you can connect a short cut or F-key to the menu item. For this choose <i>Tools > Assign shortcut</i>. You can also save a named sets with short keys for different situations with <i>Tools > Hotkeys > Save presets</i>. To install a previously saved set, just click <i>Tools > Hotkeys</i> and select a set from the list.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Link from outside to a particular node" STYLE_REF="Professional" FOLDED="true" ID="ID_1418102707" CREATED="1322224946352" MODIFIED="1335300461119" STYLE="combined">
+<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">
+
+<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 other case the absolute path should be provided. To get the full pathname of a node, right-click the node and select <i>Copy node URI. </i>Next you can paste the address with<i> Cntrl + V </i>in the edit field for the link address.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Jumping to a particular node only works for applications which pass the nodeID information. Of course Freeplane does this. Many other applications like MSWord do not pass the nodeID, hence you can only jump to the root node.( A work around in these cases might be to save the mind map in a folding state which shows the node you want to jum to.)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ An alternative way to open or close the panel, choose <i>View > Properties panel</i>.
+ </li>
+ <li>
+ An alternative way to change properties, use menu <i>Format.</i>
+ </li>
+ </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">
+<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">
+
+<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 want to return to the default behaviour. Also uncheck if you want conditional styles affect (set) the property.
+ </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">
+<edge STYLE="linear"/>
+</node>
+<node TEXT="curved" STYLE_REF="AdvancedTopic" ID="ID_1333040751" CREATED="1314172748460" MODIFIED="1323518517665" HGAP="35" VSHIFT="-27">
+<edge STYLE="bezier"/>
+</node>
+<node TEXT="hidden" STYLE_REF="AdvancedTopic" ID="ID_1968961455" CREATED="1314172761269" MODIFIED="1323518014549" HGAP="40" VSHIFT="-5">
+<edge STYLE="hide_edge"/>
+</node>
+<node TEXT="horizontal" STYLE_REF="AdvancedTopic" ID="ID_494591913" CREATED="1314172936705" MODIFIED="1323518524951" HGAP="39" VSHIFT="25">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ By default each new map in Freeplane will generate a different color for each new branch. This supports one of the principles held by the inventor of the mind map, which states that colors help the brain to structure and memorize information more easily. This property is called <b>Automatic edge color.</b> This property can be disabled in the Propertieds panel. To disable automatic edge color, open the Properties panel and find the properties group <i>Node style</i>, at the top of the <i>Properties panel</i>. Uncheck <i>Automatic edge color</i>, like I did for the the mind map of this tutorial.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The <i>Properties Panel </i>contains the property automatic <b>node numbering </b>to give a node a number. You can set node numbering for a group of nodes by first selecting the group (keep Shift or Control pressed when you click nodes) and then checking this option in the <i>Properties Panel</i>.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Scan the options of the panel. The properties in the group <i>Node Style</i> will be described in a moment. Most other properties are self-explaining. All properties are described in detail in the Freeplane documentation.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The properties in the properties panel are also available through <b>menu Format</b>. Menu Format contains some properties which cannot be set in the properties panel as well. Examples are <i>map background</i> an <i>blinking node</i> (in Core).
+ </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">
+<icon BUILTIN="../Bold16"/>
+<font NAME="SansSerif" SIZE="12" BOLD="true" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This icon-button in the toolbar affects thee whole node text.
+ </p>
+ </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="Italic" STYLE_REF="AdvancedTopic" ID="ID_408787243" CREATED="1266251689531" MODIFIED="1323519147984" TEXT_SHORTENED="true">
+<icon BUILTIN="../Italic16"/>
+<font ITALIC="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ This icon-button in the toolbar affects the whole node text
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ Bold and italic set in the <i>Properties panel</i>, menu <i>Format </i>or with the toolbar, are applied (forced) to the whole node core.
+ </li>
+ <li>
+ To apply bold and italic to a part of the node core, use the method described above in node <i>Beginner map</i>.
+ </li>
+ <li>
+ Using both methods at the same time to the same node may give unexpected effects. For example, it is not possible to remove bold set with the first method by using the second method.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Styles (classes) are a means to quickly apply or change a group of visual properties or define a template text for all related nodes at once. Styles can also be used to find, select or filter nodes which are associated with a particular type of content or structure. This Quick reference mind map is also made with styles, see node <a href="#ID_1394424447">The making of this mind map</a>.
+ </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">
+<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">
+
+<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>
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Styles are also accessable: </font>
+ </p>
+ <ul>
+ <li>
+ In the <i>toolbar </i>
+ </li>
+ <li>
+ In menu<i> Format > Apply style</i>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">In the Properties panel, in properties group <i>Node Style,</i> in field <i>Style. </i>N.B. To open the Properties panel, right-click in an empty space in the background and select Properties panel.</font>
+ </li>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Normally you select another style, e.g. style Default. When using e.g. Automatic Level Styles, you may have added a style to overrule the automatic style. In that case, use <i>Format > Apply style > Reset node style </i>to remove a manually set style.
+ </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">
+<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">
+
+<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>. Once you have defined a style you can modify the style in the special style dialog with the menus available and the properties panel
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Read the Documentation
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Styles can indicate that a node contains specific information. As an example, the parent node "Äpply multiple styles" of the node you are reading is made up of two styles: Advanced, and Example. Advanced makes the yellow color and Example adds the eye-icon. To implement this example, first define the two styles and then apply them as node conditional styles by opening the<i> Properties panel </i>and clicking below <i>Node conditional styles for node. </i>Now a dialog opens and in this<i> </i>dialog:
+ </p>
+ <ul>
+ <li>
+ click <i>New</i>
+ </li>
+ <li>
+ In the rule that opens, click on <i>Default</i> to open the styles list. Select <i>Advanced</i>.
+ </li>
+ <li>
+ Click <i>New</i> again. Click default again and select <i>Example</i>.
+ </li>
+ <li>
+ Click <i>OK</i>.
+ </li>
+ </ul>
+ <p>
+ After this you will see that your node has both styles applied.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ Read more about styles in the Freeplane documentation !
+ </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">
+<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">
+
+<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>
+ </p>
+ <p>
+ 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>
+ </p>
+ <p>
+ Read more about conditional node styles and conditional map styles in the Freeplane documentation.
+ </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">
+<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">
+
+<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 automatically. The style for the root node is called style Title. The styles for the other levels are called Header 1, Header 2, Header 3 and Header 4.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ If you do not like the styles used for the levels, you can modify them as follows:
+ </p>
+ <ul>
+ <li>
+ Select menu <i>Styles > Edit style</i>
+ </li>
+ <li>
+ Select the node level you want (Root, Level 1, Level 2, Level 3 Level 4 Level 5 Level 6)
+ </li>
+ <li>
+ Change its format
+ </li>
+ </ul>
+ <p>
+ 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>
+ </p>
+ <p>
+ You may find more information in the Freeplane documentation.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ When making a new map, Freeplane takes so-called map style information from a map called default.mm. In this way all kind of standard settings are the same every time you start a new map. To start a map with your own preferred settings, you could modify default.mm. This map lives in <i>Tools > Open user directory > templates. </i>A preferred alternative way is to open your new map explicitly from a different mind map. For this, use <i>Files > Open map from style.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A node style may contain template like information in the form of predefined text in Details field and in the fields for attributes, Yyou can copy this so called style related information by hand, select:<i> Edit > Node extensions > Copy extensions from style node</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node FOLDED="true" ID="ID_357953420" CREATED="1323613544023" MODIFIED="1335095694181" HGAP="-583" VSHIFT="137"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The steps to define a template:
+ </p>
+ <ul>
+ <li>
+ define a new style, e.g. MyTemplate
+ </li>
+ <li>
+ open the editor for styles in menu <i>Format > Manage styles > Edit styles</i>
+ </li>
+ <li>
+ edit details of MyTemplate: (Edit > Extensions > ..details)
+ </li>
+ <li>
+ add attributes to MyTemplate (Edit > Extensions > ... attribute)
+ </li>
+ <li>
+ close the styles dialog (save the edited style)
+ </li>
+ <li>
+ open a new node
+ </li>
+ <li>
+ apply the new style MyTemplate ( Edit > Node extensions > Copy extensions from style node)
+ </li>
+ </ul>
+ <p>
+ The new node should have the text and attributes entered in MyStyle.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060" CREATED="1323614118804" MODIFIED="1323615655812">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Other" STYLE_REF="Advanced" ID="ID_429763637" CREATED="1323251384433" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
+</hook>
+<node TEXT="Pasting unformatted text from your browser" STYLE_REF="Advanced" FOLDED="true" ID="ID_1745656146" CREATED="1323251632079" MODIFIED="1335300487437" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Normally if you paste text from your browser, the formatting will be pasted too. If you install a small program you can paste text without formatting, see <a href="http://www.stevemiller.net/puretext/">http://www.stevemiller.net/puretext/</a> .
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you want to line up nodes, or simply want a different or fixed width:
+ </p>
+ <ul>
+ <li>
+ <i>Format > Set node width limits</i>; or see
+ </li>
+ <li>
+ Properties panel
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ The node you are reading now has minimum = maximum = 300 pixels
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Copying format (node core)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1195279427" CREATED="1316670043816" MODIFIED="1335300487437" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The node core has a global formatting function which applies to the whole node core. This global core format can be copietd with <i>Edit Node core > Copy format </i>and pasted in another node core with <i>Edit > Node core > Paste.</i>
+ </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">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ If you copy text from the internet, the regular paste will also paste the formatting (color, size etc.). The plain text option let you copy plain text only.
+ </li>
+ <li>
+ If you use this option frequently, consider to define a hot key for it, see <i>Tools > Add hot key.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</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="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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Print your map with the methods for this in menu<i> File</i>.
+ </p>
+ <p>
+ In case of larger files it may be practical not to print in the standard map layout but in an Outline layout. Use <i>View >Outline view</i> to set Freeplane in outline mode.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ When giving a presentation a map may be greyed except for the nodes having the focus. For this select <i>View > Presentation mode. </i>The nodes can be visisted one by one by pressing <i>Ctrl</i> +<i>Shift + Space</i> or <i>Shift + clicking</i> folding circle.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Sharing" STYLE_REF="Advanced" FOLDED="true" ID="ID_566359973" CREATED="1314352830240" MODIFIED="1335300511773" STYLE="combined">
+<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 computer." ID="ID_1964465318" CREATED="1323523371275" MODIFIED="1335095763712" HGAP="-37" VSHIFT="61">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Publish on the internet (Java Applet)" STYLE_REF="Professional" FOLDED="true" ID="ID_1417348323" CREATED="1314352836706" MODIFIED="1335300511773" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A <i>Java Applet</i> is a small program which allows you to display a mind map without Freeplane being installed on your computer.
+ </p>
+ <p>
+ 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 both yourmap.html and directory yourmap.Html_files to the internet server and start the mindmap by calling yourmap.html. Your mind map will open in a browser for reading, but cannot be modified. You can use the same method to share your map with other user's who don't have Freeplane installed. Move the file and the directory to their computer in stead of to the Internet server.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ .svg images cannot be published in a Java applet.
+ </li>
+ <li>
+ See the Freeplane documentation for more options. See <a href="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps">this page</a> to publish a map on the Freeplane wiki.
+ </li>
+ <li>
+ See this<a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Publishing_multiple_maps_in_one_Java_applet"> example</a> how multiple maps can be published in one Java applet.
+ </li>
+ <li>
+ It is possible to set in <i>Tools > Preferences</i> that the folding state must be saved, such that the map opens each time with the same folding.
+ </li>
+ <li>
+ Freeplane developers can also publish on http://freeplane.sourceforge.net/mapsOnline. Documents published here, can be opened without Java Applet if they are linked through the map opened by <i>Help > Documentation Maps Online.</i><b> In that case .svg images can be published</b><i>.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Publish on the Internet (needs Freeplane)" FOLDED="true" ID="ID_1269157254" CREATED="1323895951531" MODIFIED="1335300511788" STYLE="combined">
+<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" CREATED="1323895981367" MODIFIED="1336072642148" HGAP="-246" VSHIFT="115"><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>
+ </p>
+ <ul>
+ <li>
+ In MS Windows, right click the link of the mind map and choose copy hyperlink. Next paste this address in the URL above
+ </li>
+ <li>
+ http://freeplane.sourceforge.net/mapsOnline is a directory containing mind maps which can be opened without Java Applet, if the link <i>Help > Documentation Maps Online </i>is followed. In that case svg images are displayed too.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Interchange with a text editor" STYLE_REF="Professional" FOLDED="true" ID="ID_118482" CREATED="1314353836801" MODIFIED="1335300511788" STYLE="combined">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ Applications index
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click the link to open a mind map with the main applications of Freeplane. An Internet connection is needed to follow the links in the index.<i> </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note </b>
+ </p>
+ <ul>
+ <li>
+ To return from the index map to this map: select <i>Navigate >Go to previous map </i>(icon in tool bar)
+ </li>
+ </ul>
+ </body>
+</html>
+</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="Edit text in node details" STYLE_REF="Advanced" ID="ID_898889730" CREATED="1314197390735" MODIFIED="1335301078849"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The node you see now consistst of a <b>node core</b> with the title<i> "Edit text in node details". </i>The text below the node core is called <b>node details</b>. This field contains the text you are reading now. A discriminatig characteristic of this area is that it can be hidden or shown based on a user's need. One way to hide or show this area is to<b><font color="#ff0000"> press the small triangle</font></b> next to the text (try it !).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To create a node like the present one, first create a node as you learned before. Then type the title in the core as you know too. Finally open a dialog window by right-clicking the node and choose <i>Edit details in dialog</i>. Now type the text you want to appear under the title and press OK. Your node will now appear just like the one you are reading,
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Node details can also be entered with an inline-editor. To open the inline editor, rightclick the node and choose select <i>Edit node details in-line. </i>To reopen existing node details text for editing in this way, <i>Ctrl + left-click</i> the text. (Double clicking also opens the editor.) This inline editor behaves the same way as described for the node title text. It has the same context menu.
+ </li>
+ <li>
+ All methods available in context menu's are also accessable through the main menu. For example, the in-line editor is also accessible through <i>Edit > Node extensions > Edit node details in-lin</i>e
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Show text in tool tip (hover text)" STYLE_REF="Advanced" FOLDED="true" ID="ID_288274844" CREATED="1314206958207" MODIFIED="1335301078849" STYLE="combined">
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ Besides hiding node details it will also limit the length of the core text. So if you have a long title, it will be shortened. And it can also hide features like images, attributes and notes which are described below.
+ </li>
+ <li>
+ See <i>Image</i> below for the deviant behavour of an image in details.
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hidden details can also be made visible by <b>hovering</b> with the cursor over a node's core. This is specially useful when node details are set to be hidden permanently. In that case there is no triangle to make it display. A small circle at hte parent side of the node indicates if a node contains this type of hidden text, also called a tool tip. The node below is an example. Hover with the cursor over it to display its content. (Try it !)
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" ID="ID_1347491550" CREATED="1323462604083" MODIFIED="1323525624921" HGAP="-80" VSHIFT="50">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Image (node extension)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" CREATED="1314215157545" MODIFIED="1335301078849" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
+</hook>
+<node ID="ID_1931512160" CREATED="1323526694210" MODIFIED="1336383756945"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Images are not part of a Freeplane map but can be displayed in a Freeplane map. It makes a difference if the image source is stored on your computer or not. and which method you use to add the image: drag & drop or copy & paste. Note that the image in <i>Node core</i> differs from the image desribed here (node extension).
+ </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">
+<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">
+
+<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:
+ </p>
+ <ul>
+ <li>
+ Right-click a node and select <i>Add image..</i>.; or
+ </li>
+ <li>
+ Select <i>Edit > Node features > Add image..</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Even if the image is displayed in a node, it is not part of the mind map. Every time the mind map opens, the image is read from its original location. As a result, if you move or rename the source image, it is no longer visible in the map.
+ </li>
+ <li>
+ The image is hidden when View > <i>Minimize node</i> is set<i> </i>An image which is hidden this way does not show when hovering (in the tool tip)!
+ </li>
+ <li>
+ You cannot move the position of the image within the node. There is more to learn about (other types of) images and about publishing and sharing mind maps with images in the Freeplane documentation.
+ </li>
+ <li>
+ If you use copy and paste in stead of drag and drop, not the image but a hyperlink to the image is added - to the node core.
+ </li>
+ <li>
+ The image is a node featture and is displayed below the node core. The node core itself can also have an image. This image cannot be resized.
+ </li>
+ <li>
+ Take care that the image is not in a tempory file. For example, I you want to use an image from an e-mail program like Thunderbird, first copy the image to a non-temporary directory.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="External source" STYLE_REF="Advanced" FOLDED="true" ID="ID_17945363" CREATED="1323528121146" MODIFIED="1336383756945" STYLE="combined">
+<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">
+
+<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>
+ </p>
+ <p>
+ The pasted image is not part of the mindmap itself.
+ </p>
+ <ul>
+ <li>
+ In case of the source is on the Internet, there must be an Internet connection to see the image. To keep the image, first copy it to your computer.
+ </li>
+ <li>
+ If you paste an image copied with<i> print screen</i>, Freeplane asks where you want to save this image first.
+ </li>
+ <li>
+ If you paste or drop an image from a program which keeps the image in a tempory file (e.g. Thunderbird), the image may show at first but disappear laler. First copy the image to a fixed directory.
+ </li>
+ <li>
+ If you select and paste more than one image at a time, only the hyperlinks are pasted.
+ </li>
+ </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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Once an image is created, right-click and select <i>Change</i> to replace the image by a different image.
+ </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"/>
+<attribute NAME="Name" VALUE="John"/>
+<attribute NAME="email" VALUE="john at gmail.com"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Node details can contain structured information, in which each unit of information has a name and a value. This couple, name=value, is also called an attribute. Attributes are displayed in Details as a table with two columns.
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To create the above example, right-click a node and select Edit attribute in-line. Enter <i>name</i> in the left field and <i>John</i>. in the right one. To add the second attribute, right-click on the name or the value to open the attribute's context menu and select <i>New</i> <i>attribute</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ When you followed the example, you will find that the width of the displayed attributes does not fit the length of the text. You can solve this in two ways. First you can right-click the attribute and select <i>Optimal width</i>. Second you could experiment with moving the slim bar just above the table.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ Alternative ways to add a node and to apply other attribute methods, see:
+ </p>
+ <ul>
+ <li>
+ <i>Properties panel > Calendar & Attributes</i>
+ </li>
+ <li>
+ <i>Edit > Node extensions</i>
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Besides entering text as an attribute value, you can add hyperlinks. Right-click on an attribute value to see the options. The differences between types of hyperlinks were described in node<i> Hyperlinking.</i> Through <i>Properties Panel > Calendar and Attributes</i> you can also add formatted dates and numbers. Click on the field just above the attribute to get a drop down menu with formatting options. Read more about formatting in the Freeplane documentation.
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ There are several options to change e.g. the names of the attributes and/or values of all nodes. <i>Edit > Node extensions > Attributes</i> for all available methods and the Freeplane documentation for their description.
+ </p>
+ </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"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ It will be described below that hyperlinks can be added to attribute values through the context menu of the attribute value.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</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">
+<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">
+
+<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>
+ </p>
+ <p>
+ Read more in the Freeplane documentation.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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 ID="ID_1960771486" CREATED="1323524664411" MODIFIED="1329839626607"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="margin-top: 0">
+ Notes are a special kind of node details, the main difference being:
+ </p>
+ <ol>
+ <li>
+ By default <i>notes</i> are presented as hover text. In menu <i>View > Note > Display notes in map</i> it can be set that all (!) notes will be displayed.
+ </li>
+ <li>
+ Note text can be displayed screen wide and in a window that stays open when moving from node to node. Consult the Freeplane documentation for more information.
+ </li>
+ <li>
+ Notes have a note-icon.
+ </li>
+ </ol>
+ <p>
+ <b>Note</b>
+ </p>
+ <p>
+ In <i>Tools > Preferences</i> the note icon can be set not to display (for all notes !) for the curent map. Exception: On Intenet (Java applet) the icons keep showing.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The Time manager allows you to set dates, times (<b>reminders</b>) and tasks (reminder texts) in the core of selected nodes. A clock icon signals that a reminder is set. This icon appears both in the node and its predecessors, except nodes which are within a Summary node group. A flashing clock icon signals that a reminder time has been reached.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ There are two locations where these functions can be set or edited.
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Time management , </i>with submenu's for<i> Managing time </i>and for<i> managing tasks</i>
+ </li>
+ <li>
+ <i>Properties panel > Calendar and Attribute</i>s, NOT for managing task
+ </li>
+ </ul>
+ </body>
+</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"/>
+<hook NAME="FirstGroupNode"/>
+<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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ <i>Properties Panel > Calendar & Attributes</i> for an alternative dialog
+ </li>
+ </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="Set year, month and day" STYLE_REF="Method" ID="ID_629838545" CREATED="1310058100675" MODIFIED="1323529167120" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Insert date in selection" STYLE_REF="Method" ID="ID_77223280" CREATED="1288907062597" MODIFIED="1323529167120" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Remind me at this date" STYLE_REF="Method" ID="ID_1905175036" CREATED="1310058020709" MODIFIED="1323529167120" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Remind later" STYLE_REF="Method" ID="ID_46192835" CREATED="1327347042556" MODIFIED="1327347250233"/>
+<node TEXT="Remove reminder (time)" STYLE_REF="Method" ID="ID_1600844387" CREATED="1310058040514" MODIFIED="1323529167120" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</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">
+<icon BUILTIN="../TimeListAction"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Opens a window which displays the reminders of all nodes. For each reminder are displayed: </font>
+ </p>
+ <ul>
+ <li>
+ date
+ </li>
+ <li>
+ Title
+ </li>
+ <li>
+ icons
+ </li>
+ <li>
+ time created
+ </li>
+ <li>
+ time last modified
+ </li>
+ <li>
+ Note
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Remove the reminder of the selected node. For alternatives:
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Tools > Time manager..</i>.
+ </li>
+ <li>
+ <i>Properties Panel > Calendar & Attribute</i>s
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="" ID="ID_517678813" CREATED="1288542096079" MODIFIED="1330162899446" 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"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ProfessionalTopic" LAST="false"/>
+</hook>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This node contains a reminder
+ </p>
+ </body>
+</html>
+</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 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Basics of finding and filtering" STYLE_REF="Professional" FOLDED="true" ID="ID_1598853306" CREATED="1314362902185" MODIFIED="1335301113247" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Before you can find or filter you have to define a rule which determines what you want to find or filter for. You can do this with the Filter toolbar. This toolbar is the horizontal row of icons and entry fields, just above the work area of the map. The find/filter rule consists of:</font>
+ </p>
+ <ul>
+ <li>
+ <i>Node <b>component</b></i> (Core text, Details, Icon, etc.). It is possible to use almost any type of node component in finding and filtering.
+ </li>
+ <li>
+ <b><i>Type of rule: </i></b> component <i>exists, contains, =</i>, > etc.
+ </li>
+ <li>
+ <b><i>Value</i></b> of component
+ </li>
+ <li>
+ If value is text, relevancy of <b><i>case </i></b>and<b><i> Approximate search </i></b>(fuzzy search)
+ </li>
+ </ul>
+ <p>
+ 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>
+ </p>
+ <p>
+ You can use a filter rule also to <i>find</i> nodes one by one.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="Quick filter" STYLE_REF="ProfessionalTopic" ID="ID_1189166757" CREATED="1310134532663" MODIFIED="1329854269839" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Perform filter action.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+<node TEXT="Find last modified nodes" ID="ID_884023176" CREATED="1311098601253" MODIFIED="1329854051719" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To filter for all nodes modified after a certain date, set a filter rule (Date filter<i>, Modified after, date, xxx)</i> and <i>Quick filter</i> for all modified nodes.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ menu<i> Edit > Find and replace...</i> for an alternative way.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="No filtering" STYLE_REF="ProfessionalTopic" ID="ID_983064948" CREATED="1310134532663" MODIFIED="1329854292630" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Stop filter action
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Find next" STYLE_REF="ProfessionalTopic" ID="ID_507981913" CREATED="1310134532663" MODIFIED="1329853641469" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Find text or other criteria in the selected node and all its descendant nodes. And if not found, search further in other branches. This is called depth first search.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>Note</b></font>
+ </p>
+ <ul>
+ <li>
+ The found node is selected.
+ </li>
+ <li>
+ If the found node is folded, it is unfolded.
+ </li>
+ <li>
+ If the found node is outside the screen, the mind map is shifted to bring it in the visible are of the screen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Filter methods" STYLE_REF="Professional" FOLDED="true" ID="ID_1254354349" CREATED="1266240693156" MODIFIED="1335301113247" TEXT_SHORTENED="true" STYLE="combined"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">To the left are shown the icons of the buttons in the Filter toolbar, with their meaning. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Reverses the effect of the previously-used filtering command.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Redo filter" STYLE_REF="ProfessionalTopic" ID="ID_1724296233" CREATED="1310134532663" MODIFIED="1316165694606" TEXT_SHORTENED="true">
+<icon BUILTIN="../redo_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Re-applies the previously-used filtering command, after Filter > Undo has been used.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Reapply filter" STYLE_REF="ProfessionalTopic" ID="ID_1748016122" CREATED="1310134532663" MODIFIED="1316165694621" TEXT_SHORTENED="true">
+<icon BUILTIN="../reapply_filter"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Updates the effect of filtering after changes have been made to the map.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Quick filter" STYLE_REF="ProfessionalTopic" ID="ID_1552136796" CREATED="1310134532663" MODIFIED="1329856791349" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hides all visible nodes which do not fit the filter rules and options. Icon keeps unset..
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>No Filter</i> to finish filtering.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Nodes hidden before the filter was applied, keep hidden.
+ </li>
+ <li>
+ All nodes left visible move towards each other along the their edges.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="Find last modified nodes" ID="ID_1539236846" CREATED="1311098601253" MODIFIED="1329856905558" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To filter for all nodes modified after a certain date, set a filter rule (Date filter<i>, Modified after, date, xxx)</i> and <i>Quick filter</i> for all modified nodes.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Edit > Find and replace...</i> for an alternative way.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Filter selected nodes" STYLE_REF="ProfessionalTopic" ID="ID_402507556" CREATED="1310134532663" MODIFIED="1316165694637" TEXT_SHORTENED="true">
+<icon BUILTIN="../filter_selected_nodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Display only the currently-selected node(s) and, optionally, their ancestors and/or descendants. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <i><font color="#000000" face="SansSerif, sans-serif">Filter > Show Ancestors</font> </i>
+ </li>
+ <li>
+ <i><font color="#000000" face="SansSerif, sans-serif">Filter > Show Descendants</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+</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"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Filter and select all matching descendants (visible and invisible) of the node in focus and show and select also the nodes in between.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="No filtering" STYLE_REF="ProfessionalTopic" ID="ID_1978139715" CREATED="1310134532663" MODIFIED="1329857078297" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Removes the effect of any filters which were applied; this is the default. Un-sets icon.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Compose filter" STYLE_REF="ProfessionalTopic" ID="ID_1142884544" CREATED="1310134532663" MODIFIED="1316165694668" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_filtering_condition"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opens the Filter Composer dialog to create and edit filter rules / manage filters. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">The first row contains three entries to define a filter rule, filled with (Node text, Contains, empty filed). and a check box for indicating if the Case of letters is relevant (<i>Match case</i>). The box below these editable fields contains the list of predefined rules. Initially it is empty. Two or more of these rules can be combined to form a more complex rule with AND and OR operators using the buttons to the right. A rule can be named with buttond Set Name. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Do</font></b>
+ </p>
+ <ol>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">select or enter the conditions of the filter rule, e.g. (Node text, Contains, filter); Match Case unchecked.</font>
+ </li>
+ <li>
+ press <i>Add </i>to add it to the list of rules.
+ </li>
+ <li>
+ repeat for all rules you need.
+ </li>
+ <li>
+ press OK
+ </li>
+ </ol>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ To combine two or more rules with AND or OR operators, select the rules and press AND resp. OR
+ </li>
+ <li>
+ To connect a rule to a label, select the rule and press<i> Set Name</i>.
+ </li>
+ </ul>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Styles > Conditional Map styles</i> for example use of <i>Filter Composer </i>
+ </li>
+ <li>
+ <i>Styles > Conditional Node styles</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toggle Apply to filtered (visible) nodes, i.e. add an additional filter condition, to further narrow the results.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Unfold hidden nodes" STYLE_REF="ProfessionalTopic" ID="ID_865947666" CREATED="1310134532663" MODIFIED="1316165694684" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Expand all nodes in a map that match the filter. This is not a toggle switch: once the nodes are expanded, they can only be collapsed using other commands (such as Filter > Undo, which may be used immediately after this command). </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">See also</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Toggle Folded</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Fold All</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Navigate > Fold One Level.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Show ancestors" STYLE_REF="ProfessionalTopic" ID="ID_1384592614" CREATED="1310134532663" MODIFIED="1316165694684" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toggles Display all ancestor nodes of nodes which match the filter when filtering is in effect (Applies to Filtered Nodes is set) </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Can be set before or after <i>Quick filter</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Show descendants" STYLE_REF="ProfessionalTopic" ID="ID_347749612" CREATED="1310134532663" MODIFIED="1316165694684" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Togles Display all descendant nodes of nodes which match the filter when filtering is in effect (Applies to Filtered Nodes is set)</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Can be set before or after <i>Quick filter</i> has been issued.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Find text or other criteria in the selected node. The searching direction is opposite to Find Next. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ The found node is selected.
+ </li>
+ <li>
+ If the found node is folded, it is unfolded.
+ </li>
+ <li>
+ If the found node is outside the screen, the mind map is shifted to bring it in the visible are of the screen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Find next" STYLE_REF="ProfessionalTopic" ID="ID_1528431308" CREATED="1310134532663" MODIFIED="1316165694699" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Find text or other criteria in the selected node and all its descendant nodes. And if not found, search further in other branches. This is called depth first search.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b>
+ </p>
+ <ul>
+ <li>
+ The found node is selected.
+ </li>
+ <li>
+ If the found node is folded, it is unfolded.
+ </li>
+ <li>
+ If the found node is outside the screen, the mind map is shirgted to bring it in the visible are of the screen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</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">
+
+<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="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"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ As an example of using filter sets, the Freeplane directory has a subdirectory <i>doc</i> with a file called <i>freeplaneTutorial.mmfilter</i>. Choose <i>Fiter > Filter composer > Load</i> and find and load this file.
+ </p>
+ <p>
+ After this you can use the filters as described in the following nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Select filter and Quickfilter" LOCALIZED_STYLE_REF="default" ID="ID_81563733" CREATED="1316156118436" MODIFIED="1323808537386" LINK="FilterExampleBegin.jpg">
+<icon BUILTIN="full-1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see only the information at the first level of experience (Beginner):
+ </p>
+ <p>
+
+ </p>
+ <ol>
+ <li>
+ <ol>
+ <li>
+ Click in field with <i>"No filtering (remove)"</i>: a list with filters drops down.
+ </li>
+ <li>
+ Select ane of the shown rules e.g. Beginner
+ </li>
+ <li>
+ Click <i>Quick filter</i> as shown in the image.
+ </li>
+ </ol>
+ <p>
+ P.S. Make sure Show ancestors is UNselected.
+ </p>
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<icon BUILTIN="full-2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You can now click on each item to unhide its content. Or you can unhide all hidden information at once by doing the following:
+ </p>
+ <ol>
+ <li>
+ Move the cursor over the central area (root node) to select it
+ </li>
+ <li>
+ Click on the icon <i>Unfold all </i>to see all selected nodes
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<icon BUILTIN="full-3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ol>
+ <li>
+ Click in an empty area of the background and drag the map around until hou have read all.
+ </li>
+ <li>
+ Do not forget to press icon <i>No filtering</i> when you are finished.
+ </li>
+ </ol>
+ <p>
+ You can now follow the same procedure for Beginner, Advanced and Professional.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</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 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">
+
+<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>
+ </p>
+ <ul>
+ <li>
+ See also <i>Tools > Password protection.</i>
+ </li>
+ <li>
+ Password protection is implemented with DES type encryption. You can read more about protection (encryption) in the Freeplane documentation.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="New protected map" STYLE_REF="Professional" FOLDED="true" ID="ID_1064538299" CREATED="1314362258060" MODIFIED="1335301133075" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you define a new map, you can directly protect is with a password. To do this in one action, choose <i>File > New protected map. </i>This function can be combined with password proction of nodes, to create security layers.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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 ID="ID_931065203" CREATED="1323095428935" MODIFIED="1335301155181"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane has a lot of tuning options. Most used options are available in menu <i>View </i>and the others are available in <i> Tools > Preferences. </i> Besides you can write your own scripts to automate things. The Freeplane documentation describes them all.
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ A new node gets stand style <i>Default</i>. This style can be edited: <i>Format > Manage styles > Edit styles. </i>If you set "bubble" here, all new nodes get a bubble.
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Map <i>standard.mm</i> in <i>Tools > Open user directory > Templates</i> serves as a map template for each new mind map. Consider adapting the style "default" of this template map to your personal favourites, e.g.
+ </p>
+ <ul>
+ <li>
+ Change arrow-links into hyperlinks: in properties panel of Style "default", set Hyperlink to checked.
+ </li>
+ <li>
+ Set a bigger or smaller font for style Default (and the other styles.
+ </li>
+ <li>
+ Set the default style to have a bubble,
+ </li>
+ <li>
+ etc.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Standard settings in View" STYLE_REF="Professional" FOLDED="true" ID="ID_1173853188" CREATED="1315687352137" MODIFIED="1335301155197" STYLE="combined">
+<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">
+
+<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. Open menu <i>View</i> and select all options one by one to know which options are available. In the preferences much more can be set.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Viewing settings contains options for printing (outline view) and presentation (Presentation mode).
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Scientific suite (Docear)" STYLE_REF="Professional" FOLDED="true" ID="ID_170927482" CREATED="1316706324268" MODIFIED="1335301155197" LINK="http://docear.org" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span lang="EN-US">Docear is an "academic literature suite". It provides to researchers what an office suite provides to office workers. By that we mean, Docear supports you in doing all the tasks related to literature management: </span>
+ </p>
+ <p>
+ <span lang="EN-US"> </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 1. Finding new literature (searching and exploring) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 2. Organizing literature (reading, annotating, and retrieving) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 3. Creating your own literature (drafting, writing, referencing, and publishing) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> </span>
+ </p>
+ <p>
+ <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">
+<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">
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The environment preferences let you set the following:
+ </p>
+ <ul>
+ <li>
+ one instance or more instances of Freeplane can be running at the same time;
+ </li>
+ <li>
+ protection (experimental file locking) is allowed [ it is no longer experimental !];
+ </li>
+ <li>
+ options for opening and automatic saving of files;
+ </li>
+ <li>
+ if the folding state must be kept when saving a file, to open it with the same folding;
+ </li>
+ <li>
+ the deault character set;
+ </li>
+ <li>
+ if hyperlinks must take relative or absolute addresses
+ </li>
+ <li>
+ and other
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The preferences for appearances let you set:
+ </p>
+ <ul>
+ <li>
+ the standard properties used
+ </li>
+ <li>
+ height and width of nodes, tool tips etc.
+ </li>
+ <li>
+ icons showing or not showing
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The keystrokes preferences let you set hot keys used for predefined icons.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The preferences for Behaviour let you set a.o.:
+ </p>
+ <ul>
+ <li>
+ if automatic selection should be used, delay time
+ </li>
+ <li>
+ the characteristics of hovering (tool tip)
+ </li>
+ <li>
+ if the in-line editor should be displayed for all new nodes
+ </li>
+ <li>
+ if edit needs double click
+ </li>
+ <li>
+ if a key press overwrites text, adds a child, adds sibling or has no effect
+ </li>
+ <li>
+ the position of new branches (first, last)
+ </li>
+ <li>
+ the enabling/disabeling of drag and drop
+ </li>
+ <li>
+ the speed of mouse wheel
+ </li>
+ <li>
+ the size of the grid used to position nodes
+ </li>
+ <li>
+ the kind of data parsing and formatting used
+ </li>
+ <li>
+ if confirmation is used with node deletion
+ </li>
+ <li>
+ if text should be treated as numbers in comparisons
+ </li>
+ <li>
+ spell checker options like case sensitivity
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Browswer settings and settings for HTML export/import.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Settings for using formula's and scripts.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Vertical space between nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1324029133997" MODIFIED="1335301155197" STYLE="combined">
+<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">
+
+<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>
+ </p>
+ <p>
+ To reset the original posisitons, select a node and Edit > Set default node positions.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Using and writing scripts" STYLE_REF="Professional" FOLDED="true" ID="ID_519455593" CREATED="1316158310467" MODIFIED="1335301155197" 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" CREATED="1323530732191" MODIFIED="1335096329702" HGAP="-174" VSHIFT="70"><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"/>
+</hook>
+</node>
+</node>
+<node TEXT="Indexing .mm in Windows7" STYLE_REF="Professional" FOLDED="true" ID="ID_952466464" CREATED="1313349075257" MODIFIED="1335301155197" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you use Windows 7 you can make it indexing .mm files. Do as follows:
+ </p>
+ <ul>
+ <li>
+ Go to Control Panel -> indexing options; or type in Help ""indexing"
+ </li>
+ <li>
+ Choose "Professional". This gives you a page with two tabs -- "Index Settings" and "File Types"
+ </li>
+ <li>
+ Choose the "File Types" tab
+ </li>
+ <li>
+ Scroll through the list of files there till you come to ".mm"
+ </li>
+ <li>
+ The filter description will say "File Properties Filter"
+ </li>
+ <li>
+ Click the second radio button beneath, which says "Index Properties and File contents. The filter description should now change to "Plain text filter"
+ </li>
+ <li>
+ Choose OK to leave the dialog. The indexing will restart and when it is finished, the index is available.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ In the standard mode only node properties are indexed, not content. The above procedure also adds the content to the filtering mechanism
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Spell check dictionaries" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" CREATED="1271096394315" MODIFIED="1335301155197" 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 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Standard short cuts" STYLE_REF="Professional" FOLDED="true" ID="ID_64846119" CREATED="1316185102923" MODIFIED="1335301155197" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane has standard short cuts for most actions which can help speed up processing of your mind map. These short cuts are visible to the right of the menu items when you open the menu's in the main menu bar. There is also an automatically generated overview in menu Help. It is also possible to define your own short cut sets, for example for F-keys. See <i>Help > Documentation</i>.
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000">Click the red arrow to read more about extensions on the Interenet. </font>
+ </p>
+ <p>
+ <font color="#000000">Check <a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29">here</a> if there exists a language pack add-on for your language.</font>
+ </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">
+<icon BUILTIN="idea"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplane.mm#ID_1040911735">FAQ</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Frequently Asked Questions
+ </p>
+ </body>
+</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 STYLE_REF="Beginner" ID="ID_163805859" CREATED="1314422714136" MODIFIED="1335301176959"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Click <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Examples">here</a> to go to the Wiki
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Node with </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">style Begin, Advanced or Professional</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">automatic node number</font>
+ </li>
+ <li>
+ fixed min node width = 180
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Title" ID="ID_1129463861" CREATED="1329890593164" MODIFIED="1329896626655" VSHIFT="28"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Short label indicating content
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ with
+ </p>
+ <ul>
+ <li>
+ style TitlesContent
+ </li>
+ <li>
+ generally moved below Title with hidden edge
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Signals for Example or Revision" ID="ID_1987503747" CREATED="1329893003272" MODIFIED="1329893364322"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ style Example added as conditional node stye (applies to single node)
+ </li>
+ <li>
+ style Revision added as conditional map style (applies to all nodes)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="User defined Styles" ID="ID_1542766589" CREATED="1329890665063" MODIFIED="1329891699156">
+<node TEXT="Beginner" STYLE_REF="Beginner" ID="ID_1530366440" CREATED="1329890552011" MODIFIED="1329891025524"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color green
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Advanced" STYLE_REF="Advanced" ID="ID_535640598" CREATED="1329890558413" MODIFIED="1329891023028"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color yellow
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Professional" STYLE_REF="Professional" ID="ID_1633698334" CREATED="1329890564240" MODIFIED="1329891020032"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color orange/brown
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="TitlesContent" STYLE_REF="TitlesContent" ID="ID_1999102003" CREATED="1329890685983" MODIFIED="1329891614417"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ No bubble
+ </p>
+ <p>
+ Hidden edge
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example" STYLE_REF="Example" ID="ID_149652811" CREATED="1329891620274" MODIFIED="1329892004168"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ eye-icon
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1141559530" CREATED="1329891634025" MODIFIED="1329892021734"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ R-icon
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="MyTemplate" STYLE_REF="MyTemplate" ID="ID_669326751" CREATED="1329896085816" MODIFIED="1329896350488">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="4" color="#3333ff"><b>Template information</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Map with all Freeplane Functions (index)" ID="ID_1680872369" CREATED="1329896383911" MODIFIED="1329897008344" LINK="#ID_232622736"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Free node
+ </li>
+ <li>
+ Cloud
+ </li>
+ <li>
+ External link
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Map with example applications (index)" ID="ID_311616726" CREATED="1329896409752" MODIFIED="1329896989686" LINK="#ID_766584529"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Free node
+ </li>
+ <li>
+ Cloud
+ </li>
+ <li>
+ External link
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Working on large maps may be difficult if you need to work at two different node locations of the map. For this you can open two views of the same map and work in both views if they were the same map.<i> Choose View > New map view</i> for this. Switch between views by selecting the respective tabs. You cannot see both views at once. For this you could open a second version of Freeplane. However, in that case they are treated as different maps.
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To restore from local history select Menu <i>File > Restore from local history</i>.
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All functions in Freeplane are open for use as batch job, in a command line interface. With this you can for example:
+ </p>
+ <ul>
+ <li>
+ run a function on start up
+ </li>
+ <li>
+ execute a script an leave
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneTutorial.mmfilter b/freeplane/doc/freeplaneTutorial.mmfilter
new file mode 100644
index 0000000..2a32d28
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial.mmfilter
@@ -0,0 +1,14 @@
+<filter_conditions>
+ <disjunct_condition user_name="Beginner">
+ <style_equals_condition TEXT="Beginner"/>
+ <style_equals_condition TEXT="BeginnerTopic"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Advanced">
+ <style_equals_condition TEXT="AdvancedTopic"/>
+ <style_equals_condition TEXT="Advanced"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Professional">
+ <style_equals_condition TEXT="Professional"/>
+ <style_equals_condition TEXT="ProfessionalTopic"/>
+ </disjunct_condition>
+</filter_conditions>
diff --git a/freeplane/doc/freeplaneTutorial_ja.mm b/freeplane/doc/freeplaneTutorial_ja.mm
new file mode 100644
index 0000000..d381a5d
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial_ja.mm
@@ -0,0 +1,5801 @@
+<map version="freeplane 1.2.0">
+<!--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">
+<icon BUILTIN="bee"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>チュートリアル </b>
+ </p>
+ <p>
+ <b>Freeplane 1.2</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="MapStyle">
+ <conditional_styles>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <conjunct_condition user_name="Example">
+ <time_condition_modified_after DATE="1335514983501"/>
+ <time_condition_modified_before DATE="1335515403501"/>
+ </conjunct_condition>
+ </conditional_style>
+ </conditional_styles>
+ <properties 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="defaultstyle.details">
+<font SIZE="8"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="default" FORMAT_AS_HYPERLINK="true">
+<edge COLOR="#808080" WIDTH="thin"/>
+<font SIZE="8"/>
+</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="AutomaticLayout.level.root" COLOR="#000000">
+<font SIZE="12"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
+<font SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
+<font SIZE="12"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode TEXT="Beginner" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Advanced" COLOR="#000000" BACKGROUND_COLOR="#ffff00" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Professional" BACKGROUND_COLOR="#ff9900" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="TitlesContent" STYLE="fork">
+<edge STYLE="hide_edge"/>
+</stylenode>
+<stylenode TEXT="Example">
+<icon BUILTIN="../AttributesView"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Revision">
+<icon BUILTIN="revision"/>
+</stylenode>
+<stylenode TEXT="MyTemplate">
+<icon BUILTIN="females"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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="Method" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.topic" POSITION="right" COLOR="#18898b" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subtopic" POSITION="right" COLOR="#cc3300" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subsubtopic" POSITION="right" COLOR="#669900">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.important" POSITION="right">
+<icon BUILTIN="yes"/>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node STYLE_REF="Beginner" POSITION="right" ID="ID_1820104438" HGAP="-121" VSHIFT="-55">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="http://freeplane.sourceforge.net/mapsOnline/?map=IndexFreeplaneGuides.mm">ビデオガイド</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これらのガイドを見ると、Freeplane の概要を簡単に理解することができます。
+ </p>
+ </body>
+</html>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、職場や学校、家庭で、思考、情報の共有、そして GTD(getting things done)を効果的に進められるよう工夫されています。このソフトウェアは、 <a href="http://www.informationtamers.com/WikIT/index.php?title=Information_map_types">情報マップ</a> の一種である <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#What_is_mind_mapping">マインドマップ</a> の作成、共同利用、そして活用を支援するものです。<a href="freeplaneApplications_ja.mm">適用分野</a>については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane">Wiki Tutorial Freeplane</a> で具体例をご覧ください。簡単に Freeplane の使用法をつかむには、<a href="http://freeplane.sourceforge.net/TutorialExtensions/IndexFreeplaneGuides">Freeplane (ビデオ)ガイド</a> が役立ちます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ この「チュートリアル」は、よく使われるFreeplane の機能について、簡潔に説明することを目的としています。詳しい情報については、 <a href="freeplane_ja.mm">ヘルプ > マニュアル</a> をご覧ください。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 一般に、マニュアルの通読は煩わしいものです。そこで、<i>「チュートリアル」</i>では、「はじめに」を読むだけで、 Freeplane メインメニューバーを使ってマインドマップ作成に取り掛かれるように工夫しています。主要な編集機能は<i>「編集」メニュー</i>にあります。また、一部の特殊機能は<i>「ツール」メニュー</i>にあります
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 以下の理由により、「はじめに」より後の各章も一読に値するはずです。Freeplane では、様々な方法によって、同じ動作を実現することができます。通常、Freeplane メニューの使用は、通常、最も手っ取り早い効率のよいやり方ではありません。以下の各章では、すべての機能を説明するとともに、いわゆるコンテキストメニューを使う最も効率のよい方法を紹介していきます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 以後の各章は、順序どおりに読まなくても、時々の必要に応じて拾い読みできるようになっています。情報取得の便宜を考慮して、各項目は、下記の要領で彩色しています。
+ </p>
+ <ol>
+ <li>
+ <b>初 級</b>(空色/緑色):ノートテイキングやブレーンストーミングといったシンプルな生産的作業に利用できる基本事項を学習します
+ </li>
+ <li>
+ <b>中 級</b>(黄色):より高度の情報整理や的確な意思疎通に役立つ追加的機能を学習します。
+ </li>
+ <li>
+ <b>上 級</b>(橙色/茶色):環境設定や創作・専門ツールの利用法について学習します。
+ </li>
+ </ol>
+ <p>
+ <b><font color="#ff0000">重 要</font></b>
+ </p>
+ <p>
+ <font color="#ff0000"> ユーザの使用言語用言語別アドオンパックがあるかどうか、<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29">ここをクリックして</a> チェックしてください。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 基本事項に関する簡単な紹介については、<a href="http://freeplane.sourceforge.net/TutorialExtensions/IndexFreeplaneGuides">Freeplane (video) guides</a> の冒頭の3点をご覧ください。
+ </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">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+</node>
+<node TEXT="" ID="ID_1720964325" HGAP="141" VSHIFT="11" 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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 画面の何も表示されていない部分のどこかで、右クリックしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook URI="Images/mouse/mouse_RB.png" SIZE="1.0" NAME="ExternalObject"/>
+<node TEXT="背景のコンテキストメニュー" ID="ID_1485150857" VSHIFT="180" STYLE="fork">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Shot cuts</i> or <i>hot keys </i>for most functions.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="ホットキー一覧" ID="ID_1337797684">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_859940648" HGAP="-24" VSHIFT="88"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップは、情報を表示するいわゆる<b>「ノード」</b>群からなる平面図です。見方によっては、ノードは、本の<b>「項目」</b>に当たります。そこには、テキストやイメージといった情報を表示することができます。異なるのは、ノードが自由に位置を変えられ、簡単に非表示にできることです。この特徴のおかげで、マップは、状況に応じて多彩な使用法が可能であり、ユーザの必要にしたがって情報を展開したり選択的に表示したりすることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 現在ご覧のテキストはノードの中にあります。上方の<i>「ノード」</i>と書かれたテキストは、ノードを形成しています。また、左方にある<i>「はじめに」</i>と書かれたテキストもノードを形成しています。左の大きい楕円形は<b>「ルートノード」</b>と呼ばれる特殊なノードです。
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのノードは、<b>「エッジ」</b>と呼ばれる線で結び付けられています。左側に見える線がエッジです。一連の連結されたノードは<b>「木」</b>の枝のように見えます。すべての木はルート(根)ノードを起点としています。これらの枝が集まって、家族系列を形成します。ルートノードに近いノードをノードの<b>「親」</b>(祖父母)と呼び、遠くにあるものを<b>「子」</b>(孫)と呼びます。同じ階層に属すが、相互に連結されていないノードを<b>「兄弟」</b>と呼びます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 一般に、ノードの配置は、家族ツリーのなかで当該ノードがどのような立場を占めるかによって、制限されます。ただし、他のどのノードとも関係なく位置を決められる、いわゆる<b>「フリーノード」</b>については、このルールは当てはまりません。
+ </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">
+<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">
+<edge STYLE="bezier"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="ノードを折り畳む" STYLE_REF="Beginner" FOLDED="true" ID="ID_1338867820">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 通常、円囲いの「+」印ないし「-」印が表示中にノードをクリックすると、そのノードを<b>折り畳</b>んだり<b>展開</b>したりできます。この円囲い印は、ノードコア上にカーソルが置かれたときに表示されます。展開すると、非表示になっている子ノードが表示されます。折り畳みは、非表示化可能な子ノードを隠します。ノードが折り畳まれている場合は、<b>子ノード側</b>に小さな<b>丸印</b>が表示されます。このノードが展開中であれば、右側に、表示画面の最上部のツールバーにあるのと同じ4つのアイコンが表示されているはずです。これらは、選択ノードの子孫ノード[訳注:日本語版では「下位ノード」と表示することがあります]を折り畳み/展開するのに使うアイコンボタンです。
+ </p>
+ <p>
+ <br/>
+ さあ、<i>「はじめに」</i>のノードをクリックして、その子ノード群を隠し、丸印を見てみましょう!そして、次にもう一度クリックして、次のノードを読んでください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>例 外</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ 円囲いの「+」/「-」をクリックすると、間髪いれず折り畳み/展開します。ノードコアの他の部分をクリックした場合、一瞬遅延が生じます。
+ </p>
+ </li>
+ <li>
+ 「編集 > ノードグループ > 常にノードを展開(オン/オフ)」の設定により、該当ノードを折り畳まないようにすることができます。これは、雲によるグループ化時に役立ちます。
+ </li>
+ <li>
+ 折り畳み中のノードに、非表示の子ノード向けコネクタが付されている場合、点線(及びラベル)が表示されます。これを右クリックしてコンテキストメニューが表示させたり、連結先のノードにジャンプすることができます。
+ </li>
+ </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">
+<icon BUILTIN="../unfold_one_level"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードの下位ノードを徐々にに展開します。一度クリックすると子ノード群が展開されます。もう一度クリックすると孫ノード群が展開されるといった具合です。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="1階層分だけ折り畳む" STYLE_REF="ConsumerTopic" ID="ID_831251421" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fold_one_level"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの下位ノードを、最深階層から徐々に折り畳みます。仮に4つの階層があるとすると、一度クリックすると曾孫ノード群が折り畳まれます。もう一度クリックすると孫ノード群が折り畳まれ、次にクリックすると子ノード群が折り畳まれるといった具合です。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="すべて展開する" STYLE_REF="ConsumerTopic" ID="ID_933325044" TEXT_SHORTENED="true" LINK="#ID_86446891" STYLE="as_parent">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">子ノードや孫ノードなど、選択ノードの下位階層にあたるすべてのノードをすべて展開(見えるように)します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ホットキー</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Space」</i>を押す。
+ </li>
+ <li>
+ ノード上でシングルクリック。
+ </li>
+ <li>
+ <i>「ツールバー」</i>でアイコンボタンをクリック。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="すべて折り畳む" STYLE_REF="ConsumerTopic" ID="ID_657829947" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">子ノードや孫ノードなど、選択ノードの下位階層にあたるすべてのノードを折り畳み(隠し)ます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ホットキー</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Space」</i>を押す。
+ </li>
+ <li>
+ ノード上でシングルクリック。
+ </li>
+ <li>
+ <i>「ツールバー」</i>でアイコンボタンをクリック。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ インターネット上にあるマインドマップを開くには、最初に、マップをローカルコンピュータにコピーしなければなりません。これを実行するのが、<i>「ファイル > URL からマップを開く」</i>メニューです。
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1314148002" HGAP="-102" VSHIFT="105"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの情報は、大きくいって2つのエリアに表示されます。1つは、ノードの内部エリアに位置し、囲み表示の場合囲みの中側に含まれるので、<b>「ノードコア」</b>と呼ばれます。現在ご覧のテキストは、ノードコアの中にあります。現在ユーザがご覧のエリアのすぐ上の色付きのエリアは別のノードのコアにあります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ コアのテキストは、見出しのように短縮表示したり、あるいはまた複数行に表示したりできるます。画像やアイコンといった様々な基本表示要素を含めることもできます。また、ハイパーリンクや計算式、時間管理コンポーネント、パスワードによる保護機能が付くこともあります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ テキストは、ノードコア以外に<b>「ノードの詳細」</b>や<b>「ノート」</b>、<b>「属性」</b>にも入力できます。これらのフィールドについては、後ほど説明します。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ コアテキストを<i>インライン編集</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="bezier"/>
+<node ID="ID_318435221" HGAP="16" VSHIFT="139">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="video/Guide/EditingBeginner/EditingGuide-Beginner.mm#ID_639675210">ビデオ</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node FOLDED="true" ID="ID_265318117" HGAP="-100" VSHIFT="-2" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane を初めて起動すると、空白のマップが表示されます。そこには、楕円形のルートノードが表示されます。ルートノードには、「新規マインドマップ」といったテキストが書かれています。このテキストは反転表示されていますが、これは、ユーザが新たにタイプ入力するテキストに置換できることを示しています。表題をタイプ入力し<i>「Enter」</i>を押すだけで十分です。<i>「Insert」</i>キーを押すと、子ノードが付加されるので、ここで再度、テキストを入力して<i>「Enter」</i>を押してください。2度目の<i>「Enter」</i>で、兄弟ノードが付加されるはずです。なすべきことは、たったこれだけです。既存のノードを編集するには、<i>「Ctr」</i>(MAC OS の場合は「META」)を押した状態で当該のノードテキストを左クリックしてください。操作は、極めて簡単です。これで、ユーザは、容易に簡単なマップを作成できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 新たに行を付加するには、<i>「Shift + Enter」</i>を押してください。
+ </li>
+ <li>
+ テキスト編集中に右クリックすると、いわゆる<b>「コンテキストメニュー」</b>が開き、コピー&貼り付けといった書式設定機能を簡単に呼び出すことができます。
+ </li>
+ <li>
+ テキストを選択した状態で右クリックすると、テキストを太字に変えるなどの目的に使える<i>「書式」</i>メニューが表示されます。この書式設定は、選択中のテキストに限って適用されます。
+ </li>
+ <li>
+ [テキスト]編集を始めるには、「Home」や「End」、「F2」といったキーの使用、ダブル・クリック、あるいはテキストのタイプ入力開始による方法以外ありません。
+ </li>
+ </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">
+<icon BUILTIN="../filenew"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 表示画面の最上部のツールバーをご覧ください。
+ </p>
+ </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">
+<icon BUILTIN="../fileopen"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールバーをご覧ください。
+ </p>
+ </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">
+<icon BUILTIN="../fileprint"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <span><font color="#000000" face="SansSerif, sans-serif">マップを印刷するプリンタ関連のダイアログボックスを開きます。</font></span>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="切り取り" STYLE_REF="BeginnerTopic" ID="ID_353410114" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../editcut"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <span><font color="#000000" face="SansSerif, sans-serif">現在選択中のノードとそのすべての子ノードを切り取ります。</font></span>
+ </p>
+ </div>
+ </div>
+ </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">
+<icon BUILTIN="../editcopy"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <span><font color="#000000" face="SansSerif, sans-serif">選択ノードとそのすべての子ノードをコピーします。</font></span>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="貼り付け" STYLE_REF="BeginnerTopic" ID="ID_1705754282" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../editpaste"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">コピーしたテキストを貼り付けます。選択ノードが編集モード状態の場合、テキストはノードの既存の内容に付加されます。選択ノードが編集モードでない場合は、テキストは子ノードとして付加されます。</font>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="新規子ノード" STYLE_REF="BeginnerTopic" ID="ID_942355748" TEXT_SHORTENED="true" STYLE="as_parent">
+<icon BUILTIN="../idea"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">現在選択中のノードの子ノードとして、新規ノードを作成します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>同一動作</b>
+ </p>
+ <ul>
+ <li>
+ <i><font color="#000000" face="SansSerif, sans-serif">「Ins」</font></i><font color="#000000" face="SansSerif, sans-serif">キーを押す。</font>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Ins> 新規子ノード" ID="ID_45308529" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Shift>+<Enter> 新規行" ID="ID_396169297" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Enter> 編集を完了し、ノードを選択" ID="ID_780427702" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="2*<Enter> 新規兄弟ノード" ID="ID_420903085" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="右クリック:コンテキストメニュー" ID="ID_435495519" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ コアテキストを<i>ダイアログ</i>編集
+ </p>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_1800844060" HGAP="17" VSHIFT="105">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="video/Guide/EditingBeginner/EditingGuide-Beginner.mm#ID_710192757">ビデオ</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node FOLDED="true" ID="ID_1433249332" HGAP="-103" VSHIFT="-4" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノード編集の第2の方法は、独立のダイアログを使うやり方です。ノード上で右クリックして下さい。すると、ノードコンテキストメニューが開きます。(このコンテキストメニューは、テキスト編集中のコンテキストメニューとは別物です。)このコンテキストメニューで、<b><i>「ノードコアをダイアログ編集」</i></b>を選んでください。これで、テキストをタイプ入力し、そのテキストに表示されたの書式設定オプションを使うことができます。「OK」を押してダイアログを閉じると、入力したテキストがノードに表示されます。このダイアログには、インライン編集時の書式設定よりも広範なテキスト書式設定オプションがあります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ メインメニューバーで、編集ウィンドウを開くこともできます。<i>「編集」</i>に続けて<i>「ノードコア関連」</i>を選ぶと、<i>「ノードコアをダイアログ編集」</i>が現れます。以下では、この手順を<i>「編集 > ノードコア関連 > ノードコアをダイアログ編集」</i>と表記します。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font ITALIC="false"/>
+<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="独自のメニューあり" ID="ID_1425310908">
+<edge STYLE="horizontal"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
+</hook>
+</node>
+<node TEXT="<Enter> :新規行" ID="ID_1043315983">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="右クリック:コンテキストメニュー" ID="ID_1846126640">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 作成したマップは、上方のメニューバー(作業メニュー)のフロッピーディスクアイコンを押すか、又は<i>「ファイル > マップを(上書き)保存」</i>メニューを選んで保存してください。その後、マップアイコン、又は<i>「ファイル > 保存マップを開く」</i>を使って、別のマップを開くことができます。
+ </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">
+<icon BUILTIN="../filesave"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 表示中のマップを保存するには、ツールバーで上のアイコンボタンを探してください。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node STYLE_REF="BeginnerTopic" ID="ID_449363060" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesaveas"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div style="margin-top: 0">
+ <p>
+ 名前をつけてマップを保存...
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 上方のツールバーをご覧ください。
+ </p>
+ </div>
+ </div>
+ </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">
+<icon BUILTIN="../close"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <span><font color="#000000" face="SansSerif, sans-serif">フォーカス状態のマップを閉じます。複数のマップをオープン中の場合、フォーカスは、編集中のタブに合わせられています。</font></span>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップの[空白箇所の]どこかで、<i>「Ctr」</i>キーを押した状態でクリックすると、いわゆるフリーフローティングノードが作成されます。このノードは、紙製のポストイットのように動作します。すなわち、ルート-階層関係の一環をなすノード群とは関わりなく、どこにでも配置できます。このノードの書式は、<i>「フローティングノード」</i>のシステムスタイルによって規定されます。この標準スタイルは編集可能ですが、フローティングノードはすべてこの編集されたスタイルによって規定されます。ポストイットノードは、好みのノードへのドラッグ&ドロップで、階層付きノードに連結することができ、このノードの子ノードとなります。各種フリーフローティングノードの事例については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Floating_nodes">Tutorial Freeplane</a> をご覧ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="エッジの線が表示されないフローティングノードは、凡例、見出し、要約、著者などのメタ情報をマップに付加することを想定しています。こうした情報がマップ全体に関連するものだとすると、これらのノードは、常に視野に入るようにルートノードを親とするものになるはずであり、他のノードとは無関係に配置されることになります。時には、こうした情報がマップの一部にしか関係ないこともあります。この場合は、エッジの線が表示されないフローティングノードを、ルートノード以外のノードに連結することができます。そうしたノードでは、物事の前後関係がわかる(これは重要なことです)ように、親ノードに結ばれるエッジの線が、マップの背景と同じ色に指定されているのでないかぎり、通常、ノード選択時に破線の形で表示されます。

フリーノードは、エッジの線が非表示でなくてもかまいません。この第2の用法は、マップのスペースの有効利用に役立ちます。自動レイアウトアルゴリズムが作動すると、マップの枝同士は重複しないようになっています。コンパクトなマップを作成したい場合、一部のノードをフリーノードに変換することができます。これにより、ノードの位置を柔軟に変更できるようになります。しかも、他の兄弟ノードに対する当該ノードの論理的位置関係は、設定次第です。常にノードの論理的な位置関係に従って表示されるアウトラインビューに切り替えた場合も、この点に変わりありません。" STYLE_REF="SubWidth" ID="ID_1557640435" HGAP="-581" VSHIFT="187"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_591131207" HGAP="-192" VSHIFT="157" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フリーノードは、マインドマップ内で他のノードの位置に関わりなく、自由に位置設定できるノードです。フリーノードは、この動作を特徴とするとともに、ノードの移動に用いる楕円形のハンドルが、赤色ないし空っぽでなく、青色になることで識別できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ マインドマップの[空白箇所の]どこかで、ダブルクリックすると、新規のフリーノードが作成されます。新規作成されたフリーノードは、標準設定状態で「矩形の雲付きで、(エッジの)線を隠す」プロパティを備えています。これらのプロパティは通常の方法で、例えば「雲無しで、線を表示」に変更できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 既存のノードを選択し、「編集 > フリーポジションノードに指定/解除」をクリックすると、フリーノードに変わります。この場合、ノードのプロパティ(線、雲)は、従来のままです。通常の方法で、雲の付加や線を隠すといったプロパティの設定ができます。フリーノードは、当初、ルートノード付近に表示されますが、(青色)楕円形のハンドルのドラッグにより、好みの位置に移動できます。通常のドラッグ&ドロップによって、フリーポジションノードを別の親ノード/兄弟ノード上に移動させると、フリーポジション状態が解除されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ マインドマップの空白部分のクリックkによって作成されたフリーノードは、ルートノードに連結され、また、連結線(エッジ)は非表示になります。このフリーノードの子ノードを、これの親ノードの上半分に移動した場合、 ルートノード方向に移動するのは、このためです。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1188410566" HGAP="-234" VSHIFT="213"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フリーノードは、マインドマップ内で他のノードの位置に関わりなく、自由に位置設定できるノードです。フリーノードは、この動作を特徴とするとともに、ノードの移動に用いる楕円形のハンドルが、白抜きの赤色でなく、青色に塗りつぶされていることで識別できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ マインドマップの[空白箇所の]好みの場所で、<i>「Ctr」</i>キーを押した状態でクリックすると、新規のフリーノードが作成されます。新規作成されたフリーノードは、<i>「矩形の雲付きで、(エッジの)線を隠す」</i>プロパティを備えた<i>「フリーフローティングノード」</i>用システムスタイルで表示されます。これらのプロパティは通常の方法で、例えば「雲無しで、線を表示」に変更できます。これらのノードは、眼に見えない形でルートノードに結び付けられています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 既存のノードを選択し、<i>「編集 > フリーポジションノードに指定/解除」</i>をクリックすると、フリーノードに変わります。この場合、ノードのプロパティ(線、雲、折り畳み状態)は、従来のままです。通常の方法で、雲の付加や線を隠すといったプロパティの設定ができます。フリーノードは、当初、選択ノード付近に表示されますが、(青色)楕円形のハンドルのドラッグにより、好みの位置に移動できます。通常のドラッグ&ドロップによって、フリーポジションノードを別の親ノード/兄弟ノード上に移動させると、フリーポジション状態が解除されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ マインドマップの空白部分のクリックによって作成されたフリーノードは、ルートノードに連結され、また、連結線(エッジ)は非表示になります。このフリーノードの子ノードを、これの親ノードの上半分に移動した場合、 ルートノード方向に移動するのは、このためです。
+ </li>
+ </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">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このノードの左側でカーソルをホバーリングさせると、青色に塗りつぶされた楕円形が現れます。[位置を動かすには]この青色のハンドルを使って、ドラッグしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="アイコン" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" STYLE="combined" MIN_WIDTH="80">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="idea"/>
+<node ID="ID_715025500" HGAP="-56" VSHIFT="153" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ アイコンとは小さな画像のことです。Freeplane は、アイコンライブラリーを備えています。アイコンを選択するには、何種類かのメニューを利用できます。
+ </p>
+ <p>
+
+ </p>
+ <ol>
+ <li>
+ 表示画面の横側に表示されるアイコンバー。アイコンバーが表示されてない場合は、<i>「表示 < ツールバー < 左ツールバー」</i>を選択してください。
+ </li>
+ <li>
+ <i>「編集 > アイコン > アイコン一覧から選択」</i>選択時に表示されるアイコン一覧。
+ </li>
+ <li>
+ <i>「編集 > アイコン > 類別アイコン」</i>選択時に現れる、階層表示アイコンメニュー。
+ </li>
+ </ol>
+ <p>
+ アイコンをノードに付加するには、ノードを選択し、次にアイコンを選択します。アイコンを1つずつ削除するには、「最初/最後のアイコンを削除」アイコンを選択してください。これらのアイコンには赤い「×」印が付いています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ 同じノードに複数のアイコンを付加することができます。
+ </p>
+ </li>
+ <li>
+ 詳細フィールドやノートフィールドにアイコンを付けることはできません。
+ </li>
+ <li>
+ ユーザの独自アイコンを定義しツールバーに加えることができます。
+ </li>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードコアには、それぞれ1つだけサイズ変更できない「実寸」の画像を付すことができます。(異なるサイズの画像が必要な場合は、お絵かきソフトを使って元の画像をサイズ変更してください。)画像を付すには、ノードを選択した状態で、<i>「編集 > ノードコア関連 > 画像(ファイル選択 or リンクから)」</i>メニューを選択してください。同じメニューを使って、画像ファイル向けハイパーリンクアドレスのテキスト情報を本物の画像に変換することもできます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ サイズ変更可能な画像の付加については、<i>「ノード拡張情報」 </i>を参照。
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノード中の画像は貴重な表示スペースをとります。ハイパーリンクを使うと、ハイパーリンクを押して画像を閲覧できるようにしながら、この欠点を避けられます。ハイパーリンクを付加するには、元の画像をコピーし、ノードに貼り付けてください(ドラッグ&ドロップではありません!)。ノードの上のほうに貼り付けると、画像ファイル向けハイパーリンクは当該ノード自身に付加されます。ノードの子ノード側に貼り付けると、子ノードが作成されそこにハイパーリンクが格納されます。このハイパーリンクは、赤い矢印の形となります。貼り付け後は、画像ファイル向けの文字列パスも表示されます。これを消去したり、別のテキストに書き換えたりしても大丈夫です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 画像向けハイパーリンクを用いる代わりに、<i>「Ctrl」</i>を押した状態で画像をドロップすることもできます。この場合、画像はコアエリアではなく、ノード拡張情報エリアに格納されます(サイズ変更可能な画像)。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ インラインハイパーリンク(下線表示型ハイパーリンク)。このリンクを用いると、テキスト内で複数のリンクを利用できます。
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 上級ユーザなら、いわゆる HTML コードを使ってテキストのなかに画像を格納することができます。また、これを行なうためのスクリプトもあります。<i>「ヘルプ > マニュアル」</i>をご覧ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="進捗度指標" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" MIN_WIDTH="100">
+<node TEXT="ある種の進捗度表示が必要な場合、大小の進捗指標図を付すことができます。進捗度は変えることができます。進捗度を変える手順は、大きい図と小さい図とで全く異なることに、注意!" ID="ID_707469329" HGAP="28" VSHIFT="81" STYLE="fork"/>
+<node TEXT="小さい進捗指標図(アイコン)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1826965169" HGAP="26" VSHIFT="1" MAX_WIDTH="550" MIN_WIDTH="1" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 小さい進捗指標図を付加するには、<i>「編集 > ノードコア関連 > 進捗度 > 進捗度を上げる」</i>を選択してください。進捗度を上げるには、<i>「ノードの機能 > 進捗度 > 進捗度を上げる」</i>を(繰り返し)押してください。
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 大きい進捗指標図を付加するには、<i>「編集 > ノードコア関連 > 進捗度 > 大きい図を付加」</i>を選択してください。その後、進捗度%を上げるには、ダブルクリップしてください。下げるには、「Ctrl + ダブルクリック」してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 2つの画像が表示されます。小さいほうは、絵文字でノードコアに表示されます。大きいほうは、ノード拡張情報部分に表示される画像です。
+ </li>
+ <li>
+ <b>重要!</b> JAVAアプレットでは、大きいほうの画像 (svg file) を表示できません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="ノードを統合" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" MAX_WIDTH="600" MIN_WIDTH="100" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 複数のノードを選択して<i>「編集 > ノードコア関連 > ノードを統合」</i>を実行すると、これらのノードコアのテキストを結合することができます。統合されたノードの子ノードは、新規統合ノードの子ノードとなります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ この動作は、ノードにノードの詳細など、他の構成要素が含まれない場合に限って有効です。
+ </li>
+ <li>
+ ホットキー:<i>「Ctrl + J」</i>
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの分割は、2つの異なる作動形態に分かれます。1つは、メインメニューから呼び出すもので、今ひとつはエディタから呼び出します。
+ </p>
+ <ol>
+ <li>
+ 複数行からなるノードを選択し、<i>「編集 > ノードコア関連 > ノードを分割」</i>メニューを選択すると、選択中のノードコアを、それぞれ1行からなる複数のノードに分割することができます。
+ </li>
+ <li>
+ ノード編集中なら、テキストをカーソル位置で分割し、2つのノードに配置することができます。ダイアログエディタ中なら、<i>「分割」ボタン</i>を押してください。インラインエディタなら<i>「Alt + S」</i>を押してください。
+ </li>
+ </ol>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ノードの詳細などの他の構成要素は分割されません。
+ </li>
+ <li>
+ 詳細については<i>「ヘルプ > マニュアル」</i>をご覧ください。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_60050529" HGAP="-83" VSHIFT="116"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ コアテキストには、スプレッドシートのセルと同様に、"=" で始まる計算式を内蔵することができます。これに該当する場合は、計算式が実行され、その結果のみが表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スクリプトを用いれば、枝を跨いだ計算、つまりスプレッドシートのような動作をエミュレートすることができます。この点の説明については、赤い矢印をクリックして Wiki ページをご覧ください。
+ </li>
+ <li>
+ 標準設定では、計算式を含むノードコアは、縁取り表示されます。<i>「表示 > ノードコア案連 > 計算式ノードを縁取り表示しない」</i>を使って、枠囲いを外すことができます。
+ </li>
+ <li>
+ プロパティパネルを開いて「書式」フィールドを<i>「テキスト」</i>に設定すれば、自動計算機能を止めることができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1560196388" HGAP="-187" VSHIFT="52"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ全体の表示位置をずらすには、下記の方法があリます。
+ </p>
+ <ul>
+ <li>
+ 背景[空白部分]をクリックして、マップをドラッグする、
+ </li>
+ <li>
+ <i>「Ctrl+Shift+Cursor up/down/left/right」</i>でマップをパンニング表示する。
+ </li>
+ </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>
+</node>
+<node TEXT="選 択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1573267345" MIN_WIDTH="60">
+<hook NAME="FirstGroupNode"/>
+<node TEXT="自動選択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" MAX_WIDTH="600" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カーソルをノードの上でホバーリングするだけで、ノードを選択することができます。少し間を置いて、ノードが選択状態であることを示す青い縁取りが表示されるはずです。これを、自動選択と呼びます。ノードをクリックして選択することもできます。最後に、<i>「ナビゲーション」</i>メニューのフォーカス移動や<i>「検索」</i>機能でもノードを選択します。
+ </p>
+ </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>
+</node>
+<node TEXT="選択フォーカスを保持" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 一定の状況下では、ノードの自動選択が邪魔になることがあります。カーソルを他のノード上を通過させつつ、元のノードを選択したまま保持することもできます。その場合は、ノード選択後に、カーソルを他のノード上を通過させる際に<i>「Shift」</i>を押した状態で操作してください。
+ </p>
+ </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>
+<edge STYLE="hide_edge"/>
+</node>
+</node>
+<node TEXT="ルートへジャンプするキー" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<edge STYLE="bezier"/>
+<node ID="ID_279008116" HGAP="-145" VSHIFT="23"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 大きなマップでは、所在を見失いがちです。<i>「Esc」</i>を押せば、たちどころに選択がルートノードにジャンプします。
+ </p>
+ </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>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのノードを選択する場合は、最初にルートノードを選択し(<i>「Esc」</i>を押す)、次に<i>「Ctrl + A」</i>を押してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node ID="ID_1801157892" HGAP="16" VSHIFT="8">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="video/Guide/EditingBeginner/EditingGuide-Beginner.mm#ID_594788969">ビデオ</a>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
+</hook>
+<node TEXT="あるノードを現在の親ノードから切り離し、別の親に結びつけるには、当該ノードをクリックして新しい位置にドラッグするだけです。このノードの子ノード群に書かれているように、対象ノードでのドロップ位置を変えることができます。並べ替えによってノードを移動させることもできます。" FOLDED="true" ID="ID_1599927930" HGAP="-186" VSHIFT="39">
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="他のノードとの結合関係を損なうことなく、ノードの位置を変更するするには、ノードの親ノード側にある楕円形の操作ハンドルを見つけてください。ノードの親側でカーソルを動かし楕円形の色が変わるまで探してください。次に、楕円形をクリックして、ノードを移動したい場所までドラッグしてください。ノードに合わせて他のノードも動くかもしれません。楕円形のハンドルをダブルクリックすると、移動したノードを元の位置に戻すことができます。" ID="ID_1319283887" HGAP="-116" VSHIFT="45">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 対象ノードで、別ノードをドロップする際、その位置に応じて2とおりの異なる動作が行なわれます。カーソルを置くと、それらの位置関係が見えるようになります。
+ </p>
+ <ol>
+ <li>
+ カーソルを対象ノードの上部に置くと、ノードの上半分の色が変わります。この状態でノードをドロップすると、そのノードは対象ノードの上方に位置する兄弟ノードとなり ます。
+ </li>
+ <li>
+ カーソルを対象ノードの子ノード側に置くと、ノードの左側か右側かの色が変わります。この状態でノードをドロップすると、そのノードは対象ノードの子ノードとして連結されます。<br/>
+ </li>
+ </ol>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ルートノードについては、左側にでも、右側にでもノードをドロップすることができます。これは、線を非表示中のノードにも当てはまります。
+ </li>
+ </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>
+</node>
+<node ID="ID_1561397135" HGAP="16" VSHIFT="8">
+<icon BUILTIN="video"/>
+<icon BUILTIN="internet"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="video/Guide/EditingBeginner/EditingGuide-Beginner.mm#ID_380057632">ビデオ</a>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1239614830" HGAP="-84" VSHIFT="62"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ まとめノードを含む1つのグループ全体のノードを移動することができます。
+ </p>
+ <ol>
+ <li>
+ グループを選択してください。<i>「Shift」</i>を押した状態で、まずまとめノード群の始点ノードを選択し、次にまとめノードを選択します。
+ </li>
+ <li>
+ <i>「Shift」</i>を押したまま、選択ノード群を新しい位置にドラッグしてください。
+ </li>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの位置を変更した後で、元の位置に戻すことができます。対象ノードを選択し、<i>「編集 > ノードの位置をリセット」</i>を選択してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="ノードを並べ替え" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" MAX_WIDTH="600" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードをアルファベット順に並べ替えたくなることがあるかもしれません。あるノードを選択しているとすると、ノードを右クリックし<i>「子ノードを並べ替え」</i>を選択すると、子ノードを並べ替えることができます。<i>「編集 > ノードの移動と並べ替え」</i>を使うと、他のオプションもあります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_751107880" HGAP="-28" VSHIFT="43"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの階層を定義する基本的な関係付けには、線(エッジ)を使います。線の曲がり具合や色、太さを変えられるほか、線を隠す(非表示にする)こともできます。これらの変更は、下で説明する<b>「プロパティパネル」</b>又は<b>「書式」</b>メニューで行ないます。
+ </p>
+ </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>
+</node>
+<node TEXT="コネクタ" STYLE_REF="Beginner" FOLDED="true" ID="ID_1073407528" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 任意の2つのノードを(2ノード間)<b>コネクタ</b>と呼ばれる線で結びつけることができます。
+ </p>
+ <ul>
+ <li>
+ ノードを右クリックし、連結したいノードにドラッグしてください。
+ </li>
+ </ul>
+ <p>
+ コネクタの<b>曲がり具合</b>は、コネクタ上で左クリックしドラッグすることにより変えられます。矢印の向きを変える場合は、点付きのハンドルラインをドラッグしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 次のやり方で、コネクタの<b>形状</b>を変えたり、コネクタに<b><i>ラベル</i></b>を付けたりすることができます。
+ </p>
+ <ul>
+ <li>
+ コネクタを右クリックし、開くコンテキストメニューのオプションを選択してください。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ コネクタを定義する場合、この他に「Shift + Ctrl + 右クリック」を使うこともできます。
+ </li>
+ <li>
+ 2つのノードを選択したうえで、二番目のノードを右クリックし、<i>「Ctrl」</i>キーを押しながら<i>「コネクタを付加」</i>をクリックすることもできます。
+ </li>
+ <li>
+ 始点のないコネクタ、つまり<b>片道</b>コネクタを作成する場合は、当該ノードを右クリックし同じノードにドラッグしてください。
+ </li>
+ </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"/>
+<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="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>
+</node>
+</node>
+</node>
+<node TEXT="まとめノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1700918771" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ いわゆる<b>まとめノード</b>を使うと、兄弟ノード群を関係付けることができます。このまとめノードは、兄弟ノードを波括弧で一括りにします。兄弟群を選択し、「Ctrl]を押しながら選択されたノードのどれかを右クリックして、ノードコンテキストメニューの<i>「新規まとめノード(選択ノード群)」</i>を選んでください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ この他の拡張オプションもあります。これらについて詳しくは、「マニュアル」をお読みください。
+ </li>
+ </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">
+<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">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="雲囲いノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1150908697" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>雲</b>と呼ばれる共通の背景を付すと、複数のノードからなる枝全体を1つのグループとして視覚的に表現することができます。枝の親に当たるノードを右クリックし、[コンテキストメニューで]<i>「ノード > 雲(標準)を付加」</i>を選択してください。雲の色や形は、下記で説明する<i>「プロパティパネル」</i>で変更できます。ノードグループに属するノードの折り畳みを防ぐ場合は、<i>「編集 > ノードグループ > 常にノードを展開」</i>をオンにしてください。
+ </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">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="b" ID="ID_1270291744"/>
+<node TEXT="c" ID="ID_1022872809"/>
+</node>
+<node TEXT="雲 b" STYLE_REF="AdvancedTopic" FOLDED="true" ID="ID_539843005" HGAP="30" VSHIFT="-9">
+<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
+<node TEXT="e" ID="ID_249943796"/>
+<node TEXT="f" ID="ID_1428582117"/>
+</node>
+<node STYLE_REF="AdvancedTopic" ID="ID_649516172" TEXT_SHORTENED="true">
+<icon BUILTIN="../Cloud24"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「雲(標準)を付加」</i>のアイコン
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Find this icon button in the toolbar
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="bezier"/>
+</node>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Beginner" LAST="false"/>
+</hook>
+<node TEXT="ダイナミックリンク(ハイパーリンク)は、リンク元ノードからリンク先オブジェクトに向けた電子的関係付けのことです。リンク先は、ディレクトリ、ファイル、ウェブペ-ジ、アプリケーション、そして E-mail などを指定できます。関係付けがあると、クリッカブル、すなわち、ダブルクリックでオープンできます。リンクは、下線付きテキスト、または赤や緑の矢印で表示されます。赤い矢印は、外部アドレスないし E-mail アドレスにつながります。緑の矢印は、内部アドレス(他のノード)につながります。下線付きテキストは、どちらにも使えます。下線表示型ハイパーリンクは同じノード内で複数使うことができます。矢印型リンクや E-mail アドレスは、各ノード1つしか使えません。矢印型アイコンはノードコア内に表示されます。また、いわゆる属性にもハイパーリンク(複数可)を置くことができます。最後に、他のアプリケーションからマップ内の特定ノードにリンクを張ることもできます。下線表示型ハイパーリンクを起動するには、それをダブルクリックします。" ID="ID_840626562" HGAP="-70" VSHIFT="73">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 下記の手順を[使うと、特に2つのノードが同一マップ内の離れた位置ににある場合や別々のマップ上にある場合、それらを結び合わせるリンクの作成が容易になります。
+ </p>
+ <ul>
+ <li>
+ リンクするノードの一方を右クリックし、<i>「リンク > リンクアンカーをセット」</i>を選択し、
+ </li>
+ <li>
+ リンクするノードのもう片方を右クリックし、<i>「リンク > アンカーからのリンクを作成」</i>、又は<i>「リンク > アンカーへのリンクを作成」</i>を選択します。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>「リンクアンカーをセット」</i>を実行すると、既存のアンカーは削除されます。
+ </li>
+ <li>
+ Freeplane 終了時に、アンカーは削除されます。
+ </li>
+ <li>
+ お互いのノードが近接している場合は、下方に示す別の手順を参照してください。
+ </li>
+ </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"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1913035829" HGAP="-75" VSHIFT="192"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ外のアドレスへのハイパーリンクは、ノードを右クリックして「リンク」を選択するやり方でも作成できます。しかしながら、外部オブジェクト向けのハイパーリンクないしハイパーリンク群を付加する最も簡単な方法は、ドラッグ&ドロップを用いるやり方です。ディレクトリやファイル、ファイルあるいは Web アドレスのコピーをドロップすると、選択されたノードにハイパーリンク付きの子ノードができます。子ノードの見出しにハイパーリンクの対象アドレスが表示されます。このテキストを削除したり変更しても、ハイパーリンク自身の動作には影響しません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 一群のハイパーリンクをドロップすると、照応して一群の子ノードができ、それぞれに1つずつハイパーリンクが格納されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンクの対象アドレスを編集するには、リンクを含むノードを右クリックし、<i>「リンク > <font color="#000000">リンクを指定(タイプ入力)...</font>」</i>を選択してください。開いたダイアログで、アドレスを編集することができます。<i>「Ctrl + V」</i>を使えば、コピー済みのアドレスを入力フィールドに貼り付けることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 別のマインドマップ上のノードにリンクを張る場合は、<a href="#ID_1418102707">外部から特定ノードへのリンク</a> を参照してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンク(矢印型リンク)や E-mail アドレスを削除するには、ノードを右クリックし、
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定(タイプ入力)...」</i>を選択するか、又は「<i>Ctrl + K」</i>を押し、
+ </li>
+ <li>
+ テキストフィールド内のテキスト(アドレス)を削除してください。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ プロパティパネルを使って、矢印型ハイパーリンクの表示を、ノードコア全体を下線付きトテキスト形式のリンクに変換することできます。これは、他の下線表示型ハイパーリンクが一切起動されていない場合に限り、有効です。
+ </li>
+ <li>
+ 画像ファイルをノードにドロップすると、ハイパーリンクでなく、画像を表示させることができます。この場合、<i>「Cntl」</i>キーを押した状態でドロップ操作を行なってください。
+ </li>
+ </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>
+</node>
+<node TEXT="内部リンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_1942100751" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ [同じマップ上の]1つのノードから別のノードに向けたハイパーリンク(ローカルリンク)を設定するには、2つのノードを選択し、次に<i>「Ctrl」</i>を押しながらどちらかのノードを右クリックし、そして<i>「リンク > ローカルリンク」</i>メニュ-を選んでください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンク(矢印型リンク)や E-mail アドレスを削除するには、ノードを右クリックし、
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定(タイプ入力)...」</i>を選択するか、又は「<i>Ctrl + K」</i>を押し、
+ </li>
+ <li>
+ テキストフィールド内のテキスト(アドレス)を削除してください。
+ </li>
+ </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>
+</node>
+<node TEXT="E-mail リンク" STYLE_REF="Professional" FOLDED="true" ID="ID_869144882" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザの E-mail プログラムを自動的に開く、E-mail リンクを作成する最も簡単な方法は、E-mail アドレスをコピーしてノードに貼り付けるやり方です。これで、選択ノードにリンク付きの<b>子ノード</b>ができます。子ノードのテキストは、E-mail アドレスになりますが、これは、例えば、相手氏名だけに書き換えてもかまいません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ (新たな子ノードを形成することなく)特定のノードに、E-mail リンクを付加したい場合は、当該ノードを右クリックして<i>「リンク先を指定(テキスト入力)...」</i>を選択してください。そして、テキストフィールドに下記のように入力してください。
+ </p>
+ <ul>
+ <li>
+ <i>「mailto:emailaddress」</i><br/> 例: mailto:jokro at freeplane.nl
+ </li>
+ </ul>
+ <p>
+ ハイパーリンク(矢印型リンク)や E-mail アドレスを削除するには、ノードを右クリックし、
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定(タイプ入力)...」</i>を選択するか、又は「<i>Ctrl + K」</i>を押し、
+ </li>
+ <li>
+ テキストフィールド内のテキスト(アドレス)を削除してください。
+ </li>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 下線表示型<a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">リンク</a>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 下線表示型ハイパーリンク(HTML リンク)を定義するには、まず最初に、ノードコア、ノードの詳細、又はノートのテキストダイアログを開いてください。次に、リンクを適用する文字列をタイプ入力し、選択してください。
+ </p>
+ <p>
+ そして最後に、ダイアログウィンドウの<i>「編集」</i>メニューから、<i>「リンク先を指定(ファイル選択)...」</i>又は<i>「 リンク先を指定(タイプ入力)」</i>を選択してください。後者の場合、ハイパーリンクのアドレスをタイプ入力してもよいし、<i>「Ctrl + V」</i>を押してコピー済みのアドレスを貼り付けることもできます。
+ </p>
+ <ul>
+ <li>
+ <font color="#ff0000"><a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1"><i>この</i></a></font><a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">リンク</a> をクリックすると、Freeplane Open Forum にジャンプします。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ ハイパーリンク適用文字列をに変更を加える場合は、タイプ入力し直すだけです。この操作は、リンク先アドレスに変更を加えるものではありません。
+ </p>
+ </li>
+ <li>
+ リンク先のアドレスを変更する場合は、下線付きの文字列全体を選択して、再度<i>「リンク先を指定(ファイル選択)...」</i>又は<i>「 リンク先を指定(タイプ入力)」</i>を選択してください。
+ </li>
+ <li>
+ 同一のノードコア、ノードの詳細、あるいはノートフィールド内に、複数の下線表示型ハイパーリンクを置くことができます。
+ </li>
+ <li>
+ 文字列が書式設定無し、又はプロパティパネルによる書式設定のみに場合、リンクは青色表示されます。文字列が、編集ダイアログのメニューで書式設定されている場合は、当該のダイアログで設定された色や文字サイズを反映します。
+ </li>
+ <li>
+ 別のノード向けの内部リンクを付加する場合は、アドレスに "#ノードID"を入力してください。ノードIDを取得するには、ノード上で右クリックして<i>「ノードIDをコピー」</i>を選択してください。そして、<i>「リンク先を指定(タイプ入力)」</i>の選択時に開くダイアログの<i>「リンク先を指定」</i>フィールドで<i>「Ctrl + V」</i>を用いてこのノードIDを貼り付けてください。ノードID の前に"#"を置くことを忘れないでください。
+ </li>
+ <li>
+ 別のマインドマップ上のノード向けリンクを作成する場合は、<a href="#ID_1418102707">外部から特定ノードへのリンク</a> を参照してください。
+ </li>
+ <li>
+ 同じマインドマップ上のノード向けリンクを設定する場合、アドレスに "#ノードID" を含めて下さい。ノードIDは、右クリックして<i>「ノードIDをコピー」</i>を選択すると取得できます。コピーしたノードIDは、リンクアドレス入力フィールド<i>に「Ctrl + V」</i>を用いて貼り付けることができます。<font color="#990099">[○この項目、2つ上の●と内容が重複している!]</font>
+ </li>
+ <li>
+ 下線表示型ハイパーリンクのアドレスと文字列の両方を削除するには、ハイパーリンク適用文字列全体を削除してください。文字列を残し、アドレスだけを削除する場合は、
+
+ <ul>
+ <li>
+ カーソルを下線付き文字列の途中に置き(文字列を選択するのではない)、
+ </li>
+ <li>
+ <i>「編集 > リンク先を指定(タイプ入力)...」</i>をクリックし、
+ </li>
+ <li>
+ 開いたダイアログのアドレスを削除してください。
+ </li>
+ </ul>
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1108178356" HGAP="-132" VSHIFT="86"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ メニュー項目をノードに連結し、このノードをクリックして当該のメニュー項目[の機能]を起動できるようにすることもできます。ノードを特定のメニュー項目に直接連結するには、当該ノードを右クリックし<i>「リンク > 機能リンク(メニューに対応)...」</i>を選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンク(矢印型リンク)や E-mail アドレスを削除するには、ノードを右クリックし、
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定(タイプ入力)...」</i>を選択するか、又は<i>「Ctrl + K」</i>を押し、
+ </li>
+ <li>
+ テキストフィールド内のテキスト(アドレス)を削除してください。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_116460964" HGAP="-26" VSHIFT="60"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ メニュー項目[の機能]を起動したい時には、そのメニュー項目まで移動しクリックしなければなりません。操作を高速化するために、ユーザは当該メニュー項目に対するショートカットないしFキーを指定することができます。この場合は、<i>「ツール > ショートカットキーを割り当て」</i>を選んでください。また、<i>「ツール <font color="#000000">> ホットキーのプリセット > プリセットを保存」</font> </i>を用いれば、様々なシチュエーションでの使用を想定して、ショートカットキーセットに名前を付けて保存することもできます。以前に保存されたセットをインストールするには、<font color="#000000"><i>「ツール > ホットキーのプリセット」</i>をクリック</font>し、一覧表からセットを1組選び出すだけです。
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_822375535" HGAP="-160" VSHIFT="117"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 他のプログラム、ないし他のマインドマップから対象マップ中の特定ノードにジャンプする場合は、ハイパーリンク用アドレス指定フィールドに、"#"を前後挟む形で、対象マインドマップへのパス及びノードIDを記入しなければなりません。リンク元マップとリンク先マップが同じディレクトリにある場合、アドレスは、"リンク先マップ.mm#ノードID" 、例えば、"WhatIsMindmapping.mm#ID_930373151" の形で定義することができます。このやり方は、親ディレクトリ全体を移動しても、リンク関係に問題が生じない点で、優れています。この他の場合は、絶対パスを用いなければなりません。完全パス名を取得するには、ノードを右クリックし<i>「ノードURIをコピー」</i>を選択してください。この後、リンクアドレス編集フィールドで<i>「Cntrl + V」</i>を実行すると、このアドレスが貼付されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 特定ノードへのジャンプは、ノードID 情報を受け渡しできるアプリケーションでしか作動しません。もちろん、これには Freeplane も含まれます。MSWord など、他の多くのアプリケーションは、ノードIDを受け渡すことができません。したがって、これらのアプリケーションからは、ルートノードにしかジャンプできません(こうした場合、次善の策として、ジャンプしたいノードだけを表示するように折り畳んだ状態で、マインドマップを保存することが考えられます)。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="書式とスタイル" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" NUMBERED="true" MIN_WIDTH="200" 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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、ひとつのノード全体、あるいはすべてのノードに適用されるプロパティを様々に設定ないし変更することができます。ノードの基本色やノードの縁取り囲い、テキストの文字サイズ、ノードコアの横幅などについていろいろと思いを広げることができます。プロパティの編集で最も使い勝手の良い手段が、<b>プロパティパネル</b>にあります。プロパティパネルを開いたり閉じたりするには、マップの背景の空白スペースで右クリックし、<i>「プロパティパネル」</i>を選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 別のパネルの開閉方法として、<i>「表示 > プロパティパネル」</i>の選択があります。
+ </li>
+ <li>
+ 別のプロパティ項目の変更方法として、<i>「書式」</i>メニューの使用があります
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node ID="ID_757079047"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Uncheck if you want to return to the default behaviour. Also uncheck if you want conditional styles affect (set) the property.
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「プロパティパネル」</i>は、フォーカス状態にあるノードのプロパティーを表示します。選択中のノードのプロパティしか変更できません。(通常ユーザが選択するノードは1つですが、一部のプロパティについては、一度に複数のノードを選択し、変更を加えることができます。)パネルが表示されている間に、ユーザはあちこちのノードを選択しフォーカスを移すことができます。特定のプロパティ項目を変更するには、プロパティの値を変更してください。すると、変更された値の適用を示すチェックもセットされます。デフォルトの動作に戻したい場合は、チェックを外してください。また、条件対応スタイルをプロパティに適用したい場合にも、チェックを外してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>用例1</b>:<i>「ノードの形」</i>というプロパティグループに行き、<i>「ノードスタイル」</i>をクリックしてください。<i>「囲み」、「フォーク」、「親と同じ」</i>といったオプションを含むドロップダウンメニューが現れます。これらのオプションを試して何がおきるかご覧ください。現在閲覧中のノードについては、<i>「囲み」</i>オプションが選択されています。ご覧のように、このオプションの適用範囲はコアに限られます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>用例2</b>:<i>「線」</i>の<font color="#ff0000">プロパティ</font>グループに行き、<i>「線の形状」</i>のボックスをチェックしてください。<i>「線の形状」</i>の右隣をクリックすると、「直線」、「<font color="#000000">緩やかな</font>曲線」、「線を隠す」といった利用可能な形を示すドロップダウンメニューが現れます。これらを試して、どのような形が利用できるのか理解してください。また、ご覧のノードをクリックすると、[プロパティパネル」におけるいくつかプロパティ項目の変更事例を見ることができます。
+ </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">
+<edge STYLE="linear"/>
+</node>
+<node TEXT="ベジェ曲線" STYLE_REF="AdvancedTopic" ID="ID_1333040751" HGAP="35" VSHIFT="-27">
+<edge STYLE="bezier"/>
+</node>
+<node TEXT="線を隠す" STYLE_REF="AdvancedTopic" ID="ID_1968961455" HGAP="40" VSHIFT="-5">
+<edge STYLE="hide_edge"/>
+</node>
+<node TEXT="直角曲がり" STYLE_REF="AdvancedTopic" ID="ID_494591913" HGAP="39" VSHIFT="25">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1565463565" HGAP="-83" VSHIFT="59"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 初期設定では、Freeplane の新規マップは、新しく作られる枝にそれぞれ別の色を付すようになっています。これは、マインドマップ考案者が重視する原則の1つ、すなわち、頭脳がより容易に情報を構造化し記憶するのに彩色が役立つとの考えをサポートするものです。このプロパティは、<b>「線の色を自動選択」</b>と呼ばれ、プロパティパネルで無効にできます。この機能を無効にするには、プロパティパネルを開き、<i>「プロパティパネル」</i>の一番上にあ<i>る「ノードのスタイル」</i>のプロパティグループを見つけてください。そして、このチュートリアルのマインドマップのように、<i>「線の色を自動選択」</i>のチェックを外してください。
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1531819965" HGAP="-114" VSHIFT="46"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「プロパティパネル」</i>のオプションの1つに、自動的に<b>「ノードに番号振る」</b>があります。ユーザは、まずグループをを選択し(各ノードをクリックする際に、<i>「Shift」</i>ないし<i>「Ctrl」</i>を押したまま操作してください)、次に<i>「プロパティパネル」</i>でこのオプションにチェックを付けることで、ノードグループのノードに番号を振るよう設定することができます。
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネルのオプション群をよく見てください。<i>「ノードのスタイル」</i>グループのプロパティについては、すぐ後で説明します。他のプロパティの大半は、見れば解るはずです。すべてのプロパティについて、詳しくは Freeplane マニュアルで説明しています。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="書式メニュー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" HGAP="29" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネルのプロパティは、<i><b>「書式」</b></i><b>メニュー</b>経由でも利用できます。<i>「書式」</i>メニューには、プロパティパネルでぱ設定できないプロパティがいくつか含まれます。たとえば、<i>「マップの背景色」</i>や<i>「ノードを点滅」</i>(コア部分)などです。
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「プロパティパネル」</i>にあるプロパティの一部は、メインメニューバーの下にある<b>ツールバー</b>上の<b>アイコン</b>でも利用できます。右に、<i>斜体</i>と<b>太字</b>の事例を示します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>重 要</b>
+ </p>
+ <ul>
+ <li>
+ <i>プロパティパネル</i>、<i>「書式」</i>メニュー、あるいはツールバーで設定された太字や斜体は、当該のノードコア全体に(強制)適用されます。
+ </li>
+ <li>
+ 太字や斜体をノードコアの一部に適用するには、上方の<i>「初心者マップ」</i>で説明したやり方を使ってください。
+ </li>
+ <li>
+ 一度に同じノードに両方の方法を使うと、想定外の影響が出るかもしれません。例えば、第1の方法で設定された太字を、第2の方法を使って取り消すことはできません。
+ </li>
+ </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">
+<icon BUILTIN="../Bold16"/>
+<font NAME="SansSerif" SIZE="12" BOLD="true" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールバー上にあるこれと同じアイコンボタンは、ノードテキスト全体に作用します。
+ </p>
+ </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">
+<icon BUILTIN="../Italic16"/>
+<font ITALIC="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールバー上にあるこれと同じアイコンボタンは、ノードテキスト全体に作用します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スタイル(クラス)は、一連の視覚関連プロパティを素早く適用、変更したり、あるいは関連するすべてのノードについて一度に適用されるテンプレートテキストを定義したりする手段です。また、スタイルは、特定種類の内容や構造をもつノードの検索やフィルタ表示にも利用できます。このクィックリファレンスも、スタイルを用いて作成しています。この点については、<a href="#ID_1394424447">The making of this mind map</a> のノードを参照してください。
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_602520818" HGAP="-116" VSHIFT="124"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Freeplane は、多数のシステムスタイルを装備していますが、それはユーザ独自のスタイルを用いて拡張することができます。表示画面最上部のワークメニューバーの「雲を付加」アイコン隣のフィールドにスタイルリストが表示されています。このリストからスタイルを1つ選んでクリックすれば、選択ノードにこのスタイルが適用されます。現在閲覧中のノードには、<i>「TitlesContent</i> <i>」</i>スタイルが適用されています。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>ノート</b></font>
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">スタイルは、次の方法でも利用できます。</font>
+ </p>
+ <ul>
+ <li>
+ <i>ツールバー</i>を使用
+ </li>
+ <li>
+ <i>「書式 > スタイルを適用」</i>メニューを使用
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">プロパティパネルの<i>「ノードのスタイル」</i>グループ、<i>「スタイル</i>」フィールドを使用。なお、プロパティパネルは、背景の空白部分で右クリックしプロパティパネルを選ぶと、開きます。</font>
+ </li>
+ </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="通常は、別のスタイル、例えば、「標準スタイル」を選択してください。例えば階層別スタイルを使用中の場合。この自動スタイルに優先するスタイルをかぶせていることもあります。その場合は、「書式 > スタイルを適用 > ノードスタイルをリセット」を使って、手動設定スタイルを削除してください。" STYLE_REF="TitlesContent" ID="ID_1278689402" HGAP="-140" VSHIFT="43"/>
+</node>
+<node TEXT="ノードダイアログでスタイルを編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" HGAP="30" VSHIFT="2" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザは、ノードを選択し、「書式 > スタイルを管<i>理 > 選択ノードから新スタイルを作成」</i>を実行することで新しいスタイルを定義することができます。このスタイルに独自名称をつけることを求められ、選択ノードのプロパティがこのスタイルにコピーされます。また、<i>「書式 > スタイルを管理 > スタイルを編集」</i>メニューを用いて、専用のスタイルダイアログ開くこともできます。[ここで、]各種スタイルの1つを右クリックし、<i>「選択ノードから新スタイルを作成」</i>を実行することにより、スタイルを追加することもできます。スタイルを定義してしまった後でも、利用可能なメニューやプロパティパネルの専用のスタイルダイアログを用いてスタイルを修正することができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ Freeplane マニュアルをご覧ください。
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スタイルは、ノードに含まれる情報が特定種類のものであることを示すのに利用できます。一例を挙げれば、ご覧のノードの親に当たる「複数スタイルの適用」というノードは、"Acvanced" と "Example" の2つのスタイルを使っています。"Acvanced" は黄色に着色を施すもので、 "Example" は「眼」のアイコンを付します。この事例を実現するには、まず2つのスタイルを定義し、次に<i>「プロパティパネル」</i>を開き<i>「ノード用条件対応ノードスタイル」</i>の下をクリックして、これらを条件対応ノードスタイルとして適用します。すると、ダイアログが開くので、このダイアログで次のように操作してください。
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ <i>「新規」</i>をクリックして、
+ </li>
+ <li>
+ 開いたルール行で、<i>「標準スタイル」</i>を[ダブル・]クリックしてスタイルリストを開いてください。[そして、] <i>Advanced </i>を選択してください。
+ </li>
+ <li>
+ 再度「新規」をクリックし、[次に]「標準スタイル」を再度[ダブル]クリックし、<i>Example </i>を選択してください。
+ </li>
+ <li>
+ <i>「OK」</i>をクリックしてください。
+ </li>
+ </ul>
+ <p>
+ この後、ノードに両方のスタイルが適用されていることを確認してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スタイルについて詳しくは、Freeplane マニュアルをお読みください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node ID="ID_1769439600"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Advanced makes the yellow color and Example adds the eye-icon. To implement this example, first define the two styles and then apply them as node conditional styles by opening the<i> Properties panel </i>and clicking below <i>Node conditional styles for node. </i>Now a dialog opens and in this<i> </i>dialog:
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="es" ID="ID_170106264"/>
+</node>
+</node>
+<node TEXT="条件対応スタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" HGAP="31" VSHIFT="-1" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 上の用例では、複数の条件が無条件に適用されました。一定のフィルタ条件により特定されるある条件が充たされる場合に限って、スタイルを適用することもできます。次の事例では、一定の更新日以降にノードが修正されているかどうかを示すために、条件対応スタイルを用いています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>用 例:更新(リビジョン) </b>
+ </p>
+ <ul>
+ <li>
+ まず、独自の「R」印の更新アイコンを付したまず、独自の「R」印の更新アイコンを付した<i>「Revision」</i>スタイルを定義します(スタイル一覧を参照)。
+ </li>
+ <li>
+ 次に、<i>「プロパティパネル」</i>で<i>「マップ用条件対応ノードスタイル」</i>の下方をクリックしてダイアログを開きます。「新規」ボタンをクリックして、フィルタを追加します。この新たにできたルールをクリックし、フィルタ条件(以降に変更された、日付)を定義します。このフィルタルールを選択し、<i>「OK」</i>ボタンを押します。
+ </li>
+ </ul>
+ <p>
+ 「条件対応スタイルを管理」ダイアログを見ると、上に定義したルールはチェックが外されているはずです。通常の場合、ユーザにとって「R」アイコンを眼にするのは煩わしいはずなので、あえてそのように設定しました。更新を残さず見るには、ノードを展開しなければなりません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ノード用条件対応ノードスタイルとマップ用条件対応ノードスタイルについて、詳しくは 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1011147934" HGAP="-92" VSHIFT="200"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 条件対応ノードスタイルの適用の1つに、各ノード階層毎に異なる体裁を自動的に付与することがあります。例えば、ユーザが5段階のノード階層を必要としているとしましょう。その場合、ユーザは各階層に応じて5つのスタイルを定義します。次に、5つの条件対応ノードスタイルルールを定義します。作業の便宜を図るために、このケースについては Freeplane がユーザに代わって事前に定義したものがあります。<i>「プロパティパネル」の「ノードのスタイル」</i>プロパティグループの<b><i>「自動レイアウト」</i></b>にチェックするだけです。チェックが付いていれば、各ノード階層毎に、異なる体裁が自動的に付されるはずです。ルートノードのスタイルは、「タイトル」スタイルと呼ばれます。他の階層スタイルは、「見出し1」「見出し2」「見出し3」「見出し4」となります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 各階層に使われているスタイルがお気に召さない場合は、次の手順で変更することができます。
+ </p>
+ <ul>
+ <li>
+ <i>スタイル[ダイアログで 「書式] > スタイルを編集」</i>メニューを選択し、
+ </li>
+ <li>
+ 変更したいノード階層(ルート、第1階層、第2階層、第3階層、第4階層、第5階層、第6階層)を選択し、
+ </li>
+ <li>
+ その書式を変更してください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ 5を超える階層別スタイルが欲しい場合は、<i>スタイル[ダイアログの「書式] > スタイルを編集」 </i>で「自動レイアウトスタイルに新規階層を追加」を実行して、<i>「階層別スタイルを適用」</i>の後にそれらを追加するだけです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 階層別スタイルの適用を4以下にしたい場合は、<i>スタイル[ダイアログの「書式] > スタイルを編集」 で「階層別ス</i>イルを削除」を実行して、<i>「階層別スタイルを適用」</i>の後のスタイルを削除してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ Freeplane マニュアルに、もっと詳しい情報があります。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1896765128" HGAP="-96" VSHIFT="87"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規マップの作成時に、Freeplane は、default.mm という名のマップから、いわゆるマップスタイル情報を取得します。こうして、新規マップ作成時に、すべての標準設定につきが毎回同じ設定がなされることになります。お気に入りの設定でマップを作成できるように、ユーザは default.mm を修正することができます。このマップは、<i>「ツール > ユーザディレクトリを開く > テンプレート」</i>にあります。今ひとつのお薦めは、意識的に別のマインドマップから新規マップを開くことです。これについては、<font color="#ff0000"><i>「ファイル > テンプレートから新規マップ」</i></font>を使ってください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="テンプレート" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" NUMBERED="true" MIN_WIDTH="90">
+<node TEXT="ノードスタイルには、内容や属性の事前定義テキストの形をとったテンプレート型の情報が含まれることがあります。ユーザは、このいわゆるスタイル装着情報を、手動でコピーすることができます。その場合は「編集 > ノード拡張情報 > スタイルノードから拡張情報をコピー」を選択してください。" FOLDED="true" ID="ID_1268042238" HGAP="-59" VSHIFT="44" STYLE="fork">
+<node FOLDED="true" ID="ID_357953420" HGAP="-599" VSHIFT="177"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ テンプレート定義の手順は以下のとおりです。a
+ </p>
+ <ul>
+ <li>
+ 新しいテンプレート[の名称]を、例えば "MyTemplate" と定義し、
+ </li>
+ <li>
+ <i>「書式 > スタイルを管理 > スタイルを編集」</i>メニューで、スタイルエディタを開いて
+ </li>
+ <li>
+ "MyTemplate" の詳細を編集し(編集 > ノード拡張情報 > ノードの詳細を..編集)、
+ </li>
+ <li>
+ "MyTemplate" に属性を付加し(編集 > ノード拡張情報 > ノードの属性を..編集)、
+ </li>
+ <li>
+ スタイル編集ダイアログを閉じ(編集済みのスタイルを保存し)、
+ </li>
+ <li>
+ 新規ノードを開き、
+ </li>
+ <li>
+ 新たに "MyTemplate" スタイルを適用します (編集 > ノード拡張情報 > スタイルノードから拡張情報をコピー)。
+ </li>
+ </ul>
+ <p>
+ これで、新規ノードは、 <font color="#ff0000">"MyTemplate"</font> で入力したテキストと属性を持つはずです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="その他" STYLE_REF="Advanced" FOLDED="true" ID="ID_429763637" NUMBERED="true" MIN_WIDTH="90">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_885396924" HGAP="-223" VSHIFT="32"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 通常、ブラウザからテキストを貼り付けると、書式まで貼り付けられてしまいます。次のちょっとしたプログラムをインストールすれば、書式なしのテキストを貼り付けることができます。<a href="http://www.stevemiller.net/puretext/">http://www.stevemiller.net/puretext/</a> を参照。
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードを1行ずつに整理したり、あるいは、単に独自の幅、つまり固定幅にしたい場合は、
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > ノードの表示幅を設定」</i>を実行するか、
+ </li>
+ <li>
+ <i>「プロパティパネル」</i>をご覧下さい
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 現在ご覧ののノードは、"最小表示幅=最大表示幅=300 ピクセル" に設定されています。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_670948093" HGAP="-158" VSHIFT="42"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードコアは、ノードコア全体に適用される総合機能を保持しています。このコアの総合書式は、<i>「書式 > 書式のみコピー」</i>でコピーし、<i>「書式 > 書式のみ貼り付け」</i>で別のノードに貼り付けることができます。
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1072558009" HGAP="-71" VSHIFT="87"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 書式なしのテキスト(プレーンテキスト)の貼り付けなど、各種オプションについては、<i>「編集 > 貼り付け」</i>をご覧下さい。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ インターネットからテキストをコピーする場合、通常の貼り付けを行うと、書式(色や文字サイズ等)まで貼り付けられます。このオプションを使うと、プレーンテキストだけのコピー動作を選択できます。
+ </li>
+ <li>
+ このオプションを頻繁に使う場合は、この機能に<font color="#ff0000">ショートカット</font>キーを指定することを勧めます。<i>「ツール > <font color="#ff0000">ショートカット</font>キーを割り当て」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1759870173" HGAP="-38" VSHIFT="42"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップは、<i>「ファイル」</i>メニューの印刷関連機能を使って印刷してください。
+ </p>
+ <p>
+ 大きなファイルの場合、標準マップレイアウトでなく、アウトラインレイアウトで印刷したほうが実用的かもしれません。Freeplane をアウトラインモードに設定するには、<i>「表示 > アウトラインビュー」</i>を使用してください。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プレゼンテーションに用いる場合、フォーカスを合わせているノード(群)を除いて、マップをグレー表示することができます。そのためには、<i>「表示 > プレゼンテーションモード」</i>を選択してください。<i>「Shift + Space」</i>を押すか、<i>又は「Shift + 折り畳みマークをクリック」</i>を実行すれば、フォーカス表示ノードを次次に移動していくことができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="シェア(共同利用)" STYLE_REF="Advanced" FOLDED="true" ID="ID_566359973" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="マインドマップ.mm ファイルを交換することによって、マインドマップを他の人とシェア(共同利用)することができます。画像は、マインドマップの一部ではなく、したがって独自に交換しなければならないことに注意してください。新しい置き場での画像は、必ずマップ作成時と同じ相対位置(サブディレクトリ)になるようにしてください。最も優れたやり方は、マインドマップ.mm とイメージを同一の(サブ)ディレクトリで作成することです。そうすれば、ディレクトリごと書庫に圧縮し、別のコンピュータでそれを解凍することができます。" ID="ID_1964465318" HGAP="-85" VSHIFT="41">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1669899571" HGAP="-239" VSHIFT="173"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Java アプレットは簡単なプログラムですが、これを使うと、Freeplane をインストールしていないコンピュータ上で、マインドマップを表示させることができます。Java アプレットを使って、マインドマップをインターネット上に公開するには、マインドマップを<i>「ファイル > エクスポート」</i>で<i>「Java アプレットに」</i>のファイル書式を選んでエクスポートしてください。エクスポートが終わると、<i>「yourmap.html」</i>というファイルと<i>「yourmap.html_files」</i>というディレクトリができます。マップの中で画像を使う場合は、yourmap.mm 作成時に、これらの画像が yourmap.mm と同一ディレクトリに格納されていることを確認してください。[マップの]エクスポート後、画像を yourmap.html_files [ディレクトリ]にコピーしてください。これで、yourmap.html ファイルと yourmap.Html_files ディレクトリをインターネットサーバに移し、yourmap.html を呼び出してマインドマップを起動できるようになります。ユーザのマインドマップは、閲覧用のブラウザで開くことができますが、修正はできません。同じ手法は、Freeplane をインストールしていない他の人と、マップをシェアする場合にも利用できます。上記のファイルとディレクトリを、インターネットサーバの代わりに相手方のコンピュータに移してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ .svg 画像は、Java アプレットで公開することができません。
+ </li>
+ <li>
+ 他のオプションについては、Freeplane マニュアルを参照してください。Freeplane wiki でのマップの公開については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps">このページ</a> をご覧ください。
+ </li>
+ <li>
+ 単一の Java アプレットで複数のマップを公開する方法については、この <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Publishing_multiple_maps_in_one_Java_applet">用例</a> をご覧下さい。
+ </li>
+ <li>
+ <i>「ツール > 環境設定」</i>で、マップが毎回同じ折り畳み状態で開くように、折り畳み状態を保存する設定にすることができます。
+ </li>
+ <li>
+ また、Freeplanre 開発関係者なら、http://freeplane.sourceforge.net/mapsOnline で公表することもできます。ここに掲載されるドキュメントは、<i>「ヘルプ > マニュアルマップ(オンライン)」</i>で開かれるマップ経由でリンクされていれば、Java アプレットなしでも開くことができます。<b>この場合は、.svg 画像も公開できます。<i>.</i></b>
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ インターネットやイントラネットで直接マインドマップを公開することもできます。その場合は、マップを表示させるために、Freeplane が必要です。<i>「ファイル > URL からマップを開く」</i>を用いてマップを開き、マップの URLについてはフルアドレスを入力してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ MS Windows の場合、マインドマップのリンクを右クリックし、<i>「リンクの URL をコピー」</i>を選択してください。次に、上述の URL 欄にこのアドレスをペーストしてください。
+ </li>
+ <li>
+ http://freeplane.sourceforge.net/mapsOnline には、<i>「ヘルプ > マニュアルマップ(オンライン)」</i>のリンクが設定されていれば、Java アプレットなしで開くことのできるマインドマップが収納されています。この場合、.svg 画像も表示されます。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="テキストエディタを用いて、一定の書式設定コードを保持しながらデータ交換する方法については、Freeplane マニュアルに説明があります。" ID="ID_1023242392" HGAP="-182" VSHIFT="32">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ 適用事例のインデックス
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リンクをクリックすると、Freeplane の主要な適用事例を示すマインドマップが開きます。インデックスのリンクにしたがってジャンプするには、インターネットへの接続が必要です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ インデックスマップからこのマップに戻るには、<i>「ナビゲーション > 前のマップ」</i>(又はアイコンツールバー)を選択してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 現在ご覧のノードは、<i>「ノードの詳細テキストを編集」</i>と題する<b>ノードコア</b>から成り立っています。ノードコアの下方のテキストは、<b>ノードの詳細</b>と言います。現在ご覧のテキストはこのフィールドに含まれます。この領域の顕著な特徴は、ユーザの必要に応じて隠したり表示したりできることです。この領域を隠したり、表示したりする方法の1つは、テキストの横にある<font color="#ff0000">小さな三角形をクリックする</font>ことです。(試して下さい!)
+ </p>
+ <p>
+
+ </p>
+ <p>
+ このようなノードを作成するには、まず、先に学習したようにノードを作成してください。次に、これまたご存知のやり方でノードに見出しをタイプ入力してください。最後に、ノードを右クリックして<i>「ノードの詳細をダイアログ編集」</i>を実行して、ダイアログウィンドウを開いてください。ここで、[先の]見出しの下に表示させたいテキストをタイプ入力し、「OK」を押してください。これで、先のノードが今お読みのノードのような形になるはずです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ノードの詳細は、インラインエディタでも入力できます。インラインエディタを開くには、当該のノードを右クリックして<i>「ノードの詳細をインライン編集」</i>を選択してください。既存の詳細テキストをインラインエディタで再度開いて編集するには、当該の[詳細]テキスト上で、<i>「Ctrl + 左クリック」</i>してください(このインラインエディタは、ダブルクリックでも開きます)。このインラインエディタは、ノードの見出しテキストでの説明と同じように動作します。そこには、同じコンテキストメニューが付いています。
+ </li>
+ <li>
+ コンテキストメニューで利用できる機能は、すべてメインメニュー経由でもアクセスできます。例えば、インラインエディタは、<i>「編集 > ノードの拡張情報 > ノードの詳細をインライン編集」</i>でもアクセスできます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="テキストをツールチップ表示(ホバーテキスト)" STYLE_REF="Advanced" FOLDED="true" ID="ID_288274844" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの内容を常時非表示にし、カーソルでノードをホバーリングしているときに限り見えるようにすることができます。これには、当該ノードの占有スペースを最小限にできるという利点があります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ノードをホバー表示モードにするには、ノードを右クリックして<i><font color="#000000">「ノードを短縮表示」</font></i>を選んでください。ノードコアテキストの冒頭部分以外のすべて情報が隠れます。非表示状態を止めるには<i>、「ノードを短縮表示」</i>を再度クリックしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ この機能は、ノードの詳細を隠すとともに、コアテキストの長さに制限を加えます。したがって、長い見出しが用いられている場合、短縮表示されます。また、この機能を使うと、以下に説明する画像や属性、ノートといった機能も非表示にしなります。
+ </li>
+ <li>
+ 詳細内での画像の例外的動作については、下方の<i>「画像」</i>をご覧ください。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 隠された詳細は、ノードコア上でカーソルを<b>ホバーリング</b>させることで、可視化することもできます。これは、ノードの詳細を常時非表示にセットしている場合に、特に有用です。この場合、詳細を表示させるための三角形(△)はなくなります。ノードにこの種の隠されたテキスト、ツールチップとも言いますが、これが内蔵される場合、その目印として、当該ノードの親ノード側に小さな丸印(○)が表示されます。下のノードがその一例です。この上でカーソルをホバーリングさせると、内容が表示されます。(試して下さい!)
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" ID="ID_1347491550" HGAP="-80" VSHIFT="50">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="画像(ノード拡張情報)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
+</hook>
+<node ID="ID_1931512160"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 画像[データ]は、Freeplane のマップの一環ではありませんが、Freeplane のマップの中に表示することができます。画像のソース[データ]がユーザのコンピュータ内に格納されているかどうか、また、ドラッグ&ドロップとコピー&貼り付けのどちらの手法を用いるかによって、異なる動作を示します。<i>「ノードコア」</i>内の画像は、ここ(ノードの拡張情報)での説明とは別物であることに留意してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="内部ソースの場合" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" MAX_WIDTH="550" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 特定の1つのノードに単一の画像を付す場合は、ノードの上の部分に画像をドラッグ&ドロップしてください。ノードの子ノード側にドロップすると、自動的に新規子ノードが作成され、そこに画像が格納されます。いずれの場合にも、イメージの右下の角をドラッグすることにより、大きさを変更することができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 単一画像を付加する別の方法として、以下のやり方があります。
+ </p>
+ <ul>
+ <li>
+ ノードを右クリックし、<i>「画像を付加...」</i>を選択するか、又は
+ </li>
+ <li>
+ <i>「編集 > ノードの拡張情報 > 画像を付加...」</i>を選択してください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ イメージは、ノード上に表示されていても、マインドマップ[データ]の一部をなすものではありません。画像は、マインドマップを開くたびに、オリジナルの場所から読み込まれます。したがって、ユーザが、画像の元ファイルを削除したり、名称変更したりすると、マップ上に表示されなくなります。
+ </li>
+ <li>
+ <i>「表示 > ノードを短縮表示」</i>の設定時には、画像は表示されません。こうした形で非表示にされた画像は、ホバーリング時(のツールチップ内)に表示されません。
+ </li>
+ <li>
+ ノード内で画像の位置を動かすことはできません。(他の種類の)画像に関する詳しい説明、あるいは画像付きマインドマップの公開や共有に関する立入った説明については、Freeplane マニュアルにあります。
+ </li>
+ <li>
+ ドラッグ&ドロップの代わりにコピー & 貼り付けを使うと、画像そのものでなく、画像データへのハイパーリンクがノードコアに付加されます。
+ </li>
+ <li>
+ この画像は、ノードの機能の1つで、ノードコアの下方に表示されます。ノードコア自体に、イメージを格納することもできます。このイメージは、大きさを変えられません。
+ </li>
+ <li>
+ 画像は、一時ファイルではありません。例えば、Thunderbird などの E-mail プログラムから画像を利用したい場合は、まず画像ファイルをテンポラリーファイル用ディレクトリ以外のディレクトリにコピーしてください。
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ インターネットなどの外部ソースから取得した画像ジを、コピー & 貼り付けの操作によって付加することができます。同様に、プリントスクリーンを用いて作成された表示画面の画像を、貼り付けによって付加することもできます。いずれの場合も、画像は、貼り付け操作時に、選択ノードに新規作成される子ノードに付加されます。貼り付けられた画像は、右下角をドラッグすることにより大きさを変更できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 貼り付けられた画像は、マインドマップ[ファイル]自体の一部をなすものではありません。
+ </li>
+ <li>
+ ソースがインターネット上にある場合、画像を表示させるには、インターネット接続しておくことが必要です。画像データを手元に置く場合は、まずユーザのコンピュータにデータをコピーしてください。
+ </li>
+ <li>
+ <i>「プリントスクリーン」</i>機能でコピーした画像を貼り付ける場合、Freeplane は最初にこの画像をどこに保存するか指示を求めます。
+ </li>
+ <li>
+ 一時ファイルに画像データを保持するプログラム(例えば Thanderbird)から画像を貼り付けないしドロップする場合、最初は画像が表示されても、後で表示できなくなることがあります。最初に、特定ディレクトリに画像をコピーしておいてください
+ </li>
+ <li>
+ 同時に複数の画像を選択し貼り付けると、ハイパーリンクしか貼り付けられません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="インラインの画像" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="上級ユーザなら、いわゆる HTML コードを使ってテキストのなかに画像を格納することができます。また、これを行なうためのスクリプトもあります。Freeplane マニュアルをご覧ください。" ID="ID_796258305" HGAP="-93" VSHIFT="35" STYLE="combined">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 一度画像が作成されると、右クリックして<i>「画像を変更」</i>を選択することで、画像を別のものに置換することができます。
+ </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"/>
+<attribute NAME="Name" VALUE="John"/>
+<attribute NAME="email" VALUE="john at gmail.com"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの詳細に、各情報ユニットに名称と値をもつ構造化された情報を装着することができます。この"名称=値"形式の1対の組み合わせは、属性とも呼ばれます。属性群は、2列のカラムからなる表の形で表示されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="ノードの詳細に属性を付加するには?" STYLE_REF="Professional" FOLDED="true" ID="ID_1441506319" HGAP="-552" VSHIFT="183" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 上の用例を作るには、[まず]ノードを右クリックし<i>「属性をインライン編集」</i>を選択します。ここで左側のフィールドに<i>「Name」</i>を、右側のフィールドに<i>「John」</i>と入力します。2番目の属性を追加するには、属性「名」か属性「値」を右クリックして、属性のコンテキストメニューを開き、<i>「新規属性」</i>を選んでください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 用例をたどっていくと、表示された属性の幅がテキストの長さにあってないことに気づくでしょう。この問題を解決するには2とおりのやり方があります。第1は、属性を右クリックして<i>「表示幅適正化」</i>を選択することです。第2は、表のすぐ上の細いバーをクリック&ドラッグして長さ調整することです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 属性を作成したり他の属性機能を適用したりする別の方法があります。下記をご覧ください。
+ </p>
+ <ul>
+ <li>
+ <i>「プロパティパネル > カレンダー/属性」</i>
+ </li>
+ <li>
+ <i>「編集 > ノーの拡張情報」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="オプション値" STYLE_REF="Professional" FOLDED="true" ID="ID_1108500341" HGAP="-550" VSHIFT="166" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 属性値には、テキストを入力できるだけでなく、ハイパーリンクを付加することができます。オプション値については、属性値を右クリックしてご覧ください。ハイパーリンクの種類別の違いについては、[このマップの]<i>「ハイパーリンク」</i>ノードで説明しています。日付と数字については、<i>「プロパティパネル > カレンダー/属性」</i>経由で指定書式の日付や数値を付加することもできます。書式のオプションについては、属性のすぐ上のフィールドをクリックするとドロップダウンメニューが表示されます。書式の指定について詳しくは、Freeplane マニュアルをお読みください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="属性編集の上級テクニック" STYLE_REF="Professional" FOLDED="true" ID="ID_609269277" HGAP="-550" VSHIFT="100" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 例えば、すべてのノードの属性名や属性値を変更する場合、いくつかのオプションを使うことができます。利用可能なすべての機能は、<i>「編集 > ノードの拡張情報 > 属性」</i>にあります。また、その説明については、Freeplane マニュアルをご覧ください。
+ </p>
+ </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"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 下で説明するように、属性値関連のコンテキストメニュー経由で、属性値にハイパーリンクを付加できます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="科学数式(LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" MIN_WIDTH="1" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノード内に科学数式を表示することができます。<i>「編集 > ノード拡張情報 > LaTeX」</i>を使ってください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 詳しくは、Freeplane マニュアルをお読みください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <font size="3"><b><a href="freeplaneFunctions_ja.mm">機能別インデックス</a></b></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リンクをクリックすると、Freeplane の主要機能を説明したマインドマップが開きます。テキスト上でホバーリング[マウスカーソルを置いた状態でしばらく待つこと]すると、非表示になっているリンクが表示されます。これらのリンクは、この<i>「クィックリファレンス」</i>、及び<i>「ヘルプ > マニュアル」</i>の当該機能に関する説明にジャンプするよう設定されています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ インデックスマップから、このマップに戻るには、<i>「ナビゲーション > 前のマップ」</i>(又はアイコンツールバー)を選択してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_871432906" HGAP="39" VSHIFT="105">
+<icon BUILTIN="idea"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplane_ja.mm#ID_1040911735">FAQ</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 頻繁に訊かれるQ&Aです。
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="margin-top: 0">
+ ノートは、特殊な形態をしたノードの詳細です。主な違いは、下記にあります。
+ </p>
+ <ol>
+ <li>
+ 標準設定では、ノートはホバーテキスト表示されるようになっています。<i>「表示 > ノート > マップ内にノートを表示」</i>メニューを使えば、すべての(!)ノートが表示されるようになります。
+ </li>
+ <li>
+ <p style="margin-top: 0">
+ ノートテキストは、画面の横幅いっぱいに表示でき、また表示ウィンドウはノードからノードに移動しても開いたままにしておくことができます。詳細な情報については、Freeplane マニュアルをご覧ください。
+ </p>
+ </li>
+ <li>
+ <p style="margin-top: 0">
+ ノート付きの場合、ノートアイコンが表示されます。
+ </p>
+ </li>
+ </ol>
+ <p style="margin-top: 0">
+
+ </p>
+ <p style="margin-top: 0">
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ノートアイコンは、<i>「ツール > 環境設定」</i>で、(すべて)非表示に設定することができます。なお、例外として、インターネット(Java アプレット)上ではアイコンは表示されたままとなります
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="日付・時刻関連" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" NUMBERED="true" MIN_WIDTH="180">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 時間管理を使うと、選択ノードのコアに、日付や時間<b>(リマインダ)</b>、タスク(リマインダテキスト)をセットできます。置時計アイコンがリマインダ設定済みの目印となります。このアイコンは、当該ノードとその上位ノードに表示されます。ただし、上位ノードが同一のまとめノードグループに属する場合は、除きます。置き時計アイコンの点滅は、リマインダの時刻がきている合図です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ これらの機能を設定ないし編集できる場所が2つあります。
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 時間管理」</i>で、<i>「時間を管理」</i>及び<i>「タスクを管理」のサブメニューあり。</i>
+ </li>
+ <li>
+ <i>「プロパティパネル > カレンダー/属性」</i>で、タスク管理はできない。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="時間を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1104707017" VSHIFT="10" MAX_WIDTH="450" STYLE="combined">
+<icon BUILTIN="../TimeManagementAction"/>
+<hook NAME="FirstGroupNode"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに装着された日付(テキスト)やリマインダをセットしたり変更したりするダイアログを開きます。当該ノードとその上位ノードに置時計アイコンを表示します。リマインダの設定時刻になると、このアイコンが点滅します。また、ルートノードで赤い感嘆符が点滅します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 別のダイアログとしては、<i>「プロパティパネル > カレンダー/属性」</i>を参照。
+ </li>
+ </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">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_77223280" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1905175036" 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">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="課題を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1106133151" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<icon BUILTIN="../TimeListAction"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">すべてのノードのリマインダを表示するウィンドウを開きます。それぞれのリマインダに下記の事項が表示されます。</font>
+ </p>
+ <ul>
+ <li>
+ 日付
+ </li>
+ <li>
+ 見出し
+ </li>
+ <li>
+ アイコン
+ </li>
+ <li>
+ 作成時刻
+ </li>
+ <li>
+ 最終編集時刻
+ </li>
+ <li>
+ ノート
+ </li>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのリマインダを削除します。別の方法については、下記をご覧ください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 時間管理」</i>
+ </li>
+ <li>
+ <i>「プロパティパネル > カレンダー/属性」</i>
+ </li>
+ </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">
+<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"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ProfessionalTopic" LAST="false"/>
+</hook>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This node contains a reminder
+ </p>
+ </body>
+</html>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="フィルタは、見たいノードだけを表示させる手段です。同じフィルタルールは、情報検索でも使用できます。また、条件対応スタイルでも使用されます。" ID="ID_1873557100" HGAP="-85" VSHIFT="30">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">検索を実行したりフィルタをかけたりするに先立ち、ユーザは、何について検索ないしフィルタをかけるのかを定義しなければなりません。この作業はフィルタバーを使って実行することができます。このツールバーは、アイコンと入力フィールドからなる水平な行で、マップの作業エリアのすぐ上にあります。検索/フィルタルールは、以下の項目から成り立っています。 </font>
+ </p>
+ <ul>
+ <li>
+ <i><b>「ノードの構成要素」</b></i>(コアテキスト、詳細、アイコン など)。検索やフィルタでは、ノードのほとんどすべての構成要素を利用できます。
+ </li>
+ <li>
+ <i>「<b>ルールの種類</b>」<b>: </b></i> 構成要素について、<i>「付き」、「⊃(含む)」、「=」、「>」</i> など。
+ </li>
+ <li>
+ <i>「構成要素の<b>値</b>」。</i>
+ </li>
+ <li>
+ 値がテキストの場合については<i>、<b>「大文字/小文字を区別」</b></i>や<i><b>「曖昧」</b></i>検索(ファジー検索)オプションの有効/無効。
+ </li>
+ </ul>
+ <p>
+ これらの要素を設定/入力したら、<i><b>「クィックフィルタ」</b></i>アイコンをクリックしてフィルタを適用することができます(どれが「クィックフィルタ」アイコンかは、左方を参照)。また、<i><b>「検索」</b></i>アイコンをクリックして1件ずつ検索を進めることもできます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ クィックフィルタの結果は、1ないし複数のいわゆるフィルタオプションを設定することによって修正することができます(フィルタオプションについては。下方を参照)。フィルタを中止するには、<i><b>「フィルタ解除」</b></i>アイコンをクリックしてください。(検索時には、この動作を止める必要はありません。)
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 詳しい説明や用例は、Freeplane マニュアルにあります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 同じフィルタルールを使ってノードを1件ずつ検索することもできます。
+ </li>
+ </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">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フィルタを適用します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+<node TEXT="最近更新したノードを検索" ID="ID_884023176">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 特定の日付以降に修正されたすべてのノードをフィルタ表示するには、(日付フィルタ, <i>以降に変更された, 日付 xxx</i>)を設定し、すべての修正ノードに関する<i>「クィックフィルタ」</i>を実行してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 今ひとつの方法として、<i>「編集 > 検索&置換...」</i>メニューがあります。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_983064948">
+<icon BUILTIN="../remove_filtering"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フィルタの適用を解除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="次を検索" STYLE_REF="ProfessionalTopic" ID="ID_507981913">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択ノードとそのすべての下位ノードを対象に、テキストやその他の指標について検索します。そして、もし見つからなければ、さらに他の枝を検索します。これをを深さ優先検索と呼びます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ 該当するノードは選択表示されます。
+ </li>
+ <li>
+ 該当ノードが折り畳まれている場合は、展開表示されます。
+ </li>
+ <li>
+ 該当ノードが表示画面外にある場合は、マインドマップは、それが画面の可視エリアに来るようにスクロール表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="フィルタの諸機能" STYLE_REF="Professional" FOLDED="true" ID="ID_1254354349" TEXT_SHORTENED="true" STYLE="combined"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">To the left are shown the icons of the buttons in the Filter toolbar, with their meaning. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="フィルタを元に戻す" STYLE_REF="ProfessionalTopic" ID="ID_619416419" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 前に使われたフィルタコマンドの効果を無効にします。
+ </p>
+ </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">
+<icon BUILTIN="../redo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタ > フィルタを元に戻す」</i>の実行後に、その前に用いられたフィルタコマンドを再適用します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタをかけ直す" STYLE_REF="ProfessionalTopic" ID="ID_1748016122" TEXT_SHORTENED="true">
+<icon BUILTIN="../reapply_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップに変更を加えた後に、改めてフィルタをかけ直します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="クィックフィルタ" STYLE_REF="ProfessionalTopic" FOLDED="true" ID="ID_1552136796" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 表示中のノードのうち、フィルタルールとオプションに適合しないものをすべて隠します。<font color="#ff0000">アイコンは非設定時の表示のまま変わりません。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ フィルタの適用を終了する場合は、<i>「フィルタ解除」</i>(<i>「フィルタ無し」</i>)。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ フィルタを掛ける前に非表示にされていたノードは、非表示のままです。
+ </li>
+ <li>
+ [矢印キーを押すと、]可視状態のまま残されたノードはすべて、お互いに線(エッジ)に沿って移動します。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="最近更新したノードを検索" ID="ID_1539236846">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 特定の日付以降に更新されたすべてのノードをフィルタ表示させるには、(<i>日付フィルタ, 以降に変更された, 日付, xxx)</i>形式のフィルタルールを指定し、すべての更新ノードを対象に<i>「クィックフィルタ」</i>を実行してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照 </b>
+ </p>
+ <ul>
+ <li>
+ 今ひとつの方法として、<i>「編集 > 検索&置換...」</i>を用いるやり方があります。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="選択ノードに絞って適用" STYLE_REF="ProfessionalTopic" ID="ID_402507556" TEXT_SHORTENED="true">
+<icon BUILTIN="../filter_selected_nodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノード(複数可)だけをフィルタの対象とします。設定によっては、上位ノードや下位ノードも表示します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタ > 上位ノードも表示」 </i>
+ </li>
+ <li>
+ <i>「フィルタ > 下位ノードも表示」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+</node>
+<node TEXT="該当ノードを全て選択" STYLE_REF="ProfessionalTopic" ID="ID_164487469" TEXT_SHORTENED="true">
+<icon BUILTIN="../select_all_found_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フォーカス状態のノードの下位ノード(表示/非表示の両方)につき、フィルタをかけ、[条件に]該当するすべてのものを選択します。そして、それらに挟まれたノードも表示し選択状態に変えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_1978139715" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 適用中のあらゆるフィルタの効果を解除します。初期設定は、フィルタ解除状態です。<font color="#ff0000">Un-sets icon</font>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタ条件を指定" STYLE_REF="ProfessionalTopic" ID="ID_1142884544" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_filtering_condition"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">フィルタルールの作成・編集/フィルタ管理用のフィルタ構成ダイアログを開きます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 最初の行に、フィルタルール定義用の3つの入力欄("ノードテキスト"、"⊃含む"、空欄)、及び(照合時に)大文字/小文字区分を適用するかどうかのチェックボックスが表示されます。これらの編集可能フィールドの下方の枠には、定義済みルールの一覧表が表示されます。初期状態では空白です。右側のボタンを使えば、"And" や "Or" の演算子によってこれらの条件を2つ以上組み合わせたきめ細かなルールを作ることもできます。ルールには<i>「名称を指定」</i>ボタンで名前をつけることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう! </b>
+ </p>
+ <ol>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">フィルタルールの条件を選択ないし入力してください。例えば、("ノードテキスト"、"⊃含む"、"Filter")、「大文字/小文字を区別しない」はチェックしないといった具合です。 </font>
+ </li>
+ <li>
+ <i>「追加」</i>ボタンを押して、ルール一覧にそれを加えてください。
+ </li>
+ <li>
+ 、上記作業を繰り返して必要なすべてのルールを指定してください。
+ </li>
+ <li>
+ <i>「OK」</i>ボタンを押してください。
+ </li>
+ </ol>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ "And" や "Or" の演算子によって2つ以上の条件を組み合わせる場合は、[一覧のなかから]該当する条件を選びその都度 "And" や "Or"のボタンを押してください。
+ </li>
+ <li>
+ ルールにラベルをつける場合は、ルールを選び、「名称を指定」ボタンを押します。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタ構成」</i>ダイアログの使用例については、<i>「スタイル > マップ用条件対応スタイルを管理」</i>を参照。
+ </li>
+ <li>
+ <i>「スタイル > ノード用条件対応スタイルを管理」。</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタの適用・解除" STYLE_REF="ProfessionalTopic" ID="ID_214063901">
+<hook NAME="SummaryNode"/>
+<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">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">フィルタ中の(可視)ノードへの適用/解除を切り替えます。すなわち、結果を絞り込むために、追加のフィルタ条件を付加します。</font>
+ </p>
+ </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">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">マップ中のフィルタに適合するすべてのノードを展開し表示します。トグルスイッチではありません。ノードは、一度展開すると、他のコマンド(このコマンドの実行直後に行なう<i>「フィルタ > フィルタを元に戻す」</i>など)を用いなければ折り畳むことができません。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">参 照</font></b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「ナビゲーション > 折り畳む/展開する」</font></i>
+ </li>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「ナビゲーション > すべて折り畳む」</font></i>
+ </li>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「ナビゲーション > 1階層分だけ折り畳む」</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="上位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_1384592614" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">(「選択ノードに絞って適用」がセットされ、)フィルタが有効の時、フィルタ条件に適合するノードの上位ノードをすべて表示/非表示に切り替えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「クィックフィルタ」</font></i><font face="SansSerif, sans-serif" color="#000000">実行の前でも後でも設定できます。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="下位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_347749612" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">(「選択ノードに絞って適用」がセットされ、)フィルタが有効の時、フィルタ条件に適合するノードの下位ノードをすべて表示/非表示に切り替えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「クィックフィルタ」</font></i><font face="SansSerif, sans-serif" color="#000000">実行の前でも後でも設定できます。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタの条件/状態" STYLE_REF="ProfessionalTopic" ID="ID_1103140596">
+<hook NAME="SummaryNode"/>
+<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">
+<icon BUILTIN="../find_previous"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択ノードの中でテキスト[文字列]などの指標を検索します。検索は、後方検索と逆方向に行ないます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ 見つかったノードは選択状態になります。.
+ </li>
+ <li>
+ 見つかったノードが折り畳み中の場合は、展開されます。
+ </li>
+ <li>
+ 見つかったノードが表示画面の外にある場合は、表示画面の可視エリアに来るように、マインドマップを動かします。
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択ノードとその下位ノードでテキストなどの指標を検索します。見つからない場合は、さらに他の枝も検索します。深さ優先探索方式と呼ばれるやり方です。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ 見つかったノードは選択状態になります。.
+ </li>
+ <li>
+ 見つかったノードが折り畳み中の場合は、展開されます。
+ </li>
+ <li>
+ 見つかったノードが表示画面の外にある場合は、表示画面の可視エリアに来るように、マインドマップを動かします。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="探査/検索" STYLE_REF="ProfessionalTopic" ID="ID_721920269">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_49510380" HGAP="-115" VSHIFT="91"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 後に再利用するために、複数のフィルタを定義し保存しておくことができます。<i>「フィルタ > フィルタ条件を指定」</i>を開き、必要なフィルタルールを定義してください。その際には、"And" や "Or" の演算子を用いて簡単なルールを連結し、複雑なルール群を作成することができます。そして、一度定義したルールには、ラベルを付けることができます。必要なルールをすべて作成してから、セット全体を保存することができます。さらに、このセットは、他の人と共有することも可能で、それには、「フィルタ条件を指定」にセットを読み込むだけです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <i>「フィルタ条件を指定」</i>で定義したルール群は、フィルタメニューバーから使用することができます。ルールを有効にするには、<i>「フィルタ無し」</i>と表示されているフィールドのすぐ横をクリックしてください。これで、利用可能なすべてのルールのリストがドロップダウン表示されます。ご希望のルールをクリックすると、実行されます。作業を終わったら、再度<i>「フィルタ無し」</i>を選択するか、又は<i><b>「フィルタ解除」</b></i>のアイコンボタンをクリックしてください。
+ </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 の強力な機能の利用を検討してください。

フィルタの手順は下記のとおりです。このノードの赤い矢印をクリックすると、アニメションの説明が表示されます。" ID="ID_352888342"/>
+<node TEXT="このクィックリファレンス用のフィルタセットを読み込む" ID="ID_551050917">
+<icon BUILTIN="full-0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フィルタセット利用の実例として、Freeplane ディレクトリのサブディレクトリ "doc" に "<i>freeplaneTutorial.mmfilter" </i>というファイルを収めています。 「フィルタ<i> > フィルタ条件を設定 > 読み込む」</i>を実行し、このファイルを探して読み込んでください。
+ </p>
+ <p>
+ これで、ユーザは、以下のノードに説明するようにこのフィルタを利用することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="フィルタを選択し、クィックフィルタを実行" LOCALIZED_STYLE_REF="default" ID="ID_81563733" LINK="FilterExampleBegin.jpg">
+<icon BUILTIN="full-1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 初歩的な技能情報(初級者向け)に限って閲覧する場合は、
+ </p>
+ <ol>
+ <li>
+ <i>「フィルタ無し」</i>と表記されたフィールドをクリックしてください、。フィルタ候補群のリストがドロップダウンします。
+ </li>
+ <li>
+ 表示されるルール群から1つ、たとえば初級者向けを選択してください。
+ </li>
+ <li>
+ 画像の表示にしたがって、<i>「クィックフィルタ」</i>をクリックしてください。
+ </li>
+ </ol>
+ <p>
+ なお、<i>「上位ノードも表示」</i>が選択されていないことを確認してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="展開して可視状態にする" ID="ID_1451237301" HGAP="19" VSHIFT="-8" LINK="FilterExampleEnd.jpg">
+<icon BUILTIN="full-2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 各項目をクリックすれば、内容を表示させることができます。あるいは、下記の要領で非表示中の情報をすべて一挙に表示させることもできます。
+ </p>
+ <ol>
+ <li>
+ 中央エリア(ルートノード)にカーソルを移動して選択し、
+ </li>
+ <li>
+ <i>「すべて展開する」</i>のアイコンをクリックして、すべての選択ノードをご覧ください。
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="表示と表示終了" ID="ID_1331360426" HGAP="16" VSHIFT="6" LINK="FilterExampleUnfold.jpg">
+<icon BUILTIN="full-3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ol>
+ <li>
+ 背景の空白部分をクリックし、マップを動かし、全体を読んでください。
+ </li>
+ <li>
+ 終了時に、<i>「フィルタ解除」</i>アイコンを押すのを忘れないでください。
+ </li>
+ </ol>
+ <p>
+ 「初級者向け」「中級車者向け]「上級者向け」のそれぞれについて、同じ手順を踏めば、
+ </p>
+ <p>
+ うまくいきます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1784889270" HGAP="-153" VSHIFT="94"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ パスワードを使って、マップ全体を保護したり、マップの一部を保護したりすることができます。あるノード用にパスワードを定義すると、当該ノードの下位ノードは、正しいパスワードが入力されない限り、秘匿されたままの状態になります。同一マップ内で、ノードごとに異なるパスワードを定義し、幾重もの保護を課すこともできます。選択ノードの子ノード用のパスワードを定義するには、<i>「パスワードで保護」</i>を選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > パスワードで保護」</i>も参照。
+ </li>
+ <li>
+ パスワードで保護は、 DES 型暗証を用いて行なわれます。保護(暗証)について詳しくは、 Freeplane マニュアルをご覧ください。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_802748820" HGAP="-149" VSHIFT="41"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規マップを定義する際に、、パスワードでマップ全体を直接保護するlことができます。これは、<i>「ファイル > 保護(暗証)付き新規マップ」</i>を選択すれば、1操作で実行できます。この機能をノードのパスワード保護と組み合わせて、幾重ものセキュリティ保護をかけることもできます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane には、多数のチューニングオプションがあります。よく使われるオプションは、<i>「表示」</i>メニューで利用できます。また、その他のものについては、<i>「ツール > 環境設定」</i>で利用できます。このほか、ユーザが独自スクリプトを書いて、操作を自動化することもできます。これらについてはすべて、Freeplane マニュアルで説明されています。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1274034553" HGAP="-291" VSHIFT="37"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規作成ノードは、<i>「標準」</i>スタイルとなります。このスタイルは、<i>「書式 > スタイルを管理 > スタイルを編集」</i>で編集できます。ここで、「囲み」を設定すると、新規ノードはすべて囲みの形状になります。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ツール > ユーザディレクトリを開く > Template」</i>の<i>「standard.mm」</i>というマップが、新規マインドマップ作成時テンプレートマップとなります。このテンプレートマップの<i>「標準」</i>スタイルを、ユーザーの個人的好みにに合わせて調整することをお薦めします。例えば、
+ </p>
+ <ul>
+ <li>
+ 矢印型リンクをハイパーリンクに変える:「標準」スタイルのプロパティパネルで、ハイパーリンクにチェックする。
+ </li>
+ <li>
+ 「標準」スタイル(他のスタイルでもよい)のフォントを拡大/縮小する。
+ </li>
+ <li>
+ 「標準」スタイルに囲みを付する。
+ </li>
+ <li>
+ 等々。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="標準的な表示設定" STYLE_REF="Professional" FOLDED="true" ID="ID_1173853188" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「表示」</i>メニューでは、表示幅や選択時の枠囲い表示、計算式の縁取り表示、更新ノードの背景色など、ノードコア関連の特徴を設定できます。詳細の表示/非表示、表示方法、ホバーリング中のツールチップ表示の有無、更新時刻の表示/非表示を設定することができます。また、属性の表示/非表示や表示する属性の種類を設定することもできます。また、ノートの表示/非表示や表示方法、表示ウィンドウの種類も設定できます。さらに、アイコンに関する一定の特徴を設定することもできます。どのようなオプションが使用できるかは、<i>「表示」</i>メニューを開きすべてのオクションをひとつひとつ選択してみてください。環境設定を使うともっと多くのことを設定することができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 表示の設定には、印刷に関連するオプション(アウトラインビュー)やプレゼンテーションに関連するオプション(プレゼンテーションモード)も含まれます。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1788895132" HGAP="-167" VSHIFT="120"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Docear は、"学術文献データ処理パッケージ" の一種です。オフィス労働者に対してオフィス向けパッケージが提供するのと同様の機能を、研究者に提供するものです。つまり、Docear は、以下のように文献管理関連のあらゆる作業においてユーザを支援するということです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1. 新規文献の発見 (検索や探索)
+ </p>
+ <p>
+ 2. 文献整理(閲読、注記、収録)
+ </p>
+ <p>
+ 3. ユーザ自身の文献作成(構想練り、執筆、参考文献一覧の作成、及び公開)
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Docear は、SciPlore MindMapping の後継アプリで、欧州連合及びドイツ連邦経済技術省から資金助成を受けています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>詳しくは、赤い矢印をクリックしてご覧ください。</b>
+ </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">
+<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">
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「環境」では、次の事項を設定します。
+ </p>
+ <ul>
+ <li>
+ 同時に起動できる Freeplane のインスタンスを単一とするか、複数とするか、
+ </li>
+ <li>
+ 保護(「他者と同時編集時はファイルを読込み専用に」)を有効にするかどうか、
+ </li>
+ <li>
+ ファイルの読み込みや自動保存に関する各種オプション、
+ </li>
+ <li>
+ ファイル呼び出し時に再現できるよう、保存時に折り畳み状態を保持するかどうか、
+ </li>
+ <li>
+ 標準的な文字コードの設定。
+ </li>
+ <li>
+ ハイパーリンクに相対アドレス用いるか、絶対アドレスを用いるか、
+ </li>
+ <li>
+ その他。
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「画面表示」では、次の事項を設定します。
+ </p>
+ <ul>
+ <li>
+ 標準で使用する諸々のプロパティ、
+ </li>
+ <li>
+ ノードやツールチップ等の縦幅と横幅、
+ </li>
+ <li>
+ 特殊アイコンの表示/非表示。
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>キー設定</b>
+ </p>
+ </body>
+</html>
+<!-- ^ Position is not set to relative / absolute here because of Mozilla -->
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「キー設定」では、既成の内蔵アイコン用のホットキーを設定します。
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「動作設定」では、次に掲げるような事項を設定します。
+ </p>
+ <ul>
+ <li>
+ 自動選択を使用するかどうか、その場合の間合い時間、
+ </li>
+ <li>
+ ホバー(ツールチップ)の効果、
+ </li>
+ <li>
+ すべての新規作成ノードにインラインエディタを表示するかどうか、
+ </li>
+ <li>
+ ダブルクリックで編集に入るかどうか、
+ </li>
+ <li>
+ キータイプがあったとき、「テキスト[内容]を上書き」「子ノードを作成」「兄弟ノードを作成」「何もしない」のいずれの動作にするか、キー入力で確認するかどうか、
+ </li>
+ <li>
+ 「新規枝[ノード]の配置」(冒頭、末尾)
+ </li>
+ <li>
+ ドラッグ&ドロップの有効/無効の指定、
+ </li>
+ <li>
+ マウスホィールの加速度、
+ </li>
+ <li>
+ ノード位置移動時のグリッドの間隔、
+ </li>
+ <li>
+ 解析するデータの種類と使用する形式、
+ </li>
+ <li>
+ ノード削除時の確認の要否、
+ </li>
+ <li>
+ テキストの比較時に数字を数値比較するかどうか、
+ </li>
+ <li>
+ 大文字/小文字の区別など、スペルチェッカのオプション。
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ブラウザの指定、及び HTML ファイルへのエクスポート/ HTML ファイルからのインポート関係の設定です。
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 計算式とスクリプトを使用するための設定です。
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" STYLE="combined" VGAP="35">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_801516363" HGAP="-59" VSHIFT="62"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 枝毎のすべてのノードについて、既存のものと新規作成のものと両方に適用されるノードの縦間隔を設定することができます。「Ctrl」キーを押した状態で、ノードハンドル(縦長の楕円)を選択し、カーソルを上下させ、ノード間のスペースを調整してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <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_519455593" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane には、Groovy に準拠した、極めて強力はスクリプト能力が装備されています。これにより、ユーザは、Freeplane に標準装備されていない特殊な機能を作り出すことができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Freeplane Wiki に、いくつかの定義済みのスクリプトが公開されています。したがって、プログラムを作成できなくても、スクリプトを利用できます。詳しくは、Freeplane マニュアルを読むか、または、add-ons Wiki 及び <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"/>
+</hook>
+</node>
+</node>
+<node TEXT="Windows 7 で *.MM インデックスを作成" STYLE_REF="Professional" FOLDED="true" ID="ID_952466464" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Windows 7 を使用する場合、ユーザは、*.mm ファイルをインデックスリストに取り込むことができます。以下の要領に従ってください。
+ </p>
+ <ul>
+ <li>
+ [Windows 7 の]<i>「コントロールパネル -> インデックスのオプション」</i>に入るか、<i>「ヘルプ」</i>で "インデックス作成" をタイプ入力するかして、
+ </li>
+ <li>
+ <i>「詳細設定」</i>("Professional")を選択してください。すると、ページ上に<i>「インデックスの設定」</i>と<i>「ファイルの種類」</i>の2つのタブが表示されます
+ </li>
+ <li>
+ <i>「ファイルの種類」</i>のタブを選択してください。
+ </li>
+ <li>
+ ".mm"が現れるまで、ファイル一覧をスクロールしてください。
+ </li>
+ <li>
+ フィルタの説明に<i>「ファイルプロパティのフィルタ」</i>という表記があるはずです。
+ </li>
+ <li>
+ <i>「プロパティとファイルのコンテンツのインデックスを作成する」</i>と書かれた2番目のラジオボタンをクリックしてください。これで、上のフィルタの記載が<i>「プレーンテキストフィルタ」</i>に変わるはずです。
+ </li>
+ <li>
+ 「OK」を選択して、ダイアログを閉じます。インデックスの作成機能が再開し、作業が終わると、インデックスを利用できるようになります。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 通常のやり方では、ノードプロパティだけのインデックスが作成され、ノードの内容は含まれません。上記の手順をを使えば、ノードの内容部分もフィルタ機能に加えることができます。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1759599610" HGAP="-138" VSHIFT="71"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準のスペルチェックは英語に設定されています。他の言語を使う場合は、[下記の要領で辞書をダウンロードしてください。]
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ [まず、このノードの親ノード]ハイパーリンクをクリックしてください。
+ </li>
+ <li>
+ language_XX.ortho(xx は言語を示す2文字コード)をダウンロードし、
+ </li>
+ <li>
+ このファイルを、<i>「ツール > ユーザディレクトリを開く > \resources\ortho」</i>に保存してください。
+ </li>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_667200365" HGAP="-120" VSHIFT="77"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、マインドマップ作成の高速化に役立つよう、大半の動作について標準のショートカットを装備しています。これらのショートカットは、メインメニューバーの表示時にメニュー項目の右側に表示されます。また、ショートカット一覧が自動作成され、ヘルプメニューにから見ることができます。「Fキー」などについて、ユーザーが独自のショートカットセットを定義することも可能です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > マニュアル」</i>
+ </li>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000">機能拡張について詳しくは、赤い矢印をクックして、インターネット上の説明をお読みください。 </font>
+ </p>
+ <p>
+ <font color="#000000">ユーザの使用言語向けの言語別アドオンパックがある場合は、<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29">ここ</a> をクリックしてください。</font>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Examples">ここをクリック</a> して Wiki をご覧ください。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">ノードに次の特徴を持たせる。 </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">初級(Begin)、中級(Advanced)、上級(Professiona)のスタイルl</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">自動連番振り機能</font>
+ </li>
+ <li>
+ ノードの表示幅=180 に固定
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="見出し" FOLDED="true" ID="ID_1129463861" VSHIFT="28"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 内容を示す手短なラベル
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="見出しに関連した内容説明" ID="ID_1693370436" HGAP="19" VSHIFT="29"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 以下の特徴をつける。
+ </p>
+ <ul>
+ <li>
+ TitlesContent スタイル。
+ </li>
+ <li>
+ 通常、見出し[ノード]の下方に置き、線(エッジ)を隠す。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="用例や更新の目印" ID="ID_1987503747"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ 用例(Example)スタイルは、ノード用条件対応ノードスタイルとして付加(個別のノードごとに適用)。
+ </li>
+ <li>
+ 更新(Revision)スタイルは、マップ用条件対応ノードスタイルとして付加(すべてのノードに適用)。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ユーザ定義スタイル" FOLDED="true" ID="ID_1542766589">
+<node TEXT="Beginner" STYLE_REF="Beginner" ID="ID_1530366440"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 太字
+ </p>
+ <p>
+ 囲み
+ </p>
+ <p>
+ ノードの背景色は緑
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Advanced" STYLE_REF="Advanced" ID="ID_535640598"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 太字
+ </p>
+ <p>
+ 囲み
+ </p>
+ <p>
+ ノードの背景色は黄色
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Professional" STYLE_REF="Professional" ID="ID_1633698334"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 太字
+ </p>
+ <p>
+ 囲み
+ </p>
+ <p>
+ ノードの背景色はオレンジ/茶色
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="TitlesContent" STYLE_REF="TitlesContent" ID="ID_1999102003"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 囲みなし
+ </p>
+ <p>
+ 線(エッジ)を隠す
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example" STYLE_REF="Example" ID="ID_149652811"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 眼のアイコン
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1141559530"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Rのアイコン
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="MyTemplate" STYLE_REF="MyTemplate" ID="ID_669326751">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="4" color="#3333ff"><b>Template information</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Freeplane の全機能に関する(インデックス)マップへ" ID="ID_1680872369" LINK="#ID_232622736"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ フリーノード
+ </li>
+ <li>
+ 雲
+ </li>
+ <li>
+ 外部リンク
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="適用事例(インデックス)マップへ" ID="ID_311616726" LINK="#ID_766584529"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ フリーノード
+ </li>
+ <li>
+ 雲
+ </li>
+ <li>
+ 外部リンク
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップが大きいと、マップ上で別々の位置にある2つのノードで作業することが困難なことがあります。こうした場合は、それらが同一マップ上にあれば、同一マップにつき2つのビューを開き、両方のビュー上で作業することができます。それには、<i>「表示 > 新しいマップビューを作成」</i>を選択してください。ビュー間の切り替えは、タブ(representative tabs)を選択してください。一度に両方のビューを表示させることはできません。これ[複数のマップを同時に表示すること]は、Freeplane を複数起動すれば可能です。ただし、その場合、それぞれのマップは別物として扱われます。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 使用コンピュータ上にある履歴ファイルからマップを復元する場合は、<i>「ファイル > 履歴ファイルから復元」</i>を選択してください。
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane のすべての機能は、コマンドラインインターフェースを使ったバッチ処理に利用できます。これを用いると、例えば下記のような使い方ができます。
+ </p>
+ <ul>
+ <li>
+ スタートアップで特定の機能を起動する。
+ </li>
+ <li>
+ 一定のスクリプトを実行したのち、閉じる。execute a script an leave
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ 方法については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Batch_Job">http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Batch_Job</a>s
+ </p>
+ <p>
+ をお読みください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneTutorial_ja.mmfilter b/freeplane/doc/freeplaneTutorial_ja.mmfilter
new file mode 100644
index 0000000..2a32d28
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial_ja.mmfilter
@@ -0,0 +1,14 @@
+<filter_conditions>
+ <disjunct_condition user_name="Beginner">
+ <style_equals_condition TEXT="Beginner"/>
+ <style_equals_condition TEXT="BeginnerTopic"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Advanced">
+ <style_equals_condition TEXT="AdvancedTopic"/>
+ <style_equals_condition TEXT="Advanced"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Professional">
+ <style_equals_condition TEXT="Professional"/>
+ <style_equals_condition TEXT="ProfessionalTopic"/>
+ </disjunct_condition>
+</filter_conditions>
diff --git a/freeplane/doc/freeplaneTutorial_nl.jpg b/freeplane/doc/freeplaneTutorial_nl.jpg
new file mode 100644
index 0000000..13f7301
Binary files /dev/null and b/freeplane/doc/freeplaneTutorial_nl.jpg differ
diff --git a/freeplane/doc/freeplaneTutorial_nl.mm b/freeplane/doc/freeplaneTutorial_nl.mm
new file mode 100644
index 0000000..8251533
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial_nl.mm
@@ -0,0 +1,5314 @@
+<map version="freeplane 1.2.0">
+<!--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" CREATED="1283093380553" MODIFIED="1330893671691" VGAP="9" BACKGROUND_COLOR="#00ff66">
+<icon BUILTIN="bee"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Handleiding</b>
+ </p>
+ <p>
+ <b>Freeplane 1.2</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="MapStyle">
+ <conditional_styles>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <conjunct_condition user_name="1.2.9_05">
+ <time_condition_modified_after DATE="1318794562631"/>
+ <time_condition_modified_before DATE="1319399362631"/>
+ </conjunct_condition>
+ </conditional_style>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <conjunct_condition user_name="1.2.10_04">
+ <time_condition_modified_after DATE="1321127854495"/>
+ <time_condition_modified_before DATE="1321732654495"/>
+ </conjunct_condition>
+ </conditional_style>
+ </conditional_styles>
+ <properties 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="default" FORMAT_AS_HYPERLINK="true">
+<edge COLOR="#808080" WIDTH="thin"/>
+<font SIZE="8"/>
+</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.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 LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode TEXT="Beginner" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Advanced" COLOR="#000000" BACKGROUND_COLOR="#ffff00" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Professional" BACKGROUND_COLOR="#ff9900" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="bezier" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="TitlesContent" STYLE="fork">
+<edge STYLE="hide_edge"/>
+</stylenode>
+<stylenode TEXT="Example">
+<icon BUILTIN="../AttributesView"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Revision">
+<icon BUILTIN="revision"/>
+</stylenode>
+<stylenode TEXT="MyTemplate">
+<icon BUILTIN="females"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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="Method" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.topic" POSITION="right" COLOR="#18898b" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subtopic" POSITION="right" COLOR="#cc3300" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.subsubtopic" POSITION="right" COLOR="#669900">
+<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.important" POSITION="right">
+<icon BUILTIN="yes"/>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_232622736" CREATED="1320005728532" MODIFIED="1337167628576" HGAP="17" VSHIFT="-92" LINK="freeplaneFunctions_nl.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ Functieindex
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Klik op de koppeling om een mindmap te openen met de belangrijkste functies van Freeplane. Beweeg met de muiscursor over de teksten bij de functies om de koppeling naar de beschrijving van deze functie te laten verschijnen, in de handleiding en in de documentatie.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking </b>
+ </p>
+ <ul>
+ <li>
+ Om uit de handleding terug te keren, kies <i>Navigeren .> Ga naar vorige mind map</i> of klik op dit pictogram in de werkbalk.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Inleiding" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_86446891" CREATED="1314121556502" MODIFIED="1341132995368" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="180" VSHIFT="-1">
+<node TEXT="Doel" STYLE_REF="Beginner" FOLDED="true" ID="ID_1074607965" CREATED="1314422854653" MODIFIED="1336124917514">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1704300991" CREATED="1323439375808" MODIFIED="1335971337895" HGAP="-19" VSHIFT="88" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane heeft tot doel het denken, delen en gebruiken van infrormatie te vergemakkelijken. Freeplane ondersteunt het maken, delen en gebruiken van <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane_nl#Wat_is_mindmappen">mindmaps</a>, een soort van <a href="http://www.informationtamers.com/WikIT/index.php?title=Information_map_types">informatiekaarten</a>. De Freeplane <b><a href="http://freeplane.sourceforge.net/wiki/index.php/Mind_Map_Gallery/Dutch">wiki</a></b> bevat concrete voorbeelden van <a href="freeplaneApplications_nl.mm">toepassingsgebieden.</a> De knoop <a href="freeplaneFunctions.mm">functieindex</a> bevat een visueel overzicht van alle functies en hyperlinks naar beschrijvingen van deze functies. Een snelle inleiding is te vinden in de Freeplane videogidsen (zie <i>Help>Online documentatiemindmaps</i>). Het doel van deze Handleiding is om in aanvulling op de videogidsen de mogelijkeheden van Freeplane op een systemaische wijze te presenteren, en met voldoende diepgang voor de meeste gebruikers. Voor meer informatie, of meer details, ga naar de documentatie in menu <a href="freeplane.mm">Help > Documentatie</a>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Leeswijzer" STYLE_REF="Beginner" ID="ID_195004053" CREATED="1316097186850" MODIFIED="1336124917514" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_525900700" CREATED="1323439682466" MODIFIED="1341133095195" STYLE="fork" HGAP="-55" VSHIFT="233"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De meeste mensen houden er niet van om een handleiding te lezen. Daarom is deze handleiding zo opgezet dat je alleen de inleiding hoeft te lezen. Daarna kun je direkt beginnen met het maken van mindmaps met behulp van de menu's van Freeplane. Menu <i>Bewerken</i> bevat de belangrijkste mogelijkheden om informartie te bewerken en menu <i>Extra</i> bevat een aantal belangrijke hulpmiddelen. De andere menu's spreken voor zich.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Het is niettemin de moeite waard om ook de andere hoofdstukken te lezen, en wel om de volgende reden. In Freeplane kun je de dingen op heel veel verschillende manieren doen. Het gebruik van de menu's is daarbij niet altijd even handig en snel. De volgende hoofdstukken geven een overzicht over wat er mogelijk is en hoe je dit op de snelste en eenvoudigste manier kunt doen, meestal door gebruik te maken van zogenaamde contextmenus. Je hoeft hierbij niet alle hoofdtukken één voor één en na elkaar te lezen, maar je kunt die dingen er uit pikken waar je mee bezig bent. Als hulp hierbij is de informatie met een kleur gecodeerd, waarbij de kleuren vier gebruikersniveaus aangeven:
+ </p>
+ <ol>
+ <li>
+ <b>Beginner</b> (licht-blauw/groen): Kennis die nodig is om een mindmap te kunnen gebruiken voor eenvoudige taken zoals het maken en ordenen van notities en bij brainstormen.
+ </li>
+ <li>
+ <b>Gevorderde</b> (geel): Kennis die nodig is om informatie te ordenen en betekenis te genereren en te communiceren.
+ </li>
+ <li>
+ <b>Professional</b> (oranje/bruin): Kennis om Freeplane aan te passen aan je wensen en om de productietools van Freeplane te gebruiken.
+ </li>
+ </ol>
+ <p>
+ <b>BELANGRIJK:</b>
+ </p>
+ <ul>
+ <li>
+ Installeer de<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29#NL"> language add-on NL</a> voor meer uitgebreide ondersteuning..
+ </li>
+ <li>
+ Ga naar Help >Documentatie Online om na te gaan of er al videogidsen beschikbaar zijn.
+ </li>
+ </ul>
+ </body>
+</html>
+
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Hoofdmenu's" STYLE_REF="Beginner" FOLDED="true" ID="ID_27625495" CREATED="1333268936129" MODIFIED="1336124917514">
+<node TEXT="" ID="ID_1025673726" CREATED="1333220288493" MODIFIED="1336132113540" HGAP="80" VSHIFT="94" STYLE="fork">
+<edge STYLE="hide_edge"/>
+<hook URI="Images/doc/MenusPropertiesPanel_nl.png" SIZE="0.44052863" NAME="ExternalObject"/>
+<node TEXT="Menubalk" ID="ID_545376045" CREATED="1333220342855" MODIFIED="1335975121455" HGAP="-712" VSHIFT="25">
+<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_545376045" STARTINCLINATION="39;1;" ENDINCLINATION="39;1;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Werkbalk" ID="ID_1776942057" CREATED="1333220356591" MODIFIED="1333280804275" HGAP="-709">
+<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_1776942057" STARTINCLINATION="40;-5;" ENDINCLINATION="40;-5;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Filterbalk" ID="ID_1116647408" CREATED="1333220363978" MODIFIED="1333280765971" HGAP="-711">
+<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_1116647408" STARTINCLINATION="43;-13;" ENDINCLINATION="43;-13;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="F-balk" ID="ID_572885056" CREATED="1333220384297" MODIFIED="1333280813073" HGAP="-692" VSHIFT="-1">
+<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_572885056" STARTINCLINATION="46;-24;" ENDINCLINATION="46;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Pictogrammenbalk" ID="ID_40915018" CREATED="1333220561873" MODIFIED="1335975130629" HGAP="-762" VSHIFT="-4">
+<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_40915018" STARTINCLINATION="38;-2;" ENDINCLINATION="38;-2;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Opmaakpaneel" ID="ID_879868478" CREATED="1333220390249" MODIFIED="1335976066336" HGAP="-152" VSHIFT="14">
+<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_879868478" STARTINCLINATION="0;-16;" ENDINCLINATION="0;-16;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+</node>
+<node TEXT="Achtergrond
contextmenu" ID="ID_1471702513" CREATED="1333177207314" MODIFIED="1336132131246" HGAP="34" VSHIFT="-6"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Klik met rechter muisknop in en vrij gebied in de achtergrond
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook URI="Images/mouse/mouse_RB.png" SIZE="1.0" NAME="ExternalObject"/>
+<node TEXT="Achtergrond Context Menu" ID="ID_1485150857" CREATED="1333223496821" MODIFIED="1336132153024" VSHIFT="180" STYLE="fork">
+<font BOLD="true" ITALIC="true"/>
+<hook URI="Images/doc/BackgroundContextMenu_nl.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="Openen/sluiten
Opmaakpaneel" ID="ID_724121688" CREATED="1333267051623" MODIFIED="1341132732079" HGAP="56">
+<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="69;-181;" ENDINCLINATION="69;-181;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
+</node>
+</node>
+</node>
+<node TEXT="Help > Sneltoetsen" FOLDED="true" ID="ID_291675950" CREATED="1333224017380" MODIFIED="1333280691852" HGAP="39" VSHIFT="-217" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Sneltoetsen voor de meeste functies.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Tabel met sneltoetsen" ID="ID_1337797684" CREATED="1333278113064" MODIFIED="1336132187235">
+<hook URI="Images/doc/HotKeysTable_nl.png" SIZE="0.8695652" NAME="ExternalObject"/>
+</node>
+</node>
+</node>
+<node TEXT="Knopen" STYLE_REF="Beginner" FOLDED="true" ID="ID_1368882439" CREATED="1316154547031" MODIFIED="1336124917514" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_859940648" CREATED="1323460494762" MODIFIED="1335976547537" HGAP="-37" VSHIFT="79"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een mindmap is een vlak met informatie in zogenaamde <b>knopen</b>. Een knoop is te vergelijken met een paragraaf in een boek. Het verschil is dat je een knoop en zijn informatie eenvoudig kunt verplaatsen en verbergen. Hierdoor kan een mindmap goed worden gebruikt bij het ontwikkelen van nieuwe informatie en bij het aanpassen van getoonde infromatie aan de behoefte van een gebruiker.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ De tekst die je nu leest bevindt zich in een knoop. De tekst hierboven, "<i>Knopen</i>" is een knoop. En de grote ovaal links is een speciale knoop, de stamvaderknoop of <b>stamknoop</b>.,
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Familierelaties" STYLE_REF="Beginner" FOLDED="true" ID="ID_1971514033" CREATED="1314122290117" MODIFIED="1336124917514" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1269567767" CREATED="1323465595335" MODIFIED="1335976539612" HGAP="-79" VSHIFT="88"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Knopen zijn verbonden door afstammingslijnen. Een serie knopen verbonden door deze lijnen vormt
+ </p>
+ <p>
+ een <b>tak</b>. Alle takken beginnen in de stam. Samen vormen de takken een familie (hierarchie).
+ </p>
+ <p>
+ Een knoop dichter bij de stam is (groot)<b>ouder</b> van een (klein) <b>kind</b> welke verder weg ligt. Kinderen
+ </p>
+ <p>
+ van dezelfde ouder zijn (broers en) <b>zussen. </b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Knopen worden standaard in hun bewegingsruimte beperkt door hun familierelaties. Een uitzondering op deze regel vormt de<b> vrije knoop</b>. Deze knoop kan onafhankelijk van alle andere knopen worden verplaatst.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="ouder (relatief)" STYLE_REF="ConsumerTopic" ID="ID_687495618" CREATED="1314131160308" MODIFIED="1323682720381" VSHIFT="20">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1105307139" MIDDLE_LABEL="afstamming" STARTINCLINATION="25;-45;" ENDINCLINATION="-36;-44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="kind" STYLE_REF="ConsumerTopic" ID="ID_1105307139" CREATED="1314131174886" MODIFIED="1323682756605" HGAP="30" VSHIFT="15">
+<edge STYLE="bezier"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Open- en dichtvouwen van knopen" STYLE_REF="Beginner" FOLDED="true" ID="ID_1338867820" CREATED="1314122456335" MODIFIED="1336124917514">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_434382705" CREATED="1323465258749" MODIFIED="1337203791071" HGAP="-211" VSHIFT="196"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Je kunt een knoop open- en dichtvouwen door op de knoop te klikken als een cirkel met een plus- of min-teken verschijnt wanneer de cursor zich boven de knoopkern bevindt. <b>Openvouwen</b> (uitvouwen) toont verborgen kinderen en <b>dichtvouwen</b> (invouwen) verbergt kinderen. Als een knoop is dichtgevouwen verschijnt een cirketje aan de kindzijde van de knoop.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Als de knoop die je nu leest is opengevouwen, dan zie je aan de rechterkant vier pictogrammen. Deze pictogrammen zie je ook in de werkbalk bovenin het scherm. Door op deze pictogrammen in de werkbalk te klikken kun je knopen op verschillende manieren open- en dichtvouwen. Als je op het cirkeltje voor open/dichtvouwen klikt, verschijnen dezelfde pictrogram-knoppen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Uitzondering </b>
+ </p>
+ <ul>
+ <li>
+ Open en dichtvouwen gebeurt met een vertraging, behalve als op de cirkel wordt geklikt.
+ </li>
+ <li>
+ Als het vinkje achter <i>Extra > open/dichtvouwen bij intern klikken</i> is gezet, dan hoef je niet op de cirkel met het +/- teken te klikken, maar kun je voor open/dichtvouwen op het hele gebied van de knoopkern klikken. Merk op dat dubbelklikken op de knoopkern dan niet de het bewerkingsvenster opent.
+ </li>
+ <li>
+ Als een knoop wordt dichtgevouwen die een verbindingslijn heeft met een van zijn kindknopen, dan blijft een lijn (en een eventueel label) zichtbaar. Door hier op te rechtsklikken verschijnt het contextmenu waarmee je naar de verbonden, verborgen knopen kunt springen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Alle knopen openvouwen" ID="ID_1281616092" CREATED="1310134532679" MODIFIED="1323683248394" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Openvouwen toont alle afstammelingen van de geselecteerde knoop </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Sneltoets</b>
+ </p>
+ <ul>
+ <li>
+ druk op de <i>spatiebalk; of</i>
+ </li>
+ <li>
+ klik één keer op de knoop; of
+ </li>
+ <li>
+ klik op de pictogramknop in het<i> werkmenu</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Alle knopen dichtvouwen" ID="ID_613340915" CREATED="1310134532679" MODIFIED="1323683248394" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Verbergt alle afstammelingen van de geselecteerde knoop. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Sneltoets</b>
+ </p>
+ <ul>
+ <li>
+ druk op de <i>spatiebalk; of</i>
+ </li>
+ <li>
+ klik één keer op de knoop; of
+ </li>
+ <li>
+ klik op de pictogramknop in het<i> werkmenu</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Een niveau openvouwen" ID="ID_1090568502" CREATED="1310134532663" MODIFIED="1323683248394" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Eén keer klikken maakt allen de kinderen zichtbaar. Nogmaals klikken maakt de kleinkinderen zichtbaar enz. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Een niveau dichtvouwen" ID="ID_1503644667" CREATED="1310134532679" MODIFIED="1323683248394" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_one_level"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Eén keer klikken verbergt de uiteinden van de tak. Nogmaals klikken verbergt de dan zichtbare uiteinden, enz.</font><br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Bewerkent > Knoopgroep > Altijd opengevouwen" STYLE_REF="Method" ID="ID_230150067" CREATED="1337203336236" MODIFIED="1337203697159">
+<font ITALIC="true"/>
+</node>
+</node>
+</node>
+<node TEXT="Mindap op Internet openen" STYLE_REF="Beginner" FOLDED="true" ID="ID_1857240761" CREATED="1329414112893" MODIFIED="1336124917514">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Consumer" LAST="false"/>
+</hook>
+<node STYLE_REF="TitlesContent" ID="ID_1054557588" CREATED="1329414148558" MODIFIED="1335976530158" HGAP="-152" VSHIFT="35"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om een mindmap op Internet tr openen moet deze eerst naar de computer gecopieerd worden. Dit gebeurt automatisch door menu <i>Bestand > Openen van URL</i> te kiezen.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Basis mindmap" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_1337127972" CREATED="1314109409850" MODIFIED="1335976646145" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Knoopkern" STYLE_REF="Beginner" FOLDED="true" ID="ID_1370298116" CREATED="1315860175003" MODIFIED="1336124936608" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1314148002" CREATED="1323461584875" MODIFIED="1336115236512" HGAP="-56" VSHIFT="121"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De informatie in een knoop is zichtbaar via twee gebieden. Het ene gebied bevindt zich in het midden van de knoop, in de <b>kern</b> en dit veld kan worden omgeven door een kader. De tekst die je nu leest bevindt zich in de kern. Het gekleurde gebied net boven de tekst die je nu leest bevindt zich ook in een knoopkern (van een andere knoop).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ De tekst in de knoopkern kan kort zijn zoals bij een titel, maar kan ook meerdere regels omvatten. Verder kan de tekst verschillende presentatiecomponenten bevatten zoals plaatjes en pictogrammen. De knoopkern kan ook hyperlinks, een formule en componenten voor tijdmanagement en bescherming met een wachtwoord bevatten.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Naast de knoopkern kan tekst voorkomen in velden voor <b>knoopdetails</b>, <b>notities</b> en <b>attributen</b>. Deze worden op een andere plaats beschreven.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Bewerken knoopkern (snel)" STYLE_REF="Beginner" FOLDED="true" ID="ID_268413071" CREATED="1314125550476" MODIFIED="1336124936608" STYLE="combined" MIN_WIDTH="115">
+<edge STYLE="bezier"/>
+<node ID="ID_265318117" CREATED="1323437723250" MODIFIED="1336115251987" HGAP="-156" VSHIFT="169" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Na het starten van Freeplane is een leeg werkblad zichtbaar. Op het werkblad bevindt zich een elliptische vorm, de stamknoop, met een tekst zoals <i>Nieuwe mindmap</i>. Deze tekst is geaccentueerd. Dit betekent dat je de tekst kunt vervangen door je eigen tekst te typen. Type eenvoudig een titel en sluit af met <i>Enter</i>. Als je vervolgens op de <i>Insert-</i>toets drukt verschijnt een nieuwe kindknoop. Herhaal deze procedure zo vaak je wilt. Je krijgt zo een keten van knopen. Als je geen kindknoop wilt maar een knoop onder de huidige, klik dan niet éénmaal maar twee maal op <i>Enter</i>. Je kunt zo net zoveel vertakkingen maken als je wilt. Als je een bestaande knoop wilt bewerken, houdt dan <i>Control</i> ingedrukt terwijl je op de knoop linksklikt (META bij MAC OS). Dit is alles wat je moet weten om een mindmap te maken.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b><br/>
+ </p>
+ <ul>
+ <li>
+ Om een nieuwe regel toe te voegen, druk op <i>Shift + Enter.</i>
+ </li>
+ <li>
+ Als je tijdens het bewerken rechtsklikt op de te bewerken tekst dan opent een zogenaamd <b>contextmenu. </b>Hiermee heb je snel toegang tot functies zoals kopiëren en plakken.
+ </li>
+ <li>
+ Als je een tekst selecteert en hierop rechtsklikt, dan kun je in het contextmenu functies als <b>vet</b> en <i>schuin</i> toepassen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="hide_edge"/>
+<node TEXT="Nieuwe mindmap" STYLE_REF="BeginnerOnderwerp" ID="ID_1310307853" CREATED="1310134532663" MODIFIED="1323684127330" TEXT_SHORTENED="true">
+<icon BUILTIN="../filenew"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zoek dit pictogram in het werkmenu boven in het scherm.
+ </p>
+ </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="Opslaan bewaarde mindmap.." STYLE_REF="BeginnerOnderwerp" ID="ID_1284635316" CREATED="1310134532663" MODIFIED="1323684127330" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileopen"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zoek dit pictogram in het werkmenu boven in het scherm.
+ </p>
+ </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="Afdrukken mindmap" STYLE_REF="BeginnerOnderwerp" ID="ID_111478060" CREATED="1310134532663" MODIFIED="1323684127330" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileprint"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zoek dit pictogram in het werkmenu boven in het scherm.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Knippen" STYLE_REF="BeginnerOnderwerp" ID="ID_353410114" CREATED="1310134532663" MODIFIED="1323684127330" TEXT_SHORTENED="true">
+<icon BUILTIN="../editcut"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Knip de geselecteerde knoop en al zijn kinderen.</font>
+ </p>
+ </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="Kopieren" STYLE_REF="BeginnerOnderwerp" ID="ID_1274800359" CREATED="1310134532663" MODIFIED="1323684127346" TEXT_SHORTENED="true">
+<icon BUILTIN="../editcopy"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Kopieert de geselecteerde knoop en al zijn kinderen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Plakken" STYLE_REF="BeginnerOnderwerp" ID="ID_1705754282" CREATED="1310134532663" MODIFIED="1323684127346" TEXT_SHORTENED="true">
+<icon BUILTIN="../editpaste"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Plakt gekopieerde tekst in de geselecteerde knoop. Als de knoop in edit-mode is wordt de tekst toegevoed aan de knooptitel. Anders wordt de tekst toegevoegd als kindknoop.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Nieuwe kindknoop" STYLE_REF="BeginnerOnderwerp" ID="ID_942355748" CREATED="1266249828031" MODIFIED="1323684127346" TEXT_SHORTENED="true">
+<icon BUILTIN="../idea"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Maakt ee nieuwe knoop die een kind is van de geselecteerde knoop. . </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Zelfde effect: </font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">druk op toets <i>Ins</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Ins> Nieuwe kindknoop" ID="ID_33311014" CREATED="1316702689073" MODIFIED="1323684127346">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Shift>+<Enter> Toevoegen nieuwe regel" ID="ID_312543101" CREATED="1316723348757" MODIFIED="1323684127346">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Enter> Afsluiten bewerken" ID="ID_1113787270" CREATED="1316702710297" MODIFIED="1323684127346">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="2 x <Enter> Nieuwe zus-knoop" ID="ID_1173879612" CREATED="1316702765996" MODIFIED="1323684127346">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Rechtsklik: contextmenu" ID="ID_807808681" CREATED="1316723959021" MODIFIED="1323684127346">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Bewerken knoopkern (in venster)" STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" CREATED="1314126040831" MODIFIED="1336124936608" STYLE="combined" MIN_WIDTH="115">
+<node ID="ID_1433249332" CREATED="1323438495734" MODIFIED="1336115391125" HGAP="-195" VSHIFT="141" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een tweede manier om een knoop te bewerken is in een afzonderlijk venster welke eigen menuknoppen heeft. Rechtslklik op de knoop en kies in het contextmenu <i>Bewerken knooptitel in venster</i>. Je kunt nu de tekst in het venster typen en de menu's van het venster gebruiken om de tekst te bewerken en op te maken. Druk op <i>OK</i> als je klaar bent. De tekst wordt dan opgenomen in de knoop. Merk op dat de menu's van het venster meer mogelijkheden bieden voor het opmaken van tekst dan <i>Bewerken knooptitel (snel)</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Als je met de rechter muisknop op een knoop klikt (niet in de bewerkingsmodus) dan opent een <b>context menu</b>. Dit menu bevat de meestgebruikte functies van een knoop.
+ </li>
+ <li>
+ Je kunt alle opdrachten die in het contextmenu staan ook via het hoofdmenu openen. Bijvoorbeeld, om het bewerkingsvenster te openen kies <i>Bewerken> Knoopkern > Bewerken knooptitel (in venster</i>).
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="hide_edge"/>
+<node TEXT="Eigen menu's !" ID="ID_1285520943" CREATED="1316723899901" MODIFIED="1323684851172">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="<Enter>: Nieuwe regel" ID="ID_1609356152" CREATED="1316723917228" MODIFIED="1323684855540">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Rechtsklik: Contextmenu" ID="ID_1771133184" CREATED="1316723959021" MODIFIED="1323684865758">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Bewaren en sluiten" STYLE_REF="Beginner" FOLDED="true" ID="ID_48547188" CREATED="1314127927655" MODIFIED="1336124936608" STYLE="combined" MIN_WIDTH="115">
+<node ID="ID_1460485800" CREATED="1323438690647" MODIFIED="1336115404354" HGAP="-104" VSHIFT="40" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bewaar de bewerkte mindmap door op het bewaren-pictogram te klikken of <i>Bestand > Bewaren mindmap </i>te kiezen. Je kunt daarna een andere mindmap openen door op het pictogram voor openen te klikken o<i>f Bestand > Openen mindmap</i> te kiezen<i>. </i><br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="hide_edge"/>
+<node TEXT="Bewaren" STYLE_REF="BeginnerTopic" ID="ID_1253878525" CREATED="1310134532663" MODIFIED="1323684992835" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesave"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look in the toolbar for the icon button to save the current map.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Bewaren als ..." STYLE_REF="BeginnerTopic" ID="ID_449363060" CREATED="1310134532663" MODIFIED="1323685003163" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesaveas"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Look up in the toolbar
+ </p>
+ </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="Sluiten huidige mindmap" STYLE_REF="BeginnerTopic" ID="ID_1018458898" CREATED="1310134532663" MODIFIED="1323685019012" TEXT_SHORTENED="true">
+<icon BUILTIN="../close"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">Closes the map that has focus. If multiple maps are open, focus refers to the tab that you are currently editing.</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Vrije knopen" STYLE_REF="Advanced" FOLDED="true" ID="ID_1401167294" CREATED="1323470356903" MODIFIED="1336124936608" MIN_WIDTH="80">
+<node TEXT="Post-it knopen: vrij positioneerbaar, vrij zwevend" STYLE_REF="Advanced" FOLDED="true" ID="ID_630972811" CREATED="1323076049931" MODIFIED="1323809737825" HGAP="23" VSHIFT="212" STYLE="combined">
+<node ID="ID_830664496" CREATED="1323434577171" MODIFIED="1336115417739" HGAP="-297" VSHIFT="77" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Door op een vrije plaats in de mindmap te klikken terwijl <i>Control</i> is ingedrukt, opent een zogenaamde vrij positioneebare, vrij zwevende knoop. Dezeze knoop is te vergelijken met een post-it (geeltje). Je kunt de knoop verplaatsen zonder dat dit effect heeft op de andere knopen. De opmaak van deze knoop wordt bepaald door de systeemstijl<i> Zwevende knoop</i>. Je kunt deze stijl veranderen, bijvoorbeeld de wolk verwijderen of de takken zichtbaar maken. Je kunt de post-it node aan een knoop in de hierarchie vastmaken door hem op een andere knoop te plaatsen: de post-it wordt dan een kindknoop van deze knoop en is niet langer een vrije knoop. Voor voorbeelden, zie wiki <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Floating_nodes">Tutorial Freeplane.</a>
+ </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="1336115423573" HGAP="-548" VSHIFT="165"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>Vrije knopen met een verborgen tak zijn bedoeld om informatie zoals legenda, een titel, samenvatting, auteurs e.d. te tonen. Waar deze informatie betrekking heeft op de mindmap as geheel, dient de vrije knoop te zijn gekoppeld aan de stamknoop zodat de positie onafhankelijk is van de positie vsan andere knopen en de zichtbaarheid is gegarandeerd. Als de informatie betrekking heeft op een bepaalde tak van de mindmap dan kan de vrije knoop aan deze tak worden gekoppeld. De verbinding met de tak wordt dan getoond als een gestippelde lijn. Het is mogelijk de tak naar de vrije knoop als lijn zichtbaar te maken. Het tweede doel van een vrije knoop is om de ruimte van de mindmap beter te benutten. Het automatische mechanisme voor layout zorgt er voor dat knopen niet kunnen overlappen. Bij een vrije knoop kan dit wel.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Maken en verplaatsen vrije knopen" STYLE_REF="Advanced" ID="ID_128387683" CREATED="1317135703793" MODIFIED="1323809740633" VGAP="0" HGAP="24" VSHIFT="-210" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1188410566" CREATED="1323685758847" MODIFIED="1336115446146" HGAP="-210" VSHIFT="195"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een vrije knoop is een knoop die vrij positioneerbaar is, onafhankelijk van de posities van de andere knopen. Een vrije knoop kan worden herkend aan dit gedrag, en aan het blauwe, rood gevulde ovaaltje (handle) waarmee de knoop kan worden verplaatst.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Een nieuwe vrije knoop kan worden gemaakt door <i>Ctrl</i> ingedrukt te houden en te linksklikken op een vrije plek in de achtergrond van de mindmap. Deze knoop krijgt stijl <i>Zwevende knoop,</i> met als eigenschappen<i> rechthoekige wolk, </i>en<i> verborgen tak. </i>Deze kenmerken kunnen op de gebruikelijke wijze worden veranderd met het opmaakvenster.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Een gewone knoop kan in een vrije knoop worden veranderd door de knoop te selecteren en <i>Bewerken > Vrije knoop</i> te kiezen. In dat geval blijft de knoop zijn oorspronkelijke stijl houden. Een wolk en het verbergen van de tak kun je in het opmaakvenster instellen - of je kunt stijl <i>Zwevende knoop</i> kiezen. De vrije knoop verplaats automatisch nabij de knoop waarmee de knoop is verbonden, en kan vervolgens naar de gewenste positie worden verplaatst. Door de vrije knoop op een andere knoop te plaatsen wordt de knoop weer een gewone knoop.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Een vrije knoop die is gemaakt door Ctrl + klikken op de achtergrond van de mindmap is met een verborgen tak verbonden met de stamknoop.
+ </li>
+ </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="Vrije knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_1757242560" CREATED="1317754595087" MODIFIED="1336115463462" HGAP="599" VSHIFT="29" MAX_WIDTH="150">
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zweef met de cursor over mijn linker zijde tot het blauwe ovaal zichtbaar wordt. Sleep me aan dit blauwe ovaal, mijn handle.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Pictogrammen" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" CREATED="1323433444639" MODIFIED="1336124936608" STYLE="combined" MIN_WIDTH="80">
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="idea"/>
+<node ID="ID_715025500" CREATED="1323437305973" MODIFIED="1336115475038" HGAP="-115" VSHIFT="162" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een pictogram is een klein plaatje. Freeplane bevat een bibliotheek met pictogrammen. Er zijn verschillende manieren om een pictogram toe te voegen.
+ </p>
+ <ol>
+ <li>
+ Met de pictogrammenbalk naast het scherm. Als je deze balk niet ziet, kies dan <i>Beeld > werkbalken > Tonen pictogrammenbalk.</i><br/>
+ </li>
+ <li>
+ Door de pictogrammen te kiezen uit een tabel: kies Bewerken > Pictogram > Kiezen pictogram uit tabel.
+ </li>
+ <li>
+ Via een gestructureerde opsomming van pictogrammen: kies<i> Bewerken > Pictogram. </i>
+ </li>
+ </ol>
+ <p>
+ Om een pictogram toe te voegen, ga naar een van de menu's en klik op het pictogram.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een pictogram te verwijderen, klik in de menu's op een pictogram met een rood kruis.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Het is mogelijk meerdere pictogrammen toe te voegen aan dezelfde knoopkern.
+ </li>
+ <li>
+ Pictogrammen kunnen niet aan knoopkenmerken ot knoopnotities worden toegevoegd.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="hide_edge"/>
+</node>
+</node>
+<node TEXT="Afbeeldingen" STYLE_REF="Advanced" FOLDED="true" ID="ID_1795262306" CREATED="1323469507087" MODIFIED="1336124936608" MIN_WIDTH="80">
+<node TEXT="Afbeelding (knoopkern)" STYLE_REF="Advanced" FOLDED="true" ID="ID_806240384" CREATED="1315581148847" MODIFIED="1323809760149" STYLE="combined" HGAP="22" VSHIFT="45">
+<node ID="ID_199889694" CREATED="1323435536299" MODIFIED="1336115488906" HGAP="-136" VSHIFT="97" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In en knoopkern kan een plaatje worden opgenomen. Kies<i> Bewerken > Knoopkern > Toevoegen afbeelding of converteren koppeling.</i> Dit plaatje heeft een vaste grootte welke niet kan worden veranderd.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Om de grootte van het plaatje te veranderen: laadt het plaatje in een tekenprogramma en bewaar het met minder pixels.
+ </li>
+ <li>
+ Zie <i>Knoopuitbreiding</i> voor schaalbare afbeeldingen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="hide_edge"/>
+</node>
+</node>
+<node TEXT="Koppeling naar afbeelding (rode pijl)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1955041924" CREATED="1314282007169" MODIFIED="1323809769805" HGAP="21" VSHIFT="1" MAX_WIDTH="550" MIN_WIDTH="1" 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="1336115771721" HGAP="-219" VSHIFT="199"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Plaatjes nemen veel ruimte in, ook als je de knoop niet aan het bekijken bent. Een koppeling naar een plaatje heeft dit nadeel niet: het plaatje is alleen zichtbaar nadat je op de koppeling hebt geklikt. Je kunt een koppeling naar een plaatje in een knoop opnemen met kopiëren en plakken. Als je het gekopieerde plaatje op de bovenzijde van een knoop plakt dan komt het plaatje in de knoop zelf. Als je het plaatje aan de kindzijde plakt dan wordt een kindknoop gemaakt met de koppeling. Het adres van de koppeling verschijnt in de knooptitel. Dit adres mag je wissen of vervangen door een eigen tekst. De koppeling (het pijltje) blijft daarbij staan.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Als bij het plakken van een hyperlink de <i>Ctrl</i> toets wordt ingedrukt, wordt een plaatje toegevoegd in knoopdetails.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Zie ook</b>
+ </p>
+ <ul>
+ <li>
+ Onderstreepte hyperlinks. Hiermee kunnen in één tekst meerdere hyperlinks naar plaatjes worden gemaakt.
+ </li>
+ <li>
+ Als in het <i>Opmaakpaneel</i> de optie "hyperlink" is aangevinkt wordt de tekst naast het rode pijltje onderstreept en kan ook deze onderstreepte tekst worden gelikt om de hyperlink te openen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Afbeelding via HTML-code" STYLE_REF="Professional" FOLDED="true" ID="ID_680497355" CREATED="1314282819174" MODIFIED="1323687136601" VSHIFT="-48" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<edge STYLE="bezier"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Ervaren gebruikers kunnen ook met zogenaamde HTML-code plaatjes invoegen. Er is zelfs een script om dit te doen. Raadpleeg hiervoor de handleiding (Help > Handleiding)." ID="ID_990348986" CREATED="1323469818677" MODIFIED="1336115550060" HGAP="-155" VSHIFT="33">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Voortgang %" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" CREATED="1314283858479" MODIFIED="1336124936608" MIN_WIDTH="100">
+<node TEXT="Als je in een knoop wilt laten zien dat er sprake is van voortgang, dan kun je gebruik maken van een kleine of grote voortgangsindicator." ID="ID_707469329" CREATED="1323436243939" MODIFIED="1323687803128" HGAP="29" VSHIFT="80" STYLE="fork"/>
+<node TEXT="Kleine voortgangsindicator (%Schijf pictogram)" STYLE_REF="Advanced" ID="ID_1826965169" CREATED="1314283872699" MODIFIED="1330028682827" HGAP="33" VSHIFT="10" MAX_WIDTH="550" MIN_WIDTH="1" 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="1336115823388" HGAP="-300" VSHIFT="40"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een % shijf is een pictogram waarmee bijvoorbeeld de voortgang in een proces kan worden weergegeven. Om een kleine schijf toe te voegen, kies <i>Knoopkenmerken > %Shijf > Vermeerderen</i>. Herhaal dit om het percentage te verhogen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Grote voortgangsindicator (pictogram & afbeelding)" STYLE_REF="Advanced" ID="ID_1080017148" CREATED="1314283905093" MODIFIED="1330028704168" HGAP="30" VSHIFT="-62" MAX_WIDTH="550" MIN_WIDTH="1" 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="1336115834995" HGAP="-322" VSHIFT="137"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een grote schijf is een extern plaatje. Bij een grote schijf kan worden gekozen uit 10% of 25% stappen. Om een externe schijf voor 10% stappen toe te voegen, kies <i>Bewerken > Knoopkern > %Schijf > Schijf met 10% punt.</i> Om het perccentage met 10% te vergroten dubbelklik op de schijf. Om het percentage met 10% te verkleinen, houdt <i>Ctrl</i> in gedrukt en dubbelklik op het plaatje.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Er worden twee afbeeldingen getoond. Het kleinste is een pictogram in de knoopkern. Het andere plaatje is een afbeelding in knoopuitbreiding.
+ </li>
+ <li>
+ <b>BELANGRIJK</b>. het grotere plaatje is een .svg file welke niet in het Java Applet wordt getoond !
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Samenvoegen knoopkernen" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" CREATED="1316668137651" MODIFIED="1336124936624" MAX_WIDTH="600" MIN_WIDTH="100" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_795220191" CREATED="1323468276180" MODIFIED="1336115847053" HGAP="-165" VSHIFT="88"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om de teksten van de verschillende knopen samen te voegen in één knoop, selecteer de knopen en kies menu <i>Bewerken > Knoopkern > Samenvoegen knoopkernen. </i>In het in-line bewerkingsvenster heeft Ctrl + J hetzelfde effect.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Andere componenten zoals knoopdetails worden niet samengevoegd. Kinderen van de samengevoegde knopen komen alle onder de nieuwe samengestelde knoop.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Een knoopkern splitsen" STYLE_REF="Professional" FOLDED="true" ID="ID_247213553" CREATED="1316668117473" MODIFIED="1336124936624" MAX_WIDTH="600" MIN_WIDTH="100" 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="1336115855602" HGAP="-133" VSHIFT="145"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Er zijn twee verschillende manieren om een knoopkerntekst te verdelen over meerdere knopen, respectievelijk via een actie in het hoofdmenu en via een actie in het bewerkingsvenster.
+ </p>
+ <p>
+
+ </p>
+ <ol>
+ <li>
+ Een knoopkerntekst van meerdere regels kan worden verdeeld over aparte knopen door de betreffende knoop te selecteren en het kiezen van menu <i>Bewerken > Knoopkern >Splits knoopkern</i>. Als er meerdere regels zijn komen deze alle in een aparte knoop.
+ </li>
+ <li>
+ Een tekst kan op de plaats van de cursor worden verdeeld over <b>twee</b> knopen. In het dialoogvenster, kies knop Splitsen. Of in de snelle in-line bewerkingsvenster, kies. Alt + S.
+ </li>
+ </ol>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Dit werkt alleen goed bij knopen zonder andere componenten zoals knoopdetails.
+ </li>
+ <li>
+ Zie <i>Help > Documentatie</i> voor details.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Berekenen" STYLE_REF="Professional" FOLDED="true" ID="ID_448338872" CREATED="1316197624394" MODIFIED="1336124936624" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formula" MIN_WIDTH="100" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_60050529" CREATED="1323467815625" MODIFIED="1336115867474" HGAP="-80" VSHIFT="124" FORMAT="STANDARD_FORMAT"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een knoopkern kan net als een spreadsheet cel een formule bevatten die begint met "=". Deze formule wordt automatisch uitgevoerd en het resultaat wordt getoond.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ Berekeningen werken niet alleen gelezen kan worden, zoals bij de help-bestanden van Freeplane en bij publicatie op Internet (Java Applet).
+ </li>
+ <li>
+ Berekeningen kunnen over meerdere knopen gaan. Klik het rode pijltje voor uitleg.
+ </li>
+ <li>
+ Berekeningen worden standaard omlijnd. De omlijning kan worden verwijderd: <i>Beeld > Knoopkern > Markeer formules niet met een rand. </i>
+ </li>
+ <li>
+ Automatisch berekenen kan voor een knoop worden uitgeschakeld door in het opmaakpaneel in veld <i>Formaat</i> de waarde <i>Tekst</i> te kiezen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Selecteren en verplaatsen" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_272980743" CREATED="1314248580003" MODIFIED="1335976646145" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Vrij scrollen van de hele mindmap" STYLE_REF="Beginner" FOLDED="true" ID="ID_1577961914" CREATED="1314644535914" MODIFIED="1336124972644" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1560196388" CREATED="1323511488363" MODIFIED="1336115888908" HGAP="-206" VSHIFT="51"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Je kunt de hele mindmap vrij verplaatsen door
+ </p>
+ <ol>
+ <li>
+ in de achtergrond te klikken en de cursor te slepen; of
+ </li>
+ <li>
+ Ctrl + Shift ingedrukt houden en de cursor pijlen op/neer/links/rechts te gebruiken (pannen).
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Selecteren" STYLE_REF="Beginner" ID="ID_1573267345" CREATED="1323507663956" MODIFIED="1336124972644" MIN_WIDTH="60">
+<node TEXT="Automatisch selekteren" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" CREATED="1314249066966" MODIFIED="1336124972660" MAX_WIDTH="600" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1185537684" CREATED="1323506992696" MODIFIED="1336115900203" HGAP="-132" VSHIFT="40"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Je kunt een knoop selecteren door er met de muiscursor overheen te zweven. Na een korte vertraging zal de knoop dan een blauwe rand krijgen ten teken dat de knoop geselecteerd is. Dit heet <b>automatische selectie. </b>Je kunt ook op een knoop klikken om deze te selecteren.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Selectie vasthouden" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" CREATED="1314248859369" MODIFIED="1336124972660" MAX_WIDTH="550" 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="1336115909516" HGAP="-113" VSHIFT="32"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Het automatisch selecteren van een knoop kan in sommige gevallen onhandig zijn. Je kunt het geselecteerd zijn van een knoop vasthouden door bij het bewegen de <i>Shift</i> toets ingedrukt te houden.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<edge STYLE="hide_edge"/>
+</node>
+</node>
+<node TEXT="Esc naar stamknoop" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" CREATED="1314249586526" MODIFIED="1336124972644" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<edge STYLE="bezier"/>
+<node ID="ID_279008116" CREATED="1323507943923" MODIFIED="1336115919126" HGAP="-115" VSHIFT="28"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bij een grote mindmap kun je gemakkelijk verdwalen. Om in die situatie de stamknoop terug te vinden, druk op <i>Escape</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Verplaatsen" STYLE_REF="Beginner" ID="ID_1560992291" CREATED="1314248654564" MODIFIED="1336124972644" MAX_WIDTH="600" MIN_WIDTH="60">
+<node TEXT="Een knoop verschuiven" STYLE_REF="Beginner" FOLDED="true" ID="ID_293115184" CREATED="1314249849956" MODIFIED="1336124972660" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Je kunt een knoop verplaatsen maar de verbinding met andere knopen in takt laten. Hiervoor moet je de verplaatsingshandel van de te verplaatsen knoop zoeken. Deze bevindt zich aan de ouderzijde. Zweef met de cursor over de ouderzijde en wacht tot het ovaaltje verschijnt. Klik vervolgens op het ovaaltje en sleep de knoop naar de gewenste positie." ID="ID_1319283887" CREATED="1323510779368" MODIFIED="1336115927113" HGAP="-131" VSHIFT="50">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Een knoop verplaatsen in de hierarchie" STYLE_REF="Beginner" FOLDED="true" ID="ID_125921821" CREATED="1314250124540" MODIFIED="1336124972660" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Om een knoop los te maken van zijn ouder en aan een andere knoop vast te maken, klik en sleep de knoop naar zijn nieuwe ouder. Hieronder kun je lezen dat het verschil maakt op welk punt van de doelknoop je de gesleepte knoop laat vallen. Je kunt kindknopen ook verplaatsen door deze te sorteren." FOLDED="true" ID="ID_1599927930" CREATED="1323510888467" MODIFIED="1336115934070" HGAP="-235" VSHIFT="40">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="video illustratie" ID="ID_760768670" CREATED="1322820636797" MODIFIED="1323690953834" LINK="https://www.youtube.com/watch?v=0xkUzsd4naA" HGAP="30" VSHIFT="10" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Valposities" STYLE_REF="Beginner" FOLDED="true" ID="ID_1039655261" CREATED="1314250309213" MODIFIED="1336124972660" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_786303568" CREATED="1323511320373" MODIFIED="1336115943368" HGAP="-56" VSHIFT="89" MIN_WIDTH="80"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Elke knoop heeft twee posities waar je een gesleepte knoop kunt laten "vallen":
+ </p>
+ <ol>
+ <li>
+ Als de cursor dicht bij de bovenkant van de doelknoop komt, dan licht de hele bovenste helft op. Als je hier loslaat dan komt de knoop boven de doelknoop, als een zusknoop.
+ </li>
+ <li>
+ Als je de cursor over de kindzijde van de doelknoop beweegt dan licht deze helft van de knoop op. Als je hier loslaat dan wordt de gesleepte knoop een kindknoop van de doelknoop
+ </li>
+ </ol>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ Bij de stamknoop kun je een gesleepte knoop zowel aan de linkerzijde als aan de rechterzijde loslaten.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Verplaatsen groepsknoop (accollade)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1040002877" CREATED="1316181690861" MODIFIED="1336124972660" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1239614830" CREATED="1323511365121" MODIFIED="1336115953633" HGAP="-220" VSHIFT="77"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om een groep knopen te verplaatsen moet je alle knopen, inculsief de knoop achter de accollade, selecteren en verplaatsen:
+ </p>
+ <ol>
+ <li>
+ Selecteer de knoopgroep: Houd <i>Shift</i> ingedrukt en selecteer de eerste knoop van de groep en dan de knoopgroep. (Bij een accolade, selecteer ook de knoop achter de accollade; houdt zo nodig Ctrl-ingedrukt)
+ </li>
+ <li>
+ Met <i>Shift</i> nog steeds ingedrukt: sleep de groep naar zijn nieuwe bestemming.
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Reset node position" STYLE_REF="Advanced" FOLDED="true" ID="ID_1352824494" CREATED="1335300691836" MODIFIED="1336124972660">
+<node STYLE_REF="TitlesContent" ID="ID_688846542" CREATED="1335300712264" MODIFIED="1336115962728" HGAP="-115" VSHIFT="34"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ After displacing nodes they can be set to their original positions. Select the nodes and choose <i>Edit > Reset node position.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Knopen sorteren" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" CREATED="1314338769195" MODIFIED="1336124972644" MAX_WIDTH="600" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_915226922" CREATED="1323511424855" MODIFIED="1336115972774" HGAP="-90" VSHIFT="32"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De kindknopen van de geselecteerde knoop kun je alfabetisch sorteren op de tekst van de knooptitel. Kies hiervoor Bewerken<i> > Verplaatsen en sorteren</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Relaties en groepen" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_215646874" CREATED="1314109445053" MODIFIED="1335976646160" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Tak" STYLE_REF="Beginner" FOLDED="true" ID="ID_1492225657" CREATED="1314162236991" MODIFIED="1336124993564" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Een tak ("edge") is een afstammingslijn tussen twee knopen. Het is mogelijk de vorm van de tak (buiging, dikte, kleur) te veranderen. Ga hiervoor naar het opmaakpaneel, zie onder." ID="ID_751107880" CREATED="1323514479284" MODIFIED="1323809959424" HGAP="-13" VSHIFT="30">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Verbindingslijn" STYLE_REF="Beginner" FOLDED="true" ID="ID_1073407528" CREATED="1314129123086" MODIFIED="1336124993564" STYLE="combined">
+<font BOLD="true"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1649729730" CREATED="1323514507513" MODIFIED="1336116034332" HGAP="-79" VSHIFT="151"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een verbindingslijn is een lijn tussen twee willekeurige knopen welke geen afstammingslijn is. Om een verbindingslijn te maken, selecteer twee knopen, rechtklik op één van beide en kies<i>Toevoegen verbindingslijn.</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ De buiging van een verbindingslijn kan worden veranderd door op de lijn te klikken en de lijn te slepen. Het slepen kan aan de lijn zelf of aan twee hulplijnen die aan de uiteinden verschijnen. De opmaak van een verbindingslijn kan worden aangepast door op de lijn te rechtsklikken. Er verschijnt dan een <b>contextmenu</b> waarin ook <b>tekstlabels</b> kunnen worden ingevoerd die in het midden of aan de uiteinden van de verdingslijn verschijnen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Om twee of meer knopen tegelijkertijd te selecteren: houdt <i>Ctrl</i> of <i>Shift</i> ingedrukt bij het selecteren van de knopen.
+ </li>
+ <li>
+ Vergeet na het invoeren van een tekstlabel niet om op <i>Enter</i> te drukken.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="a" ID="ID_1328399304" CREATED="1314130936565" MODIFIED="1336116120168" HGAP="25" STYLE="as_parent">
+<edge STYLE="hide_edge"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_581303769" MIDDLE_LABEL="label" STARTINCLINATION="9;-23;" ENDINCLINATION="-28;-89;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="b" ID="ID_273400211" CREATED="1314130940427" MODIFIED="1336116107610">
+<edge STYLE="bezier"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_273400211" MIDDLE_LABEL="verbindingslijn 
zonder
begin" STARTINCLINATION="19;86;" ENDINCLINATION="19;86;" STARTARROW="NONE" ENDARROW="NONE"/>
+<node TEXT="c" ID="ID_581303769" CREATED="1314130942275" MODIFIED="1314130945036"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Knoopgroep met accollade" STYLE_REF="Advanced" FOLDED="true" ID="ID_1700918771" CREATED="1314129783832" MODIFIED="1336124993564" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_651594550" CREATED="1323514659262" MODIFIED="1336116145612" HGAP="-156" VSHIFT="96"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een groep zusknopen kan door een accolade worden verbonden. De knoop achter de accolade wordt groepsknoop genoemd. Selecteer de zussen van de groep, rechtsklik op een van de geselecteerde knopen en kies vervolgens <i>Knoopgroep met accollade toevoegen.</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Er zijn geavanceerde functies met betrekking tot de groepsknoop, zie <i>Bewerken > Knoopgroep.</i> Raadpleeg hiervoor<i> Help > Handleiding</i>.
+ </li>
+ </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">
+<hook NAME="FirstGroupNode"/>
+</node>
+<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="Knoopgroep" STYLE_REF="AdvancedTopic" ID="ID_460668684" CREATED="1314130905124" MODIFIED="1330030479014">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="Knoopgroep met wolk" STYLE_REF="Advanced" FOLDED="true" ID="ID_1150908697" CREATED="1314130460475" MODIFIED="1336124993564" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1862713604" CREATED="1323514733122" MODIFIED="1336116158139" HGAP="-123" VSHIFT="80"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De samenhang van een ouderknoop en zijn kindknopen kan worden geaccentueerd door een gemeenschappelijke achtergrondkleur, een <b>wolk</b>. Rechtsklik de ouderknoop en kies <i>Toevoegen wolk. </i>De eigenschappen van een wolk kunnen worden ingesteld in het opmaakpaneel, zie onder.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ Via <i>Bewerken > Knoopgroep > Knoop altijd opengevouwen </i>kan worden ingesteld dat de knopen binnen de wolk niet dichtvouwen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<font BOLD="false"/>
+<node TEXT="wolk a" STYLE_REF="AdvancedTopic" ID="ID_1742435994" CREATED="1314130827910" MODIFIED="1323694337137" VSHIFT="15">
+<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="wolk b" STYLE_REF="AdvancedTopic" ID="ID_539843005" CREATED="1314208596772" MODIFIED="1323694345202" HGAP="30" VSHIFT="-9">
+<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"/>
+</node>
+<node STYLE_REF="AdvancedTopic" ID="ID_649516172" CREATED="1310106596579" MODIFIED="1330030939558" TEXT_SHORTENED="true">
+<icon BUILTIN="../Cloud24"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Pictogram-knoop voor<i> Toevoegen standaard wolk</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zoek deze knop in de werkbalk
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Kopelingen (Hyperlinks)" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_114835202" CREATED="1314284617264" MODIFIED="1335976646160" NUMBERED="true" MIN_WIDTH="180">
+<node ID="ID_55001637" CREATED="1323100759475" MODIFIED="1333273307216" VSHIFT="40"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een dynamische koppeling is een electronische verbinding van een bronknoop naar een bestemming. De bestemming kan een map, bestand, webpagina, applicatie, e-mail, enz. zijn. De koppeling is in de bronknoop zichtbaar als onderstreepte tekst, een <b>rood pijltje</b> (externe hyperlink) of <b>groen pijltje</b> (interne snelkoppeling), of <b>e-mail pictogram</b>. Een knoop kan meerdere onderstreepte hyperlinks hebben en één pijl- of e-mail-hyperlink. Daarnaast kunnen knoopattributen meerdere hyperlinks (één per attribuut) bevatten. Het is ook mogelijk vanuit een andere mindmap of programma naar een bepaalde knoop te linken. Om de onderstreepte hyperlink te activeren, moet je hierop dubbelklikken.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Koppelen knopen via een anker" STYLE_REF="Beginner" FOLDED="true" ID="ID_1524719322" CREATED="1336298056719" MODIFIED="1336299746224">
+<node STYLE_REF="TitlesContent" ID="ID_1594135890" CREATED="1336298585173" MODIFIED="1336300147529" HGAP="-190" VSHIFT="127"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Op de volgende manier kun je gemakkelijk een link leggen tussen twee knopen die verder uit elkaar liggen of die zich in verschillende mindmaps bevinden:
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ rechtsklik een van beide knopen en kies Koppeling > <i>Zet koppelingsanker</i>
+ </li>
+ <li>
+ rechtsklik de andere knoop en kies <i>Koppeling > Maak een link van/naar het anker</i>.
+ </li>
+ </ul>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ <i>Zet koppeelingsanker </i> vervangt het vorige anker. (Er kan maar één anker zijn).
+ </li>
+ <li>
+ Het anker wordt "vergeten" na het sluiten van Freeplane.
+ </li>
+ <li>
+ Zie onder voor een alternatieve procedure in het geval dat de twee knopen niet ver uitelkaar liggen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Externe koppeling" STYLE_REF="Beginner" FOLDED="true" ID="ID_640110372" CREATED="1286651969385" MODIFIED="1336125011738" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" STYLE="combined">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1913035829" CREATED="1323512829161" MODIFIED="1336116193161" HGAP="-101" VSHIFT="249"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een pijl-hyperlink kan worden gemaakt door te rechtsklikken op een knoop en <i>Koppeling</i> te kiezen. Het is echter makkelijker om een pijl-link als volgt te maken: Klik op een een bestand, map, webadres of e-mail en sleep deze vervolgens naar een knoop (drag en drop). Als je de muis-toets loslaat dan wordt een kindknoop gemaakt met daarin de hyperlink naar de bestemming. In de knoop is het adres van de bestemming ook als tekst opgenomen. Deze tekst mag je weghalen of vervangen door een andere. Het pijltje blijft daarbij staan.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Je kunt ook meerdere bestemmingen tegelijk selecteren en slepen. Er worden dan meerdere kindknopen gevormd met in elke kindknoop één pijl-hyperlink.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een bestemmingsadres te <b>wijzigen</b>, rechtsklik op de knoop met de koppeling en kies<i> Koppeling > Typen of wijzigen koppeling</i>. Wijzig vervolgens het adres. Zo nodig kan met <i>Ctrl-V</i> kan een gekopieerd adres in het tekstveld worden geplakt.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Het is mogelijk via een hyperlink een andere mindmap te openen en een bepaalde knoop te selecteren. <a href="#ID_1418102707">Zie Koppeling van buiten naar een bepaalde knoop.</a>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een koppeling te verwijderen:
+ </p>
+ <ul>
+ <li>
+ kies <i>Koppeling > Koppeling typen of wijzigen... </i>of druk<i> Ctrl + K; en</i>
+ </li>
+ <li>
+ verwijder de tekst (het adres) in het tekstveld
+ </li>
+ </ul>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ In het Opmaakpaneel kan worden ingesteld dat de hele tekst van de knoopkern er uit ziet als een onderstreepte hyperlink. Dit werkt alleen als er geen (echte) onderstreepte hyperlink is gedefinieeerd.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Interne koppeling" STYLE_REF="Beginner" FOLDED="true" ID="ID_1942100751" CREATED="1314360169447" MODIFIED="1336125011738" LINK="#ID_86446891" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1830541497" CREATED="1323512880196" MODIFIED="1336116210805" HGAP="-106" VSHIFT="97"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een koppeling tussen twee knopen is als een groen pijltje zichtbaar in één van beide knopen, de bronknoop. Als op het pijltje wordt geklikt verschuift de focus naar de andere knoop. Deze koppeling kan worden ingesteld door met <i>Ctrl</i> ingedrukt eerst de bronknoop te selecteren en dan de bestemmingsknooprechtsklikken. Kies vervolgens<i> Koppeling > Snelkoppeling naar andere knoop</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een koppeling te verwijderen:
+ </p>
+ <ul>
+ <li>
+ rechtsklik op de knoop en kies <i>Koppeling > Koppeling typen of wijzigen... </i>of druk<i> Ctrl + K; en</i>
+ </li>
+ <li>
+ verwijder de tekst (het adres) in het tekstveld
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Email koppeling" STYLE_REF="Professional" FOLDED="true" ID="ID_869144882" CREATED="1270892460675" MODIFIED="1336125011738" LINK="mailto:%20jokro at freeplane.nl">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1480409284" CREATED="1323512986970" MODIFIED="1336116221803" HGAP="-95" VSHIFT="162"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een e-mail koppeling opent automatisch je email programma maakt een email met het email-adres uit de koppeling.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ De eenvoudigste manier om een email-koppeling te maken is door een e-mail adres (tekst) in een knoop te plakken. Er wordt dan een kindknoop gemaakt met de email koppeling.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een email-koppeling in een bepaalde knoop te maken, rechtsklik de knoop en kies <i>Koppeling > Typen of wijzigen koppeling. </i>Type in het tekstveld:
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ <i>mailto:emailaddress </i>Voorbeeld: <i>mailto:jokro at freeplane.nl</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ Om een koppeling te verwijderen:
+ </p>
+ <ul>
+ <li>
+ kies <i>Koppeling > Koppeling typen of wijzigen... </i>of druk<i> Ctrl + K; en</i>
+ </li>
+ <li>
+ verwijder de tekst (het adres) in het tekstveld.
+ </li>
+ </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" CREATED="1315336877701" MODIFIED="1336125011754"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Onderstreepte <a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">hyperlinks</a> .
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1356533861" CREATED="1323512914336" MODIFIED="1336116233799" HGAP="-149" VSHIFT="259"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In de knoopkern, knoopdetails en in een Notitie kun je een koppeling naar een interne of externe bestemming maken zolas je dit in bijvoorbeeld Word doet. Je opent de knoop in een venster, selecteert een tekstdeel en kiest in het menu van het bewerkingsvenster <i>Bewerken > Kiezen koppeling</i> of <i> Bewerken.> Koppeling typen of wijzigen.</i> In het venster dat opent kun je het adres van de koppeling typen of een gekopieerd adres te plakken door op <i>Ctrl + V </i>te drukken. voorbeeld van een koppeling: <a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1"><font color="#ff0000"><i>Deze</i></font> koppeling</a> brengt je naar het Freeplane Open Forum.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ De tekst van de koppeling kan worden bewerkt zonder dat de link (het adres) verandert. Met de menus van het dialoogvenster kan de formattering (kleur, grootte) worden gewijzigd.
+ </li>
+ <li>
+ Het adres van de link kan worden bewerkt door de hele onderstreepte tekst te selecteren en dan <i>Bewerken.> Koppeling typen of wijzigen </i>te kiezen.
+ </li>
+ <li>
+ Als een knoopkern alleen een onderstreepte koppeling heeft, dan is open/dichtvouwen lastig. Plaats een punt met een of meer spaties aan het begin en eind om ruimte te make waar kan worden geklikt zonder dat de hyperlink opent.
+ </li>
+ <li>
+ Als een hyperlink aan het begin of eind van de tekst wordt geplaatst, dan is het niet mogelijk om later nog tekst voor resp. achter de hyperlink toe te voegen (alleen door naar het HTML-venster te gaan). Zorg dus dat er voor en achter een hyperlink altijd een of meer niet-hyperlink tekens staan (spaties tellen niet mee).
+ </li>
+ <li>
+ Het is mogelijk via een hyperlink een andere mindmap te openen en een bepaalde knoop te selecteren. <a href="#ID_1418102707">Zie Koppeling van buiten naar een bepaalde knoop.</a>
+ </li>
+ <li>
+ Voor een<b> interne hyperlink</b> naar een een ander knoop binnen dezelfde mindmap moet als adres #KnoopID worden ingevoerd. Het KnoopID van de doelknoop kan worden bepaald door te rechtsklikken op de doelknoop, <i>Kopieren knoopID</i> te kiezen en in de bronknoop het venster voor <i>Koppeling typen of wijzigen </i>te openen en via<i> Ctrl + V de knoopID</i> te plakken. Vergeet niet # voor het knoopID te typen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Hyperlink naar menu" STYLE_REF="Professional" FOLDED="true" ID="ID_350080162" CREATED="1314359739019" MODIFIED="1336125011754" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1108178356" CREATED="1323513038412" MODIFIED="1336116245078" HGAP="-115" VSHIFT="87"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een bijzondere vorm van een sneltoets is een knoop die je kunt klikken om een specifiek menu item te kiezen. Rechtsklik een knoop en kies <i>Koppeling > Snelkoppeling naar menutoegang</i> om deze link te definieren.
+ </p>
+ <p>
+ <i>. </i>
+ </p>
+ <p>
+ Om een koppeling te verwijderen:
+ </p>
+ <ul>
+ <li>
+ kies <i>Koppeling > Koppeling typen of wijzigen... </i>of druk<i> Ctrl + K; en</i>
+ </li>
+ <li>
+ verwijder de tekst (het adres) in het tekstveld
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="F-toetsen en andere sneltoesen" STYLE_REF="Professional" FOLDED="true" ID="ID_1819697018" CREATED="1314526511158" MODIFIED="1336125011754" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_116460964" CREATED="1323513079714" MODIFIED="1336116255686" HGAP="-180" VSHIFT="112"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Sneltoetsen zijn toetscombinaties of F-toetsen. Door op een sneltoets te drukken wordt een keten van acties uitgevoerd waarmee een specifiek menu wordt gekozen. Een sneltoets kan worden gedefinieer met <i>Extra > Toewijzen sneltoets. </i>Direkt nadat een menu aan een sneltoets is gekoppeld, is deze te gebruiken.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Soms is het handig voor specifieke situaties een aparte sneltoetsenset te definieren die je eenvoudig kunt activeren. Het bewaren van de gedefineerde sneltoetsen als een set kan met <i>Extra > Sneltoetsenset > Bewaren set met sneltoetsen. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een bewaarde set later te hergebruiken, kies<i> Extra > Sneltoetsenset </i>en kies de naam waaronder je de set eerder hebt bewaard.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Koppeling van buiten naar een bepaalde knoop" STYLE_REF="Professional" FOLDED="true" ID="ID_1418102707" CREATED="1322224946352" MODIFIED="1336125011754" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_822375535" CREATED="1323513104618" MODIFIED="1336116264796" HGAP="-285" VSHIFT="228"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om vanuit een andere mindmap (of een ander programma) naar een bepaalde knoop in een bepaalde mindmap te springen, bepaal het adres van de doelknoop als volgt:
+ </p>
+ <ul>
+ <li>
+ Ga naar de doelmindmap.
+ </li>
+ <li>
+ Rechtsklik de bestemmingsknoop en kies <i>Kopieren knoop URI.</i>
+ </li>
+ <li>
+ Ga naar de bronlokatie van de hyperlink en plak het adres. In het geval van een mindmap, rechtsklik de knoop waar de hyperlink moet komen, kies het bewerkingsvenster voor knoopkern, details of notitie, kies <i>Bewerken > Typen of wijzigen koppeling</i>, en plak met <i>Ctrl V</i> het adres van de bestemmingsknoop.
+ </li>
+ <li>
+ Het geplakte adres is een zogenaamd absoluut adres. Als de doelmap wordt verplaatst, dan werkt de koppeling niet meer. Als bronmindmap en doelmindmap in dezelfde map (directory) staan kan een zogenaamd relatief adres worden gebruikt. In dat geval kan het mapje worden verplaatst terwijl de hyperlink blijft werken. Om een relatief adres te maken, wis het eerste deel van het adres tot de naam van de mindmap. Er blijft dan over: doelmap.mm#knoopID. Voorbeelden zijn te vinden in de map <a href="Om%20het%20adres%20in%20plaats%20van%20absoluut,%20relatief%20te%20maken,%20verwijder%20het%20eerste%20deel%20van%20het%20adres%20en%20laat%20minimaal%20mindmap.mm#knoopID%20over.%20Voordeel%20is%20dat%20de%20mindmap%20verplaatst%20kan%20worden%20waarbij%20de%20link%20blijft%20werken.%20Voorbeelden%20zijn%20te%20vinden%20in%20de%20map%C2%A0Functie%20index.">Functie index</a>.
+ </li>
+ </ul>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Sommige programma's geven het knoopnummer (#knoopID) niet automatisch door, ook al is dit in de hyperlink opgenomen. In dat geval is het niet mogelijk on direkt naar een bepaalde knoop te springen.
+ </li>
+ <li>
+ Deze Quick reference bevat twee knopen (Index functies en Index applicaties) die naar een andere mind map verwijzen. Als je deze volgt, dan bevatten deze knopen die weer terug verwijzen naar een bepaalde knoop van deze Quick reference.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Opmaken en stijlen" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" CREATED="1291143603918" MODIFIED="1335976646160" NUMBERED="true" MIN_WIDTH="180" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<node TEXT="Eigenschappen" STYLE_REF="Advanced" ID="ID_873516196" CREATED="1314162578896" MODIFIED="1336125047759" NUMBERED="true" MIN_WIDTH="110">
+<node TEXT="Opmaakpaneel" STYLE_REF="Advanced" FOLDED="true" ID="ID_1812601804" CREATED="1314162700896" MODIFIED="1336125047759" MAX_WIDTH="550" MIN_WIDTH="1" 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="1336116298726" HGAP="-88" VSHIFT="96"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane heeft meerdere mogelijkheden om de eigenschappen van een knoop of alle knopen in te stellen of te veranderen. Denk aan eigenschappen zoals het omlijnen van een knoop, de kleur enz. Het opmaakpaneel is een venster waarin bijna alle mogelijkheden bij elkaar staan. Om het opmaakpaneel te openen of te sluiten, kies <i>Beeld > Opmaakpaneel.</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Een andere manier om het opmaakpaneel te openen is via <i>Beeld > Opmaakpaneel</i>
+ </li>
+ <li>
+ Een andere manier om eigenschappen in te stellen is via menu <i>Opmaken.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Bewerken opmaak" STYLE_REF="Advanced" FOLDED="true" ID="ID_1707940964" CREATED="1314163244315" MODIFIED="1336125047759" MAX_WIDTH="500" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node FOLDED="true" ID="ID_676577574" CREATED="1323518049125" MODIFIED="1336116308461" HGAP="-102" VSHIFT="131"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Als het opmaakpaneel open is, toont het de eigenschappen die zijn ingesteld voor de geselecteerde knoop. Als je een andere knoop met andere eigenschappen selecteert, zie je direct de inhoud van het opmaakpaneel veranderen. Om een eigenschap te veranderen, zet eerst een vinkje vóór het element dat je wilt veranderen en verander daarna de instelling.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Als eerste voorbeeld, zoek in het paneel de groep met eigenschappen met de naam <i>Vorm knoop</i>. Zet vervolgens een vinkje voor <i>Omlijning</i> en klik op de knop achter <i>Omlijning</i>. Er verschijnt nu een lijst met omlijningstypen, zoals knoopomlijning, geen omlijning, enz.. Kies <i>knoopomlijning</i> en zie wat er gebeurt.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Als tweede voorbeeld, zoek groep <i>Opmaak tak</i> en zet een vinkje voor <i>Vorm tak</i>. Klik op de knop achter vorm tak. Hierdoor verschijnt een lijst met vormen zoals Ronde bocht, verborgen, rechte bocht en andere. Kies een vorm en zie wat er gebeurt.
+ </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">
+<edge STYLE="linear"/>
+</node>
+<node TEXT="curved" STYLE_REF="AdvancedTopic" ID="ID_1333040751" CREATED="1314172748460" MODIFIED="1323518517665" HGAP="35" VSHIFT="-27">
+<edge STYLE="bezier"/>
+</node>
+<node TEXT="hidden" STYLE_REF="AdvancedTopic" ID="ID_1968961455" CREATED="1314172761269" MODIFIED="1323518014549" HGAP="40" VSHIFT="-5">
+<edge STYLE="hide_edge"/>
+</node>
+<node TEXT="horizontal" STYLE_REF="AdvancedTopic" ID="ID_494591913" CREATED="1314172936705" MODIFIED="1323518524951" HGAP="39" VSHIFT="25">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Automatische takkleur" STYLE_REF="Advanced" FOLDED="true" ID="ID_1005719714" CREATED="1314164029738" MODIFIED="1336125047759" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1565463565" CREATED="1323518106869" MODIFIED="1336116317275" HGAP="-129" VSHIFT="40"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane opent standaard met de eigenschap <i><b>Automatische takkleur.</b></i> Deze eigenschap staat in de groep <i>Opmaakstijl knoop</i> en zorgt er voor dat elke nieuwe tak een andere kleur krijgt. Voor deze handleiding is dit uitgezet door het vinkje voor <i>Automatische takkleur</i> weg te halen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Automatisch knoopnummer" STYLE_REF="Advanced" FOLDED="true" ID="ID_1861361284" CREATED="1314283445398" MODIFIED="1336125047759" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1531819965" CREATED="1323518137156" MODIFIED="1336116333265" HGAP="-163" VSHIFT="32"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een handige eigenschap is <i>automatische knoopnummering</i>. Deze eigenschap staat in groep <i>Opmaak knooptitel</i>. Je kunt dit voor alle geselecteerde knopen tegelijk instellen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Andere eigenschappen" STYLE_REF="Advanced" FOLDED="true" ID="ID_457725429" CREATED="1314167397870" MODIFIED="1336125047759" MAX_WIDTH="550" STYLE="combined">
+<font ITALIC="false"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Loop door de opties van het opmaakpaneel heen om een indruk te krijgen wat er allemaal kan worden ingesteld. De eigenschappen voor (conditionele) stijlen worden hieronder besproken. Alle eigenschappen zijn meer gedetailleerd beschreven in de Handleiding Freeplane." STYLE_REF="TitlesContent" ID="ID_1014522598" CREATED="1323518167241" MODIFIED="1336116344809" HGAP="-133" VSHIFT="42"/>
+</node>
+<node TEXT="Menu Opmaken" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" CREATED="1314167687616" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node FOLDED="true" ID="ID_1716769321" CREATED="1323518205453" MODIFIED="1336116354855" HGAP="-86" VSHIFT="41"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De eigenshappen in het opmaakpaneel zijn ook beschikbaar in <b>menu Opmaken</b>. Dit menu bevat ook enkele eigenschappen die niet in het opmaakpaneel staan. Voorbeelden zijn <i>Achtergrondkleur mindmap</i> en <i>Knipperen</i>.
+ </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">
+<icon BUILTIN="../Bold16"/>
+<font NAME="SansSerif" SIZE="12" BOLD="true" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This icon-button in the toolbar affects thee whole node text.
+ </p>
+ </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="Italic" STYLE_REF="AdvancedTopic" ID="ID_408787243" CREATED="1266251689531" MODIFIED="1323519147984" TEXT_SHORTENED="true">
+<icon BUILTIN="../Italic16"/>
+<font ITALIC="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ This icon-button in the toolbar affects the whole node text
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Werkmenu (Tool bar)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1235607524" CREATED="1314167879005" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_158808063" CREATED="1323518244867" MODIFIED="1336116366696" HGAP="-117" VSHIFT="97"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Sommige eigenschappen zijn ook toegankelijk via pictogram-knoppen in het werkmenu boven in het scherm. Voorbeelden zijn schuin (<i>italic)</i> en vet (<b>bold)</b>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Belangrijk</b>
+ </p>
+ <ul>
+ <li>
+ Deze eigenschappen beinvloeden de hele knooptitel en niet allen een geselecteerd deel.
+ </li>
+ <li>
+ Om een deel van de tekst apart op te maken, gebruik de mogelijkheden zoals beschreven in de knoop <i>Basis mindmap</i>. Gebruik beide mogelijkheden niet door elkaar heen. Dit kan onverwachte effecten hebben, zoals het niet kunnen verwijderen van een opmaak.<br/>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Sijlen" STYLE_REF="Advanced" ID="ID_1838680824" CREATED="1314646406529" MODIFIED="1336125047759" NUMBERED="true" MIN_WIDTH="110">
+<node TEXT="Waarom stijlen ?" FOLDED="true" ID="ID_539515158" CREATED="1323521177251" MODIFIED="1336125047774">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Advanced" LAST="false"/>
+</hook>
+<node ID="ID_795139567" CREATED="1323768015986" MODIFIED="1336116387412" HGAP="-90" VSHIFT="52"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Stijlen (klassen) helpen je om een groep knopen dezelfde opmaak te geven. Ze helpen om knopen te vinden en te filteren. En ze kunnen worden gebruikt om een sjabloon of template met tekst en attributen te maken. Ook de mindmap van deze handleiding is opgemaakt met stijlen, zie <a href="#ID_1394424447">Hoe deze mindmap is opgebouwd.</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Een stijl vinden en toepassen" STYLE_REF="Advanced" FOLDED="true" ID="ID_512501370" CREATED="1291199304490" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_602520818" CREATED="1323521250360" MODIFIED="1336116402451" HGAP="-170" VSHIFT="122"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Freeplane heeft een aantal standaardstijlen en je kunt je eigen stijlen hieraan toevoegen. De stijl die op een knoop van toepassing is, wordt weergegeven in het opmaakpaneel in de groep Opmaakstijl, achter Stijlnaam. Meestal is dit de standaard stijl. (Als er meerdere stijlen van toepassing zijn dan kun je dit zien onder <i>Conditionele stijl voor knoop.</i></font>) Voor de knoop die je nu leest is de stijlnaam<font color="#000000" face="SansSerif, sans-serif"><i> Gevorderde </i></font>zichtbaar.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>Opmerking</b> </font>
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Andere plaatsen waar je de knoopstijl kunt instellen zijn: </font>
+ </p>
+ <ul>
+ <li>
+ In de werkbalk bovenin het scherm.
+ </li>
+ <li>
+ In menu <i>Opmaken > Toepassen stijl</i>
+ </li>
+ <li>
+ In het <i>Opmaakpaneel</i>: in de groep <i>Opmaakstijl knoop</i>, achter <i>Stijlnaam</i>.
+ </li>
+ </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="1336125047774">
+<node STYLE_REF="TitlesContent" ID="ID_1278689402" CREATED="1335278278365" MODIFIED="1335278541211" HGAP="-157" VSHIFT="43"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Normally you select another style, e.g. style Default. When using e.g. Automatic Level Styles, you may have added a style to overrule the automatic style. In that case, use <i>Format > Apply style > Reset node style </i>to remove a manually set style.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Een stijl bewerken" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" CREATED="1291196100290" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_443461395" CREATED="1323521242303" MODIFIED="1336116417084" HGAP="-105" VSHIFT="111"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Er is een apart venster waarin alle stijlen kunnen worden bewerkt en nieuwe stijlen kunnen worden gemaakt. Je opent dit venster via<i> Stijlen > Bewerken knoopstijlen</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om in dit venster een nieuwe stijl te maken:
+ </p>
+ <ul>
+ <li>
+ Selecteer de standaard knoop stijl
+ </li>
+ <li>
+ Rechtsklik op de stijnaam en kies Selectie bewaren als gebruikerstijl
+ </li>
+ <li>
+ Type een nieuwe naam in en bewaar de stijl
+ </li>
+ <li>
+ Verander de nieuwe stijl via het opmaakpaneel
+ </li>
+ <li>
+ Verlaat het venster door op het kruisje te klikken
+ </li>
+ <li>
+ Antwoord OK waneer gevraagd wordt om de stijl te bewaren.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Meerdere stijlen toepassen op dezelfde knoop" STYLE_REF="Advanced" FOLDED="true" ID="ID_270284358" CREATED="1314342119553" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Introduction" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<node ID="ID_1030002880" CREATED="1323521314827" MODIFIED="1336116429579" HGAP="-277" VSHIFT="188"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een stijl kan worden gebruikt om aan te geven dat een knoop bepaalde informatie bevat. Zo worden in de Freeplane handleiding verschillende stijlen gebruikt voor definites, procedures, voorbeelden enz. Het komt voor dat een knoop een combinatie van deze inhoud bevat. Als voorbeeld, de ouderknoop van de knoop die je nu leest (Meerdere stijlen toepassen op dezelfde knoop) is gemaakt met twee stijlen. Eén stijl <i>Advanced</i> zorgt onder andere voor de gele kleur en stijl <i>Example</i> zorgt dat de knoop het oog-pictogram krijgt.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om deze twee stijlen op dezelfde knoop toe te passen open je eerst het <i>opmaakpaneel</i>. Klik vervolgens in het opmaakpaneel onder <i>Conditionele stijl voor knoop</i>. In het venster dat opent:
+ </p>
+ <ul>
+ <li>
+ Klik op <i>Nieuw</i>
+ </li>
+ <li>
+ In de regel die opent, klik op <i>Standaard</i> om de lijst met stijlen te zien. Kies in deze lijst <i>Introduction</i>.
+ </li>
+ <li>
+ Klik nogmaals op <i>Nieuw</i>; klik weer op <i>Standaard</i> en kies nu <i>Example</i>.
+ </li>
+ <li>
+ Klik <i>OK</i>.
+ </li>
+ </ul>
+ <p>
+ Het resultaat is dat je knoop dezelfde vormgeving heeft als de knoop die je nu ziet.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ Lees meer over stijlen in de Handleiding Freeplane !
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Conditionele stijlen" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" CREATED="1314343996581" MODIFIED="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1437965047" CREATED="1323521350949" MODIFIED="1336116440437" HGAP="-107" VSHIFT="249"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In het voorbeeld hierboven wordt een stijl altijd, onvoorwaardelijk toegepast. Het is mogelijk om een stijl niet altijd, maar alleen in bepaalde gevallen toe te passen. Een voorbeeld is dat de stijl alleen wordt toegepast als de knoop is gewijzigd (revisie).
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Voorbeeld: Revisies</b>
+ </p>
+ <p>
+ In deze mindmap is de stijl <i>Revision</i> gedefineerd met een R-pictogram. De regel die bepaalt of de stijl moet worden toegepast, wordt opgegeven via een venster voor conditionele sijlen. Open het opmaakpaneel en klik onder <i>Conditionele stijl voor mindmap</i>. Er open eenzelfde venster als hierboven werd besproken voor <i>Conditionele stijl voor knoop</i>.
+ </p>
+ <ul>
+ <li>
+ Klik op Nieuw voor een nieuwe conditionele regel.
+ </li>
+ <li>
+ Klik op deze regel. Het venster voor het componeren van een filterregel verschijnt.
+ </li>
+ <li>
+ Kies als filter condities: Veranderd na, tijdstip; kies de datum waarna je de wijzigingen wilt zien.
+ </li>
+ <li>
+ Klik toevoegen.
+ </li>
+ <li>
+ Selecteer de regel (belangrijk !) en kies OK.
+ </li>
+ <li>
+ De conditionele regel is nu weer te zien. De toe te passen stijl staat nog op Standaard. Verander dit in Revision en verlaat het venster - met de regel geselecteerd.
+ </li>
+ </ul>
+ <p>
+ Als er veranderingen zijn geweest na de door jou aangegeven datum, dan zie je die nu door het verschijnen van het i-pictogram.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Het verschil tussen conditionele knoopstijlen en conditionele mindmapstijlen is dat de laatste gelden voor alle knopen.
+ </li>
+ <li>
+ Lees meer over conditionele stijlen in de Handleiding Freeplane.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Knoopniveaustijlen" STYLE_REF="Professional" FOLDED="true" ID="ID_521918713" CREATED="1314344484933" MODIFIED="1336125047774" MAX_WIDTH="550">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1011147934" CREATED="1323521380784" MODIFIED="1336116455990" HGAP="-106" VSHIFT="162"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een andere toepassing van conditionele stijlen is om knopen op eenzelfde knoopniveau dezelfde, en knopen op verschillende niveau's een andere stijl te geven. Freeplane maakt dit makkelijk omdat deze situatie voor 5 knoopniveau's al is gedefineerd. Open het opmaakpaneel en zet een vinkje voor <i>Knoopniveau stijle</i>n. Elk knoopniveau krijgt nu een eigen opmaak.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Als je de standaard opmaak wilt veranderen dan kan dit ook. Ga hiervoor naar<i> Opmaken > Beheren stijlen > Bewerken stijlen</i>. En bewerk elke knoopniveau stijl op de wijze zoals hierboven werd besproken. De stijl voor de stamknoop heet stijl Stamknoop. De lagere niveaus heten Nivea1 t/m Niveau 6.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Om minder dan 5 niveau's toe te passen, ga naar <i>Opmaken > Beheren stijlen > Bewerken stijlen</i>. verwijder de betreffende knoopniveaustijlen.
+ </li>
+ <li>
+ Om op meer dan 5 niveaus knoopniveaustijlen toe te passen, ga naar <i>Opmaken > Beheren stijlen > Bewerken stijlen</i>. en voeg knoopniveaustijlen toe.
+ </li>
+ </ul>
+ </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="1336125047774" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1896765128" CREATED="1323521437116" MODIFIED="1336116466193" HGAP="-46" VSHIFT="93"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Als je een nieuwe mindmap maakt kopieert Freeplane de inhoud van de mindmap <i>default.mm</i>. Op deze wijze worden alle standaardinstellingen van<i> default.mm</i> overgenomen. Het gaat daarbij om eigenschappen zoals <i>Automatische takkleur, </i>knoopstijlen en sneltoetsen. Als je deze eigenschappen in <i>default.mm</i> verandert, gelden ze in het vervolg voor elke nieuwe mindmap. De mindmap default.mm bevindt zich in<i> Tools > Open userdirectory > templates.</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Een andere manier om hetzelfde effect te bereiken is door een nieuwe mindmap te openen met <i>Bestand > Nieuwe mindmap met stijl..</i>. Je kunt dan de mindmap opgeven die je als sjabloon voor de nieuwe mindmap wilt gebruiken.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Sjablonen" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" CREATED="1323612770999" MODIFIED="1336125047759" NUMBERED="true" MIN_WIDTH="110">
+<node ID="ID_1268042238" CREATED="1323521409870" MODIFIED="1336116485053" HGAP="48" VSHIFT="-18" STYLE="fork"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een stijl kan informatie bevatten die in elke knoop terugkomt, zoals bij een formulier of sjabloon. Zet deze informatie in de knoopinhoud en de attributen van de stijl. Als je een nieuwe knoop opent en direkt de stijl kiest, wordt deze informatie in de nieuwe knoop gekopieerd. Op een later moment kun je deze informatie alsnog kopiëren, maar dan door het kiezen van <i>Bewerken > Knoopuitbreiding > Kopieer uit stijlsjabloon.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_357953420" CREATED="1323613544023" MODIFIED="1336116505427" HGAP="-599" VSHIFT="143"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De stapen om een sjabloon of template te definieren:
+ </p>
+ <ul>
+ <li>
+ definieer een nieuwe stijl, bijv. MyTemplate
+ </li>
+ <li>
+ open <i>Opmaken > Beheren stijlen > Bewerken stijlen</i>
+ </li>
+ <li>
+ bewerk knoopdetails van MyTemplate: (Bewerken > Knoopuitbruiding > ..details)
+ </li>
+ <li>
+ voeg attributen toe aan MyTemplate (Bewerken > Knoopuitbreiding > ... attribuut)
+ </li>
+ <li>
+ sluit het bewerkingvenster voor stijlen (bewaar de bewerkte stijl)
+ </li>
+ <li>
+ open a neeuwe knoop, tik een naam
+ </li>
+ <li>
+ pas de nieuwe stijl MyTemplate toe
+ </li>
+ </ul>
+ <p>
+ De nieuwe knoop heeft nu de inhoud van de knoopdetails en attributen van MyStyle.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060" CREATED="1323614118804" MODIFIED="1336116516159" HGAP="63" VSHIFT="1">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#3333ff" size="4">Template information</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Overig" STYLE_REF="Advanced" ID="ID_429763637" CREATED="1323251384433" MODIFIED="1336125047759" NUMBERED="true" MIN_WIDTH="110">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
+</hook>
+<node TEXT="Plakken van tekst zonder opmaak" STYLE_REF="Advanced" FOLDED="true" ID="ID_1745656146" CREATED="1323251632079" MODIFIED="1336125047774" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_885396924" CREATED="1323522491275" MODIFIED="1336116546658" HGAP="-201" VSHIFT="31"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bij plakken van informatie uit de webbrowser, wordt ook de opmaak geplakt. Het is mogelijk alleen (platte) tekst te plakken, zie <a href="http://www.stevemiller.net/puretext/">http://www.stevemiller.net/puretext/</a> .
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Vaste knoopbreedte" STYLE_REF="Advanced" FOLDED="true" ID="ID_1709254927" CREATED="1321975856238" MODIFIED="1336125047774" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_15604512" CREATED="1323522575632" MODIFIED="1336116558654" HGAP="-114" VSHIFT="94" MAX_WIDTH="300" MIN_WIDTH="300"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om knopen uit te lijnen kun je een vaste minum en/of maximum knoopbreedte in te stellen. Zie
+ </p>
+ <ul>
+ <li>
+ Opmaakpaneel; of
+ </li>
+ <li>
+ Opmaken > Instellen grenzen knoopbreedte
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ N.B. In de knoop die je nu leest is de minimum = maximum knoopbreedte 300 pixels.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Opmaak van knoopkern kopieren en plakken" STYLE_REF="Advanced" FOLDED="true" ID="ID_1195279427" CREATED="1316670043816" MODIFIED="1336125047774" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_670948093" CREATED="1323522647369" MODIFIED="1336116908501" HGAP="-271" VSHIFT="42"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De opmaak die geldt voor de hele knoopkern kan worden gekopieerd met<i> Bewerken > Knoopkern > Kopieren opmaak</i>. En het gekopieerde formaat kan in een andere knoop worden geplakt met <i>Bewerken > Knoopkern > Plakken opmaak..</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Opties voor plakken" STYLE_REF="Advanced" FOLDED="true" ID="ID_506336466" CREATED="1322990524257" MODIFIED="1336125047790" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1072558009" CREATED="1323522694317" MODIFIED="1336116920435" HGAP="-111" VSHIFT="77"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zie <i>Bewerken > Plakken als</i> voor andere opties, zoals plakken zonder opmaak.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Als je deze optie vaak gebruikt, definieer dan een sneltoets.
+ </li>
+ <li>
+ Als je van Internet kopieert wordt automatisch de opmaak meegenomen. Er zijn hulpmiddelen om dit te voorkómen.<br/>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+</node>
+<node LOCALIZED_STYLE_REF="default" POSITION="right" ID="ID_871432906" CREATED="1335301290823" MODIFIED="1335976772971" HGAP="38" VSHIFT="116">
+<icon BUILTIN="idea"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="freeplane.mm#ID_1040911735">FAQ</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Frequently Asked Questions
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+</node>
+<node TEXT="Publiceren en delen" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1613405030" CREATED="1314258163054" MODIFIED="1341133002887" NUMBERED="true" MIN_WIDTH="180" VSHIFT="-3">
+<node TEXT="Afdrukken" STYLE_REF="Advanced" FOLDED="true" ID="ID_1344283469" CREATED="1314352873779" MODIFIED="1336125067212" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1759870173" CREATED="1323523347602" MODIFIED="1336116943726" HGAP="-54" VSHIFT="40"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Druk je mindmap af met de funties in menu <i>Bestand</i>. Bij grotere mindmaps kan het handig zijn om de mindmap in overzichtsweergave af te drukken. Verander de weergave van de mindmap met <i>Beeld > Overzichtsweergave.</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Delen van mindmaps" STYLE_REF="Advanced" FOLDED="true" ID="ID_566359973" CREATED="1314352830240" MODIFIED="1336125067212" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1964465318" CREATED="1323523371275" MODIFIED="1336116954006" HGAP="-118" VSHIFT="68"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Het uitwisselen van mindmaps met andere gebruikers van Freeplane is eenvoudig: je geeft de andere gebruiker eenvoudig je bestand<i> jouwmap.mm</i>. Als je mindmap plaatjes bevat, dan moet je deze apart meegeven, want in de mindmap zelf bevinden zich geen plaatjes maar alleen links naar plaatjes. Let er op dat op de nieuwe lokatie de plaatjes op dezelfde (relatieve) plaats staan als in jouw computer. Het eenvoudigste is het om bij het maken je mindmap en de plaatjes in dezelfde map (directory) te plaatsen.
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Presenteren" STYLE_REF="Advanced" FOLDED="true" ID="ID_1747402695" CREATED="1335276169448" MODIFIED="1336125067212">
+<node STYLE_REF="TitlesContent" ID="ID_1269602804" CREATED="1335276178553" MODIFIED="1337348213861" HGAP="-64" VSHIFT="96"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Als je een presentatie wilt geven met een mindmap, kunnen de knopen die niet de aandacht hebben grijs worden gemaakt. Selecteer hiervoor <i>Beeld > Beeldinstellingen > Presentatiemode</i>. De knopen kunnen één voor één worden getoond door <i>Navigeren > Volgend</i> kind te kiezen, of Shift + klikken in cirkel voor open/dichtvouwen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ De functie <i>Navigeren > Volgend kind </i>kan aan een sneltoets worden toegewezen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Publiceren op Internet (Java Applet)" STYLE_REF="Professional" FOLDED="true" ID="ID_1417348323" CREATED="1314352836706" MODIFIED="1336125067212" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1669899571" CREATED="1323523398700" MODIFIED="1336073596649" HGAP="-215" VSHIFT="169"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een Java Applet is een klein programmaatje waarmee je een mindmap kunt bekijken zonder dat je Freeplane op je computer hebt. Hiertoe kies je <i>Bestand > Exporteren</i> en kies je<i> Java Applet</i> als bestandstype. Na het exporteren heb je een bestand <i>jouwmindmap.html</i> en een mapje <i>jouwmindmap.Html_files</i>. Als je plaatjes in je mindmap gebruikt, dan moet je deze naar<i> jouwmindmap.Html_files</i> kopiëren. Kopieer nu jouwmap.html en het mapje jouwmindmap.Html_files naar de server van Intranet of Internet. Je kunt nu de mindmap in alleen-lezen mode openen door jouwmindmap.html te openen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Afbeeldingen in .svg formaat worden niet getoond.
+ </li>
+ <li>
+ Je kunt deze zelfde werkwijze gebruiken om de mindmap uit te wisselen met een gebruiker die geen Freeplane heeft.
+ </li>
+ <li>
+ Als je wilt dat de mindmap op een bepaalde manier wordt open/dichtgevouwen, kies dan vóór het exporteren <i>Extra > Instellingen > Omgeving > Bewaar situatie van open/dicht vouwen > Altijd.</i><br/>
+ </li>
+ <li>
+ Zie dit <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Publishing_multiple_maps_in_one_Java_applet">voorbeeld</a> hoe je meerdere mindmaps in één Java Applet kunt publiceren.<br/>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Publiceren op Internet (met Freeplane)" FOLDED="true" ID="ID_1269157254" CREATED="1323895951531" MODIFIED="1336125067212" STYLE="combined">
+<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" CREATED="1323895981367" MODIFIED="1336073518024" HGAP="-234" VSHIFT="114"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Het is mogelijk een mindmap direkt op het Intranet op Internet te publiceren. Freeplane moet dan op je computer geinstalleerd zijn om de mind map te bekijken. Kies <i>Bestand > Open mindmap via URL </i>en<i> v</i>oeg achter URL het adres toe van de mindmap op Internet.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ In windows, rechtsklik op de link van de mindmap en kies hyperlink kopieren. Plak dit adres vervolgens in het URL-adres.
+ </li>
+ <li>
+ Via <i>Help > Documentatiemindmaps online</i> kunnen mindmaps op<i> http://freeplane.sourceforge.net/mapsOnline</i> worden geopend. Ook .svg plaatjes worden dan getoond..
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Uitwisselen met tekstverwerker" STYLE_REF="Professional" FOLDED="true" ID="ID_118482" CREATED="1314353836801" MODIFIED="1336125067212" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Zie Help > Handleiding Freeplane: je kunt opmaakcode behouden." ID="ID_1023242392" CREATED="1323523390908" MODIFIED="1336118122147" HGAP="-182" VSHIFT="23">
+<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="1336126292751" HGAP="14" VSHIFT="158" LINK="freeplaneApplications_nl.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <a href="freeplaneFunctions_nl.mm">Toepassingen</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Klik op de koppeling om een mindmap te openen met de belangrijkste toepassingen van Freeplane. Hiervoor is verbinding met Internet noodzakelijk.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking </b>
+ </p>
+ <ul>
+ <li>
+ Om uit de index terug te keren, kies <i>Navigeren .> Ga naar vorige mind map</i> of klik op dit pictogram in de werkbalk.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+</node>
+<node TEXT="Knoopuitbreidingen" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_143196514" CREATED="1314206563418" MODIFIED="1323705023820" NUMBERED="true" MIN_WIDTH="180" VSHIFT="80">
+<node TEXT="Bewerken tekst in knoopdetails" STYLE_REF="Advanced" ID="ID_898889730" CREATED="1314197390735" MODIFIED="1330085898523" VSHIFT="80"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De knop die je nu ziet bestaat uit een <b>knoopkern</b> met de titel "<i>Bewerken knoopdetails</i>". Hieronder bevindt zich de tekst die je nu leest, in het veld <b>knoopdetails</b>. Het veld knoopdetails heeft links een <b><i>driehoekje</i></b> waarmee je de tekst kunt verbergen of tonen; de tekst van de knoopkern blijft hierbij gewoon zichtbaar.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een knoop zoals deze te maken, maak je eerst een nieuwe knoop zoals je boven hebt geleerd. Vervolgens type je de titel van de knoop in de knoopkern, zoals je ook al weet. Je maakt de titel op in een vorm zoals je die wilt. Dan rechtsklik je op de knoop (niet in bewerken modus) en kies je <i>Bewerken knoopdetails (in venster).</i> In het venster dat opent type je de tekst die onder de knoopkern moet komen. Je sluit af door op <i>OK</i> te drukken. Je tekst is nu zichtbaar onder de knooptitel.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Net als bij de knoopkern kun je tekst ook op een snellere manier direkt in de knoop invoeren. Rechtsklik hiervoor op de knoop en kies <i>Bewerken knoopinhoud (snel).</i> Om een tekst die je al hebt ingevoerd opnieuw te bewerken, dubbelklik op de tekst.
+ </li>
+ <li>
+ Alle acties die via een contextmenu mogelijk zijn, kun je ook in het hoofdmenu terugvinden. Bijvoorbeeld, het snelbewerken van knoopinhoud kun je kiezen via <i>Bewerken > Knoopuitbreiding > Bewerken knoopdetails (snel).</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Minimaliseren knoop (zweeftekst, tooltip)" STYLE_REF="Advanced" FOLDED="true" ID="ID_288274844" CREATED="1314206958207" MODIFIED="1323705980429" VSHIFT="5" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1704074218" CREATED="1323527323490" MODIFIED="1336118157141" HGAP="-256" VSHIFT="144"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Knoopdetails kunnen worden verborgen tot het moment dat je met de cursor boven de knoop zweeft; dan wordt de verborgen informatie in een pop-up venster (tooltip) getoond. Dit heeft als voordeel dat de tekst geen ruimte op het scherm inneemt zolang je niet in de knoop bent geïnteresseerd. Bij de knoop hiernaast is dit het geval.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Om een knoop zoals hiernaast te maken, maak eerst een knoop met knoopinhoud. Rechtsklik op de knoop en kies<i> Minimaliseren knoop</i>. Om de tekst weer permanent te zien, kies nogmaals <i>Knoop > Minimaliseren knoop</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking </b>
+ </p>
+ <ul>
+ <li>
+ De keuze van <i>Knoop > Minimaliseren knoop</i> leidt er ook toe dat de lengte van de knoopinhoud wordt beperkt en dat andere kenmerken zoals plaatjes en attributen worden verborgen.
+ </li>
+ <li>
+ Zie hieronder <i>Afbeelding</i> voor afwijkend gedrag van een afbeelding in knoopdetails.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="Voorbeeld tooltip" STYLE_REF="Advanced" ID="ID_1710723594" CREATED="1323462581502" MODIFIED="1323706026917" HGAP="24" VSHIFT="-12" STYLE="combined" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Voorbeeld van verborgen tekst.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" ID="ID_1347491550" CREATED="1323462604083" MODIFIED="1323525624921" HGAP="-80" VSHIFT="50">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Afbeelding (knoopuitbreiding)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" CREATED="1314215157545" MODIFIED="1323706167099" MIN_WIDTH="1">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
+</hook>
+<node ID="ID_1931512160" CREATED="1323526694210" MODIFIED="1323706133777" HGAP="32" VSHIFT="-5"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Plaatjes zijn geen onderdeel van een mindmap, maar kunnen wel binnen een mindmap worden getoond. Het maakt daarbij uit waar zich het plaatje bevindt en welke methode wordt gebruikt: klikken en slepen of kopieren en plakken. Merk op dat de eigenschappen van een plaatje in de knoopkern anders zijn dan de hier beschreven plaatjes (knoopuitbrreiding).<br/>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Interne oorsprong" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" CREATED="1318936419394" MODIFIED="1336383968560" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1990291656" CREATED="1323527938617" MODIFIED="1336118180151" HGAP="-106" VSHIFT="169"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Er zijn verschillende manieren waarop met afbeeldingen kan worden gewerkt. Een makkelijke manier is om een plaatje in een knoop te slepen. Als je het plaatje op de bovenzijde van de knoop "laat vallen" (de bovenzijde licht op), komt het plaatje in de knoop zelf. Als je het plaatje op de kindzijde laat vallen (de kindzijde van de knoop licht op), wordt een kindknoop gemaakt en komt het plaatje in de kindknoop. De grootte van het plaatje kan worden veranderd door de hoek rechtsonder te slepen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Het plaatje wordt wel getoond als onderdeel van de mindmap maar wordt buiten de mindmap bewaard. Elke keer als je de mindmap opent wordt het plaatje van zijn oorspronkelijke locatie ingelezen. Als je dit bestand verplaatst of de naam wijzigt, wordt het plaatje niet meer in de mindmap getoond.
+ </li>
+ <li>
+ Een afbeelding die is verborgen met Instellen zweeftekst (tooltip) blijft bij zweven verborgen.<br/>
+ </li>
+ <li>
+ Een alternatieve manier om een plaatje toe te voeten is door een knoop te rechtsklikken of menu <i>Edit > Knoopuitbreiding</i> en vervolgens <i>Toevoegen afbeelding</i> te kiezen.
+ </li>
+ <li>
+ Het is mogelijk met om een plaatje dat met PrintScreen is gecopieerd, te plakken. Freeplane vraagt dan eerst waar het plaatje moet worden bewaard.<br/>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Externe oorsprong" STYLE_REF="Advanced" FOLDED="true" ID="ID_17945363" CREATED="1323528121146" MODIFIED="1336383968560" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node STYLE_REF="TitlesContent" ID="ID_594983153" CREATED="1318936453549" MODIFIED="1336118194598" HGAP="-110" VSHIFT="115" MAX_WIDTH="550"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een plaatje van een externe bron zoals Internet kan worden toegevoegd via kopieren en plakken.Op dezelfde wijze kan een schermafbeelding, gemaakt met PrintScreen, worden toegevoegd door plakken te kiezen. In beide gevallen wordt het plaatje in een automatisch gemaakte kindknoop toegevoegd. De grootte van het plaatje kan worden veranderd door de hoek rechtsonder te slepen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ De geplakte afbeelding is geen onderdeel van de mindmap zelf.
+ </p>
+ <ul>
+ <li>
+ Het plaatje op Internet, blijft op Internet. Er is dus een Internet verbinding nodig om het plaatje te tonen. Kopieer het plaatje zo nodig naar je computer.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Andere afbeelding" STYLE_REF="Advanced" FOLDED="true" ID="ID_1790215961" CREATED="1336383825170" MODIFIED="1336383968560">
+<node TEXT="Als je een afbeelding hebt, kun je deze vervangen door te rechtsklikken en "Veranderen" te kiezen." STYLE_REF="TitlesContent" ID="ID_843309222" CREATED="1336383853415" MODIFIED="1336383998956" HGAP="-117" VSHIFT="26"/>
+</node>
+<node TEXT="In-line afbeelding" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" CREATED="1314282819174" MODIFIED="1336383968560" MAX_WIDTH="550" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Ervaren gebruikers kunnen ook met zogenaamde HTML-code plaatjes invoegen. Er is zelfs een script om dit te doen. Raadpleeg hiervoor wiki pagina over scrips of Help > Handleiding." ID="ID_796258305" CREATED="1323528211774" MODIFIED="1336118210915" HGAP="-112" VSHIFT="32" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Attributen (knoopuitbreiding)" STYLE_REF="Professional" FOLDED="true" ID="ID_1324773677" CREATED="1314208168037" MODIFIED="1323706758395" MIN_WIDTH="1">
+<node TEXT="Wat zijn attributen ?" STYLE_REF="Professional" ID="ID_1657366174" CREATED="1314209542018" MODIFIED="1336118227857" HGAP="-170" VSHIFT="83" MAX_WIDTH="550">
+<attribute_layout NAME_WIDTH="34" VALUE_WIDTH="92"/>
+<attribute NAME="Name" VALUE="John"/>
+<attribute NAME="email" VALUE="john at gmail.com"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een knoop kan gestructureerde informatie bevatten. Hierbij bestaat elke informatie-eeheid uit een naam en een waarde. De relatie naam=waarde heet attribuut. Attributen worden in een tabel met twee kolommen getoond:
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Attributen toevoegen" STYLE_REF="Professional" ID="ID_1441506319" CREATED="1314210058883" MODIFIED="1336118236359" HGAP="-550" VSHIFT="204" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Er zijn verschillende manieren om een attribuut toe te voegen. Maak eerst een knoop. Rechtsklik op de knoop en kies <i>Toevoegen en bewerken attribuut.</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Als je al een attribuut hebt, rechtsklik dan op het attribuut voor meer opties. Zo kun je <i>Optimale breedte</i> kiezen om de tabel aan te passen aan de tekst. (Beide kolommen hebben een ander contextmenu !)
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ Andere manieren om een attribuut toe te voegen zijn:
+ </p>
+ <ul>
+ <li>
+ Kies in het opmaakpaneel de tab <i>Agenda en attributen. </i>Onderaan zie je een aantal opties voor attributen. Kies <i>Nieuw attribuut</i>.<br/>
+ </li>
+ <li>
+ Kies <i>Bewerken> Knoopuitbreiding > Attributen > Toevoegen attribuut</i>.<br/>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Attribuutwaarden" STYLE_REF="Professional" ID="ID_1108500341" CREATED="1314211635490" MODIFIED="1336118247451" HGAP="-552" VSHIFT="207" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Behalve getallen en tekst kun je ook een <b>koppeling</b> als attibuutwaarde opnemen. Om een koppeling toe te voegen, rechtsklik op een attriuutwaarde en kies het type koppeling. Zie bij <i>Koppelingen maken</i> welke koppelingen er zijn.
+ </p>
+ <p>
+ <br/>
+
+ </p>
+ <p>
+ Getallen en datums kunnen automatisch worden geformatteerd. Klik in het opmaakpaneel (Agenda en attributen) op het veld boven het attribuutveld. Er wordt dan een lijst met mogelijke formatteringen getoond. Zie de handleiding voor een toelichting.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Professioneel bewerken van attrtibuten" STYLE_REF="Professional" ID="ID_609269277" CREATED="1314278394970" MODIFIED="1336118255157" HGAP="-553" VSHIFT="131" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Er zijn verschillende manieren om attribuutnamen en waarden (in een keer) te veranderen. Zie <i>Bewerken > Knoopuitbreidingen > Atrributen </i> voor alle beschikbare manieren, en zie de handleiding.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Hyperlink (pijl) in attribuutwaarde" STYLE_REF="Professional" ID="ID_457929879" CREATED="1312540477537" MODIFIED="1336118261522" HGAP="-550" VSHIFT="80" MAX_WIDTH="550">
+<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="101"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hieronder wordt beschreven dat hyperlinks kunnen worden toegevoegd aan attribuutwaarden via het contextmenu van een attribuutwaarde.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Wetenschappelijke formule (LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" CREATED="1314361765668" MODIFIED="1323707404505" VSHIFT="-15" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1460441144" CREATED="1323527775837" MODIFIED="1336118280819" HGAP="-226" VSHIFT="60"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om een wetenschappelijke formule te tonen kan gebruik worden gemaakt van LaTeX, zie <i>Bewerken > Knoopuitbreiding > LaTeX</i>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <p>
+ Lees meer in <i>Help > Documentatie</i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Knoopnotitie" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_274601394" CREATED="1314208248182" MODIFIED="1323704993556" NUMBERED="true" MIN_WIDTH="180" VSHIFT="-5">
+<node ID="ID_1960771486" CREATED="1323524664411" MODIFIED="1323704959119"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="margin-top: 0">
+ Een knoopnotitie is een bijzonder vorm van knoopinhoud. Het belangrijkste verschil is dat
+ </p>
+ <ol>
+ <li>
+ een knoopnotitie standaard is verborgen (zweeftekst). De knoop kan standaard onder knoopdetails worden getoond via menu<i> Beeld > Knoopnotitie > Tonen notities bij knopen.</i>
+ </li>
+ <li>
+ een knoopnotitie ook in een afzonderlijk venster kan worden getoond dat net zo breed is als het scherm. Het venster kan op verschillende plaatsen op het scherm worden getoond. Zie <i>Beeld > knoopnotite.<br/></i>
+ </li>
+ <li>
+ Een knoopnotitie heeft standaard een notitie-pictogram. In <i>Extra > Voorkeuren</i> kan worden ingesteld dat dit pictogram niet moet worden getoond. Op Internet (Java applet) werkt dit laatste niet.<i><br/></i>
+ </li>
+ </ol>
+ <p>
+ Zie de Handleiding Freeplane voor meer informatie.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Datum en tijd" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" CREATED="1303932101749" MODIFIED="1323712047363" NUMBERED="true" MIN_WIDTH="180">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<node TEXT="Agenda functies" STYLE_REF="Professional" ID="ID_1047570728" CREATED="1314367182383" MODIFIED="1330162564261" MAX_WIDTH="600" VSHIFT="40"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De agendafunctie maakt het mogelijk om in de knooptitel datums en tijdstippen in te voegen en herinneringsmomenten in te stellen. Als een herinneringsmoment af gaat, verschijnt een knipperend klokje. Zie <i>Knoopkenmerken > Agenda </i>voor de uitgebreide agenafunctie (ook: <i>Managen taken</i>).
+ </p>
+ <p>
+ Het opmaakpaneel bevat in tab <i>Agenda en attributen</i> een deel van de functionaliteit (niet:<i> Managen taken).</i><br/>
+ </p>
+ <p>
+ De betekenis van de agendafuncties staat hieronder.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Managen tijd" STYLE_REF="Professional" FOLDED="true" ID="ID_1104707017" CREATED="1267746559867" MODIFIED="1323810805788" VSHIFT="10" MAX_WIDTH="450" STYLE="combined">
+<icon BUILTIN="../TimeManagementAction"/>
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Dit submenu opent een venster waarmee een herinneringsmoment aan de geselecteerde knoop wordt gekoppeld. De knoop en al zijn voorouders tonen een klok-pictogram. Als de ingestede tijd is verstreken knipperen de klokjes en knippert een uitroepteken in de stamknoop." ID="ID_1158360877" CREATED="1323528703218" MODIFIED="1336118302878" HGAP="-108" VSHIFT="60" MAX_WIDTH="400" MIN_WIDTH="400">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="Instellen jaar, maand en dag" STYLE_REF="Method" ID="ID_629838545" CREATED="1310058100675" MODIFIED="1330099417591" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Invoegen datum in knoopkern" STYLE_REF="Method" ID="ID_77223280" CREATED="1288907062597" MODIFIED="1330099464391" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Later herinneren" STYLE_REF="Method" ID="ID_1905175036" CREATED="1310058020709" MODIFIED="1330099721616" STYLE="as_parent" TEXT_SHORTENED="true">
+<edge STYLE="horizontal"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Herinneringsmoment opnieuw instellen, een bepaalde tijd na het ingestelde moment.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Verwijderen herinnering" STYLE_REF="Method" ID="ID_1600844387" CREATED="1310058040514" MODIFIED="1330099587908" STYLE="as_parent">
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Managen taken" STYLE_REF="Professional" FOLDED="true" ID="ID_1106133151" CREATED="1266247905093" MODIFIED="1323810826817" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<icon BUILTIN="../TimeListAction"/>
+<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="1336118311972" MAX_WIDTH="400" HGAP="-116" VSHIFT="117"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Dit submenu opent een venster met de herinneringen van alle knopen. Voor elke herinnering wordt het volgende getoond: </font>
+ </p>
+ <ul>
+ <li>
+ datum
+ </li>
+ <li>
+ knooptitel
+ </li>
+ <li>
+ pictogrammen
+ </li>
+ <li>
+ tijdstip waarop de knoop is gemaakt
+ </li>
+ <li>
+ tijdstip waarop de knoop het laatste is veranderd
+ </li>
+ <li>
+ notitietekst
+ </li>
+ </ul>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Deze elementen kunnen met zoeken en vervangen worden veranderd. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Verwijderen herinnering" STYLE_REF="Professional" FOLDED="true" ID="ID_148977369" CREATED="1303932208426" MODIFIED="1330162959755" MAX_WIDTH="450" MIN_WIDTH="1" 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="1330163048317" HGAP="-154" VSHIFT="65"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Verwijder de herinnering van de geselecteerde knoop.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Zie ook:</b>
+ </p>
+ <ul>
+ <li>
+ <i>Extra > Agenda.</i>.
+ </li>
+ <li>
+ <i>Opmaakpaneel > Kalender & attributen</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="" ID="ID_517678813" CREATED="1288542096079" MODIFIED="1330162093912" 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"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ProfessionalTopic" LAST="false"/>
+</hook>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Deze knoop bevat een herinnering.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Zoeken en filteren" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_828862571" CREATED="1314109608813" MODIFIED="1330163468968" STYLE="bubble" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Waarom filteren ?" STYLE_REF="Professional" FOLDED="true" ID="ID_887149959" CREATED="1314362530273" MODIFIED="1323770435404" VSHIFT="25" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Filteren zorgt er voor dat je alleen die knopen ziet die je wilt zien. De filterregel bepaalt welke knopen je wel en niet ziet. Dezelfde filterregel kan worden gebruikt om selectief knopen te zoeken." ID="ID_1511890775" CREATED="1323770291298" MODIFIED="1336118344873" HGAP="-116" VSHIFT="33">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Filterelementen" STYLE_REF="Professional" FOLDED="true" ID="ID_1598853306" CREATED="1314362902185" MODIFIED="1323770426964" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1492352902" CREATED="1323770358262" MODIFIED="1336118353796" HGAP="-101" VSHIFT="150"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Voor dat je kunt filteren moet je in de filterwerkbalk een filterregel maken. De filterwerkbalk bevindt zich boven het werkgebied voor de mindmap. Een filterregel bestaat uit de volgende elementen: </font>
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ <b><i>Knoopcomponent</i></b><i> </i>(Knooptitel. Knoopinhoud, Tijdstip, Pictogram, enz)
+ </li>
+ <li>
+ <i><b>Type regel: </b></i> component <i>bestaat</i>, <i>bevat</i>, <i>=</i>, > etc.
+ </li>
+ <li>
+ <i><b>Waarde</b></i> van de component
+ </li>
+ <li>
+ Bij tekst: <b>hoofdlettergevoeligheid </b>en<b> Benaderend zoeken (fuzzy search)</b>
+ </li>
+ </ul>
+ <p>
+ Vervolgens kun je op pictogram-knop <b>Filteren mindmap</b> drukken om het filteren uit te voeren. Zie in de volgende knoop welk pictogram dit is. Om het filteren te eindigen, druk op <b>Stoppen filteren</b>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Het filterresultaat kan worden aangepast door het instellen van onderstaande filteropties, zie onder.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Nadat je een filterregel hebt ingesteld kun je ook <i>Zoeken</i> kiezen om de eerstvolgende knoop te vinden die voldoet aan de filtercondities.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<node TEXT="Filteren mindmap" ID="ID_1357131173" CREATED="1310134532663" MODIFIED="1330163353106">
+<icon BUILTIN="../apply_quick_filter"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Stoppen filteren" ID="ID_346907540" CREATED="1310134532663" MODIFIED="1330163359658">
+<icon BUILTIN="../remove_filtering"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Volgende zoeken" ID="ID_1476937761" CREATED="1310134532663" MODIFIED="1330163367739">
+<icon BUILTIN="../find_next"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+</node>
+</node>
+<node TEXT="Filter methoden" STYLE_REF="Professional" FOLDED="true" ID="ID_1254354349" CREATED="1266240693156" MODIFIED="1330251778903" TEXT_SHORTENED="true" VSHIFT="-2" STYLE="combined"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">To the left are shown the icons of the buttons in the Filter toolbar, with their meaning. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Filteractie ongedaan maken" STYLE_REF="ProfessionalOnderwerp" ID="ID_619416419" CREATED="1310134532663" MODIFIED="1330165445546" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Maakt eerdere fiteraktie ongedaan.</font>
+ </p>
+ </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="Herhalen laatste filteractie" STYLE_REF="ProfessionalOnderwerp" ID="ID_1724296233" CREATED="1310134532663" MODIFIED="1330165514888" TEXT_SHORTENED="true">
+<icon BUILTIN="../redo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Voert filteractie die ongedaan gemaakt is nogmaals uit. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Opnieuw filteren (verfijnen)" STYLE_REF="ProfessionalOnderwerp" ID="ID_1748016122" CREATED="1310134532663" MODIFIED="1330165588395" TEXT_SHORTENED="true">
+<icon BUILTIN="../reapply_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Voert filteractie uit op het gefilterde deel.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Filteren mindmap" STYLE_REF="ProfessionalOnderwerp" FOLDED="true" ID="ID_1552136796" CREATED="1310134532663" MODIFIED="1330165818309" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Verbergt alle zichtbare knopen die niet aan de filterregel voldoen.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Zie ook</b>
+ </p>
+ <ul>
+ <li>
+ <i>Stop filteren</i>.
+ </li>
+ </ul>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Knopen die voor het filteren verborgen waren, blijven verborgen.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+<node TEXT="Find last modified nodes" ID="ID_1539236846" CREATED="1311098601253" MODIFIED="1314077884276" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2,9"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To filter for all nodes modified after a certain date, ser a filterrrule (Date filter<i>, Modified after, date, xxx)</i> and <i>Quick filter</i> for all modified nodes.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ <i>Find and replace all nodes...</i> for an alternative way.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Niet-geslecteerde knopen verbergen" STYLE_REF="ProfessionalOnderwerp" ID="ID_402507556" CREATED="1310134532663" MODIFIED="1330165954329" TEXT_SHORTENED="true">
+<icon BUILTIN="../filter_selected_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Toon alleen de geselecteerde knopen, en optioneel de voorouders en/of afstammelingen. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">Zie ook</font></b><font face="SansSerif, sans-serif" color="#000000"> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>Filteren > Tonen voorouders</i></font><i> </i>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>Filteren > Tonen afstammelingen</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Filteren en selecteren" STYLE_REF="ProfessionalOnderwerp" ID="ID_164487469" CREATED="1310134532663" MODIFIED="1330166218726" TEXT_SHORTENED="true">
+<icon BUILTIN="../select_all_found_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Filter en selecteer alle passende afstammelingen (zichbaar en verborgen) van de geselecteerde knoop.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Stop filteren" STYLE_REF="ProfessionalOnderwerp" ID="ID_1978139715" CREATED="1310134532663" MODIFIED="1330166256712" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Maak het filteren ongedaan. </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Componeren filter" STYLE_REF="ProfessionalOnderwerp" ID="ID_1142884544" CREATED="1310134532663" MODIFIED="1330207025964" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_filtering_condition"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Opent venster om filterregels te maken en bewerken. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">De eerste regel toont drie velden om een filterregel te maken, initieel gevuld met ("Kern, details of notitie", "Bevat", leeg veld). en een vink-veldje voor Hoofdlettergevoeligheid. Het veld onder deze in te vullen velden bevat een lijst van reeds gedefinieerde filters, initeel is de lijst leeg. Twee regels uit deze lijst kunnen met EN en OF worden gecombineerd tot een nieuwe regel. Me<i>t Naam toekennen</i> kan aan de geselecteerde regel een naamlabel worden toegevoegd.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Acties</b>
+ </p>
+ <ol>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">selecteer og type de condities van de filterregel, bijvoorbeeld (Knooptext, Bevat, filter); Hoofdlettergevoelig (vinkje).</font>
+ </li>
+ <li>
+ kies <i>Toevoegen</i> om deze regel toe te voegen aan lijst filterregels
+ </li>
+ <li>
+ herhaal voor alle benodigde filterregels.
+ </li>
+ <li>
+ druk OK
+ </li>
+ </ol>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Om twee of meer regels te combineren selecteer de regels en kies <i>EN</i> of <i>OF</i>.
+ </li>
+ <li>
+ Om een regel te voorzien van een tekstlabel, selecteer de regel en kies <i>Naam toekennen</i>.
+ </li>
+ </ul>
+ <p>
+ <b>Zie ook</b>
+ </p>
+ <ul>
+ <li>
+ <i>6. Opmaken en stijlen / Stijlen / Conditionele stijlen </i>voor voor een voorbeeld <i> </i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Filter acties" STYLE_REF="ProfessionalOnderwerp" ID="ID_214063901" CREATED="1310496676053" MODIFIED="1316331714677">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Verder filteren (verfijnen)" STYLE_REF="ProfessionalOnderwerp" ID="ID_1768599003" CREATED="1310134532663" MODIFIED="1330251186230" TEXT_SHORTENED="true">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Zet AAN om met een extra filterregel eerdere filtering verder te verfijnen. </font>
+ </p>
+ </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="Ook voorouders tonen" STYLE_REF="ProfessionalOnderwerp" ID="ID_1384592614" CREATED="1310134532663" MODIFIED="1330251322443" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Zet AAN om ook voorouders van gefilterde knopen te tonen. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Note</font></b><font color="#000000" face="SansSerif, sans-serif"> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">Kan zowel voor of na <i>Filteren mindmap </i>AAN/UIT worden gezet.</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Ook afstammelingen tonen" STYLE_REF="ProfessionalOnderwerp" ID="ID_347749612" CREATED="1310134532663" MODIFIED="1330251423472" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Zet AAN/UIT om ook afstammelingen die aan de filterregel voldoen WEL/NIET te tonen.</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Filter condities" STYLE_REF="ProfessionalOnderwerp" ID="ID_1103140596" CREATED="1310496750715" MODIFIED="1316331714692">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Volgende zoeken" STYLE_REF="ProfessionalOnderwerp" ID="ID_1528431308" CREATED="1310134532663" MODIFIED="1330251736986" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Zoek eerstvolgende knoop die aan de ingestelde filterregel voldoet (zoek eerst in diepte, dan in breedte).</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Opmerking</font></b>
+ </p>
+ <ul>
+ <li>
+ De gevonden knoop wordt geselecteerd.
+ </li>
+ <li>
+ Knopen worden zonodig opengevouwen en de mindmap wordt gescrolled om de knoop zichbaar te maken.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Vorige zoeken" STYLE_REF="ProfessionalOnderwerp" ID="ID_132872030" CREATED="1310134532663" MODIFIED="1330251806332" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_previous"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Zoek vorige knoop die aan de ingestelde filterregel voldoet.</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">Opmerking</font></b>
+ </p>
+ <ul>
+ <li>
+ De gevonden knoop wordt geselecteerd.
+ </li>
+ <li>
+ Knopen worden zonodig opengevouwen en de mindmap wordt gescrolled om de knoop zichbaar te maken.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="Zoeken" STYLE_REF="ProfessionalOnderwerp" ID="ID_721920269" CREATED="1310496838340" MODIFIED="1316331714692">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Gebruiken filter sets" STYLE_REF="Professional" FOLDED="true" ID="ID_665978371" CREATED="1316203189752" MODIFIED="1323811027426" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_49510380" CREATED="1323529306279" MODIFIED="1336118373889" HGAP="-127" VSHIFT="115"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Filterregels kun je maken en bewaren voor gebruik op een later moment of op een andere computer. Je kunt filterregels combineren met EN en OF operatoren en je kunt filterregels een maamlabel geven.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Open menu<i> Filteren > Componeren filter</i> (of klik op het pictogram in de filterbalk) en maak de filterregels die je nodig hebt. Voorzie de filterregels die je wilt hergebruiken van een naamlabel om ze herkenbaar te maken. Kies dan <i>Bewaren</i> voor het bewaren van de set. Op het moment dat je de set nodig hebt kies je (in het venster voor het componeren) <i>Laden</i> voor het opnieuw installeren van de set.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ De filterregels zijn beschikbaar in de filter menubalk. Om een regel te kiezen, klik op het venster naast "<i>Niet filteren (verwijderen)</i>". Je ziet dan de eerder gedefinieerde filters. Klik op de regel naar keuze. Na het filteren klik op pictogram <i><b>Stop filter</b></i>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Laden en gebruiken van de filterset voor deze Quick reference" STYLE_REF="Professional" FOLDED="true" ID="ID_1284293100" CREATED="1316177216317" MODIFIED="1323713282573" LINK="http://www.kioo.nl/freeplane/tutorial_en/filterSet" MIN_WIDTH="1" VSHIFT="-30">
+<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 to the left. If you do not see it, click on the colored bar above
this text to unhide it. If you click on the red arrow, the instruction is illustrated in an animation." ID="ID_352888342" CREATED="1323529491351" MODIFIED="1323529654285"/>
+<node TEXT="Load filter set for this Quick reference" ID="ID_551050917" CREATED="1317234746190" MODIFIED="1323811074382">
+<icon BUILTIN="full-0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ As an example of using filter sets, the Freeplane directory has a subdirectory <i>doc</i> with a file called <i>freeplaneTutorial.mmfilter</i>. Choose <i>Fiter > Filter composer > Load</i> and find and load this file.
+ </p>
+ <p>
+ After this you can use the filters as described in the following nodes.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Select filter and Quickfilter" LOCALIZED_STYLE_REF="default" ID="ID_81563733" CREATED="1316156118436" MODIFIED="1323811089701" LINK="FilterExampleBegin.jpg">
+<icon BUILTIN="full-1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To see only the information at the first level of experience (Beginner):
+ </p>
+ <p>
+
+ </p>
+ <ol>
+ <li>
+ <ol>
+ <li>
+ Click in field with <i>"No filtering (remove)"</i>: a list with filters drops down.
+ </li>
+ <li>
+ Select ane of the shown rules e.g. Beginner
+ </li>
+ <li>
+ Click <i>Quick filter</i> as shown in the image.
+ </li>
+ </ol>
+ <p>
+ P.S. Make sure Show ancestors is UNselected.
+ </p>
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Unfold to make visible" ID="ID_1451237301" CREATED="1316176206878" MODIFIED="1323811105176" HGAP="15" VSHIFT="-8" LINK="FilterExampleEnd.jpg">
+<icon BUILTIN="full-2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You can now click on each item to unhide its content. Or you can unhide all hidden information at once by doing the following:
+ </p>
+ <ol>
+ <li>
+ Move the cursor over the central area (root node) to select it
+ </li>
+ <li>
+ Click on the icon <i>Unfold all </i>to see all selected nodes
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+</hook>
+</node>
+<node TEXT="View and finish" ID="ID_1331360426" CREATED="1316177379721" MODIFIED="1323811125472" VSHIFT="6" LINK="FilterExampleUnfold.jpg">
+<icon BUILTIN="full-3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ol>
+ <li>
+ Click in an empty area of the background and drag the map around until hou have read all.
+ </li>
+ <li>
+ Do not forget to press icon <i>No filtering</i> when you are finished.
+ </li>
+ </ol>
+ <p>
+ You can now follow the same procedure for Beginner, Advanced and Professional.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
+ <conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="default" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="Beveiligen mindmap" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1232153769" CREATED="1314339453691" MODIFIED="1330613028178" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Beveilgen knopen met een wachtwoord" STYLE_REF="Professional" FOLDED="true" ID="ID_1433157907" CREATED="1314362016509" MODIFIED="1323770587395" VSHIFT="35">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_386223744" CREATED="1323770459872" MODIFIED="1330613110968" HGAP="-223" VSHIFT="115"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De inhoud van de kinderen van een knoop (tak) kan met een wachtwoord worden beveiligd. Selecteer hiervoor de ouderknoop en kies Extra<i> > Knoobeveiliging > Opgeven wachtwword. </i>Het is mogelijk binnen de beveiligde tak elke knoop een ander wachtwoord te geven.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ Beveiligen met een wachtwoord werkt alleen indien in<i> Extra > Voorkeuren</i> is ingesteld dat beveiligen is toestaan.
+ </li>
+ <li>
+ De knoop waarvoor je een wachtwoord instelt is zelf wel zichtbaar. Dit geldt ook voor zijn knoopinhoud.
+ </li>
+ <li>
+ De beveiliging wordt gerealiseerd met zogenaamde DES encryptie, zie Help > Handleiding.
+ </li>
+ <li>
+ Zie ook:<i> Extra > Knoopbeveiliging</i>.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Nieuwe beveiligde mindmap" STYLE_REF="Professional" FOLDED="true" ID="ID_1064538299" CREATED="1314362258060" MODIFIED="1323770575757" VSHIFT="-40" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_528457926" CREATED="1323770517195" MODIFIED="1330613239045" HGAP="-162" VSHIFT="37"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bij het maken van een nieuwe mindmap kan deze direkt met een wachtwoord worden beveiligd. Kies hiervoor <i>Bestand > Nieuwe beveiligde mindmap. </i>Deze functie kan worden gecombineerd met wchtwoorbeveiliging van knopen, om meerlaagse beveiliging te maken.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+<font ITALIC="false"/>
+</node>
+</node>
+</node>
+<node TEXT="Fijnregelen Freeplane" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1746471823" CREATED="1314215326284" MODIFIED="1323811170119" NUMBERED="true" MIN_WIDTH="180">
+<node ID="ID_931065203" CREATED="1323095428935" MODIFIED="1330254598956" VSHIFT="100"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane heeft vele mogelijkheden om de werking aan je persoonlijke wensen aan te passen. De meestgebruikte staan in menu <i>Beeld</i>. Veel meer staan in <i>Extra > Instellingen. </i>Daarnaast kun je met zogenaamde scripts en add-ons je eigen uitbredingen op Freeplane maken. Zie Help > Handleiding voor een beschrijving.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Alle knopen een omlijning" STYLE_REF="Advanced" FOLDED="true" ID="ID_210892586" CREATED="1321645917041" MODIFIED="1330254654460" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1274034553" CREATED="1323529940039" MODIFIED="1336123531402" HGAP="-170" VSHIFT="116"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Een nieuwe knoop krijgt stijl Standaardstijl. Deze stijl kan worden vernaderd : <i>Opmaken > Beheren stijlen > Bewerken stijlen. </i>Als je <i>omlijning</i> instelt krijgen alle nieuwe knopen een omlijning of kader.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ De veranderde standaardstijl geldt alleen voor de mindmap waarin je werkt. Om de standaardstijl voor alle nieuwe mindmaps toe te passen, moet je de mindmap <i>standard.mm</i> aanpassen. Deze bevindt zich in: <i>Extra > Openen gebruikersdirectory > Templates.</i>
+ </li>
+ <li>
+ Overweeg om in standard.mm de optie "Hyperlinks" aan te vinken. Dit zorgt er voor dat de tekst van een pijl-hyperlink wordt onderstreept en klikbaar is.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Instellingen in menu Beeld" STYLE_REF="Professional" FOLDED="true" ID="ID_1173853188" CREATED="1315687352137" MODIFIED="1323714027311" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1748316183" CREATED="1323530207075" MODIFIED="1336123764505" HGAP="-172" VSHIFT="122"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In menu Beeld kun je verschillende eigenschappen van de knoopkern instellen zoals de breedte van de tekst, of een selectierand moet worden getoond, of formules met een rand moeten worden omgeven en welke achtergrondkleur voor een revisie moet worden toegepast. Je kunt verder instellen hoe knoopdetails moeten worden getoond, met of zonder zweeftekst en revisies (tijdstippen). Je kunt verder aangeven welke attributen moeten moeten worden getoond of verborgen. En je kunt aangeven of knoopnotities in een apart venster moeten worden getoond dat op het scherm blijft staan, en op welke positie van het scherm.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking</b>
+ </p>
+ <ul>
+ <li>
+ <i>Beeld > Beeldinstellingen</i> bevat opties die belangrijk zijn bij printen (Outline) en presenteren (Presentatiemode).
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Scientific literature suite (Docear)" STYLE_REF="Professional" FOLDED="true" ID="ID_170927482" CREATED="1316706324268" MODIFIED="1330254743559" LINK="http://docear.org/details.php" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_1788895132" CREATED="1323530348451" MODIFIED="1336118463309" HGAP="-231" VSHIFT="123"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span lang="EN-US">Docear is an "academic literature suite". It provides to researchers what an office suite provides to office workers. By that we mean, Docear supports you in doing all the tasks related to literature management: </span>
+ </p>
+ <p>
+ <span lang="EN-US"> </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 1. Finding new literature (searching and exploring) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 2. Organizing literature (reading, annotating, and retrieving) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> 3. Creating your own literature (drafting, writing, referencing, and publishing) </span>
+ </p>
+ <p>
+ <span lang="EN-US"> </span>
+ </p>
+ <p>
+ <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="Standaard instellingen in Extra > Voorkeuren" STYLE_REF="Professional" FOLDED="true" ID="ID_889570489" CREATED="1314730257257" MODIFIED="1323714512035" MIN_WIDTH="1" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node TEXT="Omgeving" FOLDED="true" ID="ID_908072469" CREATED="1314708954177" MODIFIED="1336118478160" HGAP="-284" VSHIFT="97" MAX_WIDTH="550" MIN_WIDTH="550" STYLE="fork">
+<font BOLD="true"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Je kunt o.a. de volgend eigenschappen zelf instellen:
+ </p>
+ <ul>
+ <li>
+ Of er een of meer Freeplane programma's tegelijk kunnen draaien<br/>
+ </li>
+ <li>
+ Opties voor het openen en bewaren van bestanden;
+ </li>
+ <li>
+ Of de toestand van open/dichtvouwen bij bewaren ook moet worden bewaard, zodat bij het openen de mindmap in dezelfde toestand begint;
+ </li>
+ <li>
+ Keuze van de standaard karakterset;
+ </li>
+ <li>
+ Of hyperlinks absoluut of relatief zijn.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Voorkomen" STYLE_REF="Introduction" FOLDED="true" ID="ID_1541392544" CREATED="1314709723082" MODIFIED="1323714290702" HGAP="-550" VSHIFT="145" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hier kun je o.a. instellen:
+ </p>
+ <ul>
+ <li>
+ De standaard eigenschappen;
+ </li>
+ <li>
+ Hoogte en breedte van knopen, verborgen tekst (tooltip), enz.;
+ </li>
+ <li>
+ Of bepaalde pictogrammen moeten worden getoond, bijvoorbeeld voor attributen en notitie.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+<node TEXT="Toetsen" STYLE_REF="Introduction" FOLDED="true" ID="ID_748518266" CREATED="1314720398255" MODIFIED="1323714332869" HGAP="-555" VSHIFT="70" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De sneltoetsen die worden gebruikt voor bepaalde pictogrammen
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+<node TEXT="Gedrag" STYLE_REF="Introduction" FOLDED="true" ID="ID_1578508847" CREATED="1314720581515" MODIFIED="1323714377157" HGAP="-550" VSHIFT="163" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Hier kun je a.o. instellen:
+ </p>
+ <ul>
+ <li>
+ Of automatische selectie wordt toegepast en met welke vertraging;
+ </li>
+ <li>
+ De karakteristieken van de zweeftekst (tooltip);
+ </li>
+ <li>
+ Of snelbewerken standaard moet worden toegepast;
+ </li>
+ <li>
+ Of voor bewerken een dubbelklik nodig is;
+ </li>
+ <li>
+ Of een toetsindruk tekst overschrijft, een kind of een zus toevoegt of geen effect heeft;
+ </li>
+ <li>
+ De positie van nieuwe takken (eerste, laatste);
+ </li>
+ <li>
+ Toestaan van slepen (drag en drop);
+ </li>
+ <li>
+ Snelheid van het muiswiel;
+ </li>
+ <li>
+ De afmeting van het raster voor het plaatsen van knopen;
+ </li>
+ <li>
+ Het type formattering van getallen en datums;
+ </li>
+ <li>
+ Of bevestiging nodig is bij het verwijderen van een knoop;
+ </li>
+ <li>
+ Of tekst als getal wordt op gevat bij vergelijkingsoperaties;
+ </li>
+ <li>
+ Of de spellingscontrole hoofdlettergevoelig is.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+<node TEXT="HTML" STYLE_REF="Introduction" FOLDED="true" ID="ID_1185446743" CREATED="1314729741193" MODIFIED="1323714416516" HGAP="-550" VSHIFT="161" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De instelling van de browser en voor HTML.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+<node TEXT="Plugins" STYLE_REF="Introduction" ID="ID_1546138946" CREATED="1314729857046" MODIFIED="1323714478838" HGAP="-550" VSHIFT="55" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Instellingen voor formules en scripts
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Vertikale afstand tussen knopen" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1324029133997" MODIFIED="1336123856094" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_801516363" CREATED="1324029189260" MODIFIED="1336124253959" HGAP="-202" VSHIFT="97"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ De vertikale afstand tussen knopen kan als volgt worden veranderd: selecteer een knoop, houdt Ctrl ingedrukt en sleep de blauwe handle van de knoop naar boven of benededen; of gebruik het rolletje op de muis.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>Opmerking </b>
+ </p>
+ <ul>
+ <li>
+ De verandering beinvloedt (alleen) de broer/zusterknopen.
+ </li>
+ <li>
+ Om de standaardinstelling terug te krijgen: selecteer een knoop en kies <i>Bewerken > Herstellen oorspronkelijke knoopposities.</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Scripts" STYLE_REF="Professional" FOLDED="true" ID="ID_519455593" CREATED="1316158310467" MODIFIED="1323811193426" 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" CREATED="1323530732191" MODIFIED="1336118501997" HGAP="-65" VSHIFT="62"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane heeft een mogelijkheid om zelf ontbrekende functies toe te voegen met de scripttaal Groovy. Er is een verzameling kant en klare scripts die je kunt gebruiken zonder dat je hoeft te kunnen programmeren.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 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"/>
+</hook>
+</node>
+</node>
+<node TEXT="Indexing .mm in Windows7" STYLE_REF="Professional" FOLDED="true" ID="ID_952466464" CREATED="1313349075257" MODIFIED="1323530875579" VSHIFT="2" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_844014092" CREATED="1323530829949" MODIFIED="1336118513728" HGAP="-170" VSHIFT="168"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bij gebruik van Windows 7 kun je Windows 7 zo instellen dat ook .mm bestanden worden geindexeerd en dus sneller worden gevonden Dit gaat als volgt:
+ </p>
+ <ul>
+ <li>
+ Go to Control Panel -> indexing options; or type in Help ""indexing"
+ </li>
+ <li>
+ Choose "Advanced". This gives you a page with two tabs -- "Index Settings" and "File Types"
+ </li>
+ <li>
+ Choose the "File Types" tab
+ </li>
+ <li>
+ Scroll through the list of files there till you come to ".mm"
+ </li>
+ <li>
+ The filter description will say "File Properties Filter"
+ </li>
+ <li>
+ Click the second radio button beneath, which says "Index Properties and File contents. The filter description should now change to "Plain text filter"
+ </li>
+ <li>
+ Choose OK to leave the dialog. The indexing will restart and when it is finished, the index is available.
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>Note</b>
+ </p>
+ <ul>
+ <li>
+ In the standard mode only node properties are indexed, not content. The above procedure also adds the content to the filtering mechanism.
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Woordenlijsten voor spellingcontrole" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" CREATED="1271096394315" MODIFIED="1323714684417" 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 TEXT="Spellingcontrole is standaard voor Engels ingesteld. Voor het Nederlands moet de woordenlijst worden opgehaald van Internet. Klik op het rode pijltje. Download het bestand dictionary_nl.ortho. En bewaar dit bestand in Extra > Gebruikersdirectory > Resources/Ortho. Raadpleeg verder de Handleiding Freeplane." ID="ID_1759599610" CREATED="1323530909501" MODIFIED="1336118526130" HGAP="-256" VSHIFT="50">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="Standaard sneltoetsen" STYLE_REF="Professional" FOLDED="true" ID="ID_64846119" CREATED="1316185102923" MODIFIED="1323714780419" STYLE="combined">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
+</hook>
+<node ID="ID_667200365" CREATED="1323530988242" MODIFIED="1336118534850" HGAP="-141" VSHIFT="41"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane maakt gebruik van toetcombinaties om snel bepaalde menu's the kunnen benaderen, zie <i>Help > Overzicht van sneltoetsen.</i> Het is ook mogelijk je eigen sneltoetsenset te definieren, welke ook is mee te nemen naar een andere computer, zie de documentatie.
+ </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="1323531432400" LINK="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28install%29" VSHIFT="-140" MIN_WIDTH="1">
+<node STYLE_REF="TitlesContent" ID="ID_605874491" CREATED="1330288366116" MODIFIED="1336118542978" HGAP="-73" VSHIFT="34"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Klik op de rode pijl voor meer informatie over uitbreidingen.
+ </p>
+ <p>
+ Installeer de<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28Language_pack%29#NL"> language add-on NL</a> voor meer uitgebreide ondersteuning.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Handigheidjes" STYLE_REF="Beginner" FOLDED="true" POSITION="left" ID="ID_722085722" CREATED="1314363768463" MODIFIED="1329413365208" BACKGROUND_COLOR="#00cc33" NUMBERED="true" VSHIFT="-80" MIN_WIDTH="180">
+<node STYLE_REF="BeginnerTopic" ID="ID_163805859" CREATED="1314422714136" MODIFIED="1323714844755"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Klik <a href="http://freeplane.sourceforge.net/wiki/index.php/Mind_Map_Gallery/Dutch"><b>hier</b></a> om naar de wiki met voorbeelden op Internet te gaan.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Hoe deze mindmap is opgebouwd" STYLE_REF="Advanced" FOLDED="true" ID="ID_1394424447" CREATED="1329890506053" MODIFIED="1329925067380">
+<node TEXT="Main title with number" FOLDED="true" ID="ID_1866200606" CREATED="1329891158131" MODIFIED="1330259034831" NUMBERED="true" MIN_WIDTH="180"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">Node with </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">style Begin, Advanced or Professional</font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">automatic node number</font>
+ </li>
+ <li>
+ fixed min node width = 180
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Title" ID="ID_1129463861" CREATED="1329890593164" MODIFIED="1330163739676" VSHIFT="28" STYLE="combined"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Short label indicating content
+ </p>
+ <ul>
+ <li>
+ Omlijning: Gecombineerd (= alleen omlijnd indien dichtgevouwen)
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ with
+ </p>
+ <ul>
+ <li>
+ style TitlesContent
+ </li>
+ <li>
+ generally moved below Title with hidden edge
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Signals for Example or Revision" ID="ID_1987503747" CREATED="1329893003272" MODIFIED="1329893364322"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ style Example added as conditional node stye (applies to single node)
+ </li>
+ <li>
+ style Revision added as conditional map style (applies to all nodes)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="User defined Styles" ID="ID_1542766589" CREATED="1329890665063" MODIFIED="1329891699156">
+<node TEXT="Beginner" STYLE_REF="Beginner" ID="ID_1530366440" CREATED="1329890552011" MODIFIED="1329891025524"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color green
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Advanced" STYLE_REF="Advanced" ID="ID_535640598" CREATED="1329890558413" MODIFIED="1329891023028"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color yellow
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Professional" STYLE_REF="Professional" ID="ID_1633698334" CREATED="1329890564240" MODIFIED="1329891020032"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bold text
+ </p>
+ <p>
+ Bubble
+ </p>
+ <p>
+ Node backround color orange/brown
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="TitlesContent" STYLE_REF="TitlesContent" ID="ID_1999102003" CREATED="1329890685983" MODIFIED="1329891614417"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ No bubble
+ </p>
+ <p>
+ Hidden edge
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Example" STYLE_REF="Example" ID="ID_149652811" CREATED="1329891620274" MODIFIED="1329892004168"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ eye-icon
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1141559530" CREATED="1329891634025" MODIFIED="1329892021734"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ R-icon
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="MyTemplate" STYLE_REF="MyTemplate" ID="ID_669326751" CREATED="1329896085816" MODIFIED="1329896350488">
+<attribute NAME="birth date" VALUE=""/>
+<attribute NAME="e-mail" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="4" color="#3333ff"><b>Template information</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>Name</i>:
+ </li>
+ <li>
+ Address:
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Map with all Freeplane Functions (index)" ID="ID_1680872369" CREATED="1329896383911" MODIFIED="1329897008344" LINK="#ID_232622736"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Free node
+ </li>
+ <li>
+ Cloud
+ </li>
+ <li>
+ External link
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Map with example applications (index)" ID="ID_311616726" CREATED="1329896409752" MODIFIED="1329896989686" LINK="#ID_766584529"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Free node
+ </li>
+ <li>
+ Cloud
+ </li>
+ <li>
+ External link
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Versies (revisies)" STYLE_REF="Advanced" ID="ID_1424120147" CREATED="1323615838293" MODIFIED="1331307188668" LINK="#ID_1437965047"/>
+<node TEXT="Meerdere views van dezelfde mind map" STYLE_REF="Advanced" FOLDED="true" ID="ID_1926778226" CREATED="1331306719166" MODIFIED="1331307303845">
+<node STYLE_REF="TitlesContent" ID="ID_1319135286" CREATED="1331306733589" MODIFIED="1336118591291" HGAP="-252" VSHIFT="51"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bij een grote mindmap is het lastig om op twee verschillende plaatsen van de mind map te werken. Kies <i>Beeld > Nieuwe mindmap afbeelding</i> om een gekoppelde kopie van de huidige mindmap te maken. Via de tabbladen onderin het scherm kun je tussen beide views heen en weer springen. Freeplane ziet beide als dezelfde mind map. Je kunt de twee views niet naast elkaar zien.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font ITALIC="false"/>
+</node>
+</node>
+<node TEXT="Herstel vanuit automatische back up" STYLE_REF="Professional" FOLDED="true" ID="ID_1223302157" CREATED="1329413171735" MODIFIED="1331307176921">
+<node STYLE_REF="TitlesContent" ID="ID_518626633" CREATED="1329413197325" MODIFIED="1336118600370" HGAP="-224" VSHIFT="26"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Om een eerdere versie van een mindmap te herstellen, kies menu <i>Bestand > Herstel back-up</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Batch jobs" STYLE_REF="Professional" FOLDED="true" ID="ID_1371818753" CREATED="1330372522196" MODIFIED="1330372862294">
+<node STYLE_REF="TitlesContent" ID="ID_804893281" CREATED="1330372555097" MODIFIED="1336118610354" HGAP="-67" VSHIFT="82"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ All functions in Freeplane are open for use as batch job, in a command line interface. With this you can for example:
+ </p>
+ <ul>
+ <li>
+ run a function on start up
+ </li>
+ <li>
+ execute a script an leave
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_59598318" CREATED="1322149746220" MODIFIED="1322149989113" HGAP="197" VSHIFT="282" COLOR="#ffffff"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ © <font size="1">Jokro</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<edge STYLE="hide_edge" COLOR="#ffffff"/>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplaneTutorial_nl.mmfilter b/freeplane/doc/freeplaneTutorial_nl.mmfilter
new file mode 100644
index 0000000..236b160
--- /dev/null
+++ b/freeplane/doc/freeplaneTutorial_nl.mmfilter
@@ -0,0 +1,14 @@
+<filter_conditions>
+ <disjunct_condition user_name="Beginner">
+ <style_equals_condition TEXT="Beginner"/>
+ <style_equals_condition TEXT="BeginnerOnderwerp"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Gevorderde">
+ <style_equals_condition TEXT="GevorderdeOnderwerp"/>
+ <style_equals_condition TEXT="Gevorderde"/>
+ </disjunct_condition>
+ <disjunct_condition user_name="Professional">
+ <style_equals_condition TEXT="Professional"/>
+ <style_equals_condition TEXT="ProfessionalOnderwerp"/>
+ </disjunct_condition>
+</filter_conditions>
diff --git a/freeplane/doc/freeplane_de.mm b/freeplane/doc/freeplane_de.mm
new file mode 100644
index 0000000..8e32723
--- /dev/null
+++ b/freeplane/doc/freeplane_de.mm
@@ -0,0 +1,3457 @@
+<map version="0.9.0">
+<!--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">
+<html>
+ <head>
+
+ </head>
+ <body width="">
+ <p align="center">
+ Freeplane<br/><small>- Eine freie Mind Mapping Software -</small>
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h2>
+ Einführung
+ </h2>
+ <p>
+ Freeplane ermöglicht das Erstellen von grafischen Dokumenten zur visuellen Darstellung von Zusammenhängen - so genannte Mind Maps. Viele Leute verwenden das Programm aber auch als eine Alternative zum Notzibuch, oder als Persönlichen Informationsmanager.
+ </p>
+ <p>
+ Die Information wird in Textboxen, so genannten Knoten, gespeichert. Die Knoten sind untereinander mit Linien verbunden.
+ </p>
+ <p>
+ <font color="#0033ff"><b>Drücke die Taste Cursor nach rechts, oder klicke mit der linken Maustaste auf diesen Knoten, um ihn aufzuklappen.</b></font>
+ </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"/>
+</node>
+<node TEXT="Demonstration einiger Features" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1270892460656" MODIFIED="1274308820840" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Aussehen" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1270892460656" MODIFIED="1274308893300" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Knoten können unterschiedliche Farben haben" FOLDED="true" ID="ID_291185043" CREATED="1270892460656" MODIFIED="1274308914214">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Rot" ID="ID_73698498" CREATED="1270892460656" MODIFIED="1274308922857" COLOR="#ff0000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Grün" ID="ID_1386235766" CREATED="1270892460657" MODIFIED="1274308929820" COLOR="#009900">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Blau" ID="ID_185145945" CREATED="1270892460657" MODIFIED="1274308935959" COLOR="#0000cc">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Knoten können unterschiedliche Hintergrundfarben haben" FOLDED="true" ID="_" CREATED="1270892460657" MODIFIED="1274308966543">
+<node TEXT="Pink" ID="_Freeplane_Link_1358611533" CREATED="1270892460657" MODIFIED="1271973346309" BACKGROUND_COLOR="#ffcccc"/>
+<node TEXT="Zyan" ID="_Freeplane_Link_1317973766" CREATED="1270892460657" MODIFIED="1274309037200" BACKGROUND_COLOR="#ccffff"/>
+</node>
+<node TEXT="Knoten können unterschiedliche Schriftattribute haben" FOLDED="true" ID="ID_1923181646" CREATED="1270892460657" MODIFIED="1274309137563">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Fett" ID="ID_1824894496" CREATED="1270892460657" MODIFIED="1274309144332">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+</node>
+<node TEXT="Kursiv" ID="ID_871310557" CREATED="1270892460658" MODIFIED="1274309151650">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
+</node>
+<node TEXT="Fett und Kursiv" ID="ID_735467355" CREATED="1270892460658" MODIFIED="1274309162135">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
+</node>
+</node>
+<node TEXT="Die Knotenschrift kann unterschiedliche Größe haben" FOLDED="true" ID="ID_1148481435" CREATED="1270892460658" MODIFIED="1274309266035">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Klein" ID="ID_409039647" CREATED="1270892460658" MODIFIED="1274309274188">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node TEXT="Normal" ID="ID_1435919979" CREATED="1270892460658" MODIFIED="1274309279205">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node TEXT="Größer" ID="ID_285885166" CREATED="1270892460658" MODIFIED="1274309288308">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node TEXT="Groß" FOLDED="true" ID="ID_925591695" CREATED="1270892460659" MODIFIED="1274309294462">
+<font NAME="SansSerif" SIZE="20"/>
+<node TEXT="OOh" ID="ID_612411777" CREATED="1270892460659" MODIFIED="1270892460659">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node TEXT="Es können verschiedene Schriftarten verwendet werden" FOLDED="true" ID="ID_1844753395" CREATED="1270892460659" MODIFIED="1274309342117">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Times New Roman" ID="ID_471048226" CREATED="1270892460659" MODIFIED="1271973714732">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node TEXT="Verdana" ID="_Freeplane_Link_1568731425" CREATED="1270892460659" MODIFIED="1271973720643">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node TEXT="Dialog font" ID="ID_1860252564" CREATED="1270892460659" MODIFIED="1271973770585">
+<font NAME="Dialog" SIZE="21"/>
+</node>
+</node>
+<node TEXT="Man kann verschiedene Knotentypen verwenden" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1270892460660" MODIFIED="1274309505512">
+<node TEXT="Linie" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1270892460660" MODIFIED="1274309511982" STYLE="fork">
+<node TEXT="Linie" ID="_Freeplane_Link_89124429" CREATED="1270892460660" MODIFIED="1274309519178" STYLE="fork"/>
+<node TEXT="Linie" ID="_Freeplane_Link_173850525" CREATED="1270892460660" MODIFIED="1274309524539"/>
+</node>
+<node TEXT="Blase" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1270892460660" MODIFIED="1274309529922" STYLE="bubble">
+<node TEXT="Blase" ID="_Freeplane_Link_1677737286" CREATED="1270892460660" MODIFIED="1274309535666" STYLE="bubble"/>
+<node TEXT="Blase" ID="_Freeplane_Link_978246353" CREATED="1270892460660" MODIFIED="1274309541322" STYLE="bubble"/>
+</node>
+<node TEXT="Kombiniert" FOLDED="true" ID="ID_746506029" CREATED="1274309542928" MODIFIED="1274309712465" STYLE="combined">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Kombiniert" ID="ID_1073750917" CREATED="1274309718580" MODIFIED="1274309722192"/>
+<node TEXT="Kombiniert" ID="ID_1826613444" CREATED="1274309723425" MODIFIED="1274309730164"/>
+</node>
+</node>
+</node>
+<node TEXT="Knoten können gefaltet sein" FOLDED="true" ID="ID_1623634168" CREATED="1270892460660" MODIFIED="1274311365868" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Gefaltet" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1270892460660" MODIFIED="1274311374818">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Versteckt" ID="ID_710559854" CREATED="1270892460660" MODIFIED="1274311382274">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Baum" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1270892460661" MODIFIED="1274311387394">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Eiche" ID="ID_117856753" CREATED="1270892460661" MODIFIED="1274311415329">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Buche" ID="ID_39938798" CREATED="1270892460661" MODIFIED="1274311431811">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Ulme" ID="ID_919566309" CREATED="1270892460661" MODIFIED="1274311451278">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Knoten können Links enthalten zu..." FOLDED="true" ID="ID_1091027669" CREATED="1270892460661" MODIFIED="1274311503505" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Internet Seiten" FOLDED="true" ID="ID_1291101161" CREATED="1270892460661" MODIFIED="1274311521762" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="http://www.google.com/" ID="ID_1272005179" CREATED="1270892460662" MODIFIED="1270892460662" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="www.google.com" ID="ID_488333574" CREATED="1270892460662" MODIFIED="1270991928052" LINK="www.google.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Lokalen Ordnern" FOLDED="true" ID="ID_819664033" CREATED="1270892460662" MODIFIED="1274311569470" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:/Program Files/ (Windows)" ID="ID_33602690" CREATED="1270892460662" MODIFIED="1271973897739" LINK="file:/C:/Program%20Files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="/home/ (Linux)" ID="ID_1192223311" CREATED="1270892460662" MODIFIED="1271973908073" LINK="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="/Users (Mac OS X)" ID="ID_1305958070" CREATED="1271973910165" MODIFIED="1271973960770" LINK="/Users"/>
+</node>
+<node TEXT="Ausführbaren Programmen" FOLDED="true" ID="ID_1829360247" CREATED="1270892460663" MODIFIED="1274311581045" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\WINNT\regedit.exe" ID="ID_1773112429" CREATED="1270892460663" MODIFIED="1270991928052" LINK="file:/C:/WINNT/regedit.exe">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Anderen Knoten in der selben MindMap (oder in anderen MindMaps)" ID="ID_148011650" CREATED="1271974056299" MODIFIED="1274311622670" LINK="#ID_709498088"/>
+<node TEXT="Jedem Dokument auf dem Computer, oder im Netzwerk." ID="ID_382832692" CREATED="1270892460663" MODIFIED="1274311684089">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Je nach Plattform (Windows/Unix/...) zeigen verschiedene Icons den Typ des Hyperlinks an" ID="ID_1145751539" CREATED="1270991844130" MODIFIED="1274311748081"/>
+</node>
+<node TEXT="Um einem Hyperlink zu folgen, 
klicke auf das Icon" FOLDED="true" ID="ID_709498088" CREATED="1271029724866" MODIFIED="1274486224131" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Ein grüner Pfeil symbolisiert einen lokal Link (Innerhalb der selben MindMap)" ID="ID_1382213647" CREATED="1271974215092" MODIFIED="1274311921459"/>
+<node TEXT="Ein roter Pfeil symbolisiert einen externen Link (außerhalb der aktuellen MindMap)" ID="ID_1268065166" CREATED="1271974306669" MODIFIED="1274311938151"/>
+</node>
+<node TEXT="Mehrzeilige Knoten" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1270892460663" MODIFIED="1274486299830" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Mehrzeilige Knoten erscheinen als einer oder mehrere Punkte. Anstatt Deine Notizen in einer Textdatei zu speichern, kannst Du einen kurzen Knoten mit vielen mehrzeiligen Kindern verwenden." ID="_Freeplane_Link_1423568963" CREATED="1270892460664" MODIFIED="1275331696389"/>
+<node TEXT="Kurzer mehrzeiliger Knoten mit Zeilenumbruch" FOLDED="true" ID="ID_1324715896" CREATED="1270892460664" MODIFIED="1275331711251" COLOR="#669900">
+<node TEXT="Eine Zeile,
eine Zweite,

und noch eine,
Was hälst Du davon?" ID="_Freeplane_Link_1957797574" CREATED="1270892460664" MODIFIED="1274486640378"/>
+</node>
+</node>
+<node TEXT="Man kann eine Beschriftung
von Knotenlinien simulieren" FOLDED="true" ID="ID_929122537" CREATED="1270892460664" MODIFIED="1275331976255" COLOR="#669900">
+<node TEXT="Baum" FOLDED="true" ID="ID_1430553317" CREATED="1270892460664" MODIFIED="1274486964590">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="ist eine" FOLDED="true" ID="ID_976763673" CREATED="1270892460664" MODIFIED="1274486975331" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Eiche" ID="ID_848417183" CREATED="1270892460664" MODIFIED="1274486983903">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="ist eine" FOLDED="true" ID="ID_54522784" CREATED="1270892460665" MODIFIED="1274486996369" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Buche" ID="ID_625768370" CREATED="1270892460665" MODIFIED="1274487049077">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="ist eine" FOLDED="true" ID="ID_20190770" CREATED="1270892460665" MODIFIED="1274487003119" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Ulme" ID="ID_42771538" CREATED="1270892460665" MODIFIED="1274487068020">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Baum" FOLDED="true" ID="ID_1249902286" CREATED="1270892460665" MODIFIED="1274487074494">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<>" FOLDED="true" ID="ID_1994219362" CREATED="1270892460665" MODIFIED="1270991928052" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Blatt" ID="ID_1632637474" CREATED="1270892460666" MODIFIED="1274487082328">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="<>" FOLDED="true" ID="ID_1583422438" CREATED="1270892460666" MODIFIED="1270991928052" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Stamm" ID="ID_1648811846" CREATED="1270892460666" MODIFIED="1274487091531">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Knoten können Icons enthalten" FOLDED="true" ID="ID_492845108" CREATED="1270892460666" MODIFIED="1274487212516" COLOR="#669900">
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="button_ok"/>
+<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"/>
+<node TEXT="...und die Wolken können
verschiedene Farben haben" ID="ID_1714895943" CREATED="1270892460668" MODIFIED="1274487435773">
+<cloud COLOR="#c4388d" WIDTH="0"/>
+<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="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"/>
+</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"/>
+</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"/>
+</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">
+<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"/>
+</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">
+<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"/>
+</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"/>
+</node>
+</node>
+<node TEXT="Knotenlinien können versteckt werden" FOLDED="true" ID="ID_1539062144" CREATED="1270893550070" MODIFIED="1274817607326" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Ein Knoten mit einer versteckten Linie" ID="ID_936535846" CREATED="1270893561062" MODIFIED="1274817722321" STYLE="bubble">
+<edge STYLE="hide_edge"/>
+</node>
+</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 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1583313144" CREATED="1270892460687" MODIFIED="1274906093709">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um an den <b>Anfang des aktiven Zweiges</b> zu kommen, drücke BildAuf
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_144127434" CREATED="1270892460688" MODIFIED="1274906108315">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um ans <b>Ende des aktiven Zweiges</b> zu kommen, drücke BildAb
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_158862259" CREATED="1270892460688" MODIFIED="1274915647666">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um zum <b>Wurzelknoten</b> zu <b>gelangen</b> <b>und</b> ihn zu <b>zentrieren </b>wähle
+ </p>
+ <p>
+ "Navigieren -> Wurzelknoten zentrieren" (Escape)
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1985477320" CREATED="1271026015708" MODIFIED="1274915676581">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_902784897" CREATED="1271176654062" MODIFIED="1274915710842">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Navigieren</b> durch <b>alle Knoten</b> einer MindMap:<br/>- "Navigieren -> Zum nächsten Knoten" (Strg + Alt + Cursor rechts)
+ </p>
+ <p>
+ navigiert zum nächsten Knoten<br/>- "Navigieren -> Zum vorherigen Knoten" (Strg + Alt + Cursor links)
+ </p>
+ <p>
+ navigiert zum vorherigen Knoten
+ </p>
+ <p>
+ <br/>
+
+ </p>
+ <p>
+ Die Reihenfolge der Knoten wird anhand der Hierarchie ermittelt.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1501511305" CREATED="1271177016593" MODIFIED="1274915743605">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Navigieren</b> durch <b>alle Knoten</b> einer MindMap und dabei die
+ </p>
+ <p>
+ Zweige <b>beim Verlassen wieder falten</b>:<br/>- "Navigieren -> Zum nächsten Knoten (Kinder-Knoten falten)" (Strg + Alt + Shift + Cursor rechts)
+ </p>
+ <p>
+ navigiert zum nächsten Knoten<br/>- "Navigieren -> Zum vorherigen Knoten (Kinder-Knoten falten)" (Strg + Alt + Shift + Cursor links)
+ </p>
+ <p>
+ navigiert zum vorherigen Knoten
+ </p>
+ <p>
+ <br/>
+ Die Reihenfolge der Knoten wird anhand der HIerarchie ermittelt.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um <b>mehrere Knoten auszuwählen</b> halte die Strg- oder die Shift-Taste gedrückt,
+ </p>
+ <p>
+ während Du auf die Knoten links klickst.
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1775844952" CREATED="1270892460682" MODIFIED="1274906358844">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Einzelne Knoten</b> kannst Du einer bestehenden Auswahl <b>hinzuzufügen</b>,
+ </p>
+ <p>
+ indem Du die Strg-Taste gedrückt hälst, während Du sie mit der Maus anklickst.
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1843533091" CREATED="1270892460682" MODIFIED="1274906418413">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen <b>zusammenhängenden Bereich von Knoten auszuwählen</b>
+ </p>
+ <p>
+ halte die Shift-Taste gedrückt, während Du die Knoten anklickst, oder Du
+ </p>
+ <p>
+ Dich mit den Cursor-Tasten durch die MindMap bewegst.
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1178451061" CREATED="1270892460682" MODIFIED="1275332271295">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Einen kompletten Zweig</b> kannst Du wie folgt <b>auswählen</b>:
+ </p>
+ <p>
+ - drücke Strg + Shift + A,
+ </p>
+ <p>
+ - halte Shift gedrückt während Du von einem Knoten zu seinem Vater navigierst
+ </p>
+ <p>
+ - halte AltGr gedrückt während Du einen Knoten anklickst.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1029340509" CREATED="1270892460682" MODIFIED="1274906475113">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Auswah</b>l kannst Du wieder <b>aufheben</b>, indem Du auf den
+ </p>
+ <p>
+ Hintergrund der MindMap, oder einen unselektierten Knoten klickst.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Ein gefalteter Knoten wird durch einen kleinen Kreis an dem Ende, das am weitesten vom Wurzelknoten entfernt ist, angezeigt.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1439689412" CREATED="1270892460688" MODIFIED="1274914461698">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Falten</b> von <b>Knoten</b>:
+ </p>
+ <p>
+ - Drücke die Leertaste
+ </p>
+ <p>
+ - Verwende "Navigieren -> Knoten falten/ entfalten"
+ </p>
+ <p>
+ - Verwende das "Knoten-Kontextmenü -> Knoten falten/ entfalten"
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1089564473" CREATED="1270892460688" MODIFIED="1274914441890">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Entfalten</b> von <b>Knoten</b>:
+ </p>
+ <p>
+ - Drücke die Leertaste
+ </p>
+ <p>
+ - Navigiere mit den Cursor-Tasten in die Richtung des Faltungssymbols
+ </p>
+ <p>
+ - Verwende "Navigieren -> Knoten falten/ entfalten"
+ </p>
+ <p>
+ - Verwende das "Knoten-Kontextmenü -> Knoten falten/ entfalten"
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_926272054" CREATED="1270892460688" MODIFIED="1275332487191">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um eine <b>ganze Ebene</b> zu <b>falten</b> <b>bzw.</b> zu <b>entfalten</b> gibt es folgende Möglichkeiten:
+ </p>
+ <p>
+ - Halte die Alt-Taste gedrückt, während Du das Mausrad bewegst
+ </p>
+ <p>
+ - Verwende die Tastenkombination Alt + Bild Auf bzw. Alt + Bild Ab
+ </p>
+ <p>
+ - Benutze die Symbole aus der Werkzeug-Symbolleiste
+ </p>
+ <p>
+ (die Symbole mit dem Plus bzw. Minus über einer Knotenlinie)
+ </p>
+ <p>
+ - Wähle "Navigieren -> Eine Ebene aufklappen" bzw. "Navigieren -> Eine Ebene zuklappen"
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Diese Funktion beansprucht viel Arbeitsspeicher und kann bei großen MindMaps
+ </p>
+ <p>
+ zu Problemen führen.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1233324949" CREATED="1270892460688" MODIFIED="1275332565442">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Alle Knoten</b> ab der <b>ausgewählten Ebene</b> kann man wie folgt <b>entfalten</b>:
+ </p>
+ <p>
+ - Verwende die Tastenkombination Alt + Ende
+ </p>
+ <p>
+ - Benutze das Symbol aus der Werkzeug-Symbolleiste
+ </p>
+ <p>
+ (das Icon mit dem Plus im Kreis)
+ </p>
+ <p>
+ - Wähle "Navigieren -> Alles aufklappen"
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1624228779" CREATED="1270892460688" MODIFIED="1275332591656">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Alle Knoten</b> ab der <b>ausgewählten Ebene</b> kann man wie folgt <b>falten</b>:
+ </p>
+ <p>
+ - Verwende die Tastenkombination Alt + Pos1
+ </p>
+ <p>
+ - Benutze das Symbol aus der Werkzeug-Symbolleiste
+ </p>
+ <p>
+ (das Icon mit dem Minus im Kreis)
+ </p>
+ <p>
+ - Wähle "Navigieren -> Alles zuklappen"
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Es gibt mehrere Möglichkeiten die <b>MindMap</b> zu <b>verschieben</b>:
+ </p>
+ <p>
+ - Bewege die Maus auf den Hintergrund und drücke die linke Maustaste (der Cursor
+ </p>
+ <p>
+ ändert sich). Wenn Du die Taste jetzt gedrückt hälst folgt die MindMap den Mausbewegungen.
+ </p>
+ <p>
+ - Drehen am Mausrad verschiebt die MindMap vertikal.
+ </p>
+ <p>
+ - Drehen am Mausrad bei gedrückter Shift-Taste oder gedrückter linker Maustaste (nicht bei
+ </p>
+ <p>
+ allen Betriebssystemen) verschiebt die MindMap horizontal
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Im <b>Menü Ansicht </b>gibt es Befehle um den Zoom zu vergrößern (Alt + oben),
+ </p>
+ <p>
+ ihn zu verkleinern (Alt + unten) und die MindMap auf die Seite einzupassen.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1692671423" CREATED="1272007458262" MODIFIED="1274910485869">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ In der <b>Werkzeug-Symbolleiste</b> gibt es ein <b>Drop-Down Feld</b>,
+ </p>
+ <p>
+ über das man den Zoom-Level direkt auwählen kann.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_961139916" CREATED="1270892460689" MODIFIED="1274910640872">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bei einigen Betriebssystemen kannst Du auch <b>zoomen</b>, indem Du am
+ </p>
+ <p>
+ Mausrad dreht, während Du die Strg-Taste gedrückt hälst.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_966700848" CREATED="1270892460681" MODIFIED="1274914344453">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1646223708" CREATED="1270892460681" MODIFIED="1274914332698">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Den <b>nächsten Knoten</b>, der die vorher erstellten <b>Suchkriterien erfüllt</b>,
+ </p>
+ <p>
+ findest Du mit "Bearbeiten -> Weitersuchen" (Strg + G).
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_829330412" CREATED="1270892460681" MODIFIED="1275332872246">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Suche</b> ist <b>breitenorientiert</b>. Das bedeutet, je tiefer ein Knoten verschachtelt ist, desto später wird er gefunden.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_779591913" CREATED="1270892460681" MODIFIED="1274913238008">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Suche</b> <b>berücksichtigt</b> im Moment nur den <b>akiven Knoten </b>und<b> seine Nachfahren</b>.
+ </p>
+ <p>
+ In zukünftigen Versionen wird es eine Option geben, um die Suche auf die ganze MindMap auszudehnen.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1761633870" CREATED="1271096970387" MODIFIED="1274914012341">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1773253238" CREATED="1270897010863" MODIFIED="1274914308250">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um zu einer <b>anderen</b>, bereits <b>geöffneten</b>, <b>MindMap</b> zu <b>gelangen </b>, gibt es folgende Möglichkeiten:
+ </p>
+ <p>
+ - Strg + Tab aktiviert die nächste MindMap.
+ </p>
+ <p>
+ - Verwende das MindMaps-Menü und wähle dort den Dateinamen.
+ </p>
+ <p>
+ - Klicke rechts auf den Hintergrund und wähle die MindMap aus dem erscheinenden Kontext-Menü aus.
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_233995891" CREATED="1271000255265" MODIFIED="1275333030090">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zum <b>Rotieren</b> durch die <b>geöffneten MindMaps</b> gibt es auch die Befehle
+ </p>
+ <p>
+ "Navigieren -> Vorherige MindMap" (Alt + Shift + links) bzw.
+ </p>
+ <p>
+ "Navigieren -> Nächste MindMap" (Alt + Shift + rechts).
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_771867461" CREATED="1272092801195" MODIFIED="1274915572850">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zwischen den <b>zwei zuletzt bearbeiteten MindMaps</b>
+ </p>
+ <p>
+ kannst Du mit Strg + 1 wechseln.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_719677235" CREATED="1270892460671" MODIFIED="1275333322975">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Einfg erzeugt auch einen neuen Knoten, wenn man einen Anderen gerade im Inline-Editor bearbeitet.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1715555696" CREATED="1270892460671" MODIFIED="1274918902756">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1942197982" CREATED="1270892460671" MODIFIED="1274918913635">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1638437345" CREATED="1270892460671" MODIFIED="1275333364835">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zum <b>Löschen</b> eines <b>Knotens</b> wähle "Bearbeiten -> Knoten löschen",
+ </p>
+ <p>
+ oder drücke die Taste Entf.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1718916776" CREATED="1270892460671" MODIFIED="1275333428549">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ "Bearbeiten -> Ausschneiden" (Strg + X) <b>löscht</b> den <b>Knoten</b>, behält aber eine <b>Kopie</b> in der <b>Zwischenablage</b>, die man mit "Bearbeiten -> Einfügen" (Strg + V) wieder in die MindMap einfügen kann.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_86882063" CREATED="1270892460671" MODIFIED="1274918826327">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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"/>
+</node>
+<node ID="ID_673531040" CREATED="1270892460671" MODIFIED="1275333593738">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Indem man einfach zu schreiben beginnt wird der <b>Text</b> des <b>aktiven Knotens</b> durch das Geschriebene <b>ersetzt</b>.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Hinweis: Dieses Verhalten kann man unter "Extras -> Einstellungen -> Verhalten -> Kein Editieren der Knoten bei Eingabe" deaktivieren.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1386037184" CREATED="1270892460672" MODIFIED="1275333643385">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen reinen <b>Text-Knoten</b> im <b>externen Editor</b> zu <b>bearbeiten.</b> wähle "Bearbeiten -> Knoten im Editor bearbeiten...", oder drücke Alt + ENTER.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Hinweis: Dadurch wird der Knoten in einen HTML-Knoten umgewandelt und zukünftig immer im Editor geöffnet. Mit "Format -> Benutze reinen Text" kann man Ihn wieder in einen reinen Text-Knoten umwandeln, verliert dabei aber u.U. Formatierungen.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_328110224" CREATED="1270892460672" MODIFIED="1274994117607">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node FOLDED="true" ID="ID_785582356" CREATED="1270892460672" MODIFIED="1274992054979">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um im reinen <b>Text-Knoten</b> einen <b>Zeilenumbruch</b>
+ </p>
+ <p>
+ 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>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+</node>
+<node ID="ID_471748709" CREATED="1270892460672" MODIFIED="1275333745300">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Selektierter Text kann, während man einen Knoten editiert, über das "Knoten Kontext-Menü -> Kopieren in die Zwischenablage" kopiert werden.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_128741512" CREATED="1270892460672" MODIFIED="1275333802048">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um <b>spezielle Zeichen</b> wie z.B. © <b>einzufügen</b> empfiehlt sich der Weg über eine Textverarbeitung wie z.B. OpenOffice Writer oder Microsoft Word. Füge zuerst die Zeichen in dem Programm ein. Kopiere sie dann in die Zwischenablage und füge sie in Freeplane wieder ein.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1608665009" CREATED="1270996862392" MODIFIED="1274995379887" LINK="#Freeplane_Link_1318678369">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst in Freeplane alle Bearbeitungsschritte <b>Rückgängig</b> machen.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Während Du einen Knoten oder ein Notiz bearbeitest, kannst Du im "Kontext-Menü unter Sprachen" die <b>Rechtschreibprüfung aktivieren</b> und <b>deaktivieren</b>.
+ </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"/>
+</node>
+</node>
+<node TEXT="Drag and drop - Ziehen
 und fallenlassen" FOLDED="true" ID="Freeplane_Link_1024903226" CREATED="1270892460682" MODIFIED="1274996619646" COLOR="#407000">
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Durch Ziehen und Fallenlassen (drag and drop) kannst Du <b>Knoten</b> im Baum <b>neu positionieren</b>.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1633776428" CREATED="1271027579490" MODIFIED="1274996157015">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="Freeplane_Link_374323949" CREATED="1274995662437" MODIFIED="1275334201923">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen aufgenommenen Knoten als<b> Kind-Knoten</b> wieder <b>einzufügen</b>, positioniere den Mauszeiger im seitlichen Randbereich des künftigen Elternknotens und lasse die Maustaste los.<br/>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Hinweis: Achte beim Positionieren auf die Farbverlaufsänderungen. Zum Einfügen als Kind-Knoten muß der in entgegengesetzter Richtung zum Wurzelknoten befindliche seitliche Bereich des künftigen Elternknotens durch den Farbverlauf unterlegt sein.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="Freeplane_Link_1069770199" CREATED="1274995662438" MODIFIED="1274996470465">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen aufgenommenen Knoten als <b>Geschwisterknoten einzufügen</b>, positioniere den Mauszeiger im oberen Bereich des Zielknotens und lasse die Maustaste los.
+ </p>
+ <p>
+ <br/>
+ 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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="_Freeplane_Link_1994214827" CREATED="1270892460683" MODIFIED="1275334362194">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst <b>Knoten kopieren</b>, indem Du beim Fallenlassen die Strg-Taste, oder die mittlere Maustaste gedrückt hälst. Am Cursor erscheint dann ein kleines Plus.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_694691711" CREATED="1270892460683" MODIFIED="1274996963304">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Vorhandene MindMaps</b> kannst Du <b>bearbeiten</b>, indem Du die entsprechende Datei über dem Hintergrund fallen lässt.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="Freeplane_Link_1940236238" CREATED="1274995662438" MODIFIED="1275334415207">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen <b>Konnektor</b> zwischen zwei Knoten zu <b>erzeugen</b>, ziehe den einen Knoten mit gedrückter rechter Maustaste auf den Anderen und lasse ihn dort fallen.
+ </p>
+ <p>
+ Unter Mac OS X ziehe den Knoten normal ins Freeplane-Fenster und drücke Strg bevor Du ihn auf einen anderen Knoten fallen lässt.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_356858969" CREATED="1270892460683" MODIFIED="1274997299326">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du <b>mehrere Knoten ausgewählt</b> hast, dann werden alle verschoben bzw. kopiert.
+ </p>
+ </body>
+</html></richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="Freeplane_Link_873938281" CREATED="1274995662438" MODIFIED="1274997408469">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen <b>Knoten</b> <b>anders</b> zu <b>positionieren</b>, mußt Du ihn an seiner <b>Positionsmarkierung</b> an die neue Position ziehen. Diese ist an der senkrechten Seite des Knotens, die näher zum Wurzelknoten liegt und wird als kleine senkrechte Elipse sichtbar, wenn Du mit dem Cursor darüber fährst.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_505978546" CREATED="1270997770751" MODIFIED="1275335010525">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Durch das Verschieben eines Knotens auf diese Weise, wird nur das Aussehen der MindMap geändert nicht aber ihre Struktur. Die logische Anordnung der Knoten bleibt also erhalten.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1457898208" CREATED="1270997857923" MODIFIED="1275335088294">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Dies gilt auch, wenn Du einen Knoten, der rechts vom Wurzelknoten ist, auf die linke Seite ziehst. Logisch ist er immer noch rechts und seine Positionsmarkierung ist auch noch auf der linken Seite.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_846513064" CREATED="1270998153408" MODIFIED="1275335118169">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen Knoten auch logisch auf die andere Seite des Wurzelknotens zu platzieren, musst Du drag and drop anstelle des freien Positionierens verwenden.
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst Knoten(gruppen) zwischen MindMaps <b>kopieren</b> und <b>einfügen</b>. Außerdem ist es möglich, normalen Text oder HTML-Code aus anderen Programmen einzufügen.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1563176838" CREATED="1274998221355" MODIFIED="1275335286889">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du <b>einfachen Text einfügst</b>, werden mehrere Zeilen als mehrere Knoten eingefügt. Die resultierende Schachteltiefe wird durch die Anzahl führender Leerzeichen der einzufügenden Textzeilen bestimmt. Ein Beispiel folgt:
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Baum
 Laubbaum
 Eiche
 Nadelbaum
 Tanne" ID="ID_794791780" CREATED="1270892460684" MODIFIED="1275335725894" COLOR="#996600">
+<node TEXT="wird eingefügt als" ID="ID_1133286475" CREATED="1270892460684" MODIFIED="1274998476128">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Baum" ID="ID_855525853" CREATED="1275335769745" MODIFIED="1275335819914" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Laubbaum" ID="ID_36623645" CREATED="1275335769745" MODIFIED="1275335819928" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Eiche" ID="ID_799006245" CREATED="1275335769745" MODIFIED="1275335819921" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+</node>
+<node TEXT="Nadelbaum" ID="ID_207286102" CREATED="1275335769745" MODIFIED="1275335819919" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Tanne" ID="ID_1021867927" CREATED="1275335769745" MODIFIED="1275335819917" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node ID="ID_780592545" CREATED="1270892460685" MODIFIED="1274998705693">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p align="center">
+ <i><b><font size="4">Boost your brain with Freeplane</font></b></i><font size="4"> </font>
+ </p>
+ <p>
+ <br/>
+ <br/>
+
+ </p>
+ <p align="center">
+ <a href="http://sourceforge.net/projects/freeplane/"><b><font size="4">Download Freeplane now!</font></b></a><font size="4"> </font>
+ </p>
+ <h1 class="western">
+ What is Freeplane?
+ </h1>
+ <p>
+ 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>
+ <ul>
+ <li>
+ <p style="margin-bottom: 0in">
+ Microsoft Windows
+ </p>
+ </li>
+ <li>
+ <p style="margin-bottom: 0in">
+ Mac OS X
+ </p>
+ </li>
+ <li>
+ <p style="margin-bottom: 0in">
+ Linux / BSD / Solaris
+ </p>
+ </li>
+ <li>
+ <p>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Portable_Freeplane">Portable Freeplane</a> for Windows (runs from a USB drive)
+ </p>
+ </li>
+ </ul>
+ <p>
+ <br/>
+ <br/>
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p align="center">
+ <i><b><font size="4">Boost your brain with Freeplane</font></b></i><font size="4"> </font>
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_149083422" CREATED="1270894712256" MODIFIED="1270894712257" LINK="http://sourceforge.net/projects/freeplane/">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p align="center">
+ <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>
+</node>
+<node FOLDED="true" ID="ID_1571069768" CREATED="1270894712263" MODIFIED="1270894712263">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h1 class="western">
+ 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>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <p style="margin-bottom: 0in">
+ Microsoft Windows
+ </p>
+ </li>
+ </ul>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_624982390" CREATED="1270894712277" MODIFIED="1270894712277">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <p style="margin-bottom: 0in">
+ Mac OS X
+ </p>
+ </li>
+ </ul>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_767338979" CREATED="1270894712280" MODIFIED="1270894712280">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <p style="margin-bottom: 0in">
+ Linux / BSD / Solaris
+ </p>
+ </li>
+ </ul>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_972361679" CREATED="1270894712283" MODIFIED="1270894712283" LINK="http://freeplane.sourceforge.net/wiki/index.php/Portable_Freeplane">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <p>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Portable_Freeplane">Portable Freeplane</a> for Windows (runs from a USB drive)
+ </p>
+ </li>
+ </ul>
+ </body>
+</html></richcontent>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node ID="ID_734855520" CREATED="1274998221364" MODIFIED="1274999786391">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1790983208" CREATED="1274998221364" MODIFIED="1275336289379">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du einen <b>Zweig kopierst</b> und ihn in einen einfachen <b>Texteditor einfügst</b>, wird die Baumstruktur durch Einrücken angezeigt. Querverweise werden in spitzen Klammern ('<' und '>') eingefügt. Auch hier ein Beispiel:
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Baum" ID="ID_1805360637" CREATED="1274998221366" MODIFIED="1274998221366">
+<node TEXT="Eiche" ID="ID_1101741069" CREATED="1274998221366" MODIFIED="1274998221366"/>
+<node TEXT="Buche" ID="ID_462975987" CREATED="1274998221366" MODIFIED="1274998221366">
+<node TEXT="wird eingefügt als" ID="ID_1432366250" CREATED="1274998221366" MODIFIED="1274998221366">
+<node TEXT="Baum
 Eiche
 Buche
 Google <http://www.google.com/>" ID="ID_1775330013" CREATED="1270892460687" MODIFIED="1274999964182" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du einen <b>Zweig</b> aus Freeplane <b>kopierst</b> und ihn in eine Textverarbeitung einfügst, die das Rich-Text-Format (RTF) beherrscht, wird die Formatierung enschließlich Farbe und Schrift mit übernommen. Querverweise werden in spitzen Klammern ('<' und '>') eingefügt, genau wie beim Einfügen in einen einfachen Texteditor.
+ </p>
+ <p>
+ 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>
+</node>
+<node ID="ID_1036066408" CREATED="1274998221369" MODIFIED="1275000296467">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Hyperlinks</b> können auf folgende <b>Objekte verweisen</b>:
+ </p>
+ <p>
+ - Internetseiten
+ </p>
+ <p>
+ - E-Mail Adressen
+ </p>
+ <p>
+ - Dateien auf dem Computer
+ </p>
+ <p>
+ - Andere Knoten in einer MindMap
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_745700749" CREATED="1270892460675" MODIFIED="1275000970889">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen <b>Hyperlink hinzuzufügen</b> verwende "Einfügen -> Hyperlink (Textfeld)...", oder drücke die Tasten Strg + K.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1001948679" CREATED="1270892460675" MODIFIED="1275336382806">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Einen <b>Hyperlink</b> kannst Du <b>löschen</b>, indem Du in dem Dialog, den Du nach "Einfügen -> Hyperlink (Textfeld)..." siehst den Inhalt des Textfeldes löschst.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_9407796" CREATED="1270892460675" MODIFIED="1275336418086">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um auf eine <b>E-Mail Adresse</b> zu <b>verlinken,</b> muss der Hyperlink folgendes Format haben: mailto:Name at provider.irgendwas (z.B. mailto:don.bonton at supermail.com).
+ </p>
+ <p>
+ Wichtig ist das Wort "mailto:" danach muß eine gültige E-Mail Adresse folgen.
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1116507628" CREATED="1270892460676" MODIFIED="1275336454432">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Bei einer <b>E-Mail Adresse mit Betreff</b> muss nach dem Empfänger der String "?subject=" und dann der Betreff folgen wie z.B. mailto:don.bonton at supermail.com?subject=Last phone call.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1159570525" CREATED="1270894120878" MODIFIED="1275336526220">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um eine <b>Datei</b> zu <b>verlinken,</b> verwende "Einfügen -> Hyperlink (Dateiauswahl)..."
+ </p>
+ <p>
+ oder drücke die Tasten Strg + Shift + K.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1153372393" CREATED="1271979133506" MODIFIED="1275336579998">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Einen <b>Knoten</b> kannst du wie folgt <b>verlinken</b>:
+ </p>
+ <p>
+ - Aktiviere zuerst den Knoten, von dem Du verlinken willst.
+ </p>
+ <p>
+ - Drücke dann Shift und wähle den Knoten auf den Du den Link setzen willst.
+ </p>
+ <p>
+ - Danach wähle "Einfügen -> Lokalen Hyperlink hinzufügen".
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Icons" FOLDED="true" ID="Freeplane_Link_1044397139" CREATED="1270892460676" MODIFIED="1275001888216" COLOR="#407000">
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um <b>Icons</b> zu einem <b>Knoten hinzuzufügen</b>, wähle den Knoten aus und klicke auf ein Icon in der Icon-Symbolleiste auf der linken Seite.
+ </p>
+ <p>
+ Während Du die Maus zur Toolbar bewegst ist es ratsam, die Alt oder die Strg-Taste gedrückt zu halten, um den Fokus auf den Knoten nicht zu verlieren.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1703076068" CREATED="1270892460676" MODIFIED="1275002288608">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1240276527" CREATED="1270892460676" MODIFIED="1275002420456">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_911756077" CREATED="1270892460676" MODIFIED="1275002517867">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_537134358" CREATED="1270892460676" MODIFIED="1275002684010">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_250751508" CREATED="1270892460677" MODIFIED="1275002761054">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Icon-Symbolleiste</b> kannst Du über "Ansicht -> Icon-Symbolleiste" <b>ein- und ausblenden</b>.
+ </p>
+ </body>
+</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"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<icon BUILTIN="licq"/>
+<icon BUILTIN="full-1"/>
+<icon BUILTIN="full-2"/>
+<icon BUILTIN="0%"/>
+<icon BUILTIN="25%"/>
+<icon BUILTIN="50%"/>
+<icon BUILTIN="75%"/>
+<icon BUILTIN="100%"/>
+</node>
+<node ID="ID_26845444" CREATED="1271096826323" MODIFIED="1275336861376">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ "Format -> Hierarchische Icons" zeigt in jedem Knoten auch alle Icons an, die seine Nachfahren haben.
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst an einen Knoten eine Notiz anhängen,
+ </p>
+ <p>
+ die Du wie im externen Editor bearbeiten kannst.
+ </p>
+ </body>
+</html></richcontent>
+<richcontent TYPE="NOTE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b><font color="#fc0b0b"><u>Dieser Knoten hat eine Notiz.</u></font></b>
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1163876330" CREATED="1271096088819" MODIFIED="1275336894289">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Den Text kannst Du im Notizeditor anschauen und bearbeiten.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_510313925" CREATED="1271096117483" MODIFIED="1275003430688">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst mit "Bearbeiten -> Wechsel Notiz <-> Knoten" oder mit der Tastenkombination
+ </p>
+ <p>
+ Strg + < zwischen dem <b>Notiz-Editor</b> und der <b>MindMap wechseln</b>.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1710319301" CREATED="1271096150723" MODIFIED="1275003679320">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Der Notiz-Editor kann mit "Ansicht -> Position des Notiz- Editors"
+ </p>
+ <p>
+ auf jede <b>Seite des Fensters verschoben</b> werden.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst einen <b>Konnektor</b> zwischen zwei Knoten <b>mit drag and drop erzeugen</b>, indem Du
+ </p>
+ <p>
+ 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"/>
+</node>
+<node ID="ID_1564001222" CREATED="1270892460679" MODIFIED="1275058502752">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Alternativ kannst Du einen <b>Konnektor erzeugen</b>, indem du zwei Knoten mit der Strg-Taste
+ </p>
+ <p>
+ markierst und dann "Einfügen -> Konnektor hinzufügen" aus dem Menü wählst, oder die
+ </p>
+ <p>
+ Tastenkombination Strg + L drückst.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="_Freeplane_Link_208378337" CREATED="1270892460679" MODIFIED="1275058746447">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Farbe</b> eines <b>Konnektors</b> kannst Du im Kontextmenü des Konnektors <b>ändern</b>. Mache dazu
+ </p>
+ <p>
+ einen Rechtsklick auf den Konnektor (Mac OS X: Strg + klick) und wähle "Farbe des Konnektors" .
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="_Freeplane_Link_1484370636" CREATED="1270892460679" MODIFIED="1275061916843">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Im Kontextmenü des Konnektors (Rechtsklick auf Konnektor) kannst
+ </p>
+ <p>
+ Du auch die <b>Pfeile</b> des <b>Konnektors</b> ändern.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_469749659" CREATED="1270894208830" MODIFIED="1275062032926">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Beschriftung</b> des <b>Konnektors</b> kannst Du im Kontextmenü des
+ </p>
+ <p>
+ Konnektors (Rechtsklick auf Konnektor) ändern.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1970882825" CREATED="1270892460679" MODIFIED="1275062182297">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du einen <b>Konnektor löschen</b> willst kannst Du das in dessen
+ </p>
+ <p>
+ Kontextmenü (Rechtsklick auf den Konnektor) tun.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="_Freeplane_Link_266716332" CREATED="1270892460679" MODIFIED="1275062350499">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Im Kontextmenü des Konnektors (Rechtsklick auf den Konnektor)
+ </p>
+ <p>
+ kannst Du an den <b>Anfangs-</b> bzw. <b>Endknoten</b> des <b>Konnektors navigieren</b>.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="_Freeplane_Link_1015289745" CREATED="1270892460679" MODIFIED="1275062530830">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Richtung des Pfeiles</b> kannst Du <b>ändern</b>, indem Du auf den Konnektor
+ </p>
+ <p>
+ 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"/>
+</node>
+<node ID="ID_1276534365" CREATED="1271981886951" MODIFIED="1275062596475">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Im <b>nächsten Knoten</b> sind ein paar <b>Beispiele</b> für den
+ </p>
+ <p>
+ Gebrauch von Konnektoren.
+ </p>
+ </body>
+</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"/>
+</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>
+<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"/>
+</node>
+</node>
+</node>
+<node TEXT="Attribute" FOLDED="true" ID="ID_540307688" CREATED="1270896851973" MODIFIED="1275062880937" COLOR="#407000">
+<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 NAME="x" VALUE="10"/>
+<attribute NAME="y" VALUE="20"/>
+</node>
+<node ID="ID_541565942" CREATED="1270896865255" MODIFIED="1275063050254">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Attribute</b> eines einzelnen <b>Knotens</b> zu <b>bearbeiten</b> wähle
+ </p>
+ <p>
+ "Bearbeiten -> Attribute editieren" oder verwende die Tastenkombination Alt + F9.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1213222306" CREATED="1270896956119" MODIFIED="1275063440506">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst mit "Extras -> Attribute zuweisen..." die
+ </p>
+ <p>
+ <b>Attribute</b> zu <b>mehreren Knoten zuweisen</b>, <b>oder</b> sie <b>ändern</b>.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h3>
+ HTML Beispiel
+ </h3>
+ <p class="msonormal">
+ Es gibt Aufzählungen:
+ </p>
+ <ul type="disc">
+ <li class="msonormal">
+ Grund eins
+ </li>
+ <li class="msonormal">
+ Grund zwei
+ </li>
+ </ul>
+ <p>
+ Nummerierte Aufzählungen:
+ </p>
+ <ol>
+ <li>
+ Punkt eins
+ </li>
+ <li>
+ Punkt zwei
+ </li>
+ </ol>
+ <p class="msonormal">
+ Die Schrift kann <b>fett</b> oder <i>kursiv,</i> <u>unterstrichen</u> und <strike>durchgestrichen</strike> sein.
+ </p>
+ <p class="msonormal">
+ Es gibt auch Tabellen:
+ </p>
+ <table cellpadding="0" cellspacing="0" border="1" style="border: none" class="msonormaltable">
+ <tr>
+ <td style="padding-top: .75pt; padding-left: .75pt; border: solid windowtext 1.0pt; 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">
+ <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">
+ <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">
+ <p class="msonormal">
+ Zelle 4
+ </p>
+ </td>
+ </tr>
+ </table>
+ <p class="msonormal">
+ Auperdem kann Schrift verschiedene <font color="#999900">Vordergrundfarben</font> <font color="#336600">haben</font>.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_203319288" CREATED="1270895866070" MODIFIED="1275064320380">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst die <b>Verwendung von HTML</b> in Knoten über
+ </p>
+ <p>
+ "Format -> Verwende HTML Formatierung" (Alt + Shift + R) <b>aktivieren</b>.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1308797932" CREATED="1275064183463" MODIFIED="1275064272902">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Das <b>Verwenden von HTML</b> in Knoten kannst Du mit
+ </p>
+ <p>
+ "Format -> Benutze reinen Text" (Alt + Shift + P) <b>deaktivieren.</b>
+ </p>
+ </body>
+</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"/>
+</node>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Eine Methode, um ein <b>Bild</b> in Freeplane <b>einzufügen </b>ist, das Drücken von ALT + SHIFT + K oder
+ </p>
+ <p>
+ das Verwenden von "Einfügen -> Bild (Dateiauswahl)..." im Kontextmenü des Knotens,
+ </p>
+ <p>
+ oder im normalen Menü.
+ </p>
+ <p>
+ Durch das Einfügen eines Bildes verlierst Du den gesamten Knotentext, falls schon
+ </p>
+ <p>
+ einer eingegeben war. Auf diese Weise eingefügte Bilder werden auch beim Export nicht berücksichtigt.
+ </p>
+ <p>
+ Unterstützte Bildformate sind PNG, JPG und GIF.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_692449557" CREATED="1271527733841" MODIFIED="1275337561235">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Eine <b>weitere Methode </b>zum<b> Einfügen </b>von<b> Bildern</b>, bei der Du den Text nicht verlierst und die auch SVG (Scalable Vector Graphics; ein offnes Vektor-Format) unterstützt ist: "Einfügen -> Externes Objekt...". Du kannst die Größe des Bildes mit der Markierung an der unteren rechten Ecke des Rahmens ändern. Das Bild wird aber immer noch nicht mit exportiert.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_890405454" CREATED="1270892460700" MODIFIED="1275130951803">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wenn Du eine <b>Bilddatei</b> mit <b>Drag and Drop</b> über einem Knoten fallen lässt, dann erzeugt Freeplane einen Hyperlink, der auf die Datei verweist.
+ </p>
+ <p>
+ Diesen Link kannst Du in ein Bild verwandeln indem Du "Einfügen -> Bild (Dateiauswahl)..." wählst, oder die Tastenkombination Alt + Shift + K drückst.
+ </p>
+ <p>
+ Diese Methode funktioniert auch, wenn Du mehrere Knoten ausgewählt hast.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1512479346" CREATED="1270892460700" MODIFIED="1275133214045" COLOR="#000000">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Eine <b>weitere</b>, mehr technische und <b>nicht</b> so <b>benutzerfreundliche Art Bilder einzufügen</b> ist folgende:
+ </p>
+ <p>
+ 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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/usr/share/app-install/icons/treb.png"/>
+ </body>
+</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"/>
+</node>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <img src="../freeplane.png"/>
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_432603647" 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 ID="ID_1475913288" 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_605964107" 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 ID="ID_769058522" 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 ID="ID_1291538035" 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_51328681" 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_1245966084" CREATED="1270892460703" MODIFIED="1270892460703" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1510093809" CREATED="1270892460703" MODIFIED="1270892460703" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+</node>
+<node TEXT="Verwenden von 
LaTeX in Knoten" FOLDED="true" ID="ID_1060978136" CREATED="1271097112611" MODIFIED="1275211672184" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um zu einem Knoten einen <b>LaTeX-Text hinzuzufügen </b>
+ </p>
+ <p>
+ verwende "Einfügen -> LaTeX".
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_21055085" CREATED="1271097312474" MODIFIED="1275337800751">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zum <b>Bearbeiten</b> des <b>LaTeX-Quellcodes</b> klicke auf das
+ </p>
+ <p>
+ gerenderte Bild, das unter dem Knoten angezeigt wird.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1638605492" CREATED="1271097172667" MODIFIED="1275135388880">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst das angefügten <b>LaTeX</b> wieder <b>löschen</b>,
+ </p>
+ <p>
+ indem Du erneut auf "Einfügen -> LaTeX" klickst.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen <b>Bearbeitungsschritt</b> wieder <b>Rückgängig</b> zu <b>machen</b>,
+ </p>
+ <p>
+ wähle "Bearbeiten -> Rückgängig", oder verwende die Tastenkombination Strg + Z.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1501637074" CREATED="1270892460690" MODIFIED="1275135724282">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst rückgängig gemachte <b>Bearbeitungsschritte</b> <b>wiederherstellen</b>, indem Du
+ </p>
+ <p>
+ "Bearbeiten -> Wiederherstellen" wählst, oder die Tastenkombination Strg + Y verwendest.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_139456632" CREATED="1270892460690" MODIFIED="1275136034685">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Anzahl</b> der <b>Bearbeitungsschritte</b>, die Du <b>rückgängig machen kannst </b>
+ </p>
+ <p>
+ sind unter "Extras -> Einstellungen -> Verhalten -> Anzahl wiederrufbarer Aktionen" einstellbar.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+</node>
+</node>
+<node TEXT="MindMaps formatieren" FOLDED="true" POSITION="right" ID="ID_326068339" CREATED="1272091260034" MODIFIED="1275136099330" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst <b>zwischen</b> diesen beiden <b>Layouts</b> <b>umschalten</b>,
+ </p>
+ <p>
+ indem Du "Ansicht -> Gliederungsansicht" wählst.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Schrift</b> eines <b>Knotens fett</b> darzustellen, wähle
+ </p>
+ <p>
+ "Format -> Fett", oder verwende die Tastenkombination Strg + B.
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Knotenschrift</b> kannst Du <b>kursiv</b> machen, indem Du "Format -> Kursiv"
+ </p>
+ <p>
+ wählst, oder die Tastenkombination Strg + I drückst.
+ </p>
+ </body>
+</html></richcontent>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_786808182" CREATED="1270892460673" MODIFIED="1275137210440">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst die <b>Textfarbe</b> über "Format -> Knotenfarbe ändern...",
+ </p>
+ <p>
+ oder die Tastenkombination Alt + Shift + F <b>ändern</b>.
+ </p>
+ </body>
+</html></richcontent>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_256179041" CREATED="1270892460673" MODIFIED="1275142879900">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Hintergrundfarbe</b> eines Knotens zu <b>ändern</b>,
+ </p>
+ <p>
+ wähle "Format -> Knotenhintergrundfarbe...".
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1900176546" CREATED="1270892460673" MODIFIED="1275147550010">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Knotenschrift</b> zu <b>vergrößern</b>, verwende "Format -> Schrift des Knotens vergrößern",
+ </p>
+ <p>
+ oder benutze das Tastaturkürzel Strg + Plus (nimm das plus auf dem Keyboard und nicht das im Nummenrfeld).
+ </p>
+ </body>
+</html></richcontent>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node ID="ID_1031774745" CREATED="1270892460673" MODIFIED="1275147541076">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Knotenschrift</b> zu <b>verkleinern</b>, verwende "Format -> Schrift des Knotens verkleinern",
+ </p>
+ <p>
+ oder benutze das Tastaturkürzel Strg + Minus (nimm das minus auf dem Keyboard und nicht das im Nummenrfeld).
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Die <b>Schriftart</b> kannst Du im Schriftarten-Auswahlfeld in der Werkzeug-Symbolleiste <b>ändern</b>.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_880893737" CREATED="1270892460674" MODIFIED="1275147029777">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Formatierung</b> eines Knotens zu <b>kopieren</b>, verwende
+ </p>
+ <p>
+ "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>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>kopierte Formatierung</b> auf einen Knoten <b>anzuwenden</b> verwende,
+ </p>
+ <p>
+ "Bearbeiten -> Formatierung einfügen", oder nutze die Tastenkombination Alt + Shift +C.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Formatieren der Knotenlinien" FOLDED="true" ID="ID_1797063061" CREATED="1270896049950" MODIFIED="1275147569423" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Knotenlinien sind die Linien, die Knoten verbinden." ID="ID_1387990787" CREATED="1275147618866" MODIFIED="1275338289933"/>
+<node TEXT="Es gibt verschiedene Arten von Knotenlinien." ID="ID_171466211" CREATED="1270896067862" MODIFIED="1275147612199"/>
+<node TEXT="Du kannst auch die Farbe und die Dicke der Knotenlinien ändern, oder sie sogar unsichtbar machen." ID="ID_147950395" CREATED="1270896109110" MODIFIED="1275147744284"/>
+<node TEXT="Du kannst diese Eigenschaften unter "Format -> Linienfarbe", "Format -> Linienbreite" und "Format -> Linienformen" ändern (die Punkte sind auch über das Kontextmenü des Knotens unter Format erreichbar)." ID="ID_835600675" CREATED="1270896191326" MODIFIED="1275184323955"/>
+<node TEXT="Beispiel 1" FOLDED="true" ID="ID_563742809" CREATED="1270896156486" MODIFIED="1275147909975">
+<edge STYLE="sharp_bezier" WIDTH="4"/>
+<node TEXT="Es gibt verschiedene Arten von Linientypen," ID="ID_1621067344" CREATED="1270896067862" MODIFIED="1275147950331"/>
+<node TEXT="Du kannst auch die Farbe und die Linienbreite ändern." ID="ID_22717831" CREATED="1270896096758" MODIFIED="1275147981675"/>
+<node TEXT="oder die Linien ausblenden." ID="ID_1737604780" CREATED="1270896109110" MODIFIED="1275147994413">
+<edge STYLE="hide_edge" WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Beispiel 2" FOLDED="true" ID="ID_1959289213" CREATED="1270896156486" MODIFIED="1275148001831">
+<edge STYLE="horizontal" COLOR="#ff0033"/>
+<node TEXT="Es gibt verschiedene Arten von Linientypen," ID="ID_213610345" CREATED="1270896067862" MODIFIED="1275148063736"/>
+<node TEXT="Du kannst auch die Farbe und die Linienbreite ändern." ID="ID_525537821" CREATED="1270896096758" MODIFIED="1275148077741"/>
+<node TEXT="oder die Linien ausblenden." ID="ID_994729391" CREATED="1270896109110" MODIFIED="1275148102721"/>
+</node>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_58326768" CREATED="1270892460674" MODIFIED="1275185027184">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um einen eigenen <b>Stil</b> zu <b>definieren</b>, <b>oder</b> einen bestehenden zu <b>ändern</b>,
+ </p>
+ <p>
+ wähle "Format -> Stile -> Stile verwalten..."
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um dieses Feature, das "<b>Automatisches Layout</b>" heißt zu <b>aktivieren</b> und zu <b>deaktivieren, </b>
+ </p>
+ <p>
+ wähle "Format -> Automatisches Layout".
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_1678162067" CREATED="1275185485875" MODIFIED="1275185599244">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Das <b>Automatische Layout</b> kannst du in den Einstellungen unter "Extras -> Einstellungen... -> Automatisches Layout" <b>konfigurieren</b>.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um eine <b>Wolke einzufügen</b>, wähle "Einfügen -> Wolke"
+ </p>
+ <p>
+ oder verwende die Tastenkombination Strg + Shift +B.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="ID_238365883" CREATED="1270892460675" MODIFIED="1275185900358">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die <b>Farbe</b> einer <b>Wolke</b> zu <b>verändern</b>, wähle Format -> Wolkenfarbe...".
+ </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"/>
+<node TEXT="... oder rot" ID="ID_1207851558" CREATED="1270892460675" MODIFIED="1275186015216">
+<cloud COLOR="#e81d1f" WIDTH="0"/>
+</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">
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um <b>Einstellungen vorzunehmen</b>, öffne das Einstellungen-Fenster mit "Extras -> Einstellungen...". Unter Mac OS X befinden sich die Einstellungen im Applikations-Menü. Manche Einstellungen werden erst nach einem Neustart von Freeplane aktiv.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1823288862" CREATED="1270895079510" MODIFIED="1275338836138">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst jedem <b>Menüpunkt</b> eine <b>Tastenkombination zuweisen</b>, indem Du "Extras -> ShortCut zuweisen..." wählst. Klicke danach auf den Menüpunkt, dem Du einen ShortCut zuweisen willst und gib die neue Tastenkombination ein. Wenn die Tastenkombination bereits vergeben ist, dann erscheint ein PopUp, in welchem Du die Zuweisung ändern kannst.
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die experimentelle <b>Dateisperrung</b> zu <b>aktivieren</b> wähle
+ </p>
+ <p>
+ "Extras -> Einstellungen -> Allgemein -> Experimentelles sperren der geöffneten Dateien".
+ </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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst die <b>Skalierung</b> beim <b>Drucken</b> einer MindMap <b>wählen</b>. Verwende dazu das Menü
+ </p>
+ <p>
+ "Datei -> Seite einrichten...".
+ </p>
+ <p>
+ Mögliche Optionen sind:
+ </p>
+ <p>
+ - MindMap auf Seite einpassen
+ </p>
+ <p>
+ - MindMap auf Seitenbreite einpassen
+ </p>
+ <p>
+ - MindMap auf Seitenhöhe einpassen
+ </p>
+ <p>
+ - Benutzerdefinierte Größe
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Eine <b>weiter Möglichkeit MindMaps zu drucken</b> besteht darin, sie zuerst als HTML zu exportieren und dann vom Browser aus zu drucken, oder sie in OpenOffice oder Microsoft Office mit Copy und Paste einzufügen und dann zu drucken.
+ </p>
+ </body>
+</html>
+</richcontent>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Scripting" FOLDED="true" ID="ID_1046070222" CREATED="1271021863642" MODIFIED="1271022630845" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Die in Freeplane eingebauten Funktionen können mit Groovy-Skripten erweitert werden." ID="ID_871333484" CREATED="1271022419501" MODIFIED="1275233492434">
+<node TEXT="Groovy Skripte greifen auf die MindMap über das Scripting API (Application Programming Interface; Schnittstelle zum Programmieren von Anwendungen) zu." ID="ID_893034881" CREATED="1271022419501" MODIFIED="1275233577970"/>
+<node TEXT="In Skripten kannst Du einige Freeplane utility-Klassen verwenden, wie z.B. UITools, LogTool or HtmlTools." ID="ID_670788358" CREATED="1271022419501" MODIFIED="1275233647155"/>
+<node TEXT="Skripte können einige der in Freeplane integrierten Bibliotheken verwenden." ID="ID_21879568" CREATED="1271022419501" MODIFIED="1275233696746"/>
+</node>
+<node TEXT="Es gibt drei verschieden Wege, um
Skripte in Freeplane zu integrieren." ID="ID_1916933814" CREATED="1271022419501" MODIFIED="1275233818814">
+<node TEXT="Externe Skripte kannst Du einfach integrieren, indem Du Freeplane mitteilst, wo sie sind. Solche Skripte kannst du wie jede andere Freeplane-Funktion verwenden." ID="ID_905639720" CREATED="1271022419501" MODIFIED="1275233897596"/>
+<node TEXT="Stile können Skripte enthalten. Sobald Du solche einen Stil einem Knoten zuweist, werden die enthaltenen Skripte ausgeführt." ID="ID_1457942941" CREATED="1271022419501" MODIFIED="1275234009184"/>
+<node TEXT="Du kannst auch Skripte innerhalb einer MindMap als Attribute von Knoten definieren. Da sie praktisch Teil der MindMap sind, können sie einfach verteilt werden. Zum Bearbeiten der Skripte gibt es in Freeplane einen eigenen Editor." ID="ID_1545994363" CREATED="1271022419501" MODIFIED="1275234224335"/>
+</node>
+<node TEXT="Im Freeplane Wiki gibt es detailliertere Informationen zum Thema Skripting." ID="ID_476511397" CREATED="1271022540079" MODIFIED="1275234354761" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting"/>
+</node>
+<node TEXT="Import, Export und Integration" FOLDED="true" ID="ID_1155373089" CREATED="1271022654767" MODIFIED="1275234505456" COLOR="#407000">
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst die aktive <b>MindMap als HTML exportieren</b>. Dazu stehen Dir im Menü
+ </p>
+ <p>
+ "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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um die MindMap mit Hilfe einer <b>XSLT-Transformation</b> in ein anderes <b>XML-format</b> zu <b>exportieren</b>,
+ </p>
+ <p>
+ wähle "Datei -> Export -> Verschiedene Formate (z.B. *.doc *.xls) mit XSLT...
+ </p>
+ </body>
+</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"/>
+<node TEXT="XSL-Dateien müssen in einem XSLT-Unterverzeichnis gespeichert sein. Dies kann entweder im Freeplane Installationsverzeichnis (z.B. C:\Program Files\Freeplane\xslt\), oder im Freeplane Benutzerverzeichnis (z.B. ~/.freeplane/xslt/) sein." ID="ID_968478102" CREATED="1270897200992" MODIFIED="1275236985351"/>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst die <b>MindMap</b> als ein <b>OpenOffice 1.4 Writer Dokument exportieren</b>.
+ </p>
+ <p>
+ Wähle dazu "Datei -> Export -> Als OpenOffice Writer Dokument"
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst <b>Ordner-Strukturen</b> in Freeplane <b>importieren</b>. Verwende dazu
+ </p>
+ <p>
+ "Datei -> Import -> Ordnerstruktur...". Das Ergebnis ist eine Baumstruktur,
+ </p>
+ <p>
+ die alle Ordner als verlinkten Knoten und alle Dateien als Dateinamen mit
+ </p>
+ <p>
+ Links auf die Dateien enthält.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Beispiel" ID="ID_1229069993" CREATED="1270892460691" MODIFIED="1275238428298" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Ausgewählter Ordner" ID="ID_1900948226" CREATED="1270892460692" MODIFIED="1275238467491" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_1047051948" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Dbwiz" ID="ID_498299897" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_1996138069" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_798262045" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_709145536" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_1377975498" CREATED="1270892460692" MODIFIED="1270892460692" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_136918014" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_534009523" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_1754727740" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_716803393" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_573955224" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_1318950239" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
+</node>
+<node TEXT="Styles" ID="ID_1361256480" CREATED="1270892460693" MODIFIED="1270892460693" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_1744076397" CREATED="1270892460694" MODIFIED="1270892460694" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_212838780" CREATED="1270892460694" MODIFIED="1270892460694" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_1366106507" CREATED="1270892460694" MODIFIED="1270892460694" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_769876930" CREATED="1270892460694" MODIFIED="1270892460694" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1712090657" CREATED="1270892460694" MODIFIED="1270892460694" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_813891347" CREATED="1270892460695" MODIFIED="1270892460695" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1114271187" CREATED="1270892460695" MODIFIED="1270892460695" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_1639010435" CREATED="1270892460695" MODIFIED="1270892460695" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1135916708" CREATED="1270892460695" MODIFIED="1270892460695" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+</node>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Zum <b>Importieren</b> von <b>MindManager X5 MindMaps</b> wähle
+ </p>
+ <p>
+ "Datei -> Import -> MinndManager X5 Map..."
+ </p>
+ </body>
+</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">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Du kannst ganze MindMaps oder Zweige von MindMaps in Textverarbeitungen wie Microsoft Office, OpenOffice oder Wordpad und den meisten E-Mail Programmen mit Copy und Paste einfügen. Dabei werden auch Text-Formatierungen und Links berücksichtigt. Allgemein gilt dies für alle Programme, die das Rich-Text-Format (rtf) unterstützen." ID="ID_30933864" CREATED="1270892460696" MODIFIED="1275242362496">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Ein Klick auf das E-Mail Symbol öffnet das Standard E-Mail Programm und erzeugt eine neue E-Mail (hier der Link: mailto:don.bonton at supermail.com)." ID="ID_1813926938" CREATED="1270892460696" MODIFIED="1275242555737" LINK="mailto:don.bonton at supermail.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Du kannst auch einen Betreff mit angeben (hier der Link: mailto:don.bonton at supermail.com?subject=Last%20phone%20call)" ID="ID_1902881426" CREATED="1270892460696" MODIFIED="1275242716622" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Um durch die <b>Dateien</b> Deines Computers zu <b>navigieren</b>,
+ </p>
+ <p>
+ musst Du über "MindMaps -> Datei Explorer" in den browse-Modus schalten.
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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"/>
+</node>
+<node TEXT="Automatisches Speichern" FOLDED="true" ID="ID_1283343603" CREATED="1271096741387" MODIFIED="1275247830551" COLOR="#407000">
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node FOLDED="true" ID="ID_3064437" CREATED="1271178347062" MODIFIED="1275248780969">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Du kannst diese <b>Funktionen</b> unter "Extras -> Einstellungen -> Allgemein -> Automatisches Speichern" <b>konfigurieren.</b>
+ </p>
+ </body>
+</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="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>
+<node TEXT="Installation" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1270892460638" MODIFIED="1270892460638" COLOR="#006633">
+<node TEXT="Links" ID="_Freeplane_Link_1911559485" CREATED="1270892460638" MODIFIED="1270892460638" COLOR="#006699">
+<node TEXT="Download der Java Runtime Environment (Mindestvorraussetzung J2RE1.5)" ID="ID_1620747952" CREATED="1270892460639" MODIFIED="1274306664615" LINK="http://java.sun.com/javase/downloads/index.jsp">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Download des Programmes" ID="_Freeplane_Link_1612101865" CREATED="1270892460640" MODIFIED="1274306680807" LINK="http://freeplane.sourceforge.net">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node ID="_Freeplane_Link_139664576" CREATED="1270892460640" MODIFIED="1274392860879">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Microsoft Windows:</b> Installiere Java und dann Freeplane mit dem Freeplane Installationsprogramm.
+ </p>
+ <p>
+ Freeplane kann dann wie alle anderen Programme über das Start-Menü gestartet werden.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="_Freeplane_Link_1380352758" CREATED="1270892460641" MODIFIED="1274392884173">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <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>
+<font BOLD="false" ITALIC="false"/>
+</node>
+<node ID="_Freeplane_Link_1808511462" CREATED="1270892460641" MODIFIED="1274393920819">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Mac OS X: </b>Um Freeplane auf dem Mac zu installieren, musst Du zuerst sicher stellen, dass alle Software updates (insbesonders Java) eingespielt sind. Das eingebaute Software-Update-Feature befindet sich unter dem Appel-Logo Menü in der oberen linken Ecke.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Danach musst Du die Mac-Version von Freeplane herunterladen. Es gibt ein .dmg-Version (die bevorzugt werden sollte, da sie sich einfach installieren lässt) und eine .zip-Version. Nachdem der Download abgeschlossen ist, sollte die Datei (abhängig von den Browser-Voreinstellungen) automatisch eingebunden, oder entzippt werden. Wenn dies nicht geschieht, hilft ein Doppelklick auf die heruntergeladene Datei, um sie einzubinden, oder zu entzippen.
+ </p>
+ <p>
+ <br/>
+
+ </p>
+ <p>
+ Jetzt solltest Du ein Freeplane-Icon sehen, das Du in den Applikations-Ordner ziehen kannst. Optional kannst Du auch einen Shortcut auf dem Desktop und/ oder im dock anlegen. Zum Starten von Freeplane reicht jetzt ein Doppelklick auf die Anwendung (im Applikations-Ordner), den Desktop Shortcut, oder ein einfacher Klick auf das Icon im Dock.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Im Freeplane-Wiki gibt es eine Mac-Seite mit weiteren Informationen.<br/>
+ </p>
+ </body>
+</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">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Freeplane unterstützt das Betriebssystem Mac OS X noch nicht sehr lange. Die Dokumentation richtet sich noch stark an PC-Nutzer, die Windows, oder Linux verwenden. Trotzdem können Mac-Nutzer mit dieser Doku klar kommen, wenn sie die im Folgenden aufgelisteten Unterschiede im Hinterkopf behalten." ID="ID_752234886" CREATED="1270892460643" MODIFIED="1274394361160">
+<node TEXT="Kommando-Taste im Vergleich zur Strg-Taste" FOLDED="true" ID="ID_274373799" CREATED="1272034412047" MODIFIED="1275248868519">
+<node TEXT="Wenn Du Freeplane unter Mac OS X verwendest, wirst Du im Allgmeinen eher die Apple-Kommando Taste verwenden, als die Strg-Taste. Die Kommando-Taste ist mit einem Kleepblatt-Symbol (⌘) gekennzeichnet, kann aber auch mit "command", "cmd", oder dem Apple-Loge beschriftet sein." ID="ID_395674676" CREATED="1272029514331" MODIFIED="1275249080490"/>
+<node TEXT="Wenn in dieser Dokumentation von der Strg-Taste die Rede ist, sollten Mac-Benutzer in den meisten fällen die Kommando-Taste verwenden" ID="ID_124270811" CREATED="1272034546855" MODIFIED="1275249146943"/>
+<node TEXT="In einigen wenigen Fällen müssen aber auch Mac-Benutzer die Strg-Taste verwenden. Diese sind in der Dokumentation aber explizit genannt. Falls die Kommando-Taste einmal nicht funktioniert, kann es aber dennoch eine gute Idee sein die Strg-Taste zu probieren." ID="ID_1031450682" CREATED="1272034546807" MODIFIED="1275249266475"/>
+</node>
+<node TEXT="Maus, Rechtsklick und Context-Menüs" FOLDED="true" ID="ID_1326732850" CREATED="1272034661406" MODIFIED="1275249293642">
+<node TEXT="Viele Apple Mäuse und Trackpads haben nur einen klickbaren Button. Das Kontextmenü kann man in diesen Fällen erreichen, indem man die Strg-Taste gedrückt hält, während man den Klick durchführt (in diesem Fall ist die Strg-Taste gemeint)." ID="ID_1259415390" CREATED="1272030826942" MODIFIED="1275249538274"/>
+</node>
+<node TEXT="Unterschiede der Menüs" FOLDED="true" ID="ID_1110596300" CREATED="1272475775170" MODIFIED="1275339928834">
+<node TEXT="Einige Menüpunkte sind entsprechend dem Mac OS X Standard an anderen Stellen, als in anderen Betriebssystemen. Diese Fälle sind unten aufgelistet." ID="ID_1853446063" CREATED="1272475795702" MODIFIED="1275339995577"/>
+<node TEXT=""Hilfe -> Über Freeplane..." ist im Applikations-Menü unter Über Freeplane..." ID="ID_1154800735" CREATED="1272475988527" MODIFIED="1275249713869"/>
+<node TEXT=""Exras -> Einstellungen..." ist im Applikations-Menü unter Einstellungen." ID="ID_1860427078" CREATED="1272490956135" MODIFIED="1275249757568"/>
+<node TEXT=""Datei -> Beenden" ist im Applikations-Menü unter Beenden." ID="ID_1745832189" CREATED="1272491194401" MODIFIED="1275249802027"/>
+</node>
+<node TEXT="Zoomen" FOLDED="true" ID="ID_590901264" CREATED="1272034779740" MODIFIED="1275249813416">
+<node TEXT="Da Freeplane seinen Zoom-Level selbst verwaltet, funktioniert die in Mac OS X eingebaute Zoom-Funktion (Strg gedrückt halten und am Mausrad drehen) nicht. Mac-Beutzer müssen die von Freeplane zur Verfügung gestellten Mittel zum Einstellen des Zooms verwenden." ID="ID_1955741602" CREATED="1272031370038" MODIFIED="1275250078105"/>
+<node TEXT="Wenn Du aber trotzdem die Mac-Variante zum Vergößern verwendet hast, kann es vorkommen, dass einige Mausfunktionen in Freeplane nicht mehr richtig, oder gar nicht mehr funktionieren. In diesem Fall musst Du den Mac-Zoom wieder rückgängig machen." ID="ID_842528755" CREATED="1272034875909" MODIFIED="1275250252847"/>
+</node>
+<node TEXT="Freeplane Wiki" FOLDED="true" ID="ID_1142057644" CREATED="1272034993198" MODIFIED="1272035003988">
+<node TEXT="Um mehr über den Betrieb von Freeplane unter Mac OS X zu erfahren, besuche das Freeplane Wiki." ID="ID_275313424" CREATED="1272035005736" MODIFIED="1275250305269" LINK="http://freeplane.sourceforge.net/wiki/index.php/Macintosh"/>
+</node>
+</node>
+</node>
+<node TEXT="Verwenden des Freeplane-Applets auf Deiner Web- Seite" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1270892460644" MODIFIED="1275250344010" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Mit "Datei -> Export -> Als Java Applet..." erzeugst Du die Dateien für Deine Web-Site." ID="ID_885091125" CREATED="1270892460644" MODIFIED="1275250555545" COLOR="#000000">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node TEXT="Im Freeplane Applet kannst Du MindMaps nur betrachten und nicht bearbeiten. Durch klicken auf einen Knoten kannst Du den Zweig aber ein- und ausfalten. Auch das Umherschieben mit gedrückter linker Maustaste und das Durchsuchen (mit Kontext-Menü) funktioniert" ID="_Freeplane_Link_514864900" CREATED="1270892460645" MODIFIED="1275340105130">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Kleinere Maps kannst Du auch als Flash-Applet exportieren, was aber weniger Navigationsmöglichkeiten bietet." ID="ID_814739863" CREATED="1270895588942" MODIFIED="1275340135154"/>
+<node TEXT="LaTeX und SVG Bilder werden in den Applets nicht dargestellt." ID="ID_1798905971" CREATED="1271097701298" MODIFIED="1275340146193"/>
+</node>
+<node TEXT="Das Team" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1270892460645" MODIFIED="1275340221218" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Ursprünglichel Autoren" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1270892460646" MODIFIED="1275250920051" COLOR="#006699">
+<node TEXT="Joerg Mueller" ID="_Freeplane_Link_1896457660" CREATED="1270892460646" MODIFIED="1270896496444" COLOR="#996600">
+<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/">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1270892460647" MODIFIED="1270892460647" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1270892460647" MODIFIED="1270896519401" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitry Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1270892460648" MODIFIED="1270895653419" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Graphical Design by Predrag Cuklin" ID="ID_1094825033" CREATED="1270892460648" MODIFIED="1270902561031" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Augenblickliches Team" FOLDED="true" ID="ID_1090487344" CREATED="1271097427203" MODIFIED="1275250950142" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<edge WIDTH="thin"/>
+<node TEXT="Release 1.1.x" ID="ID_1795869028" CREATED="1271097443907" MODIFIED="1271097685189" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Dimitry Polivaev" ID="ID_809494025" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Volker Boerchers" ID="ID_548414191" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Eric L." ID="ID_306583030" CREATED="1271097633122" MODIFIED="1271097633122"/>
+<node TEXT="jayseye" ID="ID_502187025" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Predrag" ID="ID_320430724" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Ryan Wesley" ID="ID_288819242" CREATED="1271097633123" MODIFIED="1271097633123"/>
+</node>
+</node>
+</node>
+</node>
+</map>
+
+
diff --git a/freeplane/doc/freeplane_es.mm b/freeplane/doc/freeplane_es.mm
new file mode 100644
index 0000000..94f9b5a
--- /dev/null
+++ b/freeplane/doc/freeplane_es.mm
@@ -0,0 +1,821 @@
+<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 - Ctrl+Q
Mapa anterior - Ctrl+Izquierda
Mapa siguiente - Ctrl+Derecha
Exportar fichero a HTML - Ctrl+E
Exportar rama a HTML - Ctrl+H
Exportar rama a un nuevo fichero MM - Alt+A
Abrir el primer fichero del histórico - Ctrl+SHIFT (MAYÚSCULAS)+W

Comandos de edición
Buscar - Ctrl+F
Buscar siguiente - Ctrl+G
Cortar - Ctrl+X
Copiar - Ctrl+C
Copiar elemento - Ctrl+Y
Pegar - Ctrl+V

Comandos de modos
Modo Mapa mental (MindMap) - Alt+1
Modo navegación - Alt+2
Modo fichero - Alt+3

Comandos de formato de nodos
Cursiva - Ctrl+I
Negrita - Ctrl+B
Nube (Cloud) - Ctrl+SHIFT (MAYÚSCULAS)+B
Cambiar el color del nodo - Alt+C
Mezclar el color del nodo - Alt+B
Cambiar el color del borde del nodo - Alt+E
Aumentar el tamaño de letra del nodo - Ctrl+L
Disminuir el tamaño de letra del nodo - Ctrl+M
Aumentar el tamaño de letra de la rama - Ctrl+SHIFT (MAYÚSCULAS)+L
Disminuir el tamaño de letra de la rama - Ctrl+SHIFT (MAYÚSCULAS)+M

Comandos del modo navegación
Ir a la raíz - ESCAPE
Subir - ARRIBA
Bajar - ABAJO
Izquierda - IZQUIERDA
Derecha - DERECHA
Seguir el enlace - Ctrl+ENTER
Disminuir Zoom - Alt+ARRIBA
Aumentar Zoom - Alt+ABAJO

Comandos para un nuevo nodo
Añadir un nodo hermano - ENTER
Añadir un nodo hijo - INSERT
Añadir un nodo hermano anterior (padre) - SHIFT (MAYÚSCULAS)+ENTER

Comandos de edición de nodos
Editar el nodo seleccionado - F2
Editar la longitud del nodo - Alt+ENTER
Unir nodos - Ctrl+J
Desplegar/Replegar nodo - BARRA ESPACIADORA
Desplegar/Replegar todas las ramas de un nodo - Ctrl+BARRA ESPACIADORA
Establecer enlace con un fichero - Ctrl+SHIFT (MAYÚSCULAS)+K
Establecer enlace con una entrada de texto - Ctrl+K
Establecer enlace con un fichero de imagen - Alt+K
Subir nodo (mover) - Ctrl+ARRIBA
Bajar nodo (mover) - Ctrl+ABAJO">
+<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)">
+<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">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1170327167056" POSITION="left" TEXT="Sobre los modos">
+<edge WIDTH="thin"/>
+<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 está claro si alguien realmente querría hacer uso de esta arquitectura; es un recurso a explotar si alguien está interesado y lo desea hacer." VSHIFT="4"/>
+<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."/>
+</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>
+<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1170327531427" POSITION="left" TEXT="Usando el applet de Freeplane">
+<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>
+<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"/>
+<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 – Aquí la influencia de Microsoft es aparente aunque puede que no hay una razón de uso intuitivo para usar la tecla F2 para tener que editar nodos. Pero una vez que se acostumbre al uso de las teclas rápidas en todas las aplicaciones que use (En inglés, claro), querrá hacer uso de ellas en Freeplane también."/>
+<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"/>
+<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"/>
+<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">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_268552515" MODIFIED="1170327672284" TEXT="Universidad de Freiburg, Alemania">
+<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"/>
+<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"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1170327637519" TEXT="Pequeñas contribuciones">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_189984007" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_117526613" MODIFIED="1170327651956" TEXT="Instalador de Windows">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Eclipse howto">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Tutorial flash">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1534904708" MODIFIED="1124560950701" TEXT="David Low">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Helpful">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Italian translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Danish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1928961904" MODIFIED="1124560950701" TEXT="Alex Dukal">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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.">
+<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>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1170401730966" POSITION="right" TEXT="Demostración de algunas características">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1170401751153" TEXT="Apariencia">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_801391449" MODIFIED="1170401759200" TEXT="Los nodos pueden tener diferentes colores">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#ff0000" CREATED="1124560950701" ID="Freeplane_Link_1935642015" MODIFIED="1170401763778" TEXT="Rojo">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#009900" CREATED="1124560950701" ID="Freeplane_Link_358662946" MODIFIED="1170401767216" TEXT="Verde">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#0000cc" CREATED="1124560950701" ID="Freeplane_Link_569149865" MODIFIED="1170401772466" TEXT="Azul">
+<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>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_542663260" MODIFIED="1170401836498" TEXT="Los nodos pueden tener diferentes estilos de fuentes">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_807716236" MODIFIED="1170401842685" TEXT="Negrita">
+<font BOLD="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1517956725" MODIFIED="1170401848310" TEXT="Cursiva">
+<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1716797514" MODIFIED="1170401855592" TEXT="Negrita y cursiva">
+<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1651709962" MODIFIED="1170401864248" TEXT="Los tamaños de fuente puedes ser diferentes">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_94543529" MODIFIED="1170401870482" TEXT="Pequeño">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1637486722" MODIFIED="1170401875560" TEXT="Normal">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_660570324" MODIFIED="1170401882482" TEXT="Grande">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_232732639" MODIFIED="1170401889154" TEXT="Gigante">
+<font NAME="SansSerif" SIZE="20"/>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="OOh">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_1872197155" MODIFIED="1170401905951" TEXT="Ésta">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1170401911608" TEXT="Ésta otra">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_704399864" MODIFIED="1170401921873" TEXT="Ó ésta otra">
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1271086229" MODIFIED="1170402128468" TEXT="Los nodos se pueden desplegar">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1170402134671" TEXT="Doblez">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_339068638" MODIFIED="1170402138140" TEXT="Oculta">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1170402144875" TEXT="Árbol">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_1450639329" MODIFIED="1170402149750" TEXT="Roble">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1463816938" MODIFIED="1170402159531" TEXT="Haya">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1006242670" MODIFIED="1170402153547" TEXT="Olmo">
+<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…">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1178924051" MODIFIED="1170402176937" TEXT="Páginas web">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1646455138" MODIFIED="1170402230875" TEXT="Freeplane thinks this is executable :)">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1571818298" MODIFIED="1170402185078" TEXT="Carpetas locales">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_134747683" LINK="file:/C:/Program%20Files/" MODIFIED="1170402246313" TEXT="C:/Program files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" LINK="/home/" MODIFIED="1124560950701" TEXT="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_179286322" MODIFIED="1170402191875" TEXT="Ejecutables">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006600" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="You see that the node is executable by icon.">
+<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.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_839677176" MODIFIED="1170402256219" TEXT="Nodos multilínea">
+<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>
+<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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_707227593" MODIFIED="1170402363954" TEXT="es un">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1405291988" MODIFIED="1170402377767" TEXT="Roble">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_867032809" MODIFIED="1170402368939" TEXT="es un">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_779687380" MODIFIED="1170402382657" TEXT="Haya">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_802687707" MODIFIED="1170402372720" TEXT="es un">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_544688485" MODIFIED="1170402386376" TEXT="Olmo">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1421027901" MODIFIED="1170402355314" TEXT="Árbol">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_921860045" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1635761458" MODIFIED="1170402395236" TEXT="Hoja">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1017438621" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1545141692" MODIFIED="1170402400142" TEXT="Tronco">
+<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">
+<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á cuando finalice la sesión de Freeplane."/>
+<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.">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="korn"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<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>
+<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>
+<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>
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1170403490211" POSITION="right" TEXT="Hacer búsquedas">
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1170403527134" POSITION="right" TEXT="Seleccionar múltiples nodos">
+<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>
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1170403565009" POSITION="right" TEXT="Arrastrar y soltar">
+<edge WIDTH="thin"/>
+<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."/>
+</node>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1170403884683" POSITION="right" TEXT="Copiar y pegar (Edición)">
+<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.">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_639753662" MODIFIED="1170403690306" TEXT="Árbol">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_142445650" MODIFIED="1170403694135" TEXT="Roble">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_68949954" MODIFIED="1170403697775" TEXT="Haya">
+<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:">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Shopping (120236)">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Urban Living (19)">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1124560950717" TEXT="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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_1688306576" MODIFIED="1170403774791" TEXT="Roble">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_838087851" MODIFIED="1170403779760" TEXT="Haya">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_926901432" MODIFIED="1170403787354" TEXT="se pega como">
+<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/>">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950732" LINK="http://www.google.com/" MODIFIED="1124560950732" TEXT="Google">
+<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 Linux, existe algunos (No se mencionan concretos)."/>
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1170403959449" POSITION="right" TEXT="Cambiar de mapas">
+<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.">
+<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">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1170404045621" POSITION="right" TEXT="Exportar a HTML">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1170404233263" POSITION="right" TEXT="Importar una estructura de carpetas">
+<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;"/>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1170658902269" POSITION="right" TEXT="Integración con Microsoft Word ó Outlook">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1170658962190" POSITION="right" TEXT="Configurar las preferencias">
+<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.">
+<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="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" style="border: none" class="msonormaltable" border="1" cellspacing="0">
 <tr>
 <td style="border: solid windowtext 1.0pt; padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-top: .75pt">
 <p class="msonormal">
 Celda1
 </p>
 </td>
 <td style="border: solid windowtext 1.0pt; border-left: none; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
 <p class="msonormal">
 Celda2
 </p>
 </td>
 </tr>
 <tr>
 <td style="border: solid windowtext 1.0pt; border-top: none; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
 <p class="msonormal">
 Celda3
 </p>
 </td>
 <td style="border-bottom: solid windowtext 1.0pt; border-top: none; border-left: none; padding-left: .75pt; padding-right: .75pt; border-right: solid windowtext 1.0pt; 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> <font color="#336600"></font>.
 </p>
 </body>
</html>
"/>
+<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 en versión beta dentro de esta versión de Freeplane."/>
+<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>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_et.mm b/freeplane/doc/freeplane_et.mm
new file mode 100644
index 0000000..1614620
--- /dev/null
+++ b/freeplane/doc/freeplane_et.mm
@@ -0,0 +1,3058 @@
+<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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1911559485" MODIFIED="1216200835990" TEXT="Viited">
+<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)">
+<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">
+<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>
+<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>
+<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>
+<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">
+<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.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1036346569" MODIFIED="1216187545265" TEXT="Sa lehitsed failipuud nagu see oleks mõttekaart.">
+<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.">
+<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.">
+<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>
+<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">
+<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>
+<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>
+<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"/>
+<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 ta on siin olemas uurimiseks kui keegi seda soovib.
+ </p>
+ </body>
+</html></richcontent>
+<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>
+<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">
+<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.">
+<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.">
+<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>
+<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>
+<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">
+<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>
+<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"/>
+<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 F2 kiirklahvi sõlme sisu muutmiseks. Kuid kui oled neid kiirklahve teistes programmides kasutanud, soovid neid ka Freeplane-i.
+ </p>
+ </body>
+</html></richcontent>
+<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.">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" ID="Freeplane_Link_415458128" MODIFIED="1216272329963" TEXT="Autorid">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1896457660" MODIFIED="1216187545261" TEXT="Joerg Mueller">
+<edge WIDTH="thin"/>
+<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">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1757468410" MODIFIED="1216187545261" TEXT="Freiburgi Ülikool, Saksamaa">
+<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"/>
+<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"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1216187545261" TEXT="Dimitri Polivaev">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1216272427853" TEXT="Väiksemad panustajad">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950701" ID="ID_1613097663" MODIFIED="1216272349630" TEXT="Andrew Iggleden">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1149301468" MODIFIED="1216187545261" TEXT="Windows-i paigaldaja">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1096673251" MODIFIED="1216272351336" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_617977736" MODIFIED="1216187545261" TEXT="Eclipse õpetus">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1024053399" MODIFIED="1216272352345" TEXT="David Butt">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_49661074" MODIFIED="1216187545261" TEXT="Flash-i õpetus">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="ID_1167712813" MODIFIED="1216272353298" TEXT="David Low">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_356164606" MODIFIED="1216187545261" TEXT="Abitekstid">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124561374999" ID="ID_180090574" MODIFIED="1216272357942" TEXT="Edmund Laugasson">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561377702" ID="ID_537083851" MODIFIED="1216187545260" TEXT="Eesti keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_807977431" MODIFIED="1216272359692" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1392047072" MODIFIED="1216187545260" TEXT="Itaalia keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1853214917" MODIFIED="1216272361218" TEXT="Knud Riishøjgård">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_572926838" MODIFIED="1216187545260" TEXT="Taani keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1676529317" MODIFIED="1216272362282" TEXT="Takeshi Kakeda">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_763739856" MODIFIED="1216187545260" TEXT="Jaapani keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124562983644" ID="Freeplane_Link_1172193026" MODIFIED="1216272363189" TEXT="Kohichi Aoki">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_919845662" MODIFIED="1216187545260" TEXT="Jaapani keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="ID_1810700717" MODIFIED="1216272364055" TEXT="Alex Dukal">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1990388249" MODIFIED="1216187545260" TEXT="Hispaania keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124562998159" ID="Freeplane_Link_757563697" MODIFIED="1216272364816" TEXT="Hugo Gayosso">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1783275246" MODIFIED="1216187545260" TEXT="Hispaania keele tõlge">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_929540960" MODIFIED="1216272365516" TEXT="Sylvain Gamel">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_665552197" MODIFIED="1216187545260" TEXT="Prantsuse keele tõlge">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124561242082" ID="Freeplane_Link_946171164" MODIFIED="1216272366270" TEXT="Koen Roggemans">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561245957" ID="Freeplane_Link_1819881845" MODIFIED="1216187545260" TEXT="Hollandi keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124561374999" ID="Freeplane_Link_235962981" MODIFIED="1216272366953" TEXT="Rafal Kraik">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561377702" ID="Freeplane_Link_459079511" MODIFIED="1216187545260" TEXT="Poola keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124561969717" ID="Freeplane_Link_653284985" MODIFIED="1216272367703" TEXT="Goliath">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561438294" ID="Freeplane_Link_1387213811" MODIFIED="1216187545259" TEXT="Korea keele tõlge">
+<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)">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561491886" ID="Freeplane_Link_835144271" MODIFIED="1216187545258" TEXT="Sloveenia keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124561814721" ID="Freeplane_Link_1008886206" MODIFIED="1216272380101" TEXT="William Chen">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561497308" ID="Freeplane_Link_1960552629" MODIFIED="1216187545258" TEXT="Hiina keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124561823877" ID="Freeplane_Link_1650138043" MODIFIED="1216272379451" TEXT="Radek Švarc">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124561515761" ID="Freeplane_Link_768227373" MODIFIED="1216187545257" TEXT="Tšehhi keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124562250475" ID="Freeplane_Link_901975324" MODIFIED="1216272380882" TEXT="Balázs Márton">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124562252585" ID="Freeplane_Link_557911120" MODIFIED="1216187545257" TEXT="Ungari keele tõlge">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124562948942" ID="Freeplane_Link_290351026" MODIFIED="1216272381633" TEXT="Luis Ferreira ">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124562956332" ID="Freeplane_Link_6081004" MODIFIED="1216187545257" TEXT="Portugali keele tõlge">
+<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>
+<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>
+<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.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1596161299" MODIFIED="1216201160406" POSITION="right" TEXT="Tutvustus">
+<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>
+<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>
+<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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1216200835993" TEXT="Välimus">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_887863172" MODIFIED="1216187545241" TEXT="Sõlmed võivad olla erinevat värvi.">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#ff0000" CREATED="1124560950701" ID="ID_1474945370" MODIFIED="1216187545241" TEXT="Punane">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#009900" CREATED="1124560950701" ID="ID_1005177880" MODIFIED="1216187545241" TEXT="Roheline">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#0000cc" CREATED="1124560950701" ID="ID_304992602" MODIFIED="1216187545241" TEXT="Sinine">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="_" MODIFIED="1216187545241" TEXT="Sõlmedel võivad olla erinevad taustavärvid">
+<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>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_754589044" MODIFIED="1216187545241" TEXT="Sõlmedel võivad olla erinevad fontide stiilid">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1966890106" MODIFIED="1216187545241" TEXT="Rasvane kiri">
+<font BOLD="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1134315926" MODIFIED="1216187545241" TEXT="Kaldkiri">
+<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1038960675" MODIFIED="1216187545241" TEXT="Rasvane ja kaldkiri">
+<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_357603252" MODIFIED="1216187545241" TEXT="Sõlmede fondid võivad olla erinevate suurustega">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1612985143" MODIFIED="1216187545241" TEXT="Väike">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node CREATED="1124560950701" ID="ID_99178057" MODIFIED="1216187545241" TEXT="Normaalne">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node CREATED="1124560950701" ID="ID_421241675" MODIFIED="1216187545241" TEXT="Suurem">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_590940671" MODIFIED="1216187545240" TEXT="Suur">
+<font NAME="SansSerif" SIZE="20"/>
+<node CREATED="1124560950701" ID="ID_223617365" MODIFIED="1216187545240" TEXT="OOh">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_1960916074" MODIFIED="1216187545240" TEXT="Erinevaid fonte saab kasutada">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1360641359" MODIFIED="1216187545240" TEXT="Selline">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1216187545240" TEXT="Või see">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_539001457" MODIFIED="1216187545240" TEXT="Või hoopis see">
+<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">
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="ID_738265772" MODIFIED="1216200835993" TEXT="Sõlmi saab kokku/lahti voltida">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1216187545240" TEXT="Sõlm">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_295225504" MODIFIED="1216187545240" TEXT="Peidetud">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1216187545240" TEXT="Puu">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_734334377" MODIFIED="1216187545240" TEXT="Tamm">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1388126257" MODIFIED="1216187545240" TEXT="Pöök">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_292365900" MODIFIED="1216187545240" TEXT="Jalakas">
+<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 ... ">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_1913017247" MODIFIED="1216187545239" TEXT="Veebilehtedele">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_350611440" LINK="http://www.google.ee/" MODIFIED="1216187545239" TEXT="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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1117649418" MODIFIED="1216187545239" TEXT="Freeplane arvab, et see on käivitatav fail :)">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_715165450" MODIFIED="1216187545239" TEXT="Kohalikele kaustadele">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_469314055" LINK="file:/C:/Program%20Files/" MODIFIED="1216187545239" TEXT="C:/Program Files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_534319083" LINK="/home/" MODIFIED="1216187545239" TEXT="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_1939211284" MODIFIED="1216187545239" TEXT="Käivitatavatele failidele">
+<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">
+<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.">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_839677176" MODIFIED="1216200835994" TEXT="Mitmerealised sõlmed">
+<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>
+<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>
+<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">
+<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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" FOLDED="true" ID="ID_1812254377" MODIFIED="1216187545239" TEXT="Puu">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_1357589453" MODIFIED="1216200828922" TEXT="on">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_1843885197" MODIFIED="1216187545239" TEXT="Tamm">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_1175801663" MODIFIED="1216200828922" TEXT="on">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_956172504" MODIFIED="1216187545239" TEXT="Pöök">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_647529529" MODIFIED="1216200828922" TEXT="on">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_1045593899" MODIFIED="1216187545239" TEXT="Jalakas">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950717" FOLDED="true" ID="ID_1721974835" MODIFIED="1216187545238" TEXT="Puu">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_300230898" MODIFIED="1216187545238" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_1149978961" MODIFIED="1216187545238" TEXT="Leht">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_329904317" MODIFIED="1216187545238" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_1518758203" MODIFIED="1216187545238" TEXT="Tüvi">
+<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"/>
+<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="1216200835996" TEXT="Sa võid teha pilvi">
+<cloud/>
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_1236643816" MODIFIED="1216187545238" TEXT="Endavalitud värvidega">
+<cloud COLOR="#f1ede6"/>
+<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">
+<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;"/>
+<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;"/>
+<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;"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1216187545238" TEXT="Ja erineva kujuga">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="_Freeplane_Link_894936766" MODIFIED="1216187545238" TEXT="Üks">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="_Freeplane_Link_1942481455" MODIFIED="1216187545237" TEXT="Teine">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_1080456719" MODIFIED="1216187545237" TEXT="Alamsõlme tekitamiseks aktiivse sõlme alla vajuta INSERT.">
+<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>
+<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>
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="ID_461300770" MODIFIED="1216187545234" TEXT="Sõlme kustutamiseks vajuta DELETE">
+<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>
+<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 Freeplane-i vahepeal ei sulge.
+ </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.">
+<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.">
+<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.">
+<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>
+<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>
+<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>
+<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>
+<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>
+<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">
+<edge WIDTH="thin"/>
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="korn"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<icon BUILTIN="licq"/>
+</node>
+</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">
+<edge WIDTH="thin"/>
+<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>
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" FOLDED="true" ID="ID_1174875076" MODIFIED="1216191388934" TEXT="asetatakse kui">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_630727847" MODIFIED="1216191387928" TEXT="Puu">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_10517981" MODIFIED="1216191366645" TEXT="Tamm">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_1473809424" MODIFIED="1216191371256" TEXT="Pöök">
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" FOLDED="true" ID="ID_1182968610" MODIFIED="1216200835998" TEXT="Näidistulemus pärast asetamist:">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_1854872512" MODIFIED="1216195174178" TEXT="Ostmine (120236)">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="ID_1197617245" MODIFIED="1216195181063" TEXT="Linnaelu (19)">
+<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">
+<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">
+<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>
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_1454908790" MODIFIED="1216200835998" TEXT="Puu">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_633110419" MODIFIED="1216195798447" TEXT="Tamm">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_838560951" MODIFIED="1216200829358" TEXT="Pöök">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" FOLDED="true" ID="ID_1676658451" MODIFIED="1216197295548" TEXT="asetatakse kui">
+<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>
+<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">
+<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>
+<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>
+<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"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</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>
+<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="ID_1586593732" MODIFIED="1216217084661" TEXT="Näidis">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="ID_946625728" MODIFIED="1216217082479" TEXT="Valitud kataloog">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950732" FOLDED="true" ID="ID_1954366926" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/" MODIFIED="1216217073101" TEXT="Dbwiz">
+<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">
+<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>
+</node>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_269203785" MODIFIED="1216217579976" POSITION="right" TEXT="MS Internet Explorer-i järjehoidjate importimine">
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#999999" CREATED="1124560950732" ID="ID_332563589" MODIFIED="1216217570092" TEXT="Märksõnad: Microsoft Internet Explorer, MS Internet Explorer MSIE, MS IE.">
+<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">
+<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ärgus olev võimalus ja ei ole veel lõpuni välja arendatud.
+ </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>
+<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>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_fr.mm b/freeplane/doc/freeplane_fr.mm
new file mode 100644
index 0000000..40255b4
--- /dev/null
+++ b/freeplane/doc/freeplane_fr.mm
@@ -0,0 +1,1165 @@
+<map version="0.9.0">
+<!--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">
+<html>
+ <head>
+
+ </head>
+ <body width="">
+ <p align="center">
+ Freeplane<br/><small>- Logiciel Libre de Mind-Mapping -</small>
+ </p>
+ </body>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h2>
+ Introduction
+ </h2>
+ <p>
+ Freeplane permet de créer des documents graphiques et arborescents appelés Mind Maps, Cartes Mentales ou encore Cartes Heuristiques. De nombreux utilisateurs choisissent ce programme comme alternative au bloc-notes ou à un gestionnaire d'informations personnelles. Les informations sont stockées dans des zones de texte nommées "noeuds". Les noeuds sont reliés par des traits appelés "lignes".
+ </p>
+ <p>
+
+ </p>
+ <p style="padding-right: 0cm; padding-bottom: 0cm; margin-bottom: 0cm; border: none; 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>
+<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>
+<node TEXT="Illustrations graphiques de quelques fonctionnalités" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1270892460656" MODIFIED="1277230218296" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Apparence" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1270892460656" MODIFIED="1275419982281" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Les noeuds peuvent avoir différentes couleurs" FOLDED="true" ID="ID_291185043" CREATED="1270892460656" MODIFIED="1275419998250">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Rouge" ID="ID_73698498" CREATED="1270892460656" MODIFIED="1275420003140" COLOR="#ff0000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vert" ID="ID_1386235766" CREATED="1270892460657" MODIFIED="1275420005453" COLOR="#009900">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Bleu" ID="ID_185145945" CREATED="1270892460657" MODIFIED="1275420007578" COLOR="#0000cc">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="La couleur de fond des noeuds peut être modifiée" FOLDED="true" ID="_" CREATED="1270892460657" MODIFIED="1277183299218">
+<node TEXT="Rose" ID="_Freeplane_Link_1358611533" CREATED="1270892460657" MODIFIED="1275420054171" BACKGROUND_COLOR="#ffcccc"/>
+<node TEXT="Cyan" ID="_Freeplane_Link_1317973766" CREATED="1270892460657" MODIFIED="1271973353486" BACKGROUND_COLOR="#ccffff"/>
+</node>
+<node TEXT="Les nœuds peuvent avoir différents styles de police" FOLDED="true" ID="ID_1923181646" CREATED="1270892460657" MODIFIED="1275420083734">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Gras" ID="ID_1824894496" CREATED="1270892460657" MODIFIED="1275420088375">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+</node>
+<node TEXT="Italique" ID="ID_871310557" CREATED="1270892460658" MODIFIED="1275420091562">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
+</node>
+<node TEXT="Gras et italique" ID="ID_735467355" CREATED="1270892460658" MODIFIED="1275420096140">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
+</node>
+</node>
+<node TEXT="La police utilisée dans les noeuds peut être de différentes tailles" FOLDED="true" ID="ID_1148481435" CREATED="1270892460658" MODIFIED="1277183388359">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="petit" ID="ID_409039647" CREATED="1270892460658" MODIFIED="1275420135343">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node TEXT="normal" ID="ID_1435919979" CREATED="1270892460658" MODIFIED="1270892460658">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node TEXT="grand" ID="ID_285885166" CREATED="1270892460658" MODIFIED="1275420142015">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node TEXT="très grand" FOLDED="true" ID="ID_925591695" CREATED="1270892460659" MODIFIED="1275420146046">
+<font NAME="SansSerif" SIZE="20"/>
+<node TEXT="OOh" ID="ID_612411777" CREATED="1270892460659" MODIFIED="1270892460659">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node TEXT="Différents types de police peuvent être utilisés" FOLDED="true" ID="ID_1844753395" CREATED="1270892460659" MODIFIED="1277183439109">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Times New Roman" ID="ID_471048226" CREATED="1270892460659" MODIFIED="1271973714732">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node TEXT="Verdana" ID="_Freeplane_Link_1568731425" CREATED="1270892460659" MODIFIED="1271973720643">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node TEXT="Dialog font" ID="ID_1860252564" CREATED="1270892460659" MODIFIED="1271973770585">
+<font NAME="Dialog" SIZE="21"/>
+</node>
+</node>
+<node TEXT="Différents styles de noeud sont possibles" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1270892460660" MODIFIED="1277183451046">
+<node TEXT="Fourche" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1270892460660" MODIFIED="1275420224515">
+<node TEXT="fourche" ID="_Freeplane_Link_89124429" CREATED="1270892460660" MODIFIED="1275420228203"/>
+<node TEXT="fourche" ID="_Freeplane_Link_173850525" CREATED="1270892460660" MODIFIED="1275420231781"/>
+</node>
+<node TEXT="Bulle" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1270892460660" MODIFIED="1275420244546" STYLE="bubble">
+<node TEXT="Bulle" ID="_Freeplane_Link_1677737286" CREATED="1270892460660" MODIFIED="1275420248031" STYLE="bubble"/>
+<node TEXT="Bulle" ID="_Freeplane_Link_978246353" CREATED="1270892460660" MODIFIED="1275420250375" STYLE="bubble"/>
+</node>
+</node>
+</node>
+<node TEXT="Les noeuds peuvent être dépliés ou pliés à volonté" FOLDED="true" ID="ID_1623634168" CREATED="1270892460660" MODIFIED="1277183525890" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Plié" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1270892460660" MODIFIED="1275420305843">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Caché" ID="ID_710559854" CREATED="1270892460660" MODIFIED="1275420308734">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Arbres" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1270892460661" MODIFIED="1277183515531">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Chêne" ID="ID_117856753" CREATED="1270892460661" MODIFIED="1275420319828">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Hêtre" ID="ID_39938798" CREATED="1270892460661" MODIFIED="1275420323984">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Orme" ID="ID_919566309" CREATED="1270892460661" MODIFIED="1275420327078">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Les noeuds peuvent contenir des liens hypertextes" FOLDED="true" ID="ID_1091027669" CREATED="1270892460661" MODIFIED="1277183531609" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Pages Web" FOLDED="true" ID="ID_1291101161" CREATED="1270892460661" MODIFIED="1275420351437" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="http://www.google.com/" ID="ID_1272005179" CREATED="1270892460662" MODIFIED="1270892460662" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Ouvrir Google" ID="ID_488333574" CREATED="1270892460662" MODIFIED="1277183590796" LINK="http://www.google.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Répertoires locaux" FOLDED="true" ID="ID_819664033" CREATED="1270892460662" MODIFIED="1275420371171" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:/Program Files/ (Windows)" ID="ID_33602690" CREATED="1270892460662" MODIFIED="1271973897739" LINK="file:/C:/Program%20Files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="/home/ (Linux)" ID="ID_1192223311" CREATED="1270892460662" MODIFIED="1271973908073" LINK="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="/Users (Mac OS X)" ID="ID_1305958070" CREATED="1271973910165" MODIFIED="1271973960770" LINK="/Users"/>
+</node>
+<node TEXT="FIchiers exécutables" FOLDED="true" ID="ID_1829360247" CREATED="1270892460663" MODIFIED="1275420379671" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\WINNT\regedit.exe" ID="ID_1773112429" CREATED="1270892460663" MODIFIED="1270991928052" LINK="file:/C:/WINNT/regedit.exe">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Liens vers des noeuds de la même carte (ou vers des noeuds d'autres cartes)" ID="ID_148011650" CREATED="1271974056299" MODIFIED="1275420455046" LINK="#ID_709498088"/>
+<node TEXT="Lien vers tout document enregistré sur votre ordinateur ou sur un réseau local" ID="ID_382832692" CREATED="1270892460663" MODIFIED="1277183655812">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="A noter : selon la plate-forme (Windows / Unix / Mac...) des icônes différentes peuvent être utilisées." ID="ID_1145751539" CREATED="1270991844130" MODIFIED="1277183702296">
+<font ITALIC="true"/>
+</node>
+</node>
+<node TEXT="Pour suivre un lien, cliquer sur la flèche" FOLDED="true" ID="ID_709498088" CREATED="1271029724866" MODIFIED="1275420596281" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Une flèche rouge indique un lien externe (lien extérieuren à la carte en cours)" ID="ID_1268065166" CREATED="1271974306669" MODIFIED="1277183759656"/>
+<node TEXT="Une flèche verte indique un lien local (au sein de la même carte)" ID="ID_1382213647" CREATED="1271974215092" MODIFIED="1275420621375"/>
+</node>
+<node TEXT="Noeud multi-lignes" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1270892460663" MODIFIED="1275420681046" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Les noeuds contenant un texte long s'affichent automatiquement sur plusieurs lignes. Si vous souhaitez imposer des retours à la ligne, la première solution consiste à transformer votre texte long en plusieurs noeuds courts à l'aide de la commande "Outils-->Diviser le noeud"." ID="_Freeplane_Link_1423568963" CREATED="1270892460664" MODIFIED="1277184181796"/>
+<node TEXT="Noeud multi-lignes avec saut de lignes" FOLDED="true" ID="ID_1324715896" CREATED="1270892460664" MODIFIED="1275421070093" COLOR="#669900">
+<node TEXT="une ligne,
et une deuxième,

et encore une autre,
que pensez-vous de ce second paragraphe ?" ID="_Freeplane_Link_1957797574" CREATED="1270892460664" MODIFIED="1277184225921"/>
+<node TEXT="Pour ajouter un saut de ligne, utilisez les touches "Alt + Entrée"." ID="ID_600644899" CREATED="1277184239375" MODIFIED="1277184275312"/>
+</node>
+</node>
+<node TEXT="Vous pouvez utiliser le texte des noeuds comme libellés" FOLDED="true" ID="ID_929122537" CREATED="1270892460664" MODIFIED="1277184367390" COLOR="#669900">
+<node TEXT="Arbre" FOLDED="true" ID="ID_1430553317" CREATED="1270892460664" MODIFIED="1277184411468">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="différentes essences" FOLDED="true" ID="ID_976763673" CREATED="1270892460664" MODIFIED="1277184657484" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Chêne" ID="ID_848417183" CREATED="1270892460664" MODIFIED="1275421239687">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Hêtre" ID="ID_625768370" CREATED="1270892460665" MODIFIED="1275421272937">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Orme" ID="ID_42771538" CREATED="1270892460665" MODIFIED="1275421279250">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="est constitué par" FOLDED="true" ID="ID_54522784" CREATED="1270892460665" MODIFIED="1277184676187" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Des racines" ID="ID_1656231926" CREATED="1277184494703" MODIFIED="1277184520984" COLOR="#000000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Un tronc" ID="ID_509762085" CREATED="1277184501078" MODIFIED="1277184525828"/>
+<node TEXT="Des branches" ID="ID_1462260222" CREATED="1277184503156" MODIFIED="1277184528984"/>
+<node TEXT="Des feuilles" ID="ID_1926814329" CREATED="1277184507968" MODIFIED="1277184517421"/>
+</node>
+<node TEXT="est différent de" FOLDED="true" ID="ID_20190770" CREATED="1270892460665" MODIFIED="1277184557015" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Rocher" ID="ID_1221816010" CREATED="1277184557890" MODIFIED="1277184563296"/>
+<node TEXT="Terre" ID="ID_1603909191" CREATED="1277184566468" MODIFIED="1277184574812"/>
+<node TEXT="Béton" ID="ID_1559801130" CREATED="1277184575187" MODIFIED="1277184582125"/>
+</node>
+</node>
+<node TEXT="Arbre" FOLDED="true" ID="ID_1249902286" CREATED="1270892460665" MODIFIED="1275421282968">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<>" FOLDED="true" ID="ID_1994219362" CREATED="1270892460665" MODIFIED="1277184628609" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Feuille" ID="ID_1632637474" CREATED="1270892460666" MODIFIED="1275421288625">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="<>" FOLDED="true" ID="ID_1583422438" CREATED="1270892460666" MODIFIED="1270991928052" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Tronc" ID="ID_1648811846" CREATED="1270892460666" MODIFIED="1275421292828">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Des icônes peuvent être ajoutées" ID="ID_492845108" CREATED="1270892460666" MODIFIED="1277184697234" COLOR="#669900">
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="button_ok"/>
+<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"/>
+<node TEXT="avec des couleurs personnalisées" ID="ID_1714895943" CREATED="1270892460668" MODIFIED="1275421343281">
+<cloud COLOR="#ccccff" WIDTH="0"/>
+</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="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"/>
+</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"/>
+</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"/>
+</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">
+<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"/>
+</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">
+<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"/>
+</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"/>
+</node>
+</node>
+<node TEXT="Les lignes peuvent être cachées" FOLDED="true" ID="ID_1539062144" CREATED="1270893550070" MODIFIED="1275421889171" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Une noeud avec une ligne cachée" ID="ID_936535846" CREATED="1270893561062" MODIFIED="1275421900515" STYLE="bubble">
+<edge STYLE="hide_edge"/>
+</node>
+</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 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>
+</node>
+<node TEXT="Navigation" FOLDED="true" POSITION="right" ID="ID_1233270983" CREATED="1272091279810" MODIFIED="1277230218296" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Navigation dans la carte" FOLDED="true" ID="_Freeplane_Link_1540212684" CREATED="1270892460687" MODIFIED="1275421980578" COLOR="#407000">
+<node TEXT="Pour sélectionner un noeud vers le haut, bas, gauche ou droite, utilisez les touches fléches du clavier." ID="ID_990469408" CREATED="1270892460687" MODIFIED="1277185906390"/>
+<node TEXT="Pour aller au premier noeud de la branche actuelle : touche "PageUp"" ID="ID_991946266" CREATED="1270892460687" MODIFIED="1277185830234">
+<font ITALIC="false"/>
+</node>
+<node TEXT="Pour aller au dernier noeud de la branche actuelle : touche "PageDown"" ID="ID_697637157" CREATED="1270892460688" MODIFIED="1277185856593"/>
+<node TEXT="Pour revenir au noeud central : touche "Esc"" ID="ID_897038230" CREATED="1270892460688" MODIFIED="1277185940703"/>
+<node TEXT="Pour revenir sur les déplacements effectués sur la carte : Navigation --> Noeud précédent dans l'historique (ou Alt + Gauchet) ou Navigation --> Noeud suivant dans l'historique (ou Alt + Droite)." ID="ID_380593497" CREATED="1271026015708" MODIFIED="1277186010031"/>
+<node TEXT="Pour parcourir tous les noeuds les uns après les autres : Navigation > Noeud suivant de la carte (Ctrl + Alt + Droit) et Navigation > Noeud précédent de la carte (Ctrl + Alt + Left)." ID="ID_1006152714" CREATED="1271176654062" MODIFIED="1277186044171"/>
+<node TEXT="Pour effectuer un parcours identique mais en fermant les noeuds passés : "Navigation > Noeud suivant de la carte (avec pliage automatique)" (ou Ctrl + Alt + Shift + Droit), et "Navigation > Noeud Précédent de la carte (avec pliage automatique)" (ou Ctrl + Alt + Shift + Gauche)." ID="ID_261764750" CREATED="1271177016593" MODIFIED="1277186114687"/>
+<node TEXT="Par défaut le noeud placé sous la souris est sélectionné" FOLDED="true" ID="ID_485160362" CREATED="1271003250866" MODIFIED="1277186209812">
+<node TEXT="Ce délai est paramétrable dans Outils > Préférences > Comportement > Méthode de Sélection" ID="ID_1399586050" CREATED="1271003344288" MODIFIED="1277186220625"/>
+</node>
+</node>
+<node TEXT="Sélectionner plusieurs noeuds" FOLDED="true" ID="Freeplane_Link_653540280" CREATED="1270892460681" MODIFIED="1275422997500" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Cliquez sur les noeuds en maintenant la touche "Shift" ou "Ctrl"" ID="ID_1435652978" CREATED="1270892460681" MODIFIED="1277186265406">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour ajouter des nœuds à des nœuds déjà sélectionnés, maintenez la touche Ctrl en cliquant sur le noeud" ID="ID_741729737" CREATED="1270892460682" MODIFIED="1277186326078">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour sélectionner une série continue de nœuds, maintenez la touche Shift lorsque vous cliquez sur le dernier noeud, ou maintenez la touche Shift tout en vous déplaçant avec les touches fléchées." ID="ID_133089768" CREATED="1270892460682" MODIFIED="1277186361562">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour sélectionner une branche complète, utilisez Ctrl + Maj + A, ou maintenez la touche Shift tout en vous déplaçant avec les touches fléchées à partir du nœud père." ID="ID_350782537" CREATED="1270892460682" MODIFIED="1277186655000"/>
+<node TEXT="Pour annuler la sélection de plusieurs nœuds, cliquez sur le fond de carte ou sur un nœud non sélectionné." ID="ID_451303534" CREATED="1270892460682" MODIFIED="1275423263609"/>
+</node>
+<node TEXT="Plier et déplier" FOLDED="true" ID="Freeplane_Link_4727471" CREATED="1270892460688" MODIFIED="1275423286671" COLOR="#407000">
+<node TEXT="Un noeud plié est symbolisé par un petit cercle du coté opposé au noeud central" FOLDED="true" ID="ID_1622399561" CREATED="1270892460688" MODIFIED="1275423339796">
+<node TEXT="Un symbole est affiché à droite du père lorsque ce noeud est plié" ID="ID_1009025506" CREATED="1277186799750" MODIFIED="1277186840156"/>
+</node>
+<node TEXT="Pour plier un noeud déplié utilisez "Navigation > Plier/Déplier le noeud" ou appuyez sur la touche barre d'espace." FOLDED="true" ID="ID_1439689412" CREATED="1270892460688" MODIFIED="1277186749906">
+<node TEXT="Noeud pour faire des tests de pliage" ID="ID_1962282484" CREATED="1277186863437" MODIFIED="1277186873640"/>
+</node>
+<node TEXT="Pour déplier un noeud plié utilisez "Navigation > Plier/Déplier le noeud" ou appuyez sur la touche barre d'espace." FOLDED="true" ID="ID_1386649707" CREATED="1270892460688" MODIFIED="1277186766703">
+<node TEXT="Noeud pour faire des tests de pliage" ID="ID_1631946742" CREATED="1277186863437" MODIFIED="1277186873640"/>
+</node>
+<node TEXT="Pour plier ou déplier les nœuds dans les niveaux, maintenez la touche Alt tout en utilisant la molette de la souris ou appuyez sur Alt + PageUp ou Alt + PageDown." ID="ID_926272054" CREATED="1270892460688" MODIFIED="1277187163671"/>
+<node TEXT="Pour déplier tous les noeuds, sélectionnez "Navigation > Tout déplier", ou cliquez sur l'icône représentant un "+" rouge cerclé ou Alt + End." ID="ID_1233324949" CREATED="1270892460688" MODIFIED="1277187125421"/>
+<node TEXT="Pour plier tous les nœuds, utilisez "Naviguation > Tout plier", ou cliquez sur le bouton "-" rouge cerclé, dans la barre d'outils principale, ou Alt + Home." ID="ID_1337518584" CREATED="1270892460688" MODIFIED="1277187110765"/>
+</node>
+<node TEXT="Faire défiler la carte" FOLDED="true" ID="Freeplane_Link_467411537" CREATED="1270892460689" MODIFIED="1277186988375" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Pour faire défiler la carte, cliquez sur l'arrière-plan puis déplacer votre souris ou utiliser la molette de la souris. Pour faire défiler horizontalement avec la molette de la souris, maintenez la touche Maj ou, sur certains systèmes d'exploitation, maintenez enfoncé l'un des boutons de la souris." ID="ID_1291243282" CREATED="1270892460689" MODIFIED="1277187026187">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Zoomer" FOLDED="true" ID="Freeplane_Link_913137192" CREATED="1270892460689" MODIFIED="1275423918718" COLOR="#407000">
+<node TEXT="Le menu Affichage contient les commandes "Augmenter le zoom", "Réduire le zoom" et "Faire tenir dans la page"" ID="ID_1270232158" CREATED="1272007214049" MODIFIED="1277224540437"/>
+<node TEXT="La barre d'outils principale contient un liste déroulante de niveaux de zoom. Ces paramètres peuvent également être choisis en appuyant sur Alt + flèche haut ou bas." ID="ID_1692671423" CREATED="1272007458262" MODIFIED="1277187274218"/>
+<node TEXT="Sur certains systèmes d'exploitation comme Windows vous pouvez effectuer un zoom en utilisant la molette de la souris tout en maintenant la touche Ctrl enfoncée." ID="ID_961139916" CREATED="1270892460689" MODIFIED="1277187299953"/>
+</node>
+<node TEXT="Chercher et Filtrer" FOLDED="true" ID="Freeplane_Link_423038022" CREATED="1270892460681" MODIFIED="1275424076578" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Vous pouvez rechercher et filtrer les nœuds en fonction de leur texte, de leurs icônes, de la date de création ou de modification, l'existence de connecteurs ou de liens hypertextes, du contenu des notes ou encore des attributs du noeud." ID="ID_1565729150" CREATED="1270896350974" MODIFIED="1277224579031"/>
+<node TEXT="Pour rechercher du texte ou d'autres critères dans un nœud et tous ses nœuds fils, utilisez Édition> Rechercher ... ou appuyez sur les touches Ctrl + F." ID="ID_966700848" CREATED="1270892460681" MODIFIED="1277224600718">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour atteindre le résultat suivant correspondant à votre recherche, utilisez la commande Edition> Rechercher suivant ou appuyez sur les touches Ctrl + G" ID="ID_1646223708" CREATED="1270892460681" MODIFIED="1277224635421">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="La recherche s'effectue par niveau : plus le noeud est loin du noeud de départ, plus le résultat sera trouvé tard." ID="ID_829330412" CREATED="1270892460681" MODIFIED="1277224718984"/>
+<node TEXT="La recherche s'effectue dans la carte courante et à partir de la position courante." ID="ID_779591913" CREATED="1270892460681" MODIFIED="1277225046328"/>
+<node TEXT="Pour effectuer un Rechercher/Remplacer, utilisez "Edition> Rechercher et remplacer ...". Il est aussi possible de recherche dans toutes les cartes actuellement ouvertes en choisissant "Edition> Rechercher et remplacer dans toutes les cartes."" ID="ID_1761633870" CREATED="1271096970387" MODIFIED="1277225086718"/>
+<node TEXT="Vous pouvez créer des filtres pour ne voir qu'un sous-ensemble de noeuds. Utilisez la barre d'outils Filtres ou le menu Filtres de la barre de menu." ID="ID_1773253238" CREATED="1270897010863" MODIFIED="1277225144187"/>
+</node>
+<node TEXT="Accéder à une autre carte" FOLDED="true" ID="Freeplane_Link_516331171" CREATED="1270892460688" MODIFIED="1275424616890" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Pour accéder à une carte déjà ouverte, sélectionnez-là dans le menu Cartes ou effectuez un clic droit sur le fond de la carte et sélectionnez la carte dans en haut du menu contextuel. Vous pouvez aussi utiliser le menu Navigation pour aller à la carte suivante / précédente." ID="ID_213892338" CREATED="1270892460689" MODIFIED="1277187409937">
+<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"/>
+</node>
+</node>
+</node>
+<node TEXT="Modifier le contenu d'une carte" FOLDED="true" POSITION="right" ID="ID_393070580" CREATED="1272091239258" MODIFIED="1277230218296" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Créer et éditer des noeuds" FOLDED="true" ID="_Freeplane_Link_1709752669" CREATED="1270892460670" MODIFIED="1275499429531" COLOR="#407000">
+<node TEXT="Pour créer un noeud fils, appuyer sur la touche "Insert"" ID="ID_847485935" CREATED="1270892460670" MODIFIED="1277225187078"/>
+<node TEXT="Insérer un noeud fils tout en éditant le noeud père est possible, toujours grâce à la touche "Insert"." ID="ID_719677235" CREATED="1270892460671" MODIFIED="1277225230687"/>
+<node TEXT="Pour créer un noeud frère en dessous du noeud d'origine, pressez la touche Entrée." ID="ID_1715555696" CREATED="1270892460671" MODIFIED="1277225242078"/>
+<node TEXT="Pour créer un noeud frère au dessus du noeud d'origine, pressez les touches Maj+Entrée." ID="ID_433487771" CREATED="1270892460671" MODIFIED="1277225272593"/>
+<node TEXT="Pour supprimer un noeud, utiliser la touche "Suppr"." ID="ID_1638437345" CREATED="1270892460671" MODIFIED="1277225278843"/>
+<node TEXT="Pour couper un noeud en vue de le coller ailleurs : Ctrl + X." ID="ID_1718916776" CREATED="1270892460671" MODIFIED="1277225289171"/>
+<node TEXT="Couper est également disponible dans le menu contextuel (clic droit de la souris)" ID="ID_86882063" CREATED="1270892460671" MODIFIED="1275499863562"/>
+</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"/>
+</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"/>
+</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"/>
+<node TEXT="Pour insérer un symbole spécial comme ©, utilisez un traitement de texte comme OpenOffice Writer, tapez le caractère, collez-le dans le presse-papier puis collez-le dans Freeplane." ID="ID_128741512" CREATED="1270892460672" MODIFIED="1277226166406"/>
+<node TEXT="Une fonction "Annuler" permet d'effacer toute opération d'édition." ID="ID_1608665009" CREATED="1270996862392" MODIFIED="1277226225640" LINK="#Freeplane_Link_1318678369"/>
+<node TEXT="Correcteur orthographique" FOLDED="true" ID="ID_1122067470" CREATED="1271096284570" MODIFIED="1277226230343" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Lors de l'édition d'un noeud, il est possible d'activer / désactiver la correction orthographique : choisissez la commande "Langues" dans le menu contextuel." ID="ID_784188803" CREATED="1271096294667" MODIFIED="1277226396500"/>
+<node TEXT="Les dictionnaires de nombreuses langues sont disponibles sur le site de Freeplane" ID="ID_1341966636" CREATED="1271096394315" MODIFIED="1277226279640" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"/>
+</node>
+</node>
+<node TEXT="Cliquer - Glisser" FOLDED="true" ID="Freeplane_Link_1024903226" CREATED="1270892460682" MODIFIED="1277226528625" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Vous pouvez déplacer les noeuds par Cliquer-Glisser" ID="ID_926620656" CREATED="1270892460682" MODIFIED="1277226500937">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="L'action est possible en utilisant le clavier : touche Ctrl et les touches flèchées" ID="ID_1633776428" CREATED="1271027579490" MODIFIED="1277226474875"/>
+<node TEXT="Pour déplacer un noeud et en faire un noeud fils, le lacher sur la partie extérieure du noeud père" ID="ID_1311351928" CREATED="1270892460682" MODIFIED="1275506185937">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour déplacer un noeud et en faire un noeud frère, le lacher sur la partie supérieure du noeud frère" ID="ID_716707755" CREATED="1270892460683" MODIFIED="1277226552562">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour copier plutôt que déplacer, maintenir en même temps la touche Ctrl enfoncée" ID="_Freeplane_Link_1994214827" CREATED="1270892460683" MODIFIED="1277226568671">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour ouvrir une carte existante, faire un glisser-déposer du fichier dans Freeplane." ID="ID_694691711" CREATED="1270892460683" MODIFIED="1277226605765"/>
+<node TEXT="Pour ajouter un noeud avec un lien vers un fichier, faire un glisser-déposer du fichier à partir de l'explorateur vers le noeud père." ID="ID_1756497395" CREATED="1270892460683" MODIFIED="1277226693671"/>
+<node TEXT="Des données d'applications externes peuvent être déposées (exemple : adresse d'un site Web)." ID="ID_1101346302" CREATED="1270892460683" MODIFIED="1277226825296"/>
+</node>
+<node TEXT="Positionnement libre" FOLDED="true" ID="ID_1293447241" CREATED="1270997738611" MODIFIED="1277226832953" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Pour déplacer un noeud, saisir avec la souris la forme ovale qui s'affiche sur le bord, au passage de la souris. Cette poingée est placée entre le noeud et son noeud père." ID="_Freeplane_Link_97763226" CREATED="1270892460688" MODIFIED="1277226944921"/>
+<node TEXT="La position des noeuds modifie seulement l'aspect visuel de la carte, mais pas sa structure." ID="ID_505978546" CREATED="1270997770751" MODIFIED="1275510115546"/>
+<node TEXT="Pour passer un noeud de la gauche vers la droite (ou inversement) du noeud central, utiliser le cliquer-glisser plutôt que le positionnement libre." ID="ID_846513064" CREATED="1270998153408" MODIFIED="1277226991875"/>
+</node>
+<node TEXT="Copier et coller" FOLDED="true" ID="ID_1719642324" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#338800">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Vous pouvez copier et coller des nœuds entre plusieurs cartes mentales. Vous pouvez coller du texte normal ou HTML issu d'autres applications." ID="Freeplane_Link_1571910999" CREATED="1275508661656" MODIFIED="1277227031609">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Si vous collez du texte simple, chaque ligne sera collée comme un nouveau nœud, leur profondeur étant déterminée par le nombre d'espaces qui précède le texte. Voir l'exemple ci-dessous." ID="Freeplane_Link_165406975" CREATED="1275508661656" MODIFIED="1277227070718"/>
+<node TEXT="Arbre
     Chêne
     Hêtre
     " FOLDED="true" ID="Freeplane_Link_943101487" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<node TEXT="sera collé en" FOLDED="true" ID="Freeplane_Link_267060832" CREATED="1275508661656" MODIFIED="1275508661656">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Arbre" FOLDED="true" ID="Freeplane_Link_285220432" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Chêne" ID="Freeplane_Link_352947280" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Hêtre" ID="Freeplane_Link_1194865403" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Si vous collez du HTML, il sera collé en texte simple. De plus, les liens contenus dans le HTML seront collés en tant que fils d'un nœud additionnel nommé "Liens". Voir l'exemple ci-dessous." ID="Freeplane_Link_157221316" CREATED="1275508661656" MODIFIED="1277227183937"/>
+<node TEXT="Résultat après collage" FOLDED="true" ID="Freeplane_Link_940552864" CREATED="1275508661656" MODIFIED="1277227155109">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Courses (120236)" ID="Freeplane_Link_1484951435" CREATED="1275508661656" MODIFIED="1275508661656">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vie Urbaine (19)" ID="Freeplane_Link_275151874" CREATED="1275508661656" MODIFIED="1275508661656">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Liens" FOLDED="true" ID="Freeplane_Link_39742718" CREATED="1275508661656" MODIFIED="1275508661656">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Courses" ID="Freeplane_Link_95869894" CREATED="1275508661656" MODIFIED="1275508661656" LINK="http://directory.google.com/Top/Shopping/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vie Urbaine" ID="Freeplane_Link_1132489344" CREATED="1275508661656" MODIFIED="1275508661656" LINK="http://directory.google.com/Top/Home/Urban_Living/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Si vous copiez une liste de fichiers sélectionnés dans l'explorateur Microsoft Windows, il seront collés comme des liens vers ces fichiers." ID="Freeplane_Link_413367976" CREATED="1275508661656" MODIFIED="1275508661656"/>
+<node TEXT="Si vous copiez une branche dans Freeplane et que vous la collez dans un éditeur de texte simple, l'arbre sera matérialisé par une indentation. Les hyperliens seront collés entre les signes <>. Voir l'exemple ci-dessous." ID="Freeplane_Link_75825075" CREATED="1275508661656" MODIFIED="1277227294625"/>
+<node TEXT="Exemple" FOLDED="true" ID="ID_500284865" CREATED="1277227236500" MODIFIED="1277227267281" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Arbre" FOLDED="true" ID="Freeplane_Link_739845612" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Chêne" ID="Freeplane_Link_1866748000" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<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/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="est collé en" FOLDED="true" ID="Freeplane_Link_1270096625" CREATED="1275508661656" MODIFIED="1275508661656">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Arbre
     Chêne
     Hêtre
     Google <http://www.google.com/>" ID="Freeplane_Link_910586297" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Si vous copiez une branche dans Freeplane et que vous la collez dans un éditeur de texte qui interprète le Rich Text Format, la mise en forme sera également collée, y compris les couleurs et les polices. Les liens hypertextes seront collés entre les signes <>, comme pour le texte simple. Parmi les éditeurs qui interprètent le Rich Text Format on peut citer Microsoft Word, Wordpad ou Microsoft Outlook et quelques outils de prise de notes sous Linux." ID="Freeplane_Link_262200214" CREATED="1275508661656" MODIFIED="1277227345015"/>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="Freeplane_Link_789925322" CREATED="1275508661625" MODIFIED="1277228025703">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</node>
+<node ID="ID_1008928081" CREATED="1275508661625" MODIFIED="1277228039843">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 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>
+</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"/>
+<node TEXT="Lien ftp" ID="Freeplane_Link_97422033" CREATED="1275508661625" MODIFIED="1277228298015" LINK="ftp://download.free.fr">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Lien UNC : \\SERVEUR\PARTAGE" ID="ID_305206417" CREATED="1277228326765" MODIFIED="1277228364562" LINK="smb://SERVEUR/PARTAGE"/>
+</node>
+</node>
+<node TEXT="Ajouter des icônes" FOLDED="true" ID="ID_1513150791" CREATED="1275508661625" MODIFIED="1277228411906" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Un nœud peut avoir plusieurs icônes." ID="Freeplane_Link_1719246999" CREATED="1275508661625" MODIFIED="1275508661625"/>
+<node TEXT="Pour ajouter une icône à un nœud, sélectionnez un nœud et choisissez l'une des icônes de la barre d'outils à gauche. Pendant votre déplacement vers cette barre d'outils, maintenez la touche "Alt" ou "Ctrl" pressée pour ne pas perdre la sélection de noeud en cours." ID="Freeplane_Link_573733331" CREATED="1275508661640" MODIFIED="1277228544062"/>
+<node TEXT="Pour retirer une icône, cliquez sur l'un des icônes avec la croix rouge affichés en haut de la barre d'outils icônes." ID="Freeplane_Link_192593700" CREATED="1275508661640" MODIFIED="1277228617312"/>
+<node TEXT="Pour retirer toutes les icônes, cliquez sur la poubelle en haut de la barre d'outils icônes." ID="Freeplane_Link_1662563363" CREATED="1275508661640" MODIFIED="1277228672234"/>
+<node TEXT="Pour ajouter une icône sans passer par la barre d'outils, utilisez les touches Alt + I." ID="Freeplane_Link_946113090" CREATED="1275508661640" MODIFIED="1277228708015"/>
+<node TEXT="Il n'est pas possible d'utiliser vos propres icônes; votre choix est restreint à la bibliothèque d'icônes de freeplane." ID="Freeplane_Link_1880472460" CREATED="1275508661640" MODIFIED="1277228801156"/>
+<node TEXT="Exemples d'icônes attachées à ce nœud." ID="Freeplane_Link_1874089667" CREATED="1275508661640" MODIFIED="1277228832656">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="icon_not_found"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<icon BUILTIN="licq"/>
+<icon BUILTIN="full-1"/>
+<icon BUILTIN="full-2"/>
+<icon BUILTIN="0%"/>
+<icon BUILTIN="50%"/>
+<icon BUILTIN="75%"/>
+<icon BUILTIN="100%"/>
+</node>
+<node TEXT="Le menu "Outils > Préférences > Appparences > Organiser la barre d'icônes" permet de regrouper les icônes par catégorie." ID="ID_26845444" CREATED="1271096826323" MODIFIED="1277228897078"/>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <u>à ce noeud est associée <b>une note.</b></u>
+ </p>
+ </body>
+</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"/>
+<node TEXT="Il est possible de définir la position de l'éditeur, parmi 4 positions : menu Affichage > Position de l'éditeur de notes." ID="ID_1710319301" CREATED="1271096150723" MODIFIED="1277229014218"/>
+</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"/>
+</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"/>
+<node TEXT="Pour changer les flèches d'un connecteur, utilisez le menu contextuel du connecteur." ID="ID_219575116" CREATED="1275400917613" MODIFIED="1277229309375"/>
+<node TEXT="Pour effacer un lien, utilisez le menu contextuel du lien." ID="Freeplane_Link_1406908692" CREATED="1275400917613" MODIFIED="1275400917613"/>
+<node TEXT="Pour vous déplacer jusqu'à l'extrémité d'un connectreur, utilisez le menu contextuel du lien." ID="ID_865762760" CREATED="1275400917613" MODIFIED="1277229407593"/>
+<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"/>
+</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"/>
+</node>
+</node>
+</node>
+<node TEXT="Ajouter des attributs" FOLDED="true" ID="ID_540307688" CREATED="1270896851973" MODIFIED="1275766620812" COLOR="#407000">
+<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 NAME="x" VALUE="10"/>
+<attribute NAME="y" VALUE="20"/>
+</node>
+<node TEXT=""Edition > Modifier les attributs" ou Alt + F9 pour modifier les attributs d'un seul noeud" ID="ID_541565942" CREATED="1270896865255" MODIFIED="1277229598046"/>
+<node TEXT="Utiliser "Outils > Modifier les attributs..." pour ajouter ou modifier des attributs pour plusieurs noeuds" ID="ID_1213222306" CREATED="1270896956119" MODIFIED="1277229646343"/>
+</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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h3>
+ Exemple HTML
+ </h3>
+ <p class="msonormal">
+ Plusieurs points:
+ </p>
+ <ul type="disc">
+ <li>
+ Point un
+ </li>
+ <li>
+ Point deux
+ </li>
+ </ul>
+ <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">
+ <tr>
+ <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt">
+ <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">
+ <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">
+ <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">
+ <p class="msonormal">
+ Cellulle4
+ </p>
+ </td>
+ </tr>
+ </table>
+ <p class="msonormal">
+ Et plusieurs <font color="#999900">couleurs</font> de <font color="#336600">caractères</font> sont possibles.
+ </p>
+ </body>
+</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"/>
+</node>
+</node>
+<node TEXT="Utiliser des images dans les nœuds" FOLDED="true" ID="ID_1125624716" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Insérer une image : touches Alt + Maj + K, ou dans le menu contextuel du nœud Insérer > Image. L'insertion d'une image efface le texte déjà présent dans le nœud. Les images insérées par cette méthode ne sont pas collées correctement en dehors de Freeplane et ne sont pas non plus bien exportées en HTML." ID="Freeplane_Link_1724581202" CREATED="1275400917643" MODIFIED="1277229776921"/>
+<node TEXT="Les formats d'images gérés sont les PNG, JPEG et GIF." ID="Freeplane_Link_1206759193" CREATED="1275400917643" MODIFIED="1275400917643"/>
+<node TEXT="Transformer un lien vers une image en image visible: touches ALT + SHIFT + K. Vous pouvez glisser-déposer plusieurs fichiers d'images dans Freeplane, sélectionnez les comme nœuds multiples, et transformez-les en images en pressant les touches ALT + SHIFT + K." ID="Freeplane_Link_281524923" CREATED="1275400917643" MODIFIED="1277229803453"/>
+<node TEXT="Il existe une approche plus technique et moins facile d'accès pour insérer une image. Il est possible d'inclure du HTML dans les nœuds. Démarrez le contenu du nœud avec la balise <html>. De cette manière, vous pouvez afficher des images dans les nœuds." ID="Freeplane_Link_1654024039" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#000000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Par exemple
  <html><img src="linked/Apple.png">
  <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">" ID="Freeplane_Link_1390666393" CREATED="1275400917643" MODIFIED="1275400917643">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vous pouvez utiliser des liens relatifs pour les images" ID="Freeplane_Link_1043020605" CREATED="1275400917643" MODIFIED="1275400917643">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</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">
+<html>
+ <head>
+ <style type="text/css">
+ <!--<!<!<!<!<!<!<!<!<!<!<!<!
+ body { background-color: #ffffff; font-size: 12pt; font-family: SansSerif }
+ p { margin-top: 0 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_networks.jpg" />
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node ID="Freeplane_Link_163698799" CREATED="1124560950732" MODIFIED="1194968767171">
+<richcontent TYPE="NODE">
+<html>
+ <head>
+ <style type="text/css">
+ <!--<!<!<!<!<!<!<!<!<!<!<!<!
+ p { margin-top: 0 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_wizard.jpg" />
+ </p>
+ </body>
+</html></richcontent>
+</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 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <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>
+ <head>
+ <style type="text/css">
+ <!--<!<!<!<!<!<!<!<!<!<!<!<!
+ p { margin-top: 0 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <img src="file:/C:/Windows/Help/Tours/htmltour/end_up.jpg" />
+ </p>
+ </body>
+</html></richcontent>
+</node>
+</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 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <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>
+ <head>
+ <style type="text/css">
+ <!--<!<!<!<!<!<!<!<!<!<!<!<!
+ p { margin-top: 0 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <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>
+ <head>
+ <style type="text/css">
+ <!--<!<!<!<!<!<!<!<!<!<!<!<!
+ p { margin-top: 0 }
+ -->
+ </style>
+
+ </head>
+ <body>
+ <p>
+ <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACSUMIPT.GIF" />
+ </p>
+ </body>
+</html></richcontent>
+</node>
+</node>
+</node>
+<node TEXT="GLOBE.WMF" ID="Freeplane_Link_767819854" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="Freeplane_Link_768730129" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+<node TEXT="Utiliser LaTeX dans les noeuds" FOLDED="true" ID="ID_1060978136" CREATED="1271097112611" MODIFIED="1275766901468" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Exemple : LaTeX multi-lignes attaché à un noeud" ID="ID_651820837" CREATED="1271097206186" MODIFIED="1277229953562">
+<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 TEXT="Pour ajouter LaTeX à un noeud, utilisez la fonction Insérer > Latex" ID="ID_1042304226" CREATED="1271097123195" MODIFIED="1277229868765"/>
+<node TEXT="Pour modifier le texte LaTeX inséré dans le noeud, cliquez sur l'image affichée sous le noeud." ID="ID_21055085" CREATED="1271097312474" MODIFIED="1277229970250"/>
+<node TEXT="Pour retirer l'image LaTeX, modifiez le texte LaTeX puis effacer le contenu présent dans la fenêtre." ID="ID_1638605492" CREATED="1271097172667" MODIFIED="1277230052828"/>
+</node>
+<node TEXT="Annulation" FOLDED="true" ID="Freeplane_Link_1318678369" CREATED="1270892460689" MODIFIED="1275767292656" COLOR="#407000">
+<node TEXT="Pour annuler une action, utiliser Edition > Annuler ou Ctrl + Z" ID="ID_1877729417" CREATED="1270892460690" MODIFIED="1277230076093"/>
+<node TEXT="Pour rétablir une action, utiliser Edition > Rétablir ou Ctrl +Y" ID="ID_1501637074" CREATED="1270892460690" MODIFIED="1277230076093"/>
+<node TEXT="Pour définir le nombre maximum de retours arrière possibles, utilisez Outils > Préférences > Comportement > Annulation." ID="ID_139456632" CREATED="1270892460690" MODIFIED="1277230104531"/>
+</node>
+</node>
+<node TEXT="Mise en forme" FOLDED="true" POSITION="right" ID="ID_326068339" CREATED="1272091260034" MODIFIED="1277230218296" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Mode d'affichage des cartes" FOLDED="true" ID="ID_710714991" CREATED="1271095870732" MODIFIED="1277332287562" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Une carte peut s'afficher sous forme de Carte ou de Plan" ID="ID_1920188221" CREATED="1271095880163" MODIFIED="1277386678750"/>
+<node TEXT="Pour basculer entre ces 2 modes d'affichage : sélectionnez Affichage > Vue Plan" ID="ID_353099197" CREATED="1271095880163" MODIFIED="1277332237640"/>
+</node>
+<node TEXT="Mise en forme d'un noeud" FOLDED="true" ID="Freeplane_Link_1660149394" CREATED="1270892460672" MODIFIED="1277386694343" COLOR="#407000">
+<node TEXT="Texte en gras : Mise en Forme > Gras ou Ctrl + B" ID="ID_896067797" CREATED="1270892460672" MODIFIED="1275768158046">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Texte en italique : Mise en Forme > Italique ou Ctrl + I." ID="ID_1435353677" CREATED="1270892460673" MODIFIED="1275768153781">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour modifier la couleur du texte d'un noeud, Mise en Forme > Couleur du texte ou Alt + Maj + F" ID="ID_786808182" CREATED="1270892460673" MODIFIED="1277389101546">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour modifier l'arrière plan d'un noeud : Mise en Forme > Couleur de fond du noeud" ID="ID_256179041" CREATED="1270892460673" MODIFIED="1277388108203"/>
+<node TEXT="Pour augmenter la taille du texte d'un noeud : Mise en Forme + Augmenter la taille du texte ou Ctrl + PLUS (pas celui du pavé numérique)." ID="ID_1900176546" CREATED="1270892460673" MODIFIED="1277388131265">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Pour diminuer la taille du texte d'un noeud : Mise en Forme + Diminuer la taille du texte ou Ctrl + MOINS (pas celui du pavé numérique)." ID="ID_1484559422" CREATED="1270892460673" MODIFIED="1277388441578">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Toutes ces fonctions sont également disponibles dans le menu contextuel, sous Mise en Forme" ID="ID_817931500" CREATED="1271977602378" MODIFIED="1275768447859"/>
+<node TEXT="Pour modifier la police du texte, utilisez la barre d'outils" ID="ID_975697332" CREATED="1270892460674" MODIFIED="1277389074140"/>
+<node TEXT="Pour copier la mise en Forme : Edition > Copier la Mise en Forme ou Alt + Maj + C" FOLDED="true" ID="ID_880893737" CREATED="1270892460674" MODIFIED="1277389095984">
+<node TEXT="Ensuite pour Coller la mise en forme : Edition > Coller la mise en forme ou Alt + Maj + V" ID="ID_52099291" CREATED="1270892460674" MODIFIED="1277389172671"/>
+</node>
+</node>
+<node TEXT="Mise en forme des lignes" FOLDED="true" ID="ID_1797063061" CREATED="1270896049950" MODIFIED="1277389722968" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Il existe différents styles de lignes" ID="ID_171466211" CREATED="1270896067862" MODIFIED="1275768858500"/>
+<node TEXT="Il est aussi possible de modifier leurs couleurs et leur épaisseur et même de les rendre invisible (= couleur de ligne identique à la couleur de fond de la carte)." ID="ID_147950395" CREATED="1270896109110" MODIFIED="1277389235000"/>
+<node TEXT="Les choix du menu Mise en forme incluent la couleur, le style et l'épaisseur" ID="ID_835600675" CREATED="1270896191326" MODIFIED="1277389266859"/>
+<node TEXT="Exemple 1" FOLDED="true" ID="ID_1959289213" CREATED="1270896156486" MODIFIED="1277389391984">
+<edge STYLE="horizontal" COLOR="#ff0033"/>
+<node TEXT="Il existe différents styles de lignes" ID="ID_213610345" CREATED="1270896067862" MODIFIED="1275768988296"/>
+<node TEXT="Il est aussi possible de modifier leurs couleurs et leur épaisseur" ID="ID_525537821" CREATED="1270896096758" MODIFIED="1275769004046"/>
+<node TEXT="ou les rendre invisible." ID="ID_994729391" CREATED="1270896109110" MODIFIED="1275769015984"/>
+</node>
+<node TEXT="Exemple 2" FOLDED="true" ID="ID_563742809" CREATED="1270896156486" MODIFIED="1277389468750">
+<edge STYLE="sharp_bezier"/>
+<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">
+<edge COLOR="#0033cc" WIDTH="8"/>
+</node>
+<node TEXT="ou les rendre invisible." ID="ID_1737604780" CREATED="1270896109110" MODIFIED="1277389558593" HGAP="23" VSHIFT="17">
+<edge STYLE="hide_edge" COLOR="#ffffff" WIDTH="thin"/>
+</node>
+</node>
+</node>
+<node TEXT="Utiliser les styles" FOLDED="true" ID="Freeplane_Link_526328879" CREATED="1270892460674" MODIFIED="1275769238843" COLOR="#407000">
+<node TEXT="Pour appliquer un style, sélectionner le style dans le menu Mise en Forme > Styles. Cette fonction est également accessible par le menu contextuel. Pour appliquer un style rapidement, utliser les raccourcis clavier." ID="ID_284671582" CREATED="1270892460674" MODIFIED="1275769336125"/>
+<node TEXT="Pour ajouter ou modifier vos propres styles : Mise en Forme > Style > Gérer les styles" ID="ID_58326768" CREATED="1270892460674" MODIFIED="1275769394375"/>
+</node>
+<node TEXT="Mise en forme automatique" FOLDED="true" ID="ID_1561765534" CREATED="1271096555907" MODIFIED="1275769405734" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Les noeuds peuvent être mis en forme automatiquement, attention la mise en forme s'applique à l'ensemble de la carte." ID="ID_287999249" CREATED="1271096587963" MODIFIED="1277389693250"/>
+<node TEXT="Cette fonction est accessible dans : Mise en Forme > Mise en forme automatique" ID="ID_495596648" CREATED="1271096619675" MODIFIED="1277389762125"/>
+<node TEXT="Les styles utilisés pour la mise en forme automatique sont définis dans Outils > Préférences > Mise en forme automatique" ID="ID_1097930287" CREATED="1277389817718" MODIFIED="1277389863125"/>
+</node>
+<node TEXT="Mettre en valeur des nœuds avec les nuages" FOLDED="true" ID="ID_1738955481" CREATED="1275400917613" MODIFIED="1275400917613" COLOR="#407000">
+<node TEXT="Les nuages sont bien adaptés pour la mise en valeur d'une région. La mise en valeur s'applique à un nœud et tous ses fils." ID="Freeplane_Link_1216114345" CREATED="1275400917613" MODIFIED="1277389940531"/>
+<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"/>
+<node TEXT="... ou le marron." ID="Freeplane_Link_1420920637" CREATED="1275400917613" MODIFIED="1277390145671" COLOR="#ffffff">
+<cloud COLOR="#993300" WIDTH="0"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Préférences" FOLDED="true" POSITION="right" ID="ID_827349258" CREATED="1271021855439" MODIFIED="1277230218281" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Modifier les préférences" FOLDED="true" ID="ID_1624330515" CREATED="1275400917643" MODIFIED="1277390181421" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Menu Outils > Préférences. La plupart des changements prennent effet après un redémarrage de Freeplane." ID="Freeplane_Link_1234344968" CREATED="1275400917643" MODIFIED="1277390195296"/>
+<node TEXT="Les préférences incluent les raccourcis claviers, les caractéristiques de l'export HTML, la façon de sélectionner un nœud avec la souris, le lissage et plus encore." ID="Freeplane_Link_259902657" CREATED="1275400917643" MODIFIED="1277390229250"/>
+</node>
+<node TEXT="Utiliser le verrouillage "expérimental" de carte" FOLDED="true" ID="Freeplane_Link_825964200" CREATED="1275400917643" MODIFIED="1277390295500" COLOR="#407000">
+<node TEXT="Le verrouillage de fichier empêche l'accès simultané de plusieurs utilisateurs à une même carte, ce qui évite aux uns d'effacer accidentellement les données des autres." ID="Freeplane_Link_926280662" CREATED="1275400917643" MODIFIED="1275400917643"/>
+<node TEXT="La version actuelle de Freeplane expérimente le verrouillage de fichier, désactivé par défaut.
Cette option devrait fonctionner pour les cas les plus fréquents d'accès simultanés à la même carte." ID="Freeplane_Link_789648148" CREATED="1275400917643" MODIFIED="1277390425421"/>
+</node>
+<node TEXT="Imprimer" FOLDED="true" ID="ID_1729491088" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Vou pouvez imprimer soit en ajustant la carte sur une page, ou en utilisant plusieurs feuilles de papier. Vous faites ce choix dans le menu: Fichier > Mise en Page" ID="Freeplane_Link_695293333" CREATED="1275400917643" MODIFIED="1275400917643"/>
+<node TEXT="Pour une utilisation optimale de l'espace de la feuille, dans la mise en page choisissez le format Paysage qui est plus adapté à la grande majorité des cartes." ID="Freeplane_Link_467598056" CREATED="1275400917643" MODIFIED="1277390524468">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vous pouvez également imprimer depuis votre navigateur internet après un export HTML, ou depuis Word ou Wordpad après y avoir copié/collé la carte. Si vous exportez la carte en HTML avec en-têtes et que vous la copiez/collez dans Microsoft Word, vous pourrez modifier les styles à votre convenance." ID="Freeplane_Link_1073337160" CREATED="1275400917643" MODIFIED="1275400917643">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Scripts" FOLDED="true" ID="ID_1046070222" CREATED="1271021863642" MODIFIED="1275769766843" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Les fonctions de Freeplane peuvent être étendues grâce aux scripts Groovy" FOLDED="true" ID="ID_871333484" CREATED="1271022419501" MODIFIED="1275769823875">
+<node TEXT="Groovy sont accessibles dans la carte au moyen d'API de scripts" ID="ID_893034881" CREATED="1271022419501" MODIFIED="1275769958812"/>
+<node TEXT="Les scripts peuvent utiliser quelques fonctionnalités offertes par des librairies inclues dans Freeplane" ID="ID_21879568" CREATED="1271022419501" MODIFIED="1275770046546"/>
+</node>
+<node TEXT="Les scripts peuvent être définis de 3 façons" FOLDED="true" ID="ID_1916933814" CREATED="1271022419501" MODIFIED="1275770309125">
+<node TEXT="Les scripts externes Groovy peuvent être intégrés simplement en indiquant à Freeplane où ils se trouvent. Ces scripts peuvent être utilisés comme n'importe quelle fonction intégrée à Freeplane." ID="ID_905639720" CREATED="1271022419501" MODIFIED="1277390566406"/>
+<node TEXT="Les styles comportent une zone de scripts qui peuvent être assignés au(x) noeud(s) sélectionné(s)" ID="ID_1457942941" CREATED="1271022419501" MODIFIED="1275770189171"/>
+<node TEXT="Les scripts locaux peuvent être assignés via les attributs. Ces scripts sont inclus à la carte. Un éditeur de script est inclus dans Freeplane et permet d'éditer les scripts de la carte en cours." ID="ID_1545994363" CREATED="1271022419501" MODIFIED="1277390584671"/>
+</node>
+<node TEXT="Lien vers la page Groovy du Wiki Freeplane" ID="ID_476511397" CREATED="1271022540079" MODIFIED="1277390596078" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting"/>
+</node>
+<node TEXT="Import, Export
et Intégration avec d'autres outils" FOLDED="true" ID="ID_1155373089" CREATED="1271022654767" MODIFIED="1277391587484" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Exporter en HTML" FOLDED="true" ID="ID_1440350065" CREATED="1275400917628" MODIFIED="1275400917628" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Exporter une branche en HTML: touche Ctrl + H. Les pages exportées en HTML peuvent embarquer des fonctionnalités de pliage, paramétrable dans le menu Outils > Préférences > HTML" ID="Freeplane_Link_407018809" CREATED="1275400917628" MODIFIED="1277390658609"/>
+<node TEXT="Pour utiliser une autre fonction d'export, menu Fichier > Exporter > En XHTML (version Javascript)" ID="Freeplane_Link_1302491778" CREATED="1275400917628" MODIFIED="1275400917628"/>
+<node TEXT="Exporter la carte avec une image d'ensemble cliquable sous HTML, menu Fichier > Export > En XHTML (image cliquable)" ID="Freeplane_Link_1434016102" CREATED="1275400917628" MODIFIED="1275400917628"/>
+</node>
+<node TEXT="Exporter en image" FOLDED="true" ID="ID_1839752927" CREATED="1275400917628" MODIFIED="1277390701156" COLOR="#407000">
+<node TEXT="Exporter la carte en image PNG, menu Fichier > Exporter > En PNG" ID="Freeplane_Link_254470028" CREATED="1275400917628" MODIFIED="1275400917628"/>
+<node TEXT="Exporter la carte en image JPEG, menu Fichier > Exporter > En JPEG" ID="Freeplane_Link_237937736" CREATED="1275400917628" MODIFIED="1275400917628"/>
+</node>
+<node TEXT="Exporter en XML" FOLDED="true" ID="ID_600592784" CREATED="1275400917628" MODIFIED="1277390746218" COLOR="#407000">
+<node TEXT="Exporter la carte dans un format XML pour lequel
vous avec la feuille XSLT, menu Fichier > Exporter > En utilisant XSLT" FOLDED="true" ID="Freeplane_Link_1640331795" CREATED="1275400917628" MODIFIED="1277390769781">
+<node TEXT="L'utilisation d'une XSLT applique une transformation XSL à la carte Freeplane pour créer un nouveau fichier" ID="ID_1796935486" CREATED="1270897200986" MODIFIED="1277390773671"/>
+<node TEXT="Dans la boite de dialogue, le "Type de fichier" permet de sélectionner le format d'exportation." ID="ID_1457131583" CREATED="1270897200986" MODIFIED="1275771506984"/>
+<node TEXT="Les fichiers XLST doivent être stockés dans le sous-répertoire XSLT du répertoire Freeplane (ex. : C:\Program Files\Freeplane\xslt\) ou dans le répertoire utilisateur Freeplane (ex. ~/.freeplane/xslt/)." ID="ID_968478102" CREATED="1270897200992" MODIFIED="1277390831984"/>
+<node TEXT="Les fichiers XSL doivent posséder l'extension *.xsl et contenir dans l'une des 5 premières lignes le code suivant :

MINDMAPEXPORT extensions description" ID="ID_1304075824" CREATED="1270897201015" MODIFIED="1277391638578"/>
+</node>
+<node TEXT="Exporter la carte dans un document OpenOffice Writer
menu Fichier > Exporter > En document OpenOffice Writer" ID="Freeplane_Link_1314963260" CREATED="1275400917628" MODIFIED="1277391040515"/>
+</node>
+<node TEXT="Importer la structure du système de fichiers" FOLDED="true" ID="ID_1185019034" CREATED="1275400917628" MODIFIED="1275400917628" COLOR="#407000">
+<font NAME="Dialog" SIZE="12"/>
+<node TEXT="Pour importer la structure des répertoires, dans le contexte d'un nœud, menu Fichier > Importer > Une arborescence de répertoires. Choisissez le répertoire pour lequel vous désirez importer l'arborescence. Par arborescence, nous entendons l'arbre de tous les sous-repertoires, avec les liens vers les dossiers et fichiers que contiennent ces sous-répertoires. Suit un exemple d'arborescence de fichiers importée." ID="Freeplane_Link_947129573" CREATED="1275400917628" MODIFIED="1277391163281"/>
+<node TEXT="Exemple" FOLDED="true" ID="Freeplane_Link_194372032" CREATED="1275400917628" MODIFIED="1275400917628" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Répertoire choisi" FOLDED="true" ID="Freeplane_Link_544626837" CREATED="1275400917628" MODIFIED="1275400917628" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="Freeplane_Link_1055412959" CREATED="1275400917628" MODIFIED="1275400917628" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Dbwiz" FOLDED="true" ID="Freeplane_Link_262747655" CREATED="1275400917628" MODIFIED="1275400917628" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_65250416" CREATED="1275400917628" MODIFIED="1275400917628" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_1595661271" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_231442664" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_1360061137" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_376841763" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_1533129270" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_567199608" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_1436240796" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_837484841" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_47859177" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
+</node>
+<node TEXT="Styles" FOLDED="true" ID="Freeplane_Link_814519219" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_1426370157" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_1170266360" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_1479427470" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_1486476222" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1599514683" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_168147974" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1135881326" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_1705204537" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_858674823" CREATED="1275400917643" MODIFIED="1275400917643" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+</node>
+<node TEXT="Importer les favoris d'Internet Explorer" FOLDED="true" ID="ID_1227889239" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Pour importer les favoris d'Internet Explorer dans Freeplane, menu Fichier > Importer > Les favoris d'Internet Explorer. Entrez le répertoire où sont stockés les favoris. Le nom du répertoire est "favoris". En Windows 2000 vous le trouverez sur votre disque dans le chemin C:\Documents and Settings\<user>\Favoris" ID="ID_1401615924" CREATED="1275400917643" MODIFIED="1277391299937"/>
+</node>
+<node TEXT="Importer une carte mentale de MindManager X5" FOLDED="true" ID="ID_1978256062" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#407000">
+<node TEXT="menu Fichier > Importer > Carte MindManager X5" ID="Freeplane_Link_1459845334" CREATED="1275400917643" MODIFIED="1277391343109"/>
+</node>
+<node TEXT="Intégration avec un traitement de texte et
la messagerie électronique" FOLDED="true" ID="ID_868508980" CREATED="1275400917643" MODIFIED="1277391520656" COLOR="#338800">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Vous pouvez coller des cartes ou des branches dans Microsoft Word, Wordpad ou dans des messages Outlook/ThunderBird/ Lotus Notes. En réalité, vous pouvez coller des cartes, des branches ou des noeuds dans toute application qui interprète le format Rich Text Format. La mise en forme du texte ainsi que les liens sont copiés." ID="Freeplane_Link_459841375" CREATED="1275400917643" MODIFIED="1277391442671">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Cliquer sur un lien mail (mailto:don.bonton at supermail.com) ouvrira votre messagerie pour créer un nouveau message." ID="Freeplane_Link_953624663" CREATED="1275400917643" MODIFIED="1275400917643" LINK="mailto:don.bonton at supermail.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Vous pouvez ajouter un sujet au mail (mailto:don.bonton at supermail.com?subject=Last phone call)" ID="Freeplane_Link_1495500722" CREATED="1275400917643" MODIFIED="1275400917643" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
+</node>
+</node>
+<node TEXT="Sauvegarde automatique" FOLDED="true" ID="ID_1283343603" CREATED="1271096741387" MODIFIED="1275772220953" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Freeplane crée un sous-répertoire nommé .backup dans chaque répertoire qui contient des cartes modifiées. Les anciennes cartes sont sauvegardées à cet endroit, ainsi que les copies automatiques des cartes modifiées. Ces copies portent l'extension ".autosave"." ID="ID_1590067344" CREATED="1271096749626" MODIFIED="1277391612203"/>
+<node TEXT="Par défaut, une sauvegarde automatique a lieu toutes les minutes et les 10 dernières sauvegardes sont conservées. Vous pouvez les utiliser en cas de plantage de Freeplane, lire ci-dessous." ID="ID_1073721425" CREATED="1271177847312" MODIFIED="1277391704046"/>
+<node TEXT="Pour restaurer un fichier sauvegardé automatiquement, il convient de renommer le fichier en supprimant l'extension .autosave et de supprimer le numéro d'ordre de la sauvegarde automatique.
Exemple : freeplane.mm.10.autosave devra être renommé en freeplane.mm" ID="ID_206842943" CREATED="1271178201859" MODIFIED="1275772670593"/>
+<node TEXT="Les sauvegardes automatiques sont paramétrables via le menu Outils > Préférences > Environnement > Enregistrement automatique." ID="ID_3064437" CREATED="1271178347062" MODIFIED="1277391827468"/>
+</node>
+</node>
+<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="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>
+<node TEXT="Installation" FOLDED="true" POSITION="left" ID="ID_1818783850" CREATED="1275400917568" MODIFIED="1275400917568" COLOR="#006633">
+<node TEXT="Liens" FOLDED="true" ID="ID_1552509738" CREATED="1275400917568" MODIFIED="1277391854359" COLOR="#006699">
+<node TEXT="Download the Java Runtime Environment (at least J2RE1.5)" ID="ID_1620747952" CREATED="1270892460639" MODIFIED="1270895438071" LINK="http://java.sun.com/javase/downloads/index.jsp">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Télécharger l'application Freeplane" ID="_Freeplane_Link_1612101865" CREATED="1270892460640" MODIFIED="1277391874031" LINK="http://freeplane.sourceforge.net">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Pour installer Freeplane sur Microsoft Windows, installez d'abord Java Runtime Environment de Sun puis installez Freeplane." ID="ID_1648973481" CREATED="1275400917568" MODIFIED="1277391918640"/>
+<node TEXT="Pour installer Freeplane sur Linux, télécharger le Java Runtime Environment et l'application Freeplane. Installez Java en premier lieu, puis décompressez Freeplane. Pour démarrer Freeplane, exécutez freeplane.sh" ID="ID_1405968395" CREATED="1275400917568" MODIFIED="1275400917568"/>
+<node TEXT="Pour installer Freeplane sur MacOS X s'assurer que votre système est entièrement à jour et particulièrement Java. La mise à jour Logicielle est localisée sous le logo Apple dans le coin supérieur gauche de l'écran. 

Télécharger alors la version Spécifique de Mac de Freeplane. La version .dmg est la plus simple à installer, mais une version .zip est également disponible. A la fin du téléchargement, le fichier peut être automatiquement "monté" (ou dé-zippé) selon le paramétrage de votre logiciel de navigation, sinon double-cliquez sur le fichier .dmg ou .zip. 

Une icône Freeplane devrait être visible à l'écran. Cette icône peut être placée dans le répertoire des applications." ID="ID_223074114" CREATED="1275400917568" MODIFIED="1277391973843"/>
+</node>
+<node TEXT="Informations à l'attention des utilisateurs Mac OS X" FOLDED="true" POSITION="left" ID="ID_640737748" CREATED="1270892460643" MODIFIED="1276003275984" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Mac OS X est entièrement supporté par Freeplane. 
Une partie de la documentation est toujours très 
orientée Windows ou Linux. Les utilisateurs Mac 
peuvent toutefois se référer aux éléments suivants 
pour les spécificités liées à Mac OS." FOLDED="true" ID="ID_111622212" CREATED="1270892460643" MODIFIED="1275977156015">
+<node TEXT="Ctrl ou "control" ?" FOLDED="true" ID="ID_60186889" CREATED="1272034412047" MODIFIED="1275976574281">
+<node TEXT="Les touche "pomme" ou "command" ou "cmd" des Mac est le pendant de la touche Ctrl (Control) des PC." ID="ID_83315164" CREATED="1272029514331" MODIFIED="1275976291109"/>
+<node TEXT="Dans la plupart des cas, la touche Ctrl des PC doit être remplacée par cette touche Command." ID="ID_174530999" CREATED="1272034546855" MODIFIED="1275976344281"/>
+<node TEXT="Toutefois, dans quelques rares cas, c'est bien la touche "Control" qui doit être utilisée. Si la touche "Command" ne fonctionne pas, il convient d'utiliser la touche "Control"." ID="ID_51393310" CREATED="1272034546807" MODIFIED="1275976526078"/>
+</node>
+<node TEXT="Souris, clic droit et menu contextuel" FOLDED="true" ID="ID_1823608872" CREATED="1272034661406" MODIFIED="1275976617312">
+<node TEXT="La plupart des souris Apple ne possèdent qu'un bouton. Pour obtenir l'équivalent du clic sur bouton droit d'une souris PC, il faut maintenir la touche Control enfoncée et cliquer simultanément sur la souris. Cette action permet de faire apparaitre notamment le menu contextuel sur la carte." ID="ID_328601071" CREATED="1272030826942" MODIFIED="1275976822609"/>
+</node>
+<node TEXT="Différences de menu" FOLDED="true" ID="ID_1474889224" CREATED="1272475775170" MODIFIED="1275976846171">
+<node TEXT="Quelques éléments du menu
sont conformes au standard Mac OS X" FOLDED="true" ID="ID_1689040279" CREATED="1272475795702" MODIFIED="1276002230062">
+<node TEXT="Aide > A propos est déplacé dans Menu > A propos de Freeplane" ID="ID_1829822845" CREATED="1272475988527" MODIFIED="1275976968359"/>
+<node TEXT="Outils > Préférences vers Menu > Préférences" ID="ID_218289116" CREATED="1272490956135" MODIFIED="1275977010484"/>
+<node TEXT="Fichier > Quitter vers Menu > Quitter Freeplane" ID="ID_173525555" CREATED="1272491194401" MODIFIED="1275977053625"/>
+</node>
+</node>
+<node TEXT="Zooming" FOLDED="true" ID="ID_1822134483" CREATED="1272034779740" MODIFIED="1272034791305">
+<node TEXT="Mac OS X permet d'effectuer un zoom d'un partie de l'écran en tournant la molette de la souris vers le haut tout en maintenant la touche Control enfoncée. Cette fonction est propre à Mac OS. Pour zoomer, la solution doit passer par l'utilisation de la fonction zoom de Freeplane." ID="ID_1431313195" CREATED="1272031370038" MODIFIED="1276003100375"/>
+</node>
+<node TEXT="Wiki Freeplane" FOLDED="true" ID="ID_307465918" CREATED="1272034993198" MODIFIED="1276003149656">
+<node TEXT="Rendez-vous sur le wiki Freeplane pour en savoir plus sur l'utilisation de Freeplane sous MacOS X." ID="ID_1888636845" CREATED="1272035005736" MODIFIED="1276003215093" LINK="http://freeplane.sourceforge.net/wiki/index.php/Macintosh"/>
+</node>
+</node>
+</node>
+<node TEXT="Installer l'applet Freeplane sur votre site web" FOLDED="true" POSITION="left" ID="ID_401316073" CREATED="1275400917568" MODIFIED="1275400917568" COLOR="#407000">
+<node TEXT="Fichier > Exporter > En applet Java" ID="Freeplane_Link_1833092996" CREATED="1275400917568" MODIFIED="1277392014125" COLOR="#000000">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node TEXT="Avec l'applet Java Freeplane, les cartes sont en lecture seule. Aucune modification n'est possible. Cliquez sur un noeud pour l'ouvrir ou suivre un lien. Déplacez la carte en cliquant sur le fond de la carte. Un menu contextuel est accessible d'un clic droit de la souris, ce qui permet par exemple d'effectuer une recherche dans la carte." ID="Freeplane_Link_1948548375" CREATED="1275400917568" MODIFIED="1277392249468"/>
+<node TEXT="L'exportation de petites cartes est envisageable en Flash, qui offre, comme l 'export en applet Java, des fonctions de manipulations de la carte mais celles-ci sont plus limitées." ID="ID_996038672" CREATED="1275774133046" MODIFIED="1277392296796"/>
+<node TEXT="LaTeX et les fichiers SVG ne sont pas visibles via les exportations Flash et Java" ID="ID_1688517766" CREATED="1275774318671" MODIFIED="1275774358390"/>
+</node>
+<node TEXT="Crédits" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1270892460645" MODIFIED="1275774493609" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Auteurs" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1270892460646" MODIFIED="1275774527218" COLOR="#006699">
+<node TEXT="Joerg Mueller" ID="_Freeplane_Link_1896457660" CREATED="1270892460646" MODIFIED="1270896496444" COLOR="#996600">
+<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/">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1270892460647" MODIFIED="1270892460647" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1270892460647" MODIFIED="1270896519401" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitry Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1270892460648" MODIFIED="1270895653419" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Graphical Design by Predrag Cuklin" ID="ID_1094825033" CREATED="1270892460648" MODIFIED="1270902561031" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Equipe Actuelle" FOLDED="true" ID="ID_1090487344" CREATED="1271097427203" MODIFIED="1275774538828" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<edge WIDTH="thin"/>
+<node TEXT="Release 1.1.x" FOLDED="true" ID="ID_1795869028" CREATED="1271097443907" MODIFIED="1271097685189" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Dimitry Polivaev" ID="ID_809494025" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Volker Boerchers" ID="ID_548414191" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Eric L." ID="ID_306583030" CREATED="1271097633122" MODIFIED="1271097633122"/>
+<node TEXT="jayseye" ID="ID_502187025" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Predrag" ID="ID_320430724" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Ryan Wesley" ID="ID_288819242" CREATED="1271097633123" MODIFIED="1271097633123"/>
+</node>
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_functionality_nl.jpg b/freeplane/doc/freeplane_functionality_nl.jpg
new file mode 100644
index 0000000..dc3b126
Binary files /dev/null and b/freeplane/doc/freeplane_functionality_nl.jpg differ
diff --git a/freeplane/doc/freeplane_functionality_nl.mm b/freeplane/doc/freeplane_functionality_nl.mm
new file mode 100644
index 0000000..1b617b8
--- /dev/null
+++ b/freeplane/doc/freeplane_functionality_nl.mm
@@ -0,0 +1,440 @@
+<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
new file mode 100644
index 0000000..531b4cd
--- /dev/null
+++ b/freeplane/doc/freeplane_id.mm
@@ -0,0 +1,1057 @@
+<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 - Alt+A
Buka berkas pertama dari riwayat - Ctrl+Shift+W

Perintah edit:
Cari - Ctrl+F
Cari berikutnya - Ctrl+G
Potong - Ctrl+X
Salin - Ctrl+C
Salin tunggal - Ctrl+Y
Tempelkan - Ctrl+V

Perintah modus:
Modus MindMap - Alt+1
Modus jelajah - Alt+2 
Modus berkas - Alt+3

Perintah pemformatan node:
Miringkan - Ctrl+I
Tebalkan - Ctrl+B
Awan - Ctrl+Shift+B
Ubah warna node - Alt+C
Campur warna node - Alt+B
Ubah warna tangkai node - Alt+E
Perbesar font node - Ctrl+L
Perkecil font node - Ctrl+M
Perbesar font cabang - Ctrl+Shift+L
Perkecil font cabang - Ctrl+Shift+M

Perintah navigasi node:
Pergi ke akar - ESCAPE
Pindah ke atas - UP
Pindah ke bawah - DOWN
Pindah ke kiri - LEFT
Pindah ke kanan - RIGHT
Ikuti taut - Ctrl+ENTER
Zum keluar - Alt+UP
Zum masuk - Alt+DOWN

Perintah node baru:
Tambah node adik - ENTER
Tambah node anak - INSERT
Tambah node kakak - Shift+ENTER

Perintah edit node:
Edit node terpilih - F2
Edit node panjang - Alt+ENTER
Gabungkan node - Ctrl+J
Buka-tutup lipatan - SPACE
Buka-tutup lipatan anak - Ctrl+SPACE
Setel taut lewat pemilih berkas - Ctrl+Shift+K
Setel taut lewat kolom teks - Ctrl+K
Setel gambar lewat pemilih berkas - Alt+K
Pindahkan node ke atas - Ctrl+UP
Pindahkan node ke bawah - Ctrl+DOWN
">
+<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)">
+<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">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1208961883966" POSITION="left" TEXT="Tentang modus">
+<edge WIDTH="thin"/>
+<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 apakah akan ada yang memanfaatkan arsitektur ini, namun hal ini bisa dilakukan bila diinginkan.">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1208964602766" POSITION="left" TEXT="Menggunakan Freeplane applet">
+<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.">
+<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"/>
+<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 walaupun tidak ada alasan intuitif mengapa F2 dipakai untuk mengedit node. Namun begitu Anda terbiasa dengan hal tersebut di semua aplikasi yang Anda gunakan, Anda akan menginginkannya juga di Freeplane.">
+<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.">
+<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"/>
+<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"/>
+<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">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="University of Freiburg, Germany">
+<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"/>
+<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"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1208774033132" TEXT="Sumbangan lain">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_1164774797" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_615905950" MODIFIED="1208966039732" TEXT="Instalasi Windows">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1498630478" MODIFIED="1208966051800" TEXT="Panduan Eclipse">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_158863537" MODIFIED="1208966057187" TEXT="Tutorial Flash">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_1572312597" MODIFIED="1124560950701" TEXT="David Low">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_760522438" MODIFIED="1208966069585" TEXT="Membantu">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_807977431" MODIFIED="1124560950701" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1125551331" MODIFIED="1124560950701" TEXT="Italian translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_846744145" MODIFIED="1124560950701" TEXT="Danish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_761116196" MODIFIED="1124560950701" TEXT="Alex Dukal">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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.">
+<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>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1209144562459" POSITION="right" TEXT="Demonstrasi beberapa fitur">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#669900" CREATED="1124560950701" ID="_Freeplane_Link_735193624" MODIFIED="1209144584160" TEXT="Tampilan">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_690312221" MODIFIED="1209144600864" TEXT="Node bisa dibuat berbagai warna">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#ff0000" CREATED="1124560950701" ID="ID_1678736213" MODIFIED="1209144605871" TEXT="Merah">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#009900" CREATED="1124560950701" ID="ID_767661247" MODIFIED="1209144610358" TEXT="Hijau">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#0000cc" CREATED="1124560950701" ID="ID_1716843014" MODIFIED="1209144614043" TEXT="Biru">
+<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>
+<node CREATED="1124560950701" ID="ID_1132374703" MODIFIED="1209144683773" TEXT="Node bisa dibuat dalam berbagai gaya huruf">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1639593324" MODIFIED="1209144688971" TEXT="Tebal">
+<font BOLD="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1376999225" MODIFIED="1209144693157" TEXT="Miring">
+<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1864392974" MODIFIED="1209144699045" TEXT="Tebal dan miring">
+<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" ID="ID_834524132" MODIFIED="1209144718984" TEXT="Huruf node bisa dibuat dalam berbagai ukuran">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1791375192" MODIFIED="1209144724832" TEXT="kecil">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="normal">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node CREATED="1124560950701" ID="ID_816405856" MODIFIED="1209144731953" TEXT="besar">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="ID_544909735" MODIFIED="1209144737731" TEXT="besar sekali">
+<font NAME="SansSerif" SIZE="20"/>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="OOh">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950701" ID="ID_53656715" MODIFIED="1209144772251" TEXT="Jenis font yang digunakan bisa bermacam-macam">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1199607468" MODIFIED="1209144776997" TEXT="Ini">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1209144782796" TEXT="Atau itu">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1961541891" MODIFIED="1209144791218" TEXT="Atau yang itu">
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950701" ID="ID_483073690" MODIFIED="1209144893635" TEXT="Node bisa dilipat">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1209144900164" TEXT="Lipat">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_953890024" MODIFIED="1209144904120" TEXT="Tersembunyi">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1209144910239" TEXT="Pohon">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_346141495" MODIFIED="1209144968032" TEXT="Ek">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_1441151502" MODIFIED="1209144978707" TEXT="Waru">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_534141496" MODIFIED="1209144975323" TEXT="Cemara">
+<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 ...">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" ID="ID_339939684" MODIFIED="1209145013397" TEXT="Laman web">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" ID="ID_1854484178" MODIFIED="1209145055708" TEXT="Menurut Freeplane, ini bisa dieksekusi :)">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" ID="ID_278779728" MODIFIED="1209145035199" TEXT="Map lokal">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_1541289178" LINK="file:/C:/Program%20Files/" MODIFIED="1124560950701" TEXT="C:/Program Files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="ID_2370204" LINK="/home/" MODIFIED="1124560950701" TEXT="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#006699" CREATED="1124560950701" ID="ID_738829620" MODIFIED="1209145122154" TEXT="Bisa dieksekusi">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950701" ID="ID_372784718" LINK="file:/C:/WINNT/regedit.exe" MODIFIED="1124560950701" TEXT="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.">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950717" ID="_Freeplane_Link_839677176" MODIFIED="1209145146829" TEXT="Node baris banyak">
+<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>
+<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>
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" ID="ID_731706632" MODIFIED="1209145426111" TEXT="adalah">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_181561435" MODIFIED="1209145428945" TEXT="Ek">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" ID="ID_897111444" MODIFIED="1209145431819" TEXT="adalah">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_454264987" MODIFIED="1209145434683" TEXT="Waru">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" ID="ID_1002513327" MODIFIED="1209145437397" TEXT="adalah">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_22757936" MODIFIED="1209145439951" TEXT="Cemara">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950717" ID="ID_701778556" MODIFIED="1209145445198" TEXT="Pohon">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" ID="ID_1248255979" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_1769190795" MODIFIED="1209145448172" TEXT="Daun">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" ID="ID_1881802723" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="ID_335664905" MODIFIED="1209145450916" TEXT="Batang">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950717" ID="ID_1556015660" MODIFIED="1209145462263" TEXT="Node bisa diberi ikon">
+<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>
+</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>
+<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>
+<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>
+<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1209145526135" TEXT="Dan rute berbeda"/>
+</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>
+</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>
+<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>
+<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>
+<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>
+<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.">
+<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.">
+<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.">
+<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).">
+<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).">
+<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>
+<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>
+<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">
+<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..">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="korn"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<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>
+<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>
+<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>
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1209225822962" POSITION="right" TEXT="Mencari">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1209226631074" POSITION="right" TEXT="Memilih banyak node">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_296855940" MODIFIED="1209226650853" TEXT="Untuk memilih banyak node, tahan Shift atau Control sambil mengklik. ">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1209273548565" POSITION="right" TEXT="Seret dan jatuhkan">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_1178943684" MODIFIED="1209273566891" TEXT="Anda dapat memindah-mindahkan node dengan menyeret dan menjatuhkannya.">
+<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.">
+<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.">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1209274000895" POSITION="right" TEXT="Menyalin dan menempel">
+<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.">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_787112439" MODIFIED="1209274159944" TEXT="Pohon">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_1397202134" MODIFIED="1209274162718" TEXT="Ek">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_475104996" MODIFIED="1209274165892" TEXT="Cemara">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_785656568" MODIFIED="1209274321686" STYLE="fork" TEXT="Belanja (120236)">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="ID_785399167" MODIFIED="1209274335066" TEXT="Gaya Hidup (19)">
+<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">
+<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">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_1516542995" MODIFIED="1209275992168" TEXT="Ek">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" ID="ID_133833504" MODIFIED="1209275995003" TEXT="Cemara">
+<font NAME="SansSerif" SIZE="12"/>
+<node CREATED="1124560950717" ID="ID_268647755" MODIFIED="1209276004807" TEXT="ditempelkan sebagai">
+<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/>
">
+<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">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1209278047444" POSITION="right" TEXT="Berpindah ke peta lain">
+<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.">
+<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">
+<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.">
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1209278324883" POSITION="right" TEXT="Ekspor ke HTML">
+<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>
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1209283607262" POSITION="right" TEXT="Mengimpor struktur map">
+<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">
+<font NAME="SansSerif" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950732" ID="ID_1028597241" MODIFIED="1209283613201" TEXT="Map terpilih">
+<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">
+<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>
+<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>
+</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"/>
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1209284422485" POSITION="right" TEXT="Integrasi dengan Word atau Outlook">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1209284665834" POSITION="right" TEXT="Menyetel preferensi">
+<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.">
+<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 tapi mungkin PCL, yang tidak bermanfaat bagi Anda."/>
+<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 tahap awal."/>
+<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.">
+<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>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_it.mm b/freeplane/doc/freeplane_it.mm
new file mode 100644
index 0000000..cd10cda
--- /dev/null
+++ b/freeplane/doc/freeplane_it.mm
@@ -0,0 +1,1436 @@
+<map version="0.9.0">
+<!--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_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>
+<font NAME="Dialog" SIZE="18" BOLD="true"/>
+<hook NAME="MapStyle" max_node_width="600"/>
+<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>
+<node TEXT="Tabella della mappa dei tasti, disponibile come file PDF" POSITION="left" ID="ID_274273746" CREATED="1280835417303" MODIFIED="1281345996992" LINK="FP_Key_Mappings_Quick_Guide_it.pdf" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Tabella della mappa dei tasti, disponibile come file editabile ODT" POSITION="left" ID="ID_1795618621" CREATED="1280835297254" MODIFIED="1281345996976" LINK="FP_Key_Mappings_Quick_Guide_it.odt" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Guida ai menu di Freeplane è disponibile come mappa separata" POSITION="left" ID="ID_640122712" CREATED="1272090985328" MODIFIED="1281424466236" LINK="FP_MenuReference_it.mm" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Installazione" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1124560950701" MODIFIED="1266589969903" COLOR="#006633">
+<node TEXT="Collegamenti" FOLDED="true" ID="_Freeplane_Link_1911559485" CREATED="1124560950701" MODIFIED="1265292987710" COLOR="#006699">
+<node TEXT="Qualora non sia già installato, scaricare il Java Runtime Environment (versione minima J2RE1.4)" ID="ID_1620747952" CREATED="1124560950701" MODIFIED="1265292863225" LINK="http://java.sun.com/javase/downloads/index.jsp">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</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ò essere montato automaticamente (o decompresso) a seconda delle impostazioni del browser web. In caso contrario, fare doppio clic sul file. Dmg scaricato per "montare", o fare doppio clic sul file. Zip scaricato per scompattarlo.<br/><br/>Ora si dovrebbe vedere una icona dell'applicazione Freeplane, che è possibile trascinare nella cartella Applicazioni. Poi si può opzionalmente creare un alias (collegamento) sul desktop, e / o nel Dock. Per eseguire Freeplane, fare doppio clic sulla sua icona dell'applicazione (nella cartella Applicazioni) o sul suo collegamento sul desktop, oppure fare clic una volta sulla sua icona nel Dock. Il wiki di Freeplane ha una pagina per Macintosh, con ulteriori informazioni.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+</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"/>
+<node TEXT="Freeplane recently added full support for Apple's Mac OS X operating system. Some of the documentation is still oriented toward PC users running Windows or Linux. Mac users will be able to follow along by keeping some differences in mind, listed below." FOLDED="true" ID="ID_752234886" CREATED="1270892460643" MODIFIED="1272034409877">
+<node TEXT="Command key versus the Ctrl (control) key" FOLDED="true" ID="ID_274373799" CREATED="1272034412047" MODIFIED="1272500980501">
+<node TEXT="When Freeplane runs under Mac OS X, you generally will use the Apple Command key rather than the "control" key, which is labeled Ctrl on a PC. The Command key is marked with a cloverleaf ⌘ symbol, and may also be captioned as "command" or "cmd", or be marked with an Apple logo." ID="ID_395674676" CREATED="1272029514331" MODIFIED="1272502497708"/>
+<node TEXT="When you see the Ctrl key mentioned in Freeplane's documentation, in most cases you should use the Command key instead." ID="ID_124270811" CREATED="1272034546855" MODIFIED="1272501133669"/>
+<node TEXT="In a very few cases, even on your Mac, Freeplane actually requires using the "control" key rather than the Command key. In these cases, this document refers to the key explicitly as Control, for emphasis. In other cases, if the documentation refers to the Ctrl key, yet the Command key fails to work as a substitute on your Mac, try the "control" key instead." ID="ID_1031450682" CREATED="1272034546807" MODIFIED="1272502562154"/>
+</node>
+<node TEXT="Mice, Right Clicks and Context Menus" FOLDED="true" ID="ID_1326732850" CREATED="1272034661406" MODIFIED="1272034719554">
+<node TEXT="Many Apple-branded mice and trackpads have only one clickable "button." To bring up a context-sensitive menu (or "context menu"), Mac users can hold down the Control key while clicking the mouse (abbreviated as "Control + click"). Yes, use the Control key here, rather than the Command key, because this function is built into Mac OS X so Freeplane cannot change it. Apple makes Control + click equivalent to the "right click" which is available on mice with two buttons." ID="ID_1259415390" CREATED="1272030826942" MODIFIED="1272034317363"/>
+</node>
+<node TEXT="Menu Differences" FOLDED="true" ID="ID_1110596300" CREATED="1272475775170" MODIFIED="1272475793114">
+<node TEXT="A few menu items are relocated in accordance with Mac OS X standards. These are listed below." ID="ID_1853446063" CREATED="1272475795702" MODIFIED="1272475981316"/>
+<node TEXT="Help > About is moved to the Freeplane application menu > About Freeplane." ID="ID_1154800735" CREATED="1272475988527" MODIFIED="1272490731402"/>
+<node TEXT="Tools > Preferences is moved to the Freeplane application menu > Preferences." ID="ID_1860427078" CREATED="1272490956135" MODIFIED="1272491068596"/>
+<node TEXT="File > Quit is moved to the Freeplane application menu > Quit Freeplane." ID="ID_1745832189" CREATED="1272491194401" MODIFIED="1272491228343"/>
+</node>
+<node TEXT="Zooming" FOLDED="true" ID="ID_590901264" CREATED="1272034779740" MODIFIED="1272034791305">
+<node TEXT="Mac OS X provides a means to zoom in on (magnify) part of the screen, by holding down the Control key while turning the mouse wheel forward. This facility is built into the Mac operating system, so the function is unavailable for Freeplane to use for control of its own Zoom function. So Mac users must use one of the alternate means which Freeplane provides to adjust its zoom level. " ID="ID_1955741602" CREATED="1272031370038" MODIFIED="1272034875880"/>
+<node TEXT="If you are unfamiliar with OS X's Control + mouse wheel function, be aware that some mouse functions become awkward to use, or even unusable, while zoomed in. To return the screen to normal, hold down the Conrol key and turn the mouse wheel backward to zoom back out all the way." ID="ID_842528755" CREATED="1272034875909" MODIFIED="1272034875910"/>
+</node>
+<node TEXT="Freeplane Wiki" ID="ID_1142057644" CREATED="1272034993198" MODIFIED="1272035003988">
+<node TEXT="Visit the Macintosh page on Freeplane's online Wiki to learn more about running Freeplane on a Mac." ID="ID_275313424" CREATED="1272035005736" MODIFIED="1272035180163" LINK="http://freeplane.sourceforge.net/wiki/index.php/Macintosh"/>
+</node>
+</node>
+</node>
+<node TEXT="Installazione dell'applet di Freeplane nei siti web" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1124560950701" MODIFIED="1281346039585" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="E' possibile Esportare una mappa come applet per siti web, in modo che gli utenti possano vedere le mappe. Usare il comando File - Esporta - Come Applet Java..." ID="ID_1124294401" CREATED="1124560950701" MODIFIED="1280837258108" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Per inserirlo nel sito web, creare un collegamento al file esportato." ID="ID_1055558417" CREATED="1124560950701" MODIFIED="1280837258108" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="L'applet di Freeplane, consente solo la visualizzazione delle mappe. Non è possibile modificarle. Premendo su un nodo, per commutare la visualizzazione di Espansione/Collassamento. Per spostare la mappa, cliccare e trascinare lo sfondo. Per cercare nella mappa, usare il menu contestuale del nodo." ID="_Freeplane_Link_514864900" CREATED="1124560950701" MODIFIED="1280837258123" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Piccole mappe possono anche essere esportate come "Flash", che offre però funzionalità limitate per l'esplorazione" ID="ID_74116190" CREATED="1280837118793" MODIFIED="1280837258139" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="I componenti LaTeX e le immagini SVG, non sono visualizzate nell'applet di Freeplane e nemmeno nella modalità Flash" ID="ID_1756113383" CREATED="1280837189060" MODIFIED="1280837258154" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+</node>
+<node TEXT="Credits" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1124560950701" MODIFIED="1216753652715" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Autori" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1124560950701" MODIFIED="1280835747244" COLOR="#006699">
+<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">
+<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/">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<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 TEXT="Graphical Design by Predrag Cuklin" ID="ID_792883629" CREATED="1270892460648" MODIFIED="1270902561031" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Team attuale" FOLDED="true" ID="ID_1090487344" CREATED="1271097427203" MODIFIED="1280835791526" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<edge WIDTH="thin"/>
+<node TEXT="Versione 1.1.x" FOLDED="true" ID="ID_1795869028" CREATED="1271097443907" MODIFIED="1280835799292" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Dimitry Polivaev" ID="ID_809494025" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Volker Boerchers" ID="ID_548414191" CREATED="1271097633119" MODIFIED="1271097633119"/>
+<node TEXT="Eric L." ID="ID_306583030" CREATED="1271097633122" MODIFIED="1271097633122"/>
+<node TEXT="jayseye" ID="ID_502187025" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Predrag" ID="ID_320430724" CREATED="1271097633123" MODIFIED="1271097633123"/>
+<node TEXT="Ryan Wesley" ID="ID_288819242" CREATED="1271097633123" MODIFIED="1271097633123"/>
+</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="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">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Aspetto" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1124560950701" MODIFIED="1264162217002" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="I nodi possono avere colori del testo diversi" FOLDED="true" ID="ID_1419495204" CREATED="1124560950701" MODIFIED="1264162336111">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Red" ID="ID_1174186217" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#ff0000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Green" ID="ID_961195468" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#009900">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Blue" ID="ID_1711810095" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#0000cc">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="I nodi possono avere diversi colori di sfondo" FOLDED="true" ID="_" CREATED="1124560950701" MODIFIED="1264152108993">
+<node TEXT="Questo" ID="_Freeplane_Link_1358611533" CREATED="1124560950701" MODIFIED="1264162404517" BACKGROUND_COLOR="#00ffff"/>
+<node TEXT="Questo" ID="_Freeplane_Link_1317973766" CREATED="1124560950701" MODIFIED="1264162405174" BACKGROUND_COLOR="#ff6600"/>
+</node>
+<node TEXT="I nodi possono avere vari stili di carattere" FOLDED="true" ID="ID_749426470" CREATED="1124560950701" MODIFIED="1264152276290">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Grassetto" ID="ID_1356242309" CREATED="1124560950701" MODIFIED="1264162432767">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+</node>
+<node TEXT="Corsivo" ID="ID_1559314275" CREATED="1124560950701" MODIFIED="1264152316040">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
+</node>
+<node TEXT="Grassetto e Corsivo" ID="ID_1707863867" CREATED="1124560950701" MODIFIED="1264152325055">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
+</node>
+</node>
+<node TEXT="Il testo del nodo può avere diverse dimensioni" FOLDED="true" ID="ID_1985126988" CREATED="1124560950701" MODIFIED="1264152361133">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Piccolo (11)" ID="ID_1732096903" CREATED="1124560950701" MODIFIED="1264152412680">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node TEXT="Normale (13)" ID="ID_1751513501" CREATED="1124560950701" MODIFIED="1264152419727">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node TEXT="Più grande (15)" ID="ID_1739436350" CREATED="1124560950701" MODIFIED="1264152402790">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node TEXT="Grande (20)" FOLDED="true" ID="ID_896554129" CREATED="1124560950701" MODIFIED="1264152439368">
+<font NAME="SansSerif" SIZE="20"/>
+<node TEXT="OOh" ID="ID_1458948037" CREATED="1124560950701" MODIFIED="1124560950701">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node TEXT="Possono essere usati diversi tipi di carattere" FOLDED="true" ID="ID_73983954" CREATED="1124560950701" MODIFIED="1264152476352">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Questo" ID="ID_900474495" CREATED="1124560950701" MODIFIED="1264152483915">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node TEXT="O questo" ID="_Freeplane_Link_1568731425" CREATED="1124560950701" MODIFIED="1264152491305">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node TEXT="O quest'altro" ID="ID_1735672703" CREATED="1124560950701" MODIFIED="1264152498727">
+<font NAME="Dialog" SIZE="21"/>
+</node>
+</node>
+<node TEXT="Possono essere usati diversi formati dei nodi" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1124560950701" MODIFIED="1264152568462">
+<node TEXT="Biforcazione" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1124560950701" MODIFIED="1264152579493">
+<node TEXT="Biforcazione" ID="_Freeplane_Link_89124429" CREATED="1124560950701" MODIFIED="1264152586383"/>
+<node TEXT="Biforcazione" ID="ID_1983302415" CREATED="1124560950701" MODIFIED="1264152586383"/>
+</node>
+<node TEXT="Bolla" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1124560950701" MODIFIED="1264152610696" STYLE="bubble">
+<node TEXT="Bolla" ID="_Freeplane_Link_1677737286" CREATED="1124560950701" MODIFIED="1264152601946" STYLE="bubble"/>
+<node TEXT="Bolla" ID="_Freeplane_Link_978246353" CREATED="1124560950701" MODIFIED="1264152604774" STYLE="bubble"/>
+</node>
+</node>
+</node>
+<node TEXT="I nodi possono essere espansi" FOLDED="true" ID="ID_903259717" CREATED="1124560950701" MODIFIED="1264162609017" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Espandi" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1124560950701" MODIFIED="1264162641392">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Nascosto" ID="ID_291495101" CREATED="1124560950701" MODIFIED="1264162653924">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Alberi" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1124560950701" MODIFIED="1264162738236">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Quercia" ID="ID_286716010" CREATED="1124560950701" MODIFIED="1264162700970">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Faggio" ID="ID_678621378" CREATED="1124560950701" MODIFIED="1264162718377">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Olmo" ID="ID_899324669" CREATED="1124560950701" MODIFIED="1264162733970">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="I nodi possono contenere collegamenti a..." FOLDED="true" ID="ID_456155416" CREATED="1124560950701" MODIFIED="1264162805752" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Pagine Internet" FOLDED="true" ID="ID_1420790572" CREATED="1124560950701" MODIFIED="1264162820502" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="http://www.google.com/" ID="ID_1806044339" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="www.google.com" FOLDED="true" ID="ID_45855188" CREATED="1124560950701" MODIFIED="1124560950701" LINK="www.google.com">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Freeplane questo link è un eseguibile :)" ID="ID_777300065" CREATED="1124560950701" MODIFIED="1264162875549" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+</node>
+<node TEXT="Cartelle del proprio computer" FOLDED="true" ID="ID_1237047569" CREATED="1124560950701" MODIFIED="1264162919064" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Programmi" FOLDED="true" ID="ID_1822005188" CREATED="1264162990517" MODIFIED="1264162990533" LINK="../../../Programmi/">
+<node TEXT="La cartella deve esistere nel PC" ID="ID_71789589" CREATED="1264163111049" MODIFIED="1264163151097">
+<icon BUILTIN="messagebox_warning"/>
+</node>
+</node>
+<node TEXT="WINDOWS" FOLDED="true" ID="ID_157903391" CREATED="1264163078283" MODIFIED="1264163078283" LINK="../../../WINDOWS/">
+<node TEXT="La cartella deve esistere nel PC" ID="ID_1800701557" CREATED="1264163111049" MODIFIED="1264163151800">
+<icon BUILTIN="messagebox_warning"/>
+</node>
+</node>
+<node TEXT="/home/" FOLDED="true" ID="ID_1785341938" CREATED="1124560950701" MODIFIED="1124560950701" LINK="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="La cartella deve esistere nel PC" ID="ID_1124440907" CREATED="1264163111049" MODIFIED="1264163152206">
+<icon BUILTIN="messagebox_warning"/>
+</node>
+</node>
+</node>
+<node TEXT="Eseguibili, programmi" FOLDED="true" ID="ID_1587757797" CREATED="1124560950701" MODIFIED="1264163357749" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" ID="ID_138908568" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/WINNT/regedit.exe">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="L'icona indica che c'è un collegamento" ID="ID_1324261503" CREATED="1124560950701" MODIFIED="1264172935140" COLOR="#006600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="calc.exe" ID="ID_1059704786" CREATED="1264163303262" MODIFIED="1264163303262" LINK="../../../WINDOWS/system32/calc.exe"/>
+</node>
+<node TEXT="Altri nodi nella stessa mappa (o nodi in altre mappe)" ID="ID_1657470681" CREATED="1280837856358" MODIFIED="1280838076237" LINK="#ID_1673793348"/>
+<node TEXT="Qualsiasi documento nel computer locale o unità di rete" ID="ID_1450116097" CREATED="1124560950717" MODIFIED="1264163448957">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="A seconda del sistema operativo (Windows/Unix/...) icone differenti indicano il tipo di collegamento" ID="ID_426037084" CREATED="1280838101597" MODIFIED="1280838297678"/>
+</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>
+<node TEXT="Nodi con più righe" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1264172978859" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="E' possibile considerarli come un paragrafo con più righe o paragrafi. Se state costruendo un database o una serie articolata di informazioni usando Freeplane, è meglio usarli. Al posto di avere un file di testo piatto per le note, è possibile avere un nodo centrale con vari nodi figli." ID="_Freeplane_Link_1423568963" CREATED="1124560950717" MODIFIED="1280838583979"/>
+<node TEXT=""La scienza è un insieme di fatti; come una casa è fatta di pietre, così la scienza è fatta di fatti; ma una pila di pietre non è una casa e una collezione di fatti non necessariamente è scienza." -- Henri Poincaré" ID="ID_1009585309" CREATED="1264173678836" MODIFIED="1264173964496"/>
+<node TEXT="Nodo multi linea con linee vuote" FOLDED="true" ID="ID_554827788" CREATED="1280838616870" MODIFIED="1280838633667">
+<node TEXT="Linea,
seconda linea

ed un'altra ancora,
che cosa ne pensate ?" ID="ID_635177710" CREATED="1280838636385" MODIFIED="1280838687745"/>
+</node>
+</node>
+<node TEXT="E' possibile mettere etichette sulle linee" FOLDED="true" ID="ID_986603742" CREATED="1124560950717" MODIFIED="1280838753403" COLOR="#669900">
+<node TEXT="Alberi" FOLDED="true" ID="ID_1466506736" CREATED="1124560950717" MODIFIED="1264175472277">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="sono" FOLDED="true" ID="ID_683882292" CREATED="1124560950717" MODIFIED="1264175477699" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Quercia" ID="ID_1284472924" CREATED="1124560950717" MODIFIED="1264175489137">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="sono" FOLDED="true" ID="ID_1165554447" CREATED="1124560950717" MODIFIED="1264175479933" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Faggio" ID="ID_1080961979" CREATED="1124560950717" MODIFIED="1264175492855">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="sono" FOLDED="true" ID="ID_333800479" CREATED="1124560950717" MODIFIED="1264175482137" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Olmo" ID="ID_210729171" CREATED="1124560950717" MODIFIED="1264175495887">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Alberi" FOLDED="true" ID="ID_764524639" CREATED="1124560950717" MODIFIED="1264175502309">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<>" FOLDED="true" ID="ID_265744654" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Foglia" ID="ID_1523667862" CREATED="1124560950717" MODIFIED="1264175531637">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="<>" FOLDED="true" ID="ID_907440923" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Tronco" ID="ID_103917058" CREATED="1124560950717" MODIFIED="1264175554012">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="E' possibile avere icone nei nodi" ID="ID_946676896" CREATED="1124560950717" MODIFIED="1264175587153" COLOR="#669900">
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="button_cancel"/>
+<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="Con colori personalizzati" ID="ID_1525540268" CREATED="1124560950717" MODIFIED="1264175862628">
+<cloud COLOR="#cccc00" WIDTH="0"/>
+</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="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"/>
+</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"/>
+</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"/>
+</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">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Nodo sorgente" ID="ID_265365223" CREATED="1280838852419" MODIFIED="1280840660130" VSHIFT="-51">
+<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>
+<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">
+<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>
+<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>
+<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>
+</node>
+<node TEXT="I collegamenti possono essere nascosti" FOLDED="true" ID="ID_294841155" CREATED="1280841586704" MODIFIED="1280841652987" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Nodo con collegamento nascosto" ID="ID_899106379" CREATED="1280841602298" MODIFIED="1280841635846" STYLE="bubble">
+<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">
+<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>
+</node>
+<node TEXT="Navigazione ed esplorazione della mappa" FOLDED="true" POSITION="right" ID="ID_418018884" CREATED="1280845405945" MODIFIED="1281280123406" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Navigare nella mappa" FOLDED="true" ID="ID_777475986" CREATED="1280846554161" MODIFIED="1281008005052" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Per muovere la selezione corrente, usare i tasti freccia" ID="ID_1627093802" CREATED="1280846585880" MODIFIED="1280846608162"/>
+<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="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">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+</node>
+<node TEXT="Come da settaggio standard, i nodi vengono selezionati posizionando il mouse sopra, dopo un ritardo.
Questo può essere modificato in Strumenti > Preferenze > Comportamento > Metodo di Selezione." ID="ID_1638498196" CREATED="1280933961619" MODIFIED="1280997622784"/>
+</node>
+<node TEXT="Selezionare nodi multipli" FOLDED="true" ID="Freeplane_Link_653540280" CREATED="1124560950717" MODIFIED="1266590112250" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Per selezionare più nodi, tenere premuto Ctrl o Shift mentre si selezionano con il mouse." ID="ID_1435652978" CREATED="1124560950717" MODIFIED="1264682638375">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per aggiungere altri nodi ai nodi già selezionati, tenere premuto Ctrl mentre si selezionano con il mouse." ID="ID_741729737" CREATED="1124560950717" MODIFIED="1264683979122">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per selezionare un range continuo di nodi, tenere premuto Shift mentre si seleziona col mouse o tenere premuto Shift e spostarsi con i tasti freccia." ID="ID_133089768" CREATED="1124560950717" MODIFIED="1264684082618">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per selezionare tutto il ramo premere Ctrl+Shift+A o tenere premuto Alt mentre si clicca con il mouse." ID="ID_350782537" CREATED="1124560950717" MODIFIED="1281007996005"/>
+<node TEXT="Per cancellare la selezione di più nodi, clickkare sulla in un punto vuoto della mappa o su un nodo non selezionato." ID="ID_451303534" CREATED="1124560950717" MODIFIED="1264684938474"/>
+</node>
+<node TEXT="Collassare ed Espandere" FOLDED="true" ID="Freeplane_Link_4727471" CREATED="1124560950732" MODIFIED="1266590123516" COLOR="#407000">
+<node TEXT="I nodi collassati sono evidenziati da un piccolo cerchio al termine del nodo." ID="ID_1880992670" CREATED="1124560950732" MODIFIED="1264955284656"/>
+<node TEXT="Per Collassare un nodo, premere spazio o dal menu contestuale scegliere Collassa/Espandi." ID="ID_467851080" CREATED="1124560950732" MODIFIED="1264954520937"/>
+<node TEXT="Per Espandere un nodo, premere spazio o dal menu contestuale scegliere Collassa/Espandi o usare il tasto freccia nella direzione dell'espansione." ID="ID_1756095401" CREATED="1124560950732" MODIFIED="1264954511078"/>
+<node TEXT="Per Collassare o Espandere i livelli dei nodi, tenere premuto Alt mentre si usa la rotella del mouse o premere Alt + Pag.Su o Alt + Pag.Giu. Con grandi mappe, usare questa funzione con attenzione; potrebbero esserci problemi di memoria." ID="ID_51625260" CREATED="1124560950732" MODIFIED="1264954849328"/>
+<node TEXT="Per espandere tutto, premere il tasto (+) cerchiato nella barra principale o dal menu Naviga - Espandi tutti o Alt + Fine" ID="ID_1891299533" CREATED="1124560950732" MODIFIED="1281025316426"/>
+<node TEXT="Per Collassare tutto, premere il tasto (-) cerchiato nella barra principale o dal menu Naviga - Collassa tutti o Alt + Home" ID="ID_1546507157" CREATED="1124560950732" MODIFIED="1281025324410"/>
+</node>
+<node TEXT="Muovere la mappa" FOLDED="true" ID="Freeplane_Link_467411537" CREATED="1124560950732" MODIFIED="1280846537786" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Per muovere la mappa, premere in una zona vuota e trascinare, o usare la rotella del mouse. Per scorrere orizzontalmente con la rotella del mouse, tenere premuto Shift o uno dei pulsanti del mouse." ID="ID_1070598032" CREATED="1124560950732" MODIFIED="1280846545145">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Zoom" FOLDED="true" ID="Freeplane_Link_913137192" CREATED="1124560950732" MODIFIED="1281083825078" COLOR="#407000">
+<node TEXT="Per lo zoom, usare la rotella del mouse tenendo premuto il tasto Ctrl o premere alt + Su o Giu.
In alternativa, usare il menu visualizza." ID="ID_1350220039" CREATED="1124560950732" MODIFIED="1281083728483"/>
+<node TEXT="Il menu visualizza ha i comandi di Zoom avanti, Zoom indietro, adatta alla pagina" ID="ID_1295014652" CREATED="1281083656811" MODIFIED="1281083708233"/>
+<node TEXT="La barra degli strumenti principale contiene un controllo per inserire la percentuale di zoom." ID="ID_1981356876" CREATED="1281083734811" MODIFIED="1281083801093"/>
+</node>
+<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>
+<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>
+<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>
+<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"/>
+</node>
+<node TEXT="Cambiare mappa" FOLDED="true" ID="Freeplane_Link_516331171" CREATED="1124560950732" MODIFIED="1281084726594" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Per passare ad un'altra mappa già aperta, premere il tasto destro del mouse in una zona vuota e scegliere la mappa o usare le schede nella barra bassa dello schermo. Oppure usare il menu mappe." ID="ID_773519853" CREATED="1124560950732" MODIFIED="1281084544303">
+<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>
+</node>
+<node TEXT="Modificare il contenuto della mappa" FOLDED="true" POSITION="right" ID="ID_1395035101" CREATED="1280845450820" MODIFIED="1281279920359" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Creare e cancellare nodi" FOLDED="true" ID="_Freeplane_Link_1709752669" CREATED="1124560950717" MODIFIED="1281087519795" COLOR="#407000">
+<node TEXT="Per creare un nodo Figlio, premere il tasto Ins (su Mac OC usare TAB)" ID="ID_573501513" CREATED="1124560950717" MODIFIED="1281087345277"/>
+<node TEXT="Per creare un nodo Figlio mentre si sta editando un nodo, premere il tasto Ins." ID="ID_335954474" CREATED="1124560950717" MODIFIED="1281087393168"/>
+<node TEXT="Per creare un nodo Fratello sotto al nodo corrente, premere il tasto Enter." ID="ID_810552505" CREATED="1124560950717" MODIFIED="1264178253627"/>
+<node TEXT="Per creare un nodo Fratello sopra al nodo corrente, premere i tasti Shift + Enter." ID="ID_27338804" CREATED="1124560950717" MODIFIED="1264178333832"/>
+<node TEXT="Per cancellare un nodo, premere Canc." ID="ID_129074617" CREATED="1124560950717" MODIFIED="1264178741230"/>
+<node TEXT="Per cancellare un nodo (tagliare), mantenendolo in memoria per incollarlo altrove, premere i tasti Ctrl + X." ID="ID_1578996183" CREATED="1124560950717" MODIFIED="1281087442231"/>
+<node TEXT="In alternativa, usare il menù contestuale, premendo il tasto destro del mouse (su Mac OS X usare Control + Click)." ID="ID_1901965623" CREATED="1124560950717" MODIFIED="1281087509607"/>
+</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"/>
+</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="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"/>
+</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"/>
+<node TEXT="Come standard, il tasto Invio termina la modifica di un nodo e "Alt+Invio" va a capo. Deselezionando l'opzione "Conferma con il tasto Invio" è possibile invertire la logica della funzione; cioè Invio va a capo e "Alt + Invio" termina la modifica del nodo. L'opzione si trova nel menu Strumenti - Preferenze - Visualizzazione - Editor semplice del nodo. Inoltre, la modifica ha azione immediata, senza il riavvio del programma." ID="_Freeplane_Link_1445647544" CREATED="1124560950717" MODIFIED="1266488930774"/>
+<node TEXT="Freeplane gestisce completamente unicode. E' quindi possibile usare gli script a vostra scelta" ID="ID_188690388" CREATED="1124560950717" MODIFIED="1264350883266"/>
+<node TEXT="Freeplane ha la funzione di Annulla per tutte le operazioni fatte" ID="ID_379903864" CREATED="1281087742624" MODIFIED="1281087791625" LINK="#Freeplane_Link_1318678369"/>
+<node TEXT="Controllo ortografico" FOLDED="true" ID="ID_1670412231" CREATED="1281087839766" MODIFIED="1281087853937">
+<node TEXT="Può essere abilitato dal menu contestuale > lingue, mentre si è in modifica" ID="ID_1177171578" CREATED="1281087869609" MODIFIED="1281087914016"/>
+<node TEXT="Dizionari di varie lingue sono disponibili nel sito di Freeplane." ID="ID_169638318" CREATED="1271096394315" MODIFIED="1281087947001" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"/>
+</node>
+</node>
+<node TEXT="Trascinare e Rilasciare" FOLDED="true" ID="Freeplane_Link_1024903226" CREATED="1124560950717" MODIFIED="1281095726329" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="E' possibile muovere i nodi, trascinandoli e rilasciandoli nella posizione desiderata." ID="ID_274529776" CREATED="1124560950717" MODIFIED="1264698019897">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="In alternativa è possibile usare la tastiera: Tenere premuto Ctrl e usare i tasti freccia." ID="ID_39769748" CREATED="1281095457602" MODIFIED="1281095499210"/>
+<node TEXT="Per fare diventare un nodo figlio, rilasciarlo alla fine del nodo desiderato." ID="ID_1729276743" CREATED="1124560950717" MODIFIED="1264698368436">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per fare diventare un nodo fratello, rilasciarlo sopra o sotto al nodo relativo." ID="ID_631029233" CREATED="1124560950717" MODIFIED="1264698433140">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per copiare i nodi al posto di spostarli, tenere premuto Ctrl mentre si spostano o spostarli col tasto centrale del mouse." ID="_Freeplane_Link_1994214827" CREATED="1124560950717" MODIFIED="1264698509875">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Per modificare una mappa esistente, trascinare il file e rilasciarlo in una area libera di Freeplane" ID="ID_1202880775" CREATED="1124560950717" MODIFIED="1281095568036"/>
+<node TEXT="Per creare un collegamento grafico, trascinare un nodo e rilasciarlo usando il tasto destro del mouse. Con Mac OS X, trascinarlo normalmente e premere Control prima di rilasciarlo sul nodo." ID="ID_1645502943" CREATED="1124560950717" MODIFIED="1281095725579"/>
+<node TEXT="Se sono stati selezionati più nodi, verranno tutti spostati o copiati." ID="ID_315432379" CREATED="1124560950717" MODIFIED="1264752645000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="E' possibile trascinare dati da applicazioni esterne, come file di Windows o parti di testo ad esempio selezionato in Firefox o altri programmi. Verrà creato un nuovo nodo." ID="ID_920949787" CREATED="1124560950717" MODIFIED="1264753144914"/>
+</node>
+<node TEXT="Muovere" FOLDED="true" ID="_Freeplane_Link_1540212684" CREATED="1124560950732" MODIFIED="1281099408041" COLOR="#407000">
+<node TEXT="Per posizionare liberamente un nodo, trascinarlo usando l'aggancio invisibile, posizionato di fianco al nodo, in direzione del nodo centrale. Il posizionamento dei nodi cambia solo l'aspetto visino, non la struttura." ID="_Freeplane_Link_97763226" CREATED="1124560950732" MODIFIED="1281097265050"/>
+<node TEXT="Anche se un nodo a destra viene spostato alla sinistra del nodo centrale, rimane strutturalmente alla destra. Il suo collegamento e l'aggancio invisibile rimangono a sinistra." ID="ID_1497593909" CREATED="1281097305191" MODIFIED="1281097397192"/>
+<node TEXT="Per muovere il cursore su, giu, sinistra o destra, usare i tasti freccia." ID="ID_922815781" CREATED="1124560950732" MODIFIED="1281097470850" LINK="#Freeplane_Link_1024903226"/>
+</node>
+<node TEXT="Copiare e incollare" FOLDED="true" ID="Freeplane_Link_958781924" CREATED="1124560950717" MODIFIED="1281099830747" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="E' possibile copiare ed incollare nodi (anche multipli) tra mappe come desiderato. In aggiunta, è possibile incollare testo normale o HTML da altre applicazioni." ID="ID_1059634022" CREATED="1124560950717" MODIFIED="1264754444154">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Incollando testo normale, verranno incollate linee multiple come nodi multipli, con la relativa profondità determinata dal numero degli spazi antecedenti nel testo. A seguire un esempio." ID="ID_256815337" CREATED="1124560950717" MODIFIED="1264754618451"/>
+<node TEXT="Albero
 Quercia
 Faggio" FOLDED="true" ID="ID_1437372199" CREATED="1124560950717" MODIFIED="1264767094313" COLOR="#996600">
+<node TEXT="Viene incollato come" FOLDED="true" ID="ID_1219605662" CREATED="1124560950717" MODIFIED="1264767038124">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Albero" FOLDED="true" ID="ID_969826077" CREATED="1124560950717" MODIFIED="1264767029296" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Quercia" ID="ID_237740698" CREATED="1124560950717" MODIFIED="1264767101938" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Faggio" ID="ID_1417959118" CREATED="1124560950717" MODIFIED="1264767105751" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Incollando codice HTML, può essere considerato come testo normale o strutturato. In aggiunta i link contenuti nel codice HTML diventano nodi figli di un nodo addizionale chiamato "Links"." FOLDED="true" ID="ID_470068904" CREATED="1124560950717" MODIFIED="1281099660496">
+<node TEXT="Usare Modifica > Incolla come..." ID="ID_1846001991" CREATED="1281099662136" MODIFIED="1281099719606"/>
+</node>
+<node TEXT="Esempio dopo aver incollato:" FOLDED="true" ID="ID_958620284" CREATED="1124560950717" MODIFIED="1264767157815">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Shopping (120236)" ID="ID_777639900" CREATED="1124560950717" MODIFIED="1124560950717">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Urban Living (19)" ID="ID_419425914" CREATED="1124560950717" MODIFIED="1264767228988">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Links" FOLDED="true" ID="ID_1988269220" CREATED="1124560950717" MODIFIED="1124560950717">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Shopping" ID="ID_693883044" CREATED="1124560950717" MODIFIED="1124560950717" LINK="http://directory.google.com/Top/Shopping/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Urban Living" ID="ID_1725209652" CREATED="1124560950717" MODIFIED="1264767227738" LINK="http://directory.google.com/Top/Home/Urban_Living/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Incollando una lista di file selezionati in esplora risorse di Microsoft Windows, viene generata una serie di link ai file stessi." ID="ID_1907315962" CREATED="1124560950717" MODIFIED="1264767916157"/>
+<node TEXT="Se in Freeplane si copia un ramo e si incolla in un editor di testo non avanzato (tipo blocco note), la struttura ad albero è visualizzata come allineamento. I collegamenti ipertestuali verranno racchiusi da parentesi <>. Ecco un esempio." ID="ID_1237696946" CREATED="1124560950717" MODIFIED="1264768456793"/>
+<node TEXT="Albero" FOLDED="true" ID="ID_1205560740" CREATED="1124560950717" MODIFIED="1264768189645" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Quercia" ID="ID_927227348" CREATED="1124560950717" MODIFIED="1264768195239" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Faggio" FOLDED="true" ID="ID_829496176" CREATED="1124560950717" MODIFIED="1264768199473" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="viene incollato come..." FOLDED="true" ID="ID_1657497070" CREATED="1124560950717" MODIFIED="1264768229583">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Albero
 Quercia
 Faggio
 Google <http://www.google.com/>" ID="ID_219622371" CREATED="1124560950732" MODIFIED="1264768263084" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Google" ID="ID_1246514257" CREATED="1124560950732" MODIFIED="1124560950732" COLOR="#996600" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Se in Freeplane si copia un ramo e si incolla in un editor di testo avanzato, viene mantenuta anche la formattazione inclusi colori e font. I collegamenti ipertestuali sono incollati in parentesi <>, come per il testo semplice. Gli editor che lo supportano sono Open Office, Microsoft Word, Wordpad or Microsoft Outlook, o altri in Linux." ID="ID_1673271824" CREATED="1124560950732" MODIFIED="1264950825937"/>
+<node TEXT="Per copiare un nodo, ma senza discendenti, premere Ctrl + Y o nel menu contestuale scegliere copia singolo." ID="ID_402222442" CREATED="1124560950732" MODIFIED="1264951102531"/>
+</node>
+<node TEXT="Aggiungere collegamenti ipertestuali" FOLDED="true" ID="Freeplane_Link_203858515" CREATED="1124560950717" MODIFIED="1281099982748" COLOR="#407000">
+<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>
+<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="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>
+<node TEXT="Aggiungere Icone" FOLDED="true" ID="Freeplane_Link_1044397139" CREATED="1124560950717" MODIFIED="1281103634819" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Un nodo può avere diverse icone." ID="ID_213408360" CREATED="1124560950717" MODIFIED="1264491647062"/>
+<node TEXT="Per aggiungere ad un nodo una icona, selezionare il nodo e premere sull'icona desiderata nella barra a sinistra. Mentre si muove il cursore del mouse verso la barra a sinistra, spostare il mouse velocemente o tenere premuto il tasto Alt o Ctrl per essere sicuri di mantenere selezionato il nodo." ID="ID_685370946" CREATED="1124560950717" MODIFIED="1266590095672"/>
+<node TEXT="E' possibile rimuovere la prima, l'ultima o tutte le icone. Usare gli appositi pulsanti in alto nella barra delle icone." ID="ID_1489759850" CREATED="1124560950717" MODIFIED="1266590096203"/>
+<node TEXT="Per aggiungere una icona senza usare la barra delle icone a sinistra, premere Ctrl + F2." ID="ID_1681522431" CREATED="1124560950717" MODIFIED="1266590096703">
+<font ITALIC="false"/>
+</node>
+<node TEXT="E' possibile aggiungere icone personalizzate. Creare una nuova cartella, ad esempio per l'utente Administrator: C:Documents and Settings\Administrator\.freeplane\icons. Inserire le icone in questa cartella, dovranno essere in formato png 16x16." ID="ID_596348002" CREATED="1124560950717" MODIFIED="1266590097343"/>
+<node TEXT="Per nascondere o visualizzare la barra delle icone, nel menu contestuale dallo sfondo o dal menu Visualizza, premere "Barra delle icone"." ID="ID_1569552712" CREATED="1124560950717" MODIFIED="1266590098047"/>
+<node TEXT="E' possibile usare queste icone e molte altre già comprese in Freeplane." ID="ID_1929074802" CREATED="1124560950717" MODIFIED="1264508420628">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="icon_not_found"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<icon BUILTIN="licq"/>
+</node>
+<node TEXT="Con l'impostazione Formato > Visualizza le icone in maniera gerarchica, le icone vengono aggiunge automaticamente in cascata ai nodi predecessori della gerarchia. Questa funzionalità è utile per sapere se nei nodi figli ci sono icone, senza dovere espanderli." ID="ID_1757624813" CREATED="1281103483099" MODIFIED="1281103628756"/>
+</node>
+<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">
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Questo nodo ha una<u> nota </u><b>allegata</b>.
+ </p>
+ </body>
+</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">
+<font SIZE="12"/>
+</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="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"/>
+</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"/>
+<node TEXT="Per cambiare il colore del collegamento grafico, premere il tasto destro del mouse sul collegamento stesso (su Mac usare Control + Click)." ID="_Freeplane_Link_208378337" CREATED="1124560950717" MODIFIED="1281272349309"/>
+<node TEXT="E' possibile cambiare il senso della freccia, usando sempre il menu contestuale." ID="_Freeplane_Link_1484370636" CREATED="1124560950717" MODIFIED="1264579054193"/>
+<node TEXT="Per aggiungere etichette, usare il menu che appare cliccando con il tasto destro del mouse sul collegamento stesso." ID="ID_111561726" CREATED="1281272440231" MODIFIED="1281272496887"/>
+<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"/>
+</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"/>
+</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"/>
+</node>
+</node>
+</node>
+<node TEXT="Aggiungere attributi" FOLDED="true" ID="ID_1041784802" CREATED="1281272641247" MODIFIED="1281272707450" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="I nodi possono avere attributi" ID="ID_1935914751" CREATED="1280841656393" MODIFIED="1280841722785" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<attribute NAME="X" VALUE="10"/>
+<attribute NAME="Y" VALUE="20"/>
+</node>
+<node TEXT="Usare Modifica > Modifica attributi o Alt + F9 per editare gli attributi di un singolo nodo" ID="ID_1040473500" CREATED="1281272709715" MODIFIED="1281272766653"/>
+<node TEXT="Usare Strumenti > Assegna attributi per assegnare o cambiare gli attributi di più nodi" ID="ID_1638848770" CREATED="1281272802356" MODIFIED="1281272846200"/>
+<node TEXT="Usare Strumenti > Gestione attributi per definire gli attributi" ID="ID_1775920452" CREATED="1281272850856" MODIFIED="1281272894684"/>
+</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="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">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Inserire immagini nei nodi" FOLDED="true" ID="Freeplane_Link_271176250" CREATED="1124560950732" MODIFIED="1281276996203" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Le immagini inserite sono dei collegamenti. All'interno del file .mm non è inclusa alcuna immagine. E' cura dell'utente usare riferimenti stabili alle immagini, in modo che il file di Freeplane possa trovarli." ID="ID_1327362410" CREATED="1281336128551" MODIFIED="1281336219168"/>
+<node TEXT="Per inserire una immagine in Freeplane, premere Alt + Shift + K, o dal menu scegliere Inserisci > Immagine. Inserendo l'immagine, viene perso tutto il testo presente nel nodo. Le immagini inserite in questo modo non verranno incollate correttamente fuori da Freeplane e non verranno correttamente esportate in HTML." ID="ID_158339543" CREATED="1124560950732" MODIFIED="1281276928515"/>
+<node TEXT="I formati supportati sono PNG, JPEG, JPG e GIF." ID="ID_1249566688" CREATED="1124560950732" MODIFIED="1266590210455"/>
+<node TEXT="E' supportato anche un nuovo metodo in cui il testo non viene perso ed è supportato anche il formato SVG, ma anche queste immagini non verranno esportate. Usare Inserisci > Immagini ridimensionabili. Inoltre è possibile ridimensionare l'immagine, ma solo trascinando dall'angolo in basso a destra dell'immagine stessa." ID="ID_1288599424" CREATED="1281273770169" MODIFIED="1281275882434"/>
+<node TEXT="E' possibile trascinare una immagine dal proprio computer, rilasciandola in Freeplane. Questa azione crea un Collegamento hyperlink. Per trasformare i collegamenti alle immagini in immagini visibili, premere Alt + Shift + K o Inserisci Immagine, dopo aver selezionato i collegamenti. E' possibile trascinare anche diverse immagini contemporaneamente in Freeplane, selezionarle e trasformale in immagini, premendo Alt + Shift + K." ID="ID_1194630978" CREATED="1124560950732" MODIFIED="1281276239203"/>
+<node TEXT="Un altro modo più tecnico ma non molto comodo per inserire immagini, è questo. Includere codice HTML nei nodi. E' necessario iniziare il nodo con l'etichetta <html>. In questo modo, è possibile avere immagini nei nodi." FOLDED="true" ID="ID_103407100" CREATED="1124560950732" MODIFIED="1265200688083" COLOR="#000000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Per esempio:
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">" ID="ID_1206475254" CREATED="1124560950732" MODIFIED="1265200698817">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="E' possibile usare collegamenti relativi alle immagini." ID="ID_1409757085" CREATED="1124560950732" MODIFIED="1265200734818">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</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="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"/>
+</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"/>
+</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"/>
+</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"/>
+</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"/>
+</node>
+</node>
+</node>
+<node TEXT="Using LaTeX in nodes" FOLDED="true" ID="ID_1060978136" CREATED="1271097112611" MODIFIED="1271528329415" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Esempio: Nodo con Testo LaTeX allegato" ID="ID_651820837" CREATED="1271097206186" MODIFIED="1281277420828">
+<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 TEXT="Per allegare LaTeX al nodo, usare Inserisci > Latex." ID="ID_1042304226" CREATED="1271097123195" MODIFIED="1281277495156"/>
+<node TEXT="Per modificare, cliccare sull'immagine renderizzata visualizzata sotto al nodo." ID="ID_21055085" CREATED="1271097312474" MODIFIED="1281277568765"/>
+<node TEXT="Per rimuovere il LaTeX, selezionare il nodo e dare nuovamente il comando Inserisci Latex." ID="ID_1638605492" CREATED="1271097172667" MODIFIED="1281277629609"/>
+</node>
+<node TEXT="Usando Annulla" FOLDED="true" ID="Freeplane_Link_1318678369" CREATED="1124560950732" MODIFIED="1266590134141" COLOR="#407000">
+<node TEXT="Per annullare l'ultima operazione, premere Ctrl + Z o usare il menu Modifica > Annulla" ID="ID_172098047" CREATED="1124560950732" MODIFIED="1281277093687"/>
+<node TEXT="Per ripristinare l'azione annullata, premere Ctrl + Y, o usare il menu Modifica > Ripristina." ID="ID_1925390553" CREATED="1124560950732" MODIFIED="1281277100937"/>
+<node TEXT="Per impostare il numero di passi mantenuti in memoria per la funzione Annulla, usare il menu Strumenti > Preferenze > Comportamento > Annulla." ID="ID_1107060214" CREATED="1124560950732" MODIFIED="1281277149187"/>
+</node>
+</node>
+<node TEXT="Formattazione" FOLDED="true" POSITION="right" ID="ID_435434116" CREATED="1280845463492" MODIFIED="1281279918187" COLOR="#006666">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Visualizzazione della mappa" FOLDED="true" ID="ID_501850330" CREATED="1281277864640" MODIFIED="1281278088843" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="La mappa può essere visualizzata in due modalità" FOLDED="true" ID="ID_622778113" CREATED="1281277886015" MODIFIED="1281277915296">
+<node TEXT="Come mappa" ID="ID_889816043" CREATED="1281277919140" MODIFIED="1281277928703"/>
+<node TEXT="Come elenco" ID="ID_189456167" CREATED="1281277929109" MODIFIED="1281277953796"/>
+</node>
+<node TEXT="E' possibile commutare tra le due visualizzazioni tramite Visualizza > Visualizzazione lineare ad albero" ID="ID_921658234" CREATED="1281277957234" MODIFIED="1281278023312"/>
+<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>
+<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>
+<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>
+<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="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"/>
+</node>
+<node TEXT="Per ridurre la dimensione del testo, usare Formato > Diminuisci carattere o premere i tasti Ctrl e - (non sul tastierino numerico)." ID="ID_1761103740" CREATED="1124560950717" MODIFIED="1281278444890">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node TEXT="Per cambiare il tipo di font, usare il campo nella barra principale." ID="ID_389938875" CREATED="1124560950717" MODIFIED="1264353596516">
+<font NAME="Arial Black"/>
+</node>
+<node TEXT="Tutte le funzioni sono disponibili anche dal menu contestuale." ID="ID_91065229" CREATED="1281278490390" MODIFIED="1281278575421"/>
+<node TEXT="Per copiare il formato di un nodo, usare Modifica > Copia Formattazione o premere Alt+Shift+C" ID="ID_1601112837" CREATED="1124560950717" MODIFIED="1281278693109"/>
+<node TEXT="Per incollare il formato di un nodo, usare Modifica > Incolla Formattazione o premere Alt+Shift+V." ID="ID_1052996963" CREATED="1124560950717" MODIFIED="1281278692656"/>
+</node>
+<node TEXT="Formattare i collegamenti al nodo" FOLDED="true" ID="ID_1524624084" CREATED="1281278752968" MODIFIED="1281278771703" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Ci sono diversi tipi di stili di collegamento" ID="ID_432091423" CREATED="1281278776281" MODIFIED="1281278796968"/>
+<node TEXT="E' possibile cambiare anche il colore e lo spessore o renderli invisibili" ID="ID_1168455740" CREATED="1281278798437" MODIFIED="1281278829265"/>
+<node TEXT="Scegliere dal menu formato" ID="ID_332219045" CREATED="1281278836984" MODIFIED="1281278897203"/>
+<node TEXT="Esempio" FOLDED="true" ID="ID_1001130686" CREATED="1270896156486" MODIFIED="1281279193687">
+<edge STYLE="horizontal" COLOR="#ff0033"/>
+<node TEXT="Ci sono diversi tipi di stili di collegamento" ID="ID_964515817" CREATED="1270896067862" MODIFIED="1281279157828">
+<edge STYLE="sharp_linear"/>
+</node>
+<node TEXT="Bezier" ID="ID_1957626996" CREATED="1281279079750" MODIFIED="1281279167859">
+<edge STYLE="sharp_bezier"/>
+</node>
+<node TEXT="E' possibile cambiare colore e spessore" ID="ID_1661508589" CREATED="1270896096758" MODIFIED="1281279117937">
+<edge COLOR="#990099" WIDTH="4"/>
+</node>
+<node TEXT="o anche renderli invisibili" ID="ID_1611046638" CREATED="1270896109110" MODIFIED="1281279060093">
+<edge STYLE="hide_edge"/>
+</node>
+</node>
+</node>
+<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>
+<node TEXT="Formattazione automatica" FOLDED="true" ID="ID_1643494769" CREATED="1281279223015" MODIFIED="1281279233812" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="I nodi possono essere automaticamente formattati, dipendentemente dalla gerarchia" ID="ID_492633426" CREATED="1281279722640" MODIFIED="1281279759046"/>
+<node TEXT="Questa funzione è chiamata "Formattazione automatica" ed è disponibile dal menu Formato" ID="ID_1207069654" CREATED="1281279759578" MODIFIED="1281279827109"/>
+<node TEXT="L'impostazione si trova in Strumenti > Preferenze > Formattazione automatica" ID="ID_1895131067" CREATED="1281279868125" MODIFIED="1281279903125"/>
+</node>
+<node TEXT="Evidenziare i nodi con le nuvole" FOLDED="true" ID="Freeplane_Link_1697687428" CREATED="1124560950717" MODIFIED="1266590072780" COLOR="#407000">
+<node TEXT="Le nuvole sono molto adatte ad evidenziare una zona. Verranno evidenziati il nodo selezionato e tutti i suoi discendenti." ID="ID_390294061" CREATED="1124560950717" MODIFIED="1264422951320"/>
+<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"/>
+<node TEXT="... o marrone." ID="ID_1302420936" CREATED="1124560950717" MODIFIED="1264423235820">
+<cloud COLOR="#ede5d5" WIDTH="0"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Caratteristiche avanzate" POSITION="right" ID="ID_618306633" CREATED="1280845476118" MODIFIED="1281339853212" COLOR="#006666">
+<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="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"/>
+<node TEXT="La F-Barra è semplicemente una rappresentazione degli assegnamenti dei tasti funzione. Questi sono sempre configurati come appena spiegato. Le modifiche alla configurazione dei tasti F1 - F12 vengono immediatamente visualizzate nella barra." FOLDED="true" ID="ID_1065958064" CREATED="1281280516609" MODIFIED="1281280655921">
+<node TEXT="Vedi anche" ID="ID_1478588436" CREATED="1281280795234" MODIFIED="1281280833796" LINK="#Freeplane_Link_1514218661"/>
+</node>
+</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="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="Per migliorare l'uso dello spazio, impostare la pagina in orizzontale." ID="ID_653074622" CREATED="1124560950732" MODIFIED="1265114499545">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="E' anche possibile stampare dal browser dopo l'esportazione HTML, o da Open Office dopo aver copiato ed incollato la mappa. E' possibile esportare la mappa in HTML con le intestazioni copiarla in Open Office e stamparla. In questo modo si può cambiare lo stile a piacere." ID="ID_851000404" CREATED="1124560950732" MODIFIED="1265114983965">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Script" FOLDED="true" ID="ID_1096079491" CREATED="1281336076430" MODIFIED="1281336083164" COLOR="#407000">
+<font NAME="Dialog" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="E' possibile estendere le funzionalità di Freeplane tramite Groovy script." FOLDED="true" ID="ID_648244186" CREATED="1281337065546" MODIFIED="1281337112811">
+<node TEXT="Groovy scripts possono accedere alla mappa come Script API" ID="ID_245649261" CREATED="1281337119280" MODIFIED="1281337162562"/>
+<node TEXT="Gli script possono usare alcune parti di Freeplane (utility classes) che sono messe a disposizione da Freeplane, es. UITools, LogTool o HtmlTools." ID="ID_937081742" CREATED="1271022419501" MODIFIED="1281337264547"/>
+<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>
+<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>
+<node TEXT="Esportazione, Importazione, Integrazione" FOLDED="true" ID="ID_1152450080" CREATED="1281346616021" MODIFIED="1281346643569" COLOR="#407000">
+<font NAME="Dialog" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Esportare in HTML" FOLDED="true" ID="Freeplane_Link_22510332" CREATED="1124560950732" MODIFIED="1266590146313" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Per esportare il ramo corrente in HTML, premere Ctrl + H o File > Esporta > Esporta ramo come HTML. Le pagine esportate possono contenere il supporto alla struttura ad albero, come da impostazioni in preferenze." ID="ID_1215368786" CREATED="1124560950732" MODIFIED="1281338792009"/>
+<node TEXT="E' possibile esportare anche in formato XHTML, per avere una migliore fruibilità della mappa, dal menu File scegliere Esporta XHTML (Versione JavaScript)." ID="ID_280870032" CREATED="1124560950732" MODIFIED="1265029344192"/>
+<node TEXT="Per esportare la mappa con una immagine di anteprima in HTML, dal menu scegliere come XHTML (Mappa cliccabile)." ID="ID_1786851507" CREATED="1124560950732" MODIFIED="1265029290645"/>
+</node>
+<node TEXT="Esportare come Bitmap o immagine vettoriale" FOLDED="true" ID="Freeplane_Link_1908686168" CREATED="1124560950732" MODIFIED="1266590148766" COLOR="#407000">
+<node TEXT="Per esportare la mappa come immagine PNG, dal menu File scegliere Esporta quindi in PNG..." ID="ID_560060499" CREATED="1124560950732" MODIFIED="1265029498380"/>
+<node TEXT="Per esportare la mappa come immagine JPEG, dal menu File scegliere Esporta quindi in JPEG..." ID="ID_1131784557" CREATED="1124560950732" MODIFIED="1265029551850"/>
+<node TEXT="Per esportare la mappa come SVG (vettoriale), dal menu File scegliere Esporta quindi in SVG..." ID="ID_1591782706" CREATED="1124560950732" MODIFIED="1281338880540"/>
+</node>
+<node TEXT="Esportare in altri formati XML" FOLDED="true" ID="Freeplane_Link_329770204" CREATED="1124560950732" MODIFIED="1266590150954" COLOR="#407000">
+<node TEXT="Per esportare la mappa in altri formati XML per i quali si possiede un foglio di trasformazione XSLT, usare il menu File > Esporta > Usando XSLT." ID="ID_414414645" CREATED="1124560950732" MODIFIED="1281338910181"/>
+<node TEXT="Per esportare la mappa in formato OpenOffice, dal menu file scegliere Esporta come documento di testo OpenOffice." ID="ID_911463904" CREATED="1124560950732" MODIFIED="1266590154501"/>
+</node>
+<node TEXT="Importare struttura cartella" FOLDED="true" ID="Freeplane_Link_1841136119" CREATED="1124560950732" MODIFIED="1266590160970" COLOR="#407000">
+<font NAME="Dialog" SIZE="12"/>
+<node TEXT="Per importare la struttura di una cartella, dal menu file scegliere importa quindi Importa struttura cartella. Verrà chiesta quale cartella importare. Si ottiene lo stesso risultato copiando una cartella in esplora file ed incollandola in Freeplane. Per struttura cartella si intendono i collegamenti a tutti i file ed eventualmente alle sottocartelle. A seguire un esempio." ID="ID_141591900" CREATED="1124560950732" MODIFIED="1266590163407"/>
+<node TEXT="Esempio" ID="ID_1844264178" CREATED="1124560950732" MODIFIED="1265097166097" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Cartella selezionata" ID="ID_1362619219" CREATED="1124560950732" MODIFIED="1265097255782" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_902406321" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%2520Files/Microsoft%2520Office/Office/Bitmaps">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Dbwiz" FOLDED="true" ID="ID_1908488478" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_1066131561" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_1998800906" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_1320050632" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_1342208723" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_1910959608" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_1185864745" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_1275766052" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_1024583873" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_1229846663" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_40711894" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
+</node>
+<node TEXT="Styles" FOLDED="true" ID="ID_1279990067" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_83701464" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_1602980216" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_884622068" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_1016777953" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1304662239" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_1245708126" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1137033904" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_1328702132" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1686866241" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+</node>
+<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>
+<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"/>
+</node>
+<node TEXT="Integrazione con Office e Open Office" ID="Freeplane_Link_913645795" CREATED="1124560950732" MODIFIED="1281277372921" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="E' possibile incollare mappe o rami in Open Office, Microsoft Word, Wordpad o messaggi di Outlook. Generalmente è possibile farlo in qualsiasi programma. Verranno trasportati anche la formattazione del testo ed i collegamenti, se l'applicazione lo supporta." ID="ID_1401801900" CREATED="1124560950732" MODIFIED="1265113312669">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Cliccando su un link del tipo (mailto:don.bonton at supermail.com) verrà aperto il programma impostato di default per inviare posta (es.Outlook) per creare un nuovo messaggio." ID="ID_1282579924" CREATED="1124560950732" MODIFIED="1281277343546" LINK="mailto:don.bonton at supermail.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="E' possibile impostare anche l'oggetto della mail nel link: es.mailto:don.bonton at supermail.com?subject=Ultima telefonata." ID="ID_502426887" CREATED="1124560950732" MODIFIED="1265113584905" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
+<node TEXT="Un modo alternativo per incollare mappe in Open Office, è di esportarle in HTML basato sulle intestazioni e incollare il codice HTML in Open Office." ID="ID_1096267545" CREATED="1124560950732" MODIFIED="1265113740328"/>
+</node>
+</node>
+<node TEXT="Backup automatico" FOLDED="true" ID="ID_1644088567" CREATED="1281339300447" MODIFIED="1281339846103" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<node TEXT="Freeplane crea una cartella chiamata .backup in ogni cartella che contiene una mappa modificata. Le vecchie versioni della mappa vengono salvate qui. Le copie hanno l'estensione ".autosave"" ID="ID_486404393" CREATED="1281339380900" MODIFIED="1281339475775"/>
+<node TEXT="Come standard, avviene un salvataggio automatico ogni minuto, e gli ultimi 10 salvataggi sono mantenuti come protezione contro la chiusura accidentale di Freeplane, ad esempio se si spegne il computer." ID="ID_364514060" CREATED="1281339482212" MODIFIED="1281339577353"/>
+<node TEXT="Per ripristinare un file salvato automaticamente, è necessario rinominarlo manualmente rimuovendo l'estensione ".autosave" e la sequenza di numeri ( standard da 1 a 10 )." ID="ID_1989849502" CREATED="1281339594118" MODIFIED="1281339701118"/>
+<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="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="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>
+<node TEXT="Mappa del Browser" FOLDED="true" ID="_Freeplane_Link_1530607683" CREATED="1124560950701" MODIFIED="1281339292088" COLOR="#407000">
+<node TEXT="Per esplorare le mappe, piuttosto che modificarle, commutare in modalità mappa del browser, dal menu Mappe. A meno che non sia usata in un applet, questa funzionalità non funziona." ID="ID_1564198866" CREATED="1124560950701" MODIFIED="1266410185416"/>
+<node TEXT="Il motivo per avere una modalità separata per vedere le mappe è una questione tecnica. Esplorare è la sola cosa che si può fare nell'applet di Freeplane che può essere integrato in un sito web. Normalmente non serve usare la modalità "mappa del Browser"." ID="ID_1144234617" CREATED="1124560950701" MODIFIED="1266410359480"/>
+</node>
+</node>
+</node>
+</map>
+
+
diff --git a/freeplane/doc/freeplane_ja.mm b/freeplane/doc/freeplane_ja.mm
new file mode 100644
index 0000000..f57a88e
--- /dev/null
+++ b/freeplane/doc/freeplane_ja.mm
@@ -0,0 +1,17614 @@
+<map version="freeplane 1.2.0">
+<!--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">
+<icon BUILTIN="bee"/>
+<hook NAME="MapStyle">
+ <conditional_styles>
+ <conditional_style ACTIVE="false" STYLE_REF="Revision" LAST="false">
+ <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"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode TEXT="Definition">
+<font ITALIC="true"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Method">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="OptionalValue" COLOR="#cc3300">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Procedure" COLOR="#006666">
+<font BOLD="true"/>
+<edge COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Exception">
+<icon BUILTIN="messagebox_warning"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Refine">
+<icon BUILTIN="xmag"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="ToNote">
+<icon BUILTIN="yes"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="Example">
+<icon BUILTIN="../AttributesView"/>
+<edge STYLE="bezier" COLOR="#808080"/>
+</stylenode>
+<stylenode TEXT="MainMenu" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="horizontal" COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="SubMenu" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="MenuGroupLabel" COLOR="#000000" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
+<edge COLOR="#33ffcc" WIDTH="2"/>
+<attribute_layout NAME_WIDTH="78" VALUE_WIDTH="116"/>
+</stylenode>
+<stylenode TEXT="Title" COLOR="#ffffff" BACKGROUND_COLOR="#2ed2a9" STYLE="bubble">
+<font BOLD="true"/>
+<edge STYLE="horizontal"/>
+</stylenode>
+<stylenode TEXT="IsChecked" COLOR="#cc3300">
+<icon BUILTIN="checked"/>
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="UnChecked" COLOR="#cc3300">
+<icon BUILTIN="unchecked"/>
+<edge COLOR="#33ffcc"/>
+</stylenode>
+<stylenode TEXT="Revision">
+<icon BUILTIN="revision"/>
+</stylenode>
+<stylenode TEXT="UserGuide">
+<edge STYLE="horizontal"/>
+</stylenode>
+<stylenode TEXT="ProcedureStep">
+<edge STYLE="bezier"/>
+</stylenode>
+<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.predefined" POSITION="right">
+<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.note">
+<edge COLOR="#cc0000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
+</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>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<edge STYLE="hide_edge"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="2">このマニュアルは、普通の単線的な説明文書 </font>
+ </p>
+ <p>
+ <font size="2">とは異なる特徴を備えています。ノード上で </font>
+ </p>
+ <p>
+ <b><font size="2">ホバーリング</font></b><font size="2">[カーソルを置いてしばらく </font>
+ </p>
+ <p>
+ <font size="2">動かさないで待つこと]すると、内容が表示 </font>
+ </p>
+ <p>
+ <font size="2">されます。また、ノードを<b>クリック</b>すると、 </font>
+ </p>
+ <p>
+ <font size="2">折り畳まれているノードが展開表示されます。</font>
+ </p>
+ <p>
+ <br/>
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <b><a href="freeplaneFunctions_ja.mm"><font size="3">Freeplane の機能</font></a></b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リンクをクリックすると、Freeplane の主要機能を使ったマインドマップが開きます。ノードテキスト上でホバーすると、非表示になっているリンクが表示され、この<i>クィックリファレンス</i>、及び<i>「ヘルプ > マニュアル」</i>にある、諸機能の説明にジャンプすることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ インデックスマップから、このマップに戻るには、<i>「ナビゲーション > 前のマップ」</i>(又はツールバーのアイコン)を選択してください。
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <a href="freeplaneFunctions_ja.mm"><font size="3"><b>Freeplane の適用事例</b></font></a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リンクをクリックすると、Freeplane の主要な適用事例を示すマインドマップが開きます。インデックスマップのリンクを辿るには、インターネット接続が必要です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ インデックスマップからこのマップに戻るには、「ナビゲーション > 前のマップ」を選択してください(ツールバーにアイコンもあります)。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+</node>
+</node>
+<node TEXT="リファレンス" STYLE_REF="Title" FOLDED="true" POSITION="right" ID="ID_332175012" HGAP="-37" VSHIFT="-64" TEXT_SHORTENED="true">
+<icon BUILTIN="wizard"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane では、メインメニューバーを使えば、大半の機能にアクセスできます。そこには、相互に関連する機能(動作)やダイアログボックス、パネルに跳ぶ一連の見出しメニューが表示されます。概略がわかるよう、関連項目を波括弧とグループラベルによって大括りにしています。メインメニューは下記の項目(ノード)で構成されます。このメニュー構造は、諸機能とダイアログボックスを記述する枠組みと見なされます。所期の結果を実現するには、諸々の機能を所定の順序、いわゆる手順に従って呼び出さなければなりません。重要な手順については、記述による説明だけでなく、関連する諸々の諸動作に関係付けされています。これにより、関連動作を間単に見出せるようになっています。機能と手順は、それぞれ独自の体裁(スタイル)で表示され、こうして、容易に識別できるようになっています。機能と手順の適用に際しては、例外が含まれることもあります。手順を理解するには、用例が有益かもしれません。留意すべき例外や用例などの情報は、それらが当てはまる機能や手順の周辺に表示されます。それらは、独自の体裁(スタイル)やアイコンで識別できるようになっています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 緑の矢印をクリックして、下記の各項目に適用されるスタイルをご覧ください。
+ </p>
+ <ul>
+ <li>
+ (サブ)メニュー
+ </li>
+ <li>
+ 機能とオプション値
+ </li>
+ <li>
+ 手順
+ </li>
+ <li>
+ 例外
+ </li>
+ <li>
+ 用例
+ </li>
+ <li>
+ 留意事項
+ </li>
+ </ul>
+ </body>
+</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"/>
+<attribute NAME="Chapter" VALUE="1,2,6,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップファイルの処理を行ないます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="新規マップ" ID="ID_1310307853">
+<icon BUILTIN="../filenew"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規の Freeplane マップを作成します。このマップは、保存されるまでは、メモリー上にしか存在しません。
+ </p>
+ </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">
+<icon BUILTIN="../new_map_"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規作成マップの原型となるマップスタイル選択用のダイアログを開きます。このマップは、保存されるまでは、メモリー上にしか存在しません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="保護(暗証)付き新規マップ..." ID="ID_1015806590" TEXT_SHORTENED="true">
+<icon BUILTIN="../lock"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">当該マップを開く際に求められるパスワードの入力を促し、新規マップを作成します。 これは、ノード保護用パスワードと同類の機能です。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ この機能は、「ツール > 環境設定 > 環境 > ファイル > 他者と同時編集時はファイルを読み込み専用に」が有効設定されていなければ、作動しません。
+ </li>
+ <li>
+ 個別ノードのパスワード保護によって、重層的なセキュリティを設けることも可能です。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="" ID="ID_43524792" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準では、この機能は無効にされています。有効にするには、次の設定項目にチェックを入れてください。
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定 > 環境 > ファイル > 他者と同時編集時はファイルを読み込み専用に」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="新規マップを作成" ID="ID_177723183">
+<hook NAME="SummaryNode"/>
+<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">
+<icon BUILTIN="../filesave"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">作成済みのマップを保存します。マップを最初に保存する場合、保存ダイアログボックスが現れます。マップが以前に一度でも保存されていれば、最新の保存分に自動的に上書きされます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">ここで取り上げるのは、意図的な保存のことで、自動保存機能ではありません。(</font>意図的な保存とは、「ファイル > 上書き保存」や「ファイル > 名前をつけて保存... 」、ツールバーの「上書き保存」アイコンや「名前をつけて保存」アイコン、あるいは「Ctrl + S」を用いて、手動で行なうものです。<font face="SansSerif, sans-serif" color="#000000"> )</font>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「環境設定 > 環境 > 自動保存」</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1,2"/>
+</node>
+<node TEXT="名前をつけてマップを保存..." ID="ID_449363060" TEXT_SHORTENED="true">
+<icon BUILTIN="../filesaveas"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">既に保存されているマップを別のファイル名で保存するために、ダイアログを開きます。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="すべてのマップを保存" ID="ID_1423263542" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ オープン中のすべてのマップを保存します。「上書き保存」と同じ動作ですが、オープン中のすべてのマップに適用されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="履歴ファイルから復元" ID="ID_1896010117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップを以前に行なった<font color="#ff3300">意図的な</font>保存の<font color="#ff3300">履歴により、</font>どれかの状態に戻します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 意図的な保存とは、「ファイル > 上書き保存」や「ファイル > 名前を変えて保存...」、ツールバー上の「上書き保存アイコン」や「名前をつけて保存」アイコン、ないし「Ctrl + S」を用いた手動による保存です。
+ </li>
+ <li>
+ 「自動保存」は無視されます。<u>このコマンドは冷酷なコマンドで、</u> 「編集 > 元に戻す」で復元することができません。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 個別ノードに加えられた個別的変更については、「編集 > 元に戻す」、及び「編集 > やり直す」。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="マップを保存" ID="ID_1689022735">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 折り畳み状態を保存しなければならない場合は、環境設定で設定できます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="保存マップを開く..." ID="ID_1284635316" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileopen"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ選択ダイアログを開き、保存されたマップを開きます。
+ </p>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ URL入力用ダイアログを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="最近使ったマップ" ID="ID_655783347" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 最近開いたマップの一覧表を開きます。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="マップを開く" ID="ID_565242033">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="マップをエクスポート" FOLDED="true" ID="ID_1294197740" TEXT_SHORTENED="true">
+<icon BUILTIN="../export"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ エクスポート先とエクスポートの種類を選択するダイアログを開きます。
+ </p>
+ </div>
+ </div>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を HTML ファイルにエクスポートします。マップは、「あるがまま」にエクスポートされます。すなわち、HTML ファイルは、 Freeplane でマップが表示されていたのと同じように表示されます。ノードが展開されていれば、HTML ファイルでも展開表示されます。エクスポート時にノードが折り畳まれていれば、HTML ファイルでも折り畳み表示されます。HTML ファイルに、折り畳まれたノードを展開する Java スクリプトを添付することができます。</font>
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div style="margin-top: 0">
+ <p>
+ 枝を HTML ファイルに
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <br/>
+
+
+ <div>
+ <div>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードとそのすべての下位ノード群に限って、マップの枝をエクスポートします。その他の点では、「HTML に」エクスポートと同じです。</font>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node STYLE_REF="OptionalValue" ID="ID_413819995" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div style="margin-top: 0">
+ <p>
+ Open Office Writer ファイルに(ODT)
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップを Open Office Writer ファイルにエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="PNG 画像に" STYLE_REF="OptionalValue" ID="ID_1720625924" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を PNG 画像形式でエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="JPEG 画像に" STYLE_REF="OptionalValue" ID="ID_760837856" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を JPEG/JPG 画像形式でエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を完全な JavaScript 機能付きでエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node STYLE_REF="OptionalValue" ID="ID_519681176" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <br/>
+
+
+ <div>
+ <div style="margin-top: 0">
+ <p>
+ XHTML(クリッカブルマップ版)に
+ </p>
+ </div>
+ </div>
+ <p>
+
+ </p>
+ <p>
+ As XHTML (click-able map image version HTML)...
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体をエクスポートします。ページ内の比率は、Freplane でのマップ表示とそっくりに再現されます。一部のノードが折り畳み状態で、一部が展開中の場合、[エクスポート]ファイルでも同じになります。ページの詳細部分には、アウトライン形式ですべてのノードを収録します。</font>
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Java アプレットに(HTML)" STYLE_REF="OptionalValue" ID="ID_376134497" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">ウェブページでの公開に向いた HTML 埋め込み版マップを作成します。実際のマップそっくりに再現されます。すなわち、Freeplane アプリ上と同様に、ノードの展開・折り畳みできます。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="ウェブサイトでの公開とシェア" ID="ID_126764093" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">画像付きマインドマップは公開やシェアできませんが、標準アイコン付きのものなら可能です。以下の要領で操作してください。</font>
+ </p>
+ <ul>
+ <li>
+ オープニング時に表示させたい形に、マインドマップを折り畳んでください。
+ </li>
+ <li>
+ <i>「ファイル > エクスポート」</i>を選択し、<i>「Java アプレットに」</i>を選んでください。<i>「myFile.html」</i>というファイルと <i>「myFile.html_files」</i> というディレクトリが作成されます。
+ </li>
+ </ul>
+ <p>
+ これで、<i>「myFile.html」</i>ファイルと <i>「myFile.html_files」</i>サブディレクトリを、アクセス許可する場所(ディレクトリ)に移すことができるようになります。 <i>「myFile.html」</i>は 好みに応じて、例えば、<i>「myName.mm」</i> という新しいファイル名に変更してもかまいません。サブディレクトリを名称変更してはいけません。これで、ユーザは、このマインドマップを<i>「myName.mm」</i>という名称で開けられるようになります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 画像の公開/シェアについては、<i>緑の矢印</i>を押して跳ぶリンク先も参照。
+ </li>
+ <li>
+ アイコンを非表示にするには、<i>「ツール > 環境設定 > 画面表示 > アイコン」</i>を参照。
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Flash に(HTML)" STYLE_REF="OptionalValue" ID="ID_1614795199" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">実際のマップそっくりの Flash マップにエクスポートします。Freeplane アプリ上と同様に、ノードの展開・折り畳みができます。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="タスクを TASKS ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_1149086587" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">オープンソースのプロジェクトマネジメントツール TaskJuggler から呼び出すことのできるファイルにエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="リソースを RESOURCES ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_148675074" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">オープンソースのプロジェクトマネジメントツール TaskJuggler から呼び出すことのできるファイルにエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="TWiki に(TW)" STYLE_REF="OptionalValue" ID="ID_107208189" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を TWiki 形式のファイルにエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Freeplane 1.1 ファイルに" STYLE_REF="OptionalValue" ID="ID_1737656870" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="HTML ファイルに(HTM、HTML)" STYLE_REF="OptionalValue" ID="ID_1085699848" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="LaTeX ファイルに(TEX)" STYLE_REF="OptionalValue" ID="ID_105191845" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="LaTeX ブックに(TXT)" STYLE_REF="OptionalValue" ID="ID_1955179559" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="MS Project 2003 に(XML)" STYLE_REF="OptionalValue" ID="ID_1056023013" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Mediawiki に(MWIKI)" STYLE_REF="OptionalValue" ID="ID_80736991" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Oowriter ファイルに(OOWRITER)" STYLE_REF="OptionalValue" ID="ID_878113260" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="OPML ファイルに(OPML)" STYLE_REF="OptionalValue" ID="ID_1694858774" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="プレーンテキストに(TXT)" STYLE_REF="OptionalValue" ID="ID_449065508" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Word 2003 以降版に(DOC, XML)" STYLE_REF="OptionalValue" ID="ID_1705171054" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="XBEL ファイルに" STYLE_REF="OptionalValue" ID="ID_366462703" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_944473030" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を Adobe Acrobat PDF 形式にエクスポートします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="SVG 画像に" STYLE_REF="OptionalValue" ID="ID_1270778319" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップ全体を SVG イメージ形式にエクスポートします。 </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_783046977" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ システムアイコン以外の画像は Freeplane [データファイル]に含まれません。したがって、画像については、自動的にエクスポートすることができません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノードの機能 > 画像」 </i>
+ </li>
+ <li>
+ <i>「ツール > 環境設定 > 画面表示 > アイコン」</i>
+ </li>
+ <li>
+ <i>「ツール > 環境設定 > HTML」</i>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="他のエディタへ" ID="ID_916000315"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 枝を普通のテキストエディタにコピーすると、枝の階層構造がインデントレベルの形で再現されます。ハイパーリンクは、括弧内に表示されます。リッチテキストを操作できるエディタには、OpenOffice/Write、MSWord、Wordpad、Outlook などがあります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+</node>
+</node>
+<node TEXT="枝を新しいマップに..." ID="ID_995694574" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 選択ノードとその下位ノード群を新規マップに保存します。新規マップでは、選択中のノードがルートノードとなり、そこに切り出し元の位置へのハイパーリンクが付加されます。選択ノードに新規マップ向けのハイパーリンクができ、また下位ノード群は削除されます
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="マップにインポート" FOLDED="true" ID="ID_977906606" 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">
+<hook NAME="FirstGroupNode"/>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="リンク先マップを、枝として" STYLE_REF="OptionalValue" ID="ID_437986291" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="リンク先マップのルート以外を、枝として" STYLE_REF="OptionalValue" ID="ID_676975317" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="Explorer のお気に入りを..." STYLE_REF="OptionalValue" ID="ID_1111015619" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="フォルダ構造を..." STYLE_REF="OptionalValue" ID="ID_1133473891" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="MindManager X5 マップを..." STYLE_REF="OptionalValue" ID="ID_1936806780" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="環境設定を参照" ID="ID_1138762077" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定 > HTML」</i>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="マップのインポート/エクスポート" ID="ID_1827918008" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップの印刷形式を選択するダイアログボックスが開きます。</font>
+ </p>
+ <ul>
+ <li>
+ + - 全体を1ページに収め<font color="#000000" face="SansSerif, sans-serif">る</font>
+
+ <ul id="fold1_1">
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップt全体を1ページに圧縮します。マップの大きさによっては、印字が小さすぎて読めなくなることもあります。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - 横幅をページに合わせる
+
+ <ul id="fold1_2">
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップをページの横幅に合わせますが、マップの大きさによっては、複数ページにわたるものになることもあります。印刷の向きが縦か、横かの選択によって、結果が大きく異なることがあります。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - 縦幅をページに合わせる
+
+ <ul id="fold1_3">
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップをページの縦幅に合わせますが、マップの大きさによっては、複数ページにわたるものになることもあります。印刷の向きが縦か、横かの選択によって、結果が大きく異なることがあります。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - 画面表示 × 印刷倍率
+
+ <ul id="fold1_4">
+ <li>
+ 0.0 倍~2.0倍の範囲の倍率を入力できる「印刷倍率係数」を利用できます。この係数は、横幅と縦幅の両方に同じ比率で適用されます。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="../print_preview"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ページ設定に基づいて印刷されるマップがどのようなものになるか、視覚的に表示します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「ページ設定...」</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="マップを印刷..." ID="ID_1054511597" TEXT_SHORTENED="true">
+<icon BUILTIN="../fileprint"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ印刷用のプリンタ関連のダイアログボックスを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="マップを印刷" ID="ID_1010250538" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+<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">
+<icon BUILTIN="../close"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フォーカス状態のマップを閉じます。複数のマップが開かれている場合、フォーカス状態とは編集中のタブのものを指します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="Freeplane を終了" ID="ID_623268381" TEXT_SHORTENED="true">
+<icon BUILTIN="../quit"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ オープン中のすべてのマップを閉じ、Freeplae を終了します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="編  集" FOLDED="true" ID="ID_1198850460" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 頻繁に使われる編集機能が含まれます。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<node TEXT="新規ノード作成" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<node TEXT="新規子ノード" ID="ID_942355748" TEXT_SHORTENED="true">
+<icon BUILTIN="../idea"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択中のノードの子ノード(下位のノード)として新規ノードを作成します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>同一動作</b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">「<i>Ins」</i>キーを押す。</font>
+ </li>
+ <li>
+ ツールバー上の<i>「電球」</i>アイコンを押す。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="新規弟ノード" ID="ID_1544212529" TEXT_SHORTENED="true">
+<icon BUILTIN="../NewSiblingAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択中のノードの下に同一階層の新規ノードを作成します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>同一動作</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><i>「Enter」キーを押す。</i></font>
+ </li>
+ <li>
+ 編集モード中であれば、<i>「Enter」</i>キーを2度押す。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="新規兄ノード" ID="ID_852536639" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノードの<b>すぐ上に</b>同一階層の新規ノードを作成します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>同一動作</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Shift + Enter」</i>の複合キーを押す。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="新規親ノード" ID="ID_1509185966" TEXT_SHORTENED="true">
+<icon BUILTIN="../stock_text_indent"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードと親ノード(上位のノード)との間に、新規ノードを作成します。新規ノードは、元の親ノードの子ノードとなります。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>同一動作</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Shift + Insert」</i>の複合キーを押す。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="新規フリーノード" ID="ID_389982270" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 想定上ルートノードに連結されるフリー[ポジション]ノードを作成します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="新規まとめノード(選択ノード群)" FOLDED="true" ID="ID_1126176775" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択範囲の兄ノードたちを波括弧によって括る新規<i>「まとめノード」</i>を作成します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 技術的には、まとめノードは、兄弟ノードグループ一員で、グループの最下部に位置するノードとみなされます。
+ </li>
+ <li>
+ 上方の選択されたノード(単数)にまとめノード群の始点マークが付されます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ グループに含めるノードの範囲を加減する場合は、<i><font color="#ff0000">「ノード グループ > まとめノード群の始点)」</font></i>を参照。
+ </li>
+ <li>
+ まとめノードを[普通の]兄弟ノードの1つに変換する場合は、<i><font color="#ff0000">「ノードグループ > まとめノードに指定/解除」</font></i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="" ID="ID_805111336" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 技術的は、まとめノードは兄ノード群の下方に位置する弟ノードとみなされます。用例を参照。
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_1070404224" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ <b>エラー</b>
+ </p>
+ <p>
+ 特定グループのまとめノードを作成できないという、<b>エラーメッセージ</b>が出ることがあります。こうした事態は、グループ内のノードのひとつが<i>「ノード > ノードグループの始点」</i>に指定されているために起こっている可能性があります。その場合は、<i>「ノード > まとめノード群れの始点」</i> のチェックをはずして、やり直してください。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="まとめノード/波括弧" FOLDED="true" ID="ID_1919219984" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 技術的には、まとめノードは、兄弟ノードグループ一員で、グループの最下部に位置するノードとみなされます。<i>「ノード > まとめノードに指定」</i>を選択してみれば、この位置のことがよく分かります。<i>「ノード > まとめノードに指定」</i>を再度選択すると、本来の位置に戻ります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 兄弟ノードをまとめノード群に含めたりはずしたりする場合は、「Up」キーや「Down」キーを使ってください。
+ </li>
+ <li>
+ まとめノード群にに含めたり外したりする場合は、ドラッグ&ドロップを使用してくだ
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="false" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <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">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="1" ID="ID_1351236194" TEXT_SHORTENED="true">
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="2" FOLDED="true" ID="ID_1855113133" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+<edge WIDTH="thin"/>
+<node TEXT="xx" ID="ID_1443415412" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="3" ID="ID_642318706" TEXT_SHORTENED="true">
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="4 = まとめノード" ID="ID_248628187" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="5" ID="ID_24722596" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ 選択ノードがまとめノード群の始点マーク付きかどうか表示します。選択ノードをまとめノード群の始点ノードに指定/解除します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 次の3つの要素の状況によって異なる効果を生じます。
+
+ <ol>
+ <li>
+ まとめノードがアクティブかどうか( <i>「ノード > まとめノード(指定/解除)」</i>を参照)、
+ </li>
+ <li>
+ 選択ノードがまとめノードの範囲内にあるかどうか、
+ </li>
+ <li>
+ 選択ノードが始点ノードのマーク付きでないかどうか。
+ </li>
+ </ol>
+ <p>
+ これら3つの条件がすべて真の場合、選択ノードは、このまとめノード群の(新規の)始点ノードとしてマークを付され、まとめノード範囲の上方境界が選択ノードまで縮小されます。
+ </p>
+ </li>
+ <li>
+ まとめノードが休眠中の場合、選択ノードに以前アクティブだったまとめノードの始点ノードのマークが付いたままになっていることがあります。その場合は、[残っていた始点]マークを削除します。これの効果は、休眠まとめノードを再度アクティブ化したときに、現れます。<i>「ノード > まとめノード(指定/解除)」</i>を参照。
+ </li>
+ </ul>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="ノード群" ID="ID_1499184609" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノード群</b>は、隣接しあう兄弟(同一階層、同じ親ノードを持つ)ノードのグループで、特定の<i>「まとめノード」</i>の範囲内に含まれるものです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 範囲にはすべての兄弟ノードを含めることもできますし、隣接する兄弟ノード群からなるサブセットでもかまいません。.
+ </li>
+ <li>
+ この範囲の最上部の兄弟ノードを<b>「始点ノード」</b>といいます。
+ </li>
+ <li>
+ 範囲は、ノード群内の別のノードを<i>「始点ノード」</i>と定義することにより、縮小できます。そうすると、[指定された]始点ノードよりも上の兄弟ノードは、ノード群から除外されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="まとめノードに指定/解除" ID="ID_34031772" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中うノードを、普通のノードから(アクティブな)まとめノードへ、あるいはまとめノードを[普通の]兄弟ノードの一つ(まとめノード機能停止)に変換します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 新規に作成されるまとめノード群の範囲は、選択ノードの上方にあるすべての兄弟ノードとなりますが、以下の2つの場合は例外となります。
+
+ <ol>
+ <li>
+ 兄弟ノードの1つにまとめノード群の始点マークが付されている場合、このノードから範囲が始まります。この現象は、既存のまとめノードが機能停止されている場合にも起こります。
+ </li>
+ <li>
+ 同一階層レベルで、2つのまとめノードの範囲が重複することは許されません。したがって、新規に作成されるまとめノードは、既存のまとめノードのすぐ下から始まります。
+ </li>
+ </ol>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > まとめノード > まとめノード群の始点」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「オン」設定の場合、ノードが折り畳みできないようになります。特に、雲と一緒に使用することを想定しています。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="雲(標準)を付加/削除" ID="ID_1169707898" TEXT_SHORTENED="true">
+<icon BUILTIN="../Cloud24"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">すべての選択ノード(複数可)の周辺に雲を設定します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">特定のノードを強調するのに役立ちます。雲は、選択ノードとそのすべての子ノードを包みます。(バラバラのノードについて)<i>「Ctrl」</i>キーを押したまま選択したり、あるいは、最初の選択ノードと最後のノードの間にあるすべてのノードを対象とする場合は、<i>「Shift」</i>を押したまま選択することにより、同時に複数の雲を作成することができます。<i> 「書式 > 雲の色」</i>も参照。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="コネクタを付加" FOLDED="true" ID="ID_1803275985" TEXT_SHORTENED="true">
+<icon BUILTIN="../designer"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノード間を結ぶ線(コネクタ)を作成します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ コネクタは、コネクタコンテキストウィンドウ(コネクタ上で右クリック)を開き、形式設定できます。コネクタの始点、中間点及び終点にラベルを付けられます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">参 照</font></b>
+ </p>
+ <ul>
+ <li>
+ プロパティの編集については、<i>「表示 > プロパティパネル」</i>を参照。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ あるノードを右クリックして別のノードにドラッグすることによって、コネクタを付けることができます。3つ以上のノードを選択中の場合、最後に選択されたノードを(共通の)終点とする数本のコネクタが一度に描かれます。
+ </li>
+ <li>
+ 自己参照[=注釈つきの]ノードを作ることにより、単独のノードに結び付けられた線のようにコネクタを見せかけることができます。この場合は、あるノード上で右クリックした後、同じノードにドラッグしてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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"/>
+<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"/>
+<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">
+<edge STYLE="bezier"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="ノード c" ID="ID_580762900" TEXT_SHORTENED="true"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="リンク" FOLDED="true" ID="ID_1430712985" TEXT_SHORTENED="true">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ リンクは以下のような機能を持っています。
+ </p>
+ <ul>
+ <li>
+ 2つのノード間に、1クリックでジャンプする連結関係を作ります。
+ </li>
+ <li>
+ ノードから外部オブジェクト(ウェブサイト、ディレクトリ、プログラム、、、)へ、1クリックでジャンプする連結関係を作ります。
+ </li>
+ <li>
+ ノードから[Freeplane の]メニュー項目に掲げられた機能を、1クリックで実行するする連結関係を作ります。
+ </li>
+ <li>
+ E-mail アドレスへ1クリックでジャンプする連結関係を作ります。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ ノードコアには、矢印型リンク1つ、及び複数の下線表示型リンクを付加できます。ノードの詳細では、下線表示型リンク(複数)しか使えません。下線表示型リンクは、(「編集」メニューの)テキスト編集ダイアログで設定できます。矢印型リンクはカレントのメニュー項目[the items of the current menu]を使って設定できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ユーザのコンピュータ上にある画像ファイルをドラッグ&ドロップすると、大きさを変えられる画像ができます。画像をノードの上の部分にドロップすると、画像は当該ノードに付加されます。子ノード側にドロップすると、新規子ノードが作成され、そこに画像が表示されます。コピーした画像[ファイル]を[ノードに]貼り付けると、子ノードが作成され、そこにハイパーリンクが作成されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 外部オブジェクトに対するハイパーリンクを入力する最も簡単な方法は、ドラッグ&ドロップによるやり方です。その場合、選択ノードに新たに作成される子ノードにハイパーリンクが貼り付けられます。一度に複数のアドレスをドロップすることができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="リンク先を指定(ファイル選択)..." ID="ID_1150948098" TEXT_SHORTENED="true">
+<icon BUILTIN="../SetLinkByFileChooserAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ディレクトリやファイルに導くダイアログを開きます。選択されたディレクトリないしファイルへのハイパーリンクが、選択ノードに作られます。このハイパーリンクは、赤色の矢印で表示され、それをクリックすると所定のファイルないしディレクトリが開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンクを削除するには、
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定(テキスト入力)...」</i>を選択するか、又は<i>「Ctrl + K」</i>を押して、
+ </li>
+ <li>
+ テキストフィールドのテキスト(アドレス)を削除してください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </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">
+<icon BUILTIN="../SetLinkByTextFieldAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ハイパーリンクをテキスト入力したり、E-mail アドレスを入力したりするダイアログを開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ コピー&貼り付けを使うと簡単です。
+ </li>
+ <li>
+ この方法は、ルートノードにハイパーリンクを付加する場合に利用してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ テキストフィールドでのコピー&貼り付けには、「Ctrl + C」と「Ctrl + V」を使ってください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノード文字列からリンク設定" ID="ID_1754195513" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExtractLinkFromTextAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの基本テキスト中のアドレス(http://www.google.com/ のような URL)を、クリックでジャンプするハイパーリンクに変換します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ローカルリンクを付加" ID="ID_271903009" TEXT_SHORTENED="true">
+<icon BUILTIN="../LinkLocal"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カレントマップ内にある2つのノード間のリンクを作成します。このコマンドを呼び出す前に、2つのノードを選択しておかなくはなりません。先に選択したノードが、後で選択したノードに付加されるリンクの行先になり、リンクは小さな緑色の矢印で表されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<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_1607683947" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ダイアログを開き、選択ノードに付加されるハイパーリンクで連結するメニュー項目[機能]を選択します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ [このノードからのリンク先で、]赤色の矢印を押すと、機能リンクを用いてスクリプトを起動する用例が見られます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="リンクアンカーをセット" STYLE_REF="Method" ID="ID_232225786" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 現在選択中ノードを記憶します。記憶できるノードは1つだけです。新しいノードをアンカーノードにセットすると、前のアンカーノードは記憶から消去されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="アンカーからのリンクを作成" STYLE_REF="Method" ID="ID_617064872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ アンカーノードに、現在選択中のノード向けのリンクを作成します。アンカーノードに、赤、又は緑の矢印が表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ リンク設定するノードは、別々のマップ上のものでもかまいません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="アンカーへのリンクを作成" STYLE_REF="Method" ID="ID_209345036" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 現在選択中のノードに、アンカーノード向けのリンクを作成します。カレントノードに、赤、又は緑の矢印が表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ リンク設定するノードは、別々のマップ上のものでもかまいません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="リンクアンカーを解除" STYLE_REF="Method" ID="ID_115302013" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ [ノードに]アンカーがセットされている場合、アンカーを消去します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="ハイパーリンク" ID="ID_444313366" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ハイパーリンクは、リンク元ノードからリンク先オブジェクトへの電子制御による連結機能です。リンク先は、ディレクトリでも、ファイルでも、ウェブページでも、アプリケーションでも、E-mail などでも結構です。連結は、赤色の矢印(外部ハイパーリンク)又は緑色の矢印(内部ハイパーリンク)で表示され、これらをクリックするとリンク先にジャンプします。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンクは、次のものに組み込むことができます。
+ </p>
+ <ul>
+ <li>
+ 基本的なノードテキスト、及び
+ </li>
+ <li>
+ 属性値。
+ </li>
+ </ul>
+ <p>
+ ハイパーリンクは、ドラッグ&ドロップやメニュー選択によって付加することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ドラッグ&ドロップでハイパーリンク(複数可)設定" ID="ID_754337116" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 単一であれ、複数であれ、外部オブジェクト向けのハイパーリンクを付加する最も簡単なやり方は、ドラッグ&ドロップによるものです。ディレクトリやファイル、ファイルアドレス、ウェブアドレスのコピーをドロップすれば、選択ノードの下に、そのアドレスへのハイパーリンク付きの子ノードができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ハイパーリンク群をドロップすると、それぞれにハイパーリンクが一つ付いた子ノード群ができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ こうして作られるノードのテキストは、当初、ハイパーリンク先のアドレスとなります。このテキストは、削除してもよいし、編集ないし置換してもかまいません。この変更は、ハイパーリンク自体(赤色の矢印)には影響しません。ハイパーリンク先を編集するには、<i>「編集 > リンク > リンクを指定(タイプ入力)...」</i>を選択し、アドレスを編集してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ E-mail リンク作成の最も簡単な方法は、アドレスをコピーし選択ノードに貼り付けることです。これで、選択ノードにリンク付きの<b>子ノード</b>ができます。子ノードのテキストは E-mail アドレスとなります。これは、例えば名前だけに、置換してもかまいません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 特定のノードに(新たな子ノードを作ることなく)E-mail リンクを付加したい場合は、<i>「編集 > リンク > リンク先を指定 (タイプ入力)...」</i>を選択し、下記のように入力します。
+ </p>
+ <ul>
+ <li>
+ <i>mailto:emailaddress</i>, 例えば、mailto:jokro at freeplane.nl
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ハイパーリンクや E-mail を削除" ID="ID_1436764680" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ハイパーリンクや E-mail アドレスを削除するには、
+ </p>
+ <ul>
+ <li>
+ <i>「リンク先を指定 (テキスト入力)...」</i>を選択するか、又は<i>「Ctrl + K」</i>を押し、
+ </li>
+ <li>
+ テキストフィールドのテキスト(アドレス)を削除してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="相対的ハイパーリンク" ID="ID_1942965129" 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"/>
+<attribute NAME="See also" VALUE="#ID_278329781"/>
+<attribute NAME="See also" VALUE="#ID_1279811672"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 次の手順については、これを実行するための独自スクリプトがあります。このノードのハイパーリンクをクリックしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ リンク元である「SM」マップ上の「SN」ノードに、リンク先である「TM」マップ上のノード「TN」へのリンクを作成するには、下記のように操作します。
+ </p>
+ <p>
+ 1. <u><strong>第1に リンク元ノード「SN」にリンク先マップ「TM」へのリンクを作成してください。</strong></u> これには、「SM」マップ上の「SN」ノードへ行き、次のように操作してください。<i>「ノードの機能 > ハイパーリンクを付加 (choose) ...」</i> [ここで、リンク先マップ「TM」を選択します。 - 原文注]-この操作は、コンテキストメニュー(右クリック等)でもできます。 - ユーザは、リンク元ノード「SN」の属性の属性値フィールドからジャンプするリンクを作成することもできます。この場合は、<i>「属性を編集」</i>オプション(「属性を付加」ではありません。というのは、このオプションでは、残念ながら属性値フィールドでリンクを作成することができないからです。)を使って属性を作成しなければなりません。次に、属性値フィールドを選択(又はホバー)してください。右クリックして、コンテキストメニューで、<i>「リンク先を指定 (ファイル選択)...」</i>選択して、、、等々。
+ </p>
+ <p>
+ 2. <u><strong>第2に、リンク先ノード「TN」のIDコードを取得してください。</strong></u>これには、「TM」マップの「TN」ノードに行き - <i>「編集」</i>(メインメニュー、又はコンテキストメニュー)経由で<i>「ノードIDをコピー」</i>をクリックしてください。これで、「TN」のIDがクリップボードに格納されます。
+ </p>
+ <p>
+ 3. <u><strong>第3に、この「TN」ノードのIDコードを、最初のステップで作成したリンクに追加してください。</strong></u>(換言すると、マップ向けリンクをノード向けリンクに変換してください。)これには、(「SM」マップの)「SN」ノードに戻り、(メインメニュー、又はコンテキストメニュー経由で)<i>「リンク > リンク先を指定(テキスト入力)」</i>を実行してください。表示される<i>「入力」</i>と表記されたポップアップメニューで、「.mm」のすぐ後に(スペースを置かず)、第2ステップでコピーした「TN」ノードのIDコードを書き込んでください。例えば、「...../mytargetmap.mm#ID_123456」といった具合になります。属性値にハイパーリンクを置く場合も、手順は同じです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+<font ITALIC="true"/>
+</node>
+<node TEXT="インラインハイパーリンク" STYLE_REF="ToNote" ID="ID_247329364" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードコア、ノードの詳細、あるいはノートには、それぞれに複数のインラインリンクを内蔵することができます。
+ </p>
+ <p>
+ 最初に、ノードコア、ノードの詳細、又はノートのテキストダイアログを開いてください。次に、リンクを適用する文字列をタイプ入力し、選択してください。そして最後に、<i>「編集 > リンク」</i>メニューの<i>「リンク先を指定(ファイル選択)...」</i>又は<i>「 リンク先を指定(テキスト入力)」</i>のダイアログウィンドウを選択してください。後者の場合、ハイパーリンクのアドレスをタイプ入力してもよいし、「Ctrl + V」を押してコピー済みのアドレスを貼り付けることもできます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>用 例 </b>
+ </p>
+ <ul>
+ <li>
+ <a href="https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1">このリンクを「Ctr]」を押しながらクリックしてください</a> を「Ctrl」を押しながらクリックすると、Freeplane Open Forum にジャンプします。
+ </li>
+ </ul>
+ <p>
+ このハイパーリンクには、緑色や赤色の矢印が表示されず、下線によって表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 矢印型リンクとは異なり、複数のリンクを作成できます
+ </li>
+ <li>
+ リンク適用文字列は、ハイパーリンク設定に変更を加えることなく、タイプし直すことができます。
+ </li>
+ <li>
+ リンク先のアドレスを変更する場合は、下線付きの文字列全体を選択して、再度<i>「リンク先を指定(ファイル選択)...」</i>又は<i>「 リンク先を指定(タイプ入力)」</i>を選択してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+</node>
+</node>
+<node TEXT="ノードを削除" ID="ID_673358354" TEXT_SHORTENED="true">
+<icon BUILTIN="../editdelete"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードとその子ノードをすべて削除します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「元に戻す」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノード" STYLE_REF="MenuGroupLabel" ID="ID_1306487115">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439">
+<node TEXT="ノードコアをインライン編集" ID="ID_1162372089" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードを編集モードに切り替えます。テキストの素早く入力や修正ができるインラインエディタを開きます。新規ノードの作成(「Ins」)時やノードのダブルクリック時の標準モードです。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>コンテキストメニュー:</b> コンテキストメニューを開くには、編集中のテキスト上で右クリックしてください。
+ </p>
+ <p>
+ このメニューには以下のものが含まれます。
+ </p>
+ <ul>
+ <li>
+ <b>切り取り</b>
+ </li>
+ <li>
+ <b>コピー</b>
+ </li>
+ <li>
+ <b>貼り付け</b>
+ </li>
+ <li>
+ <b>Spelling:</b> スペルチェックの有効/無効を切り替えます。
+ </li>
+ <li>
+ <b>Languages:</b> スペルチェッカーで使用する言語を選びます。
+ </li>
+ <li>
+ <b>書式</b>: 太字、斜体、など。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノード> ノードの見出しをダイアログで編集」</i>
+ </li>
+ <li>
+ <font color="#ff0000">独自の言語をインストールするには...</font>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"> ノードが 末端の子ノード(</font><font color="#ff0000" face="SansSerif, sans-serif">last child node)</font><font color="#000000" face="SansSerif, sans-serif"> の場合、ノードを左クリックすると編集モードに切り替わります。その他の場合、左クリックは子ノードの表示/非表示(折り畳み)を切り替えます。</font>
+ </li>
+ <li>
+ "=" で始まるテキストは表示できません。"=" で始まるノードは、計算式とみなされます。
+ </li>
+ <li>
+ "©" のような特殊な符号を挿入する場合は、ご愛用のテキストエディタからコピーし、貼り付けてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="ノードコアをダイアログ編集" ID="ID_1542197841" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_long_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキストを独立ダイアログで開きます。独立ダイアログは、次のような高度の編集に向いています。
+ </p>
+ <ul>
+ <li style="text-align: left">
+ アラインメント(左揃え、センタリング、右揃え)、黒丸(●)や番号付きの箇条書きを含む場合。
+ </li>
+ <li>
+ ノードを分割。
+ </li>
+ <li>
+ HTMLコードを編集。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>コンテキストメニュー:</b> コンテキストメニューを開くには、ダイアログのテキストエリアを右クリックしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ コンテキストメニューについては、<i>「ノード > ノードを編集」</i>を参照。
+ </li>
+ <li>
+ コンテキストメニューの<i>「languages」</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ "=" で始まるテキストは表示できません。"=" で始まるノードは、計算式とみなされます。
+ </li>
+ <li>
+ "©" のような特殊な符号を挿入する場合は、ご愛用のテキストエディタからコピーし、貼り付けてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="ノードを統合" ID="ID_1036692274">
+<icon BUILTIN="../JoinNodesAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 2つのノードをひとつに統合します(基本テキストのみ)。子ノードのないノード上でしか作動しません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノードを分割" ID="ID_1796564424" TEXT_SHORTENED="true">
+<icon BUILTIN="../split_node"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">ノードの基本テキストを分割し、2つ以上のノードに配分します。分割により、分割されたテキスト用の新規ノードが挿入されるます。すべての改行箇所、又は HTML コンポーネントで、分割されます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><i>「ノードを分割」</i>コマンドは、改行さえあれば、あらゆるプレーンテキストノードで利用できます。この改行は、<i>「Shift + Enter」</i>で挿入できます。また、<i>「ノードを分割」</i>は、複数の段落を含むものであれば、あらゆるリッチテキス形式(長文ないしHTML)のノードで有効です。いずれの場合にも、改行ないし段落替えの箇所でノードが分割されます。HTML ノードについては、入れ子にされた要素であれば、分割を繰り返し適用することができます。プレーンテキストノードは、まず、<i>「書式 > リッチテキストを使用」</i>を使って[リッチテキストに]変換すれば、どこでも分割できます。次に、このノードをクリックして<i>「ノードの長文編集」</i>ウィンドウを開きます。そのウィンドウで、ノードを分割したい位置にカーソルを置き、次に、ダイアログの最下部にある<i>「分割」</i>ボタンをクリックしてください。カーソルより右側のノード部分が、元のノードの下側に現れます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>ノート</b></font>
+ </p>
+ <p>
+ <a name="bugnotes" id="bugnotes">「ノードを分割」には2種類の動作があります。 </a>
+ </p>
+ <ul>
+ <li>
+ 第1は、メニュー経由で利用できます。現在選択中のノード(単数)に適用され、段落/行/HTML エレメントに分割するものです。
+ </li>
+ <li>
+ <a name="bugnotes" id="bugnotes">今1つはエディターからしか使えないもので、カーソル位置でノードを分割し、「Alt + S」で実行することができます。後者は、メニュー上に表記できません。</a>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<icon BUILTIN="../RevisionPluginAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新されたことを視覚的に表示する/しないを切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 標準では更新マークは、ノードの背景色=黄色表示です。
+ </li>
+ <li>
+ 印の表示を止めるには、マーク付きのノードを選択し、プロパティパネルで<i>「変更」</i>のチェックボックスのチェックを外してください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>「表示 > ツールチップ > 更新時刻を表示」</i>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="更新ノードの標準色を設定" ID="ID_1766752356" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新ノード色を除去するには、ノード毎に背景色のチェックボックスのチェックをはずしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ こうした更新ノードの表示/非表示の切り替え方は、時代遅れです。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="その他の更新マーク作成法" ID="ID_597667415" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新を表示する方法として、以下のものがあります。
+ </p>
+ <ul>
+ <li>
+ 更新の日付による検索/フィルタ表示
+
+ <ul>
+ <li>
+ 特定の日以降、又は一定期間内に行なわれた更新について、検索したり、フィルタ表示することができます。
+ </li>
+ <li>
+ 利点: 更新の保持は自動的に行なわれます。また、フィルタ条件を一度定義するだけで使えます。
+ </li>
+ <li>
+ 欠点: 更新の日付は最新の更新時に設定されます。更新履歴を知ることはできません。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <i>Revision</i> = <i>nr/date8(更新=数値/日付)</i> というユーザ定義による検索/フィルタ表示
+
+ <ul>
+ <li>
+ 利点: ノードの見出し部分(pro node)(詳細ではない)の更新履歴が保持されます。
+ </li>
+ <li>
+ 欠点: ノードの見出し部分、又は選択中のノード群に手動で設定/解除しなければなりません。
+ </li>
+ </ul>
+ </li>
+ <li>
+ 条件対応マップスタイルを用いて、<i>「更新」</i>スタイルを表示
+
+ <ul>
+ <li>
+ 更新の日付ないし更新の属性を用いて使用しなければなりません。
+ </li>
+ <li>
+ 利点: 上述を参照。フィルタルールは、条件対応マップスタイルリストとして、マップ毎に管理されます
+ </li>
+ <li>
+ 欠点: 上述を参照。
+ </li>
+ </ul>
+ </li>
+ <li>
+ 該当ノードの背景色に目立つ色を指定(解除)
+
+ <ul>
+ <li>
+ 利点: 簡単。
+ </li>
+ <li>
+ 欠点: スタイルの選択肢が限られる。すべて手動。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="画像(ファイル選択 or リンクから)" ID="ID_743208762" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの内部領域、つまり囲み領域のなかに、基本ノードテキストに代えて固定サイズの画像を装着します。すでにノードに画像ファイルへのハイパーリンクが付いている場合は、ハイパーリンクから画像に置換されます。その他、ファイル選択ダイアログを使って、画像ファイルを選択することもできます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 画像の非表示/表示を切り替える場合は、<i>「表示 > ノードを短縮表示」</i>を参照。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 画像は、原寸で表示されます。画像を縮小するには、お絵かきソフトを使ってください。
+ </li>
+ <li>
+ 基本ノードテキストは表示されなくなります[削除されます]。
+ </li>
+ <li>
+ 拡張ノードエディタを使えば、HTML コードを使って画像を付加することができます。例えば、次のような具合です。 <i><html><img src="linked/Apple.png"> <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png"></i>
+ </li>
+ <li>
+ 相対リンクを使えば、マインドマップ格納ディレクトリのサブディレクトリに置かれた画像を指示することができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<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">
+<icon BUILTIN="../designer"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ クリックでアイコンを選ぶことのできる一覧表を開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ この表には、システムアイコンも表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" ID="ID_1213506322">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 他のアイコン一覧表と異なり、この表はシステムアイコンを含めて表示します
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="類別アイコン" ID="ID_1325051261" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE=""/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに付加するアイコンを、アイコン付きサブメニュー経由で選んでください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="進捗度" FOLDED="true" ID="ID_1605173421" TEXT_SHORTENED="true">
+<icon BUILTIN="25%"/>
+<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 進捗度は、パーセンテージを10%刻み、もしくは25%刻みの指標を用いて視覚化するものです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 標準状態では、指標をアイコン表示します。このアイコンは隠すことができません。
+ </li>
+ <li>
+ さらに、指標を大きいイメージで表示することもできます。このイメージは隠すことができます。<i>「イメージ」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="進捗度を上げる" ID="ID_1880351220">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに進捗度指標を付加し、1回の実行ごとに25%刻みで「100%+OK」まで引き上げていきます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="進捗度を下げる" ID="ID_371511132">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの進捗度指標を25%刻みで引き下げ、最終的には指標アイコンを削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="大きい図を付加(10%刻み)" ID="ID_1447409349">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 大きい進捗度指標を付加します。
+ </p>
+ <ul>
+ <li>
+ <i>「ダブルクリック」</i>ごとに、10%刻みで上昇します。
+ </li>
+ <li>
+ <i>「Ctrl + ダブルクリック」</i>ごとに、10%刻みで低下します。
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="25%"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 大きい進捗度指標を付加します。
+ </p>
+ <ul>
+ <li>
+ <i>「ダブルクリック」</i>ごとに、25%刻みで上昇します。
+ </li>
+ <li>
+ <i>「Ctrl + ダブルクリック」</i>ごとに、250%刻みで低下します。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook URI="freeplaneresource:/images/svg/Progress_quarter_01.svg" SIZE="1.0" NAME="ExternalObject"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="" ID="ID_1351859449">
+<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="192"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 大きい指標は .svg イメージを使っています。これは、Java アプレットでは表示されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="進捗度指標を削除" ID="ID_612434998">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="上位ノードにもアイコンを表示" ID="ID_1929367560" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ あるノードの子孫(下位)ノードに置かれたアイコンがあれば、それらを当該ノードにも表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="子ノードの共通アイコンを表示" ID="ID_664401378">
+<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">
+<icon BUILTIN="../remove_first_icon"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードから最初に付加されたアイコンを削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="最後のアイコンを削除" ID="ID_424983852" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_last_icon"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードから最後に追加されたアイコンを削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="すべてのアイコンを削除" ID="ID_1438443252" TEXT_SHORTENED="true">
+<icon BUILTIN="../icon_trash"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードからすべてのアイコンを削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="211"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<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="ARC"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<hook NAME="SummaryNode"/>
+<node TEXT="アイコン" ID="ID_845839827" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ アイコンとは、小さく表示される画像のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="アイコンの用例" ID="ID_835126969">
+<icon BUILTIN="help"/>
+<icon BUILTIN="yes"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="button_ok"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザの独自アイコンをアイコン選択一覧に追加するには、<i>「ツール > ユーザディレクトリ」</i>の選択で開くユーザディレクトリにある<i>「icons」</i>というサブディレクトリにそれらのアイコンを格納してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ (カーソルがノード上にない場合、)すべてのノードの内容の表示方法をトグル切り替えします。セット時の効果は次のとおりです。
+ </p>
+ <ul>
+ <li>
+ 基本ノードテキストの長さを限定し、
+ </li>
+ <li>
+ 「ノードの機能」関連事項(詳細、属性、ノート)を隠します。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ カーソルをノード上でホバーリングすると、非表示テキストを表示するようセットするには、<i>「表示 > Display Tool Tips for notes」</i>を参照。
+ </li>
+ <li>
+ <i>View > Show notes in map </i>
+ </li>
+ <li>
+ <i>View > Attributes </i>
+ </li>
+ <li>
+ <i>View > Shortened node content</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノードの詳細をインライン編集" ID="ID_891642524" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_details"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 詳細を編集するためにインラインエディタを開きます。このエディタは基本ノードテキストのインラインエディタと同じものです。テキストは、選択時以外非表示となります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノード > ノードを編集」</i>
+ </li>
+ <li>
+ <i>「表示 > 詳細を隠す」 </i>
+ </li>
+ <li>
+ <i>「ノード > ノードを短縮表示」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ノードの詳細をダイアログ編集" ID="ID_766589763" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの詳細を編集するために、独立ダイアログの形でエディタを開きます。基本ノードテキスト[編集時]のダイアログと同じです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノード > ノードをダイアログ編集」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="スタイルノードから拡張情報をコピー" ID="ID_1200772173" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに、当該ノードに結合されたスタイルの<i>「詳細」</i>や<i>「属性」</i>をコピーします。.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スタイルの<i>「詳細」</i>や<i>「属性」</i>が変更されていたり、当該のノードが作成時にそのスタイルに関連付けられていなくても、適用されます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > スタイルを管理 > 選択ノードから新スタイルを作成」</i>
+ </li>
+ <li>
+ <i>「編集 > ノード拡張情報 > スタイルの属性をコピー」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの詳細を削除" ID="ID_1066845988"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードから、詳細テキストを削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="詳細テキスト" STYLE_REF="MenuGroupLabel" ID="ID_252237122" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>内容テキスト(詳細)</b>は、オプション的なテキストフィールドで、基本ノードテキストのすぐ下、ノード領域(囲み領域)の外側に置かれます。現在読んでいるテキストが、それにあたります。一般に、詳細は、基本ノードテキストの内容を拡張し、詳細に記述するのに使われます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 詳細は、次の2つのやり方で非表示にできます。
+ </p>
+ <ul>
+ <li>
+ [基本テキスト以外の]テキストを非表示にする場合は、[ノードの左下の]三角形をクリックして下さい。再表示する場合は、再度クリックしてください。
+ </li>
+ <li>
+ 右クリックして、<i>「ノードの内容を短縮表示」</i>を選択してください。
+ </li>
+ </ul>
+ <p>
+ 詳細が非表示状態のとき、ノード上にカーソルを置くと表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > ツールチップ > ノード情報をツールチップ表示」</i>
+ </li>
+ </ul>
+ </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">
+<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>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 表示サイズ変更可能な画像を、選択ノードの基本ノードテキストの下側の、囲み領域の外側に付加します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 別のやり方として、<b>ドラッグ&ドロップ</b>で画像を付加する方法や、<b>コピーと貼り付け</b>によって、画像ファイルへのハイパーリンクを付加する方法もあります。これらについては、下記の違いに留意してください。
+
+ <ul>
+ <li>
+ <b>コピーと貼り付け</b>
+
+ <ul>
+ <li>
+ ノードの上側の部分で貼り付けを実行すると、兄弟ノードが形成され、そこハイパーリンクを付加します。
+ </li>
+ <li>
+ ノードの外側で貼り付けを実行すると、ハイパーリンク付きの子ノードが形成されます。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <b>ドラッグ&ドロップ</b>
+
+ <ul>
+ <li>
+ ノードの上側の部分でドロップすると、選択ノードに大きさを変更できる外部画像が付加されます。
+ </li>
+ <li>
+ ノードの外側でドロップすると、新規に作成される子ノードに選択ノードに大きさを変更できる外部画像が付加されます。
+ </li>
+ <li>
+ 当該マインドマップが一度も保存されていない場合、ドロップが機能しません。
+ </li>
+ <li>
+ インターネットイ画像ジについては、セキュリティ上の理由により、ドラッグ&ドロップできません。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 画像の非表示/表示については、<i>「表示 > ノードを短縮表示」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" FOLDED="true" ID="ID_1144212077" TEXT_SHORTENED="true">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_124027424">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 画像のドラッグ&ドロップは、マインドマップを事前に保存しておかなければ、使えません。
+ </li>
+ <li>
+ インターネットからのドラッグ&ドロップは、セキュリティ上の理由により、できません。ハイパーリンクのドロップは、可能です。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="画像のドラッグ&ドロップ、及びリンクのコピー&貼り付け" ID="ID_225689401">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 画像を付加するには、下記の要領で、<b>ドラッグ&ドロップ</b>してください。
+ </p>
+ <ul>
+ <li>
+ 画像をノードの上側にドロップすると、選択ノードにサイズ変更可能な外部画像を付加します。
+ </li>
+ <li>
+ イメージをノードの外側[=ルートノードから離れた方]にドロップすると、新規に子ノードを作成し、そこにサイズ変更可能な外部画像を付加します。
+ </li>
+ <li>
+ ドロップは、マインドマップを[少なくとも1度]保存した後でなければ、使えません。
+ </li>
+ <li>
+ セキュリティ上の理由により、インターネット上のイメージはドラッグ&ドロップできません。したがって、まず[画像を]ドラッグ&ドロップでデスクトップにコピーしたうえで、それをマインドマップにドラッグ&ドロップしてください。
+ </li>
+ </ul>
+ <p>
+ ハイパーリンクを付加するには、下記の要領で、<b>コピー&貼り付け</b>してください<b> </b>(インターネットからでも可能です)。
+ </p>
+ <ul>
+ <li>
+ ノードの上側に貼り付けると、新規に兄ノード作成し、そこにハイパーリンクを付加します。
+ </li>
+ <li>
+ ノードの外側に貼り付けると、新規にハイパーリンク付きの子ノードを付加します。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 画像は、マインドマップファイルに含まれません。画像ファイルをユーザコンピュータから削除すると、その画像を表示できなくなります。
+ </li>
+ <li>
+ 画像ファイルが一時ファイルでないことを肝に銘じておいてください。たとえば、Thunderbird などのE-mail アプリで使用される画像は、まず最初にユーザコンピュータの恒久ディレクトリにコピーしてください。
+ </li>
+ <li>
+ 画像ファイルソースがインターネット上に置かれている場合、画像を表示するにはインターネット接続を有効にしておかなければなりません。
+ </li>
+ <li>
+ 画面印刷(PrintScreen) を使って画像をコピーする場合、Freeplane はまず最初に、その画像をどこ部保存するか、指定するよう求めます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="画像を変更..." ID="ID_1875250551" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの外部画像の大きさを変更できるハンドルを表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="画像を削除" ID="ID_421583940" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードから外部画像を削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="イメージ" FOLDED="true" ID="ID_1123523360" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane のイメージは、<b>png、jpeg、gif、又は svg </b>形式の画像です。イメージは、ノードの内部領域(囲みの中)ないし外部領域(囲みの外)のどちらでも付けられます。
+ </p>
+ <ul>
+ <li>
+ 内部領域のイメージは、サイズが固定されていて、原寸で表示されます。イメージを縮小するには、お絵かきソフトを使ってください。
+ </li>
+ <li>
+ 外部領域のイメージは、拡大/縮小することができます。サイズを変えるには、カーソルをいずれかの角に置き、サイズ調整ハンドルが表示されるのを待って、望ましい大きさになるまでドラッグします。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ イメージは、マインドマップファイル "*.mm" に内蔵されません。したがって、マインドマップファイルの移動時に、イメージはマインドマップと一緒に自動的に移動することなく、分断されてしまいます。
+ </li>
+ <li>
+ .<b>svg</b> イメージは、インターネット上で、例えば java アプレットで公開することができません。
+ </li>
+ </ul>
+ <p>
+ <b>こ つ</b>
+ </p>
+ <ul>
+ <li>
+ イメージファイルと"*.mm" ファイルの両方を保存するディレクトリを作ってください。このディレクトリから、イメージをマインドマップに付加してください。マインドマップの公開時には、追加の作業が必要です。この点は下記を参照。
+ </li>
+ <li>
+ 詳細やノートにイメージを加える場合は、用例のスクリプトを使用してください。スクリプトを参照。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ インターネット上でのイメージ付き<i>「マップを公開」</i>も参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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"/>
+<attribute NAME="Chapter" VALUE="3,6"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">画像付きマインドマップを公開するには、</font>
+ </p>
+ <ul>
+ <li>
+ 画像ファイルがマインドマップの格納ディレクトリにあることを確認し、
+ </li>
+ <li>
+ オープン時に表示させたい状態にマインドマップ折り畳み、
+ </li>
+ <li>
+ <i>「ファイル > エクスポート」</i>を選択し、<i>「Java アプレットに」</i>を選択してください。それぞれ、<i>myFile.html </i>というファイルと <i>myFile.html_files</i> というディレクトリが作られます。
+ </li>
+ <li>
+ <i>myFyle.html_files</i> ディレクトリに画像ファイルをコピーしてください。
+ </li>
+ </ul>
+ <p>
+ これで、 <i>myFile.html</i> ファイルとサブディレクトリ <i>myFile.html_files</i> を、アクセス許可したい場所(ディレクトリ)に移動できるようになります。マインドマップを開くには、<i>myFile.html</i> を呼び出してください。インターネット上に公開する場合は、<i>myFile.html</i> を、例えば <i>index.html</i> に名称変更してもかまいません。サブディレクトリについては、名称変更してはいけません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="属性を付加" FOLDED="true" ID="ID_760786399" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキストの下方に、属性名と属性値を入力ないし選択できる2つの列(カラム)からなる表を開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ノート
+ </p>
+ <ul>
+ <li>
+ コンテキストメニューを開くには、カラム上で右クリックしてください。
+ </li>
+ <li>
+ カラムの横幅は、カラムの上方のバーをドラックすることで、変更できます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「編集 > 属性を貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_1094419120" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のすべてのノードに、一度に同じ属性と属性値を付加することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性のコピーと貼り付け" ID="ID_1449305302" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="0" OBJECT="org.freeplane.features.format.FormattedNumber|0"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「編集 > 属性を貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性ありアイコンを表示" ID="ID_1074952186" 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">
+<icon BUILTIN="../EditAttributesAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの属性名と属性値の編集ダイアログを開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性を貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本テキストノードの下方に、属性名と属性値を入力ないし選択できる2つの列(カラム)からなる表を開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 列(カラム)上で右クリックするとコンテキストメニューが開きます。
+ </li>
+ <li>
+ 列幅は、カラムの上方のバーをドラッグして、変更できます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性を貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="" FOLDED="true" ID="ID_560316882">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_110645225" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<attribute NAME="Chapter" VALUE="3"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のすべてのノードに、同一の属性名と属性値を一挙に付加することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性をコピー&貼り付け" ID="ID_1118988780" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性を貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性付きアイコンを表示/非表示" ID="ID_395016262" 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">
+<icon BUILTIN="../showAttributes"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのノードのすべての属性を管理するダイアログを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性をコピー" ID="ID_338594349"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードから属性をコピーします。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > 属性」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="属性を貼り付け" ID="ID_1033981021" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 以前に他のノードからコピーした属性を選択ノードに貼り付けます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > ノード拡張情報 > 属性をコピー」 </i>
+ </li>
+ <li>
+ <i>「表示 > 属性」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="スタイルから属性をコピー" ID="ID_327255471" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのスタイルから、当該ノードに属性をコピー(インポート)します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 当該ノードに特定のスタイルが結合されている場合に限り、有効です。
+ </li>
+ <li>
+ そのスタイルが少なくとも1つは属性を保持する場合に限り、有効です。
+ </li>
+ <li>
+ ノードに特定のスタイルが結合されていても、属性が自動的に結合されることはありません。
+ </li>
+ <li>
+ 用 例:この機能は、このノードで使われています。まず、ノードにスタイルメソッドを作成し、次に属性の Class=Method をインポートしました。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性を削除" STYLE_REF="SubMenu" FOLDED="true" ID="ID_111620622" TEXT_SHORTENED="true">
+<node TEXT="最初の属性を削除" ID="ID_416728298">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="最後の属性を削除" ID="ID_1820177031">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="すべての属性を削除" ID="ID_970466467">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 属性を非表示にする場合は、一覧表の属性名<font color="#ff0000">[限定表示の対象]</font>にチェックを付けてください。
+ </p>
+ <p>
+ 特定の属性値セットだけを非表示にする場合は、<font color="#ff0000">[属性名・値を制限に?]</font>チェックを入れてセットをつくり、<font color="#ff0000">[属性名・値を編集]でこれらを定義してください。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノード > ノードの内容を短縮表示」</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ To hide an attribute, check its name in the list.
+ </p>
+ <p>
+ To hide only a restricted set of values of an attribute, check and define the set.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>See also</b>
+ </p>
+ <ul>
+ <li>
+ Node > Shortened node content
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" FOLDED="true" ID="ID_196085861" TEXT_SHORTENED="true">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ID="ID_1794495670">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 属性は、「属性マネージャ」での設定いかんに関わらず、ツールチップ表示で見ることができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性 a1 を隠し、属性 a2 を表示。" ID="ID_150790746">
+<font ITALIC="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これは、ノートフィールドのテキストです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="a1" VALUE="value 1"/>
+<attribute NAME="a2" VALUE="value 2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このノードには、a1 と a2 の2つの属性(もっと多くの属性でもかまいません)が付いています。<i>「属性マネージャ」</i>を開き、属性 a2 の<i>「限定表示の対象」</i>にチェックが付されていること、また a1 がチェックされておらず、したがって非表示設定されていることを確認してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ (カーソルをこのノードの上でホバーリングすると、)ツールチップに a2 が表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1420562009"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 属性を表示/非表示と<i>「ノードの内容を短縮表示」の組み合わせ</i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<font ITALIC="false"/>
+<richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これは、ノートフィールドのテキストです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="a1" VALUE="value 1"/>
+<attribute NAME="a2" VALUE="value 2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このノードには、a1 と a2 の2つの属性が付いており、かつ<i>「ノード > ノードを短縮表示」</i>を有効設定しています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 実行結果:詳細テキストは非表示で、チェック付きの属性[だけ]が表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>「属性マネージャ」</i>を開き、属性 a2 の<i>「限定表示の対象」</i>にチェックが付されていること、また a1 がチェックされておらず、したがって非表示設定されていることを確認してください。
+ </li>
+ <li>
+ (カーソルをこのノード上でホバーリングすると、)ツールチップに a2 が表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="属性" ID="ID_1336806888" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>属性</b>は属性名と属性値からできており、「属性名 = 属性値」であることを意味します。属性は、詳細の下側のノードの外部エリアに、2つの列(カラム)からなる表の形で表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル > カレンダー/属性」(一度にできる変更は1ノードのみ)</i>
+ </li>
+ <li>
+ 属性の表示/非表示については、<i>「表示 > ノードを短縮表示」を参照。</i>
+ </li>
+ <li>
+ <i>「表示 > 属性 > すべての属性を表示/表示する属性を限定/すべての属性を隠す」</i>
+ </li>
+ <li>
+ [属性の]限定表示の対象となるノードの選択については、<i>「ノード > ノード拡張情報 > 属性マネージャ」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ LaTeX 作成用のエディタを開きます。
+ </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 TEXT="LaTeX 数式を編集..." ID="ID_653019528">
+<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">
+<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">
+<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ LaTeX は、科学数式のレイアウトを定義する方法の1つです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<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">
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>は、特殊なテキストフィールドで、[通常、非表示で、ノードの]冒頭にノート付き<b>アイコン</b>が表示されます。ノートは、下記のように様々な形で表示させることができます。
+ </p>
+ <ol>
+ <li>
+ ノードの外部領域である、属性の下方に表示できます。この場合、詳細の代替手段として利用することができます。
+ </li>
+ <li>
+ 独立の別ウィンドウに表示できます。この場合、画面全体を使って完全な文書の形を表示できます。「表示」を参照。
+ </li>
+ <li>
+ 時間管理(Agenda)ダイアログに表示できます。この場合、活動や作業に名称をつけるのに使われます。
+ </li>
+ </ol>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > マップにノートを表示」</i>
+ </li>
+ <li>
+ <i>「表示 > ノートパネル」</i>
+ </li>
+ <li>
+ ノートアイコンを非表示に設定する場合は、<i>「ツール > 環境設定」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<node TEXT="ノートをダイアログ編集" ID="ID_753192689" TEXT_SHORTENED="true">
+<icon BUILTIN="../EditNoteInDialogAction"/>
+<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのノートフィールド編集用のダイアログを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ノートを削除" ID="ID_647231999" TEXT_SHORTENED="true">
+<icon BUILTIN="../RemoveNoteAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのノートフィールド削除用のダイアログを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="ノートパネルで編集" ID="ID_221910481" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「表示 > ノート 」</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="165"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>は、特殊なテキストフィールドで、[通常、非表示で、ノードの]冒頭にノート付き<b>アイコン</b>が表示されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノート付きアイコンを表示" ID="ID_830303915">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+<node TEXT="ノードの主要コンポーネント" STYLE_REF="MenuGroupLabel" ID="ID_1143096620">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="元に戻す" ID="ID_1252928137" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これまでの変更や編集を元に戻します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ノート</b> </font>
+ </p>
+ <ul>
+ <li>
+ FreePlane に保持される「元に戻す」回数は、<i>「環境設定」</i>で指定します。
+ </li>
+ </ul>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「ツール > 環境設定 > 動作設定 > 元に戻す」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="やり直す" ID="ID_767297940" TEXT_SHORTENED="true">
+<icon BUILTIN="../redo"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「元に戻す」の動作を遡って取り消します。この動作は、最近になされた「元に戻す」にしか適用できません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="切り取り" ID="ID_593223718" TEXT_SHORTENED="true">
+<icon BUILTIN="../editcut"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノードとそのすべての子ノードを切り取ります。
+ </p>
+ </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">
+<icon BUILTIN="../editcopy"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノードとそのすべての子ノードをコピーします。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="選択ノードのみコピー" ID="ID_1521191048">
+<icon BUILTIN="../copy_single"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに子ノードがあっても、当該ノードノードだけコピーします。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノードのIDをコピー" ID="ID_71485983"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択ノードの内部 ID を取得し、システムのクリップボードに保存します。この機能は、たいていの場合、メニューの<i>「挿入 > ローカルリンクの付加」</i>コマンドに置換されています。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">別のマップ上のノード向けリンク作成には有効です。この場合は、当該マインドマップ(へのパス)、次いで "#" 記号を書き込み、その後にノード ID を置かなければなりません。例えば、"mymap#特定の ID" といった具合です。絶対フルパスとノード ID の取得については、<i>「ノードの URI をコピー」</i>を参照。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ あらゆるプログラムがマインドマップに "#ノード ID"をパスできる訳ではありません。もちろん、 Freplane はパスしますが。ノード ID がパスされない場合、マインドマップは開きますが、ノードが選択されません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノードの URI をコピー" STYLE_REF="Method" ID="ID_874062942"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 絶対フルアドレス(パス名\ファイル名.mm#ノード ID" をコピーします。このアドレスを、(別の)マインドマップ、ないしプログラムのハイパーリンクにパスし、このマップを開いてノード選択させるすることもできます。絶対アドレスでなく、相対アドレスを作成する場合は、パス名から、少なくとも "#ノード ID"(同一マップ内ノードの場合)、ないし"マインドマップ名.mm#ノード ID"(同一ディレクトリの別マップにある外部ノードの場合)を残し前のほうの部分を削除してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ あらゆるプログラムがマインドマップに "#ノード ID"をパスできる訳ではありません。もちろん、 Freplane はパスしますが。ノード ID がパスされない場合、マインドマップは開きますが、ノードが選択されません
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="貼り付け" ID="ID_1036972266" TEXT_SHORTENED="true">
+<icon BUILTIN="../editpaste"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000">コピーされたテキストを貼り付けます。選択中のノードが編集モードの場合、テキストはノードの内容に追加されます。選択中のノードが編集モードでない場合は、テキストは子ノードとして付加されます。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="形式を選択して貼り付け..." ID="ID_1608096317" 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">
+<hook NAME="SummaryNode"/>
+<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">
+<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">
+<hook NAME="FirstGroupNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">同一階層の兄弟ノード間でノードの位置を下方に移動します。ノードが一番下にある場合、一番上に移動します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ホットキー</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Down」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードを移動(兄弟間で上へ)" ID="ID_1779409764" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 同一階層の兄弟ノード間でノードの位置を上方に移動します。ノードが一番上にある場合はあ、一番下に移動します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ホットキー</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Up」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="子ノードを並べ替え" ID="ID_8515098" TEXT_SHORTENED="true">
+<icon BUILTIN="../SortNodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのすべての子ノードを再帰的に、上から下に向かってアルファベット順に並べ替えます。ノード階の変更はありません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="ノードを移動(親の弟へ)" ID="ID_1906884446" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ノードを自身の親ノードの兄弟分の位置に移動します。移動後の位置は、元の親ノードのすぐ下になります。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ホットキー</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Left」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードを移動(兄の末子へ)" ID="ID_1201405914" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ノードを自身のすぐ上にある[兄弟]ノードの子ノードの位置に移動します。他に子ノードがある場合は、それらの子ノードの兄弟分となり、その最後に位置します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ホットキー</b></font>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Right」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのノードに適用されるノード間の縦間隔の最小値が設定できます。<i>「Ctrl」</i>キーを押した状態で、ノードハンドル(楕円形)を選択し、カーソルを上下に動かして、すべてのノードの縦間隔を調整してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="フリーポジションノードに指定/解除" STYLE_REF="Method" FOLDED="true" ID="ID_1997357786" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 指定すると、当該ノード(及びその下位ノード)が、他のノードの位置に関わりなく、自由に移動できるようになります。指定ノードは、ノードの移動に用いる楕円形のハンドルが青色になることで識別できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ フリーノードは、マインドマップ内で他のノードの位置に関わりなく、自由に位置設定できるノードです。フリーノードは、この動作を特徴とするとともに、ノードの移動に用いる楕円形のハンドルが、赤色ないし空っぽでなく、青色になることで識別できます。
+ </li>
+ <li>
+ マインドマップの[空白箇所であれば]どこでも、ダブルクリックすると、新規のフリーノードが作成されます。新規作成されたフリーノードは、標準設定状態で「矩形の雲付きで、(エッジの)線を隠す」プロパティを備えています。これらのプロパティは通常の方法で、例えば「雲無しで、線を表示」に変更できます。
+ </li>
+ <li>
+ 既存のノードを選択し、<i>「編集 > フリーポジションノードに指定/解除」</i>をクリックすると、フリーノードに変わります。この場合、ノードのプロパティ(線、雲)は、従来のままです。通常の方法で、雲の付加や線を隠すといったプロパティの設定ができます。フリーノードは、当初、ルートノード付近に表示されますが、(青色)楕円形のハンドルのドラッグにより、好みの位置に移動できます。通常のドラッグ&ドロップによって、フリーポジションノードを別の親ノード/兄弟ノード上に移動させると、フリーポジション状態が解除されます。
+ </li>
+ <li>
+ マインドマップの空白部分のクリックによって作成されたフリーノードは、ルートノードに連結され、また、連結線(エッジ)は非表示になります。このフリーノードの子ノードを、これの親ノードの上半分に移動した場合、 ルートノード方向に移動するのは、このためです。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="制限事項" STYLE_REF="ToNote" ID="ID_1792486278"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ol>
+ <li>
+ エッジの線が表示されないフローティングノードは、凡例、見だし、要約、著者などのメタ情報をマップに付加するためのものです。こうした情報がマップ全体に関連するものだとすると、これらのノードは、常に視野に入るようにルートノードを親とするものになるはずであり、他のノードとは無関係に配置されることになります。時には、こうした情報がマップの一部にしか関係ないこともあります。この場合は、エッジの線が表示されないフローティングノードを、ルートノード以外のノードに連結することができます。そうしたノードでは、物事の前後関係がわかる(これは重要なことです)ように、親ノードに結ばれるエッジの線が、マップの背景と同じ色に指定されているのでないかぎり、通常、ノード選択時に破線の形で表示されます。
+ </li>
+ <li>
+ フリーノードは、エッジの線が非表示でなくてもかまいません。この第2の用法は、マップのスペースの有効利用に役立ちます。自動レイアウトアルゴリズムの働きにより、マップの枝同士が重複しないようになっています。コンパクトなマップを作成したい場合、一部のノードをフリーノードに変換することができます。これにより、ノードの位置を柔軟に変更できるようになります。また、他の兄弟ノードに対する当該ノードの論理的位置関係は、同じ階層のままで変わりません。常にノードの論理的な位置関係に従って表示されるアウトラインビューに切り替えた場合も、この点は変わりありません。
+ </li>
+ </ol>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノードの位置をリセット" ID="ID_1456464643" VSHIFT="2" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><span style="color: #000000; font-family: SansSerif, sans-serif">ノードを作成時の位置に戻します。ノードの表示位置を動かした後にマップ全体の書式をリセットしたい場合に、このコマンドが大変便利です。<i>「Ctrl + A」</i>を押すとマップのすべてのノードが選択されます。</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="検索..." ID="ID_1949830526" TEXT_SHORTENED="true">
+<icon BUILTIN="../filefind"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">検索ダイアログボックスを開きます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">参 照</font></b><font face="SansSerif, sans-serif" color="#000000"> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「次を検索」</i></font>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">検索ダイアログボックスで入力した文字列につき、次の検索を実行します。(文字列は、文字と数字の組み合わせであれば何でもかまいません。)</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「検索...」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="検索&置換..." FOLDED="true" ID="ID_364564294" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeListAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">マップ中のすべてのノードをリストアップしたダイアログボックスを開きます。検索フィールドに入力された文字列に合致するものが見つかった場合、置換フィールドの値を適用するか、それともスキップして次の検索文字列に移動するかの選択肢が与えられます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">参 照</font></b><font face="SansSerif, sans-serif" color="#000000"> </font>
+ </p>
+ <ul>
+ <li>
+ <i>「すべてのマップで検索&置換」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="最後に修正したノード(複数可)を検索" ID="ID_16619030" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 最後に更新したノード(複数可)を検索しリストアップするには、表の最上部にある「変更」をクリックして、昇順/降順に行を並べ替えてください。すると、最後に更新されたノードが表示されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 目的のノードに移動するには、そのノードを含む行の上でダブルクリックしてください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照 </b>
+ </p>
+ <ul>
+ <li>
+ 一定期日以降に更新されたすべてのノードを表示させるフィルタルールについては、<i>「クィックフィルタ」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+</node>
+<node TEXT="すべてのマップで検索&置換..." ID="ID_832534218" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「検索&置換...」</i>と同じ動作をしますが、オープン中のすべてのマップが対象となります。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">参 照</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>「検索&置換...」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="検索と置換" ID="ID_1337187124" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="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"/>
+<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <div>
+ <div>
+ <p>
+ マインドマップの体裁を変更します。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<node TEXT="ステータスバーを表示" ID="ID_72695966" TEXT_SHORTENED="true">
+<icon BUILTIN="icon_not_found"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ウィンドウ最下部のステータスバーの表示/非表示を切り替えます。
+ </p>
+ </body>
+</html>
+</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">
+<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">選択ノードの表示をトグルで切り替えます。枠囲いモード時には、選択ノードの周りに実線で丸角矩形の枠がつきます。矩形モードでない時は、選択ノードの背景色がグレーになります。</font></span>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif"><b>参 照</b></font></span>
+ </p>
+ <ul>
+ <li>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif"><i>「ツール > 環境設定 > 画面表示 > 選択ノードの色等」.</i></font></span>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="計算式ノードを縁取り表示しない" ID="ID_1232411275" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 計算式ノードマークとなる色付き矩形の枠囲いの表示/非表示を切り替えます。初期設定では、枠囲いします。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの最大表示幅を設定" ID="ID_189812997" TEXT_SHORTENED="true">
+<icon BUILTIN="icon_not_found"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップのすべてのノードの表示幅を変更するダイアログを開きます。表示幅はピクセル単位で表し、初期値は 600 ピクセルです。. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">特定のノードの幅を制御し、行を短くする場合は、<i>「Enter」 </i>又は <i>「Shift + Enter」を使ってください。.</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの最小表示幅を設定" ID="ID_1836236046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">マップのすべてのノードの最小表示幅を変更するダイアログを開きます。表示幅はピクセル単位で表し、初期値は 600 ピクセルです。この機能は、枝の位置を揃えるのに役立ちます。 </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="更新ノードの背景色を変更" FOLDED="true" ID="ID_180302341" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<icon BUILTIN="../RevisionPluginAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新マークの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 標準では、更新マークは背景色が黄色のノードです。
+ </li>
+ <li>
+ マークを元に戻す場合は、マーク付きノードを選択し、プロパティパネルの「変更」のチェックをはずしてください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>「表示 > 更新時刻を表示」</i>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<node TEXT="更新ノードの標準色を設定" ID="ID_1879353702" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新ノード色を除去するには、各ノードについて背景色のチェックボックスのチェックをはずしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <p>
+ ●こうした更新ノードの表示/非表示の切り替え方は、時代遅れです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+<node TEXT="その他の更新マーク作成法" ID="ID_961541761" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 更新を表示する方法として、以下のものがあります。
+ </p>
+ <ul>
+ <li>
+ 更新の日付による検索/フィルタ表示
+
+ <ul>
+ <li>
+ 特定日以降、又は一定期間内に行なわれた更新について、検索したり、フィルタ表示することができます。
+ </li>
+ <li>
+ 利点: 更新の保持は自動的に行なわれます。また、フィルタ条件を一度定義するだけで使えます。
+ </li>
+ <li>
+ 欠点: 更新の日付は最新の更新時に設定されます。更新履歴を知ることはできません。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <i>Revision</i> = <i>nr/date8(更新=数値/日付)</i> というユーザ定義による検索/フィルタ表示
+
+ <ul>
+ <li>
+ 利点: ノードの見出し部分(pro node)(詳細ではない)の更新履歴が保持されます。
+ </li>
+ <li>
+ 欠点: ノードの見出し部分、又は選択中のノード群に手動で設定/解除しなければなりません。
+ </li>
+ </ul>
+ </li>
+ <li>
+ 条件対応マップスタイルを用いて、<i>更新</i>スタイルを表示
+
+ <ul>
+ <li>
+ 更新の日付ないし更新の属性と併用すべきです。
+ </li>
+ <li>
+ 利点: 上述を参照。フィルタルールは、各マップレベルで、条件対応マップスタイルリストとして管理されます
+ </li>
+ <li>
+ 欠点: 上述を参照。
+ </li>
+ </ul>
+ </li>
+ <li>
+ 該当ノードの背景色に目立つ色を指定(解除)
+
+ <ul>
+ <li>
+ 利点: 簡単。
+ </li>
+ <li>
+ 欠点: スタイルの選択肢が限られる。すべて手動。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="アイコン" STYLE_REF="SubMenu" FOLDED="true" ID="ID_655678719" TEXT_SHORTENED="true">
+<hook NAME="FirstGroupNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="上位ノードにもアイコン表示" ID="ID_1215606144" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ あるノードの下位ノードにアイコンが付いている場合、それらをこのノードでに現われるようにするかどうか、切り替えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="子ノードの共通アイコンを表示" ID="ID_1523948647" 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">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="160"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>ツール > 環境設定 > 画面表示 > アイコン </i>で下記のように標準設定できます。
+
+ <ul>
+ <li>
+ 属性ありアイコンを表示
+ </li>
+ <li>
+ ノートアイコンを表示しない
+ </li>
+ <li>
+ 左ツールバーのアイコン表示を階層化
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ Java アプレットでは、次のものは常時表示されます。
+
+ <ul>
+ <li>
+ 属性ありアイコン (bug)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="新規のマップビューを作成" ID="ID_1759737398" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カレントマップのコピーを識別番号付きで開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ツールバー" FOLDED="true" ID="ID_464156542" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ メニュー項目名で示されるメインメニューバー、アイコンボタンの形で提供されるツールバーとフィルタバー、ショートカットキー(Fキーとその複合キー)、さらにノードやコネクタなどのオブジェクトに結び付けられたコンテキストメニュー、これらを通じて様々な機能にアクセスすることができます。これらの選択肢から使いたいものを選ぶのは、あなた自身です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 必要のないメニューバーを非表示にして、表示画面のスペースを節約することができます。すべてのバーが非表示となった場合、表示画面上で右クリックしてコンテキストメニューを表示させ、非表示になったバーを再表示させことができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">メインツールバーの表示/非表示を切り替えます。このバーには、ファイル、編集、表示、ノード等のメニュが含まれます。. </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ 多くのメニュー項目に、メニュー項目を押す代わりに使えるショートカットキー/複合キーが表示されます。
+ </li>
+ <li>
+ メニュー項目と一緒に表示されるアイコンは、一般にツールバーのアイコンボタン(ショートカット)として利用することができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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"/>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>メインメニューバー</b>は、 表示画面の最上部に表示される Freeplane の主要メニューをテキスト表示するバーです。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">メニューの多くは、他の場所でアイコンボタンとなるアイコンを表示します。これらの<b>アイコンボタン</b>を押すと、テキスト表示のメニュー項目を選択したのと同じように作用します。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">メニュー項目には、<b>ショートカット</b>(特殊キーや複合キー)も表示されます。ショートカットが押されると、メニュー項目の動作を実行します。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ツールバー" FOLDED="true" ID="ID_1306099455" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールバーの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このマップには、メインメニューバーのうち頻繁に使われる項目が、簡単にアクセスできるよう、アイコンツールバーとして内蔵されています
+ </li>
+ <li>
+ カーソルをアイコンボタン上に移動させると、機能を見ることができます。アイコンは、メインメニューバー上にも表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="メインツールバー" ID="ID_587845768">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>メインツールバー</b>は、頻繁に使われるマップ操作機能、例えば、<i>「前のマップ」「次のマップ」</i>などのアイコンボタンを表示するバーです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="フィルタバー" FOLDED="true" ID="ID_664463091" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フィルタ機能に関するツールバーの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ メインメニューの<i>「フィルタ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="フィルタバー" ID="ID_1438024968">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>フィルタバー</b>は、フィルタルール入力フィールド、及び頻繁に使われるフィルタ機能、例えば、<i>「元に戻す」「やり直す」</i>などのアイコンボタンを表示するバーです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="F バー" ID="ID_1945242906" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ファンクションキーツールバー(Fバー)の表示/非表示を切り替えます。<i>「F1」「F2」「F3」</i>等の表示されるバーです。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">Fバーが非表示でも、キーボードのファンクションキーは有効です。</font>
+ </li>
+ <li>
+ ファンクションキーは、使用に先立って定義しておかなければなりません。下記を参照。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「ツール > ショートカットキーを割り当て」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="左ツールバー" ID="ID_148946538" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">左ツールバー(アイコンバー)の表示/非表示を切り替えます。このバーには、ユーザがノードに付加できるあらゆる類のアイコンが含まれ、(多くの場合、)表示画面の左側に縦表示されます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「編集 > アイコン」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="ステータスバーを表示" ID="ID_183960920" TEXT_SHORTENED="true">
+<icon BUILTIN="icon_not_found"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ウィンドウの最下部にあるステータスバーの表示/非表示を切り替えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="コンテキストメニュー" FOLDED="true" ID="ID_1460700080" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="228"/>
+<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ コンテキストメニューは、メニューバーに代わる強力な代替手段です
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ コンテキストメニューを開くには、関連コンテキストメニューの対象となるオブジェクトを右クリックしてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<node TEXT="コンテキストメニュー" ID="ID_726221219">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>コンテキストメニュー</b>は、特定のオブジェクトに結び付けられたメニューで、このオブジェクトに最も関連の深いメニュー項目だけを表示します。コンテキストメニューは、オブジェクトを右クリックすると開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="プロパティパネル" FOLDED="true" ID="ID_1077996948" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネルの表示/非表示を切り替えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<font BOLD="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>プロパティパネル</b>は、ノードの基本的なプロパティを変更するためのダイアログです。プロパティは、書式関連プロパティとカレンダ/属性関係プロパティに区分されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="F キーにプロパティパネルを割り当て" STYLE_REF="ToNote" ID="ID_1264703855"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ プロパティパネルは、最も頻繁に使われるメニューの1つです。したがって、ホットキーに割り当てと有意義です。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > ホットキーのプリセット」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="書式" FOLDED="true" ID="ID_352838225" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネルで選択ノードのプロパティを変えるには、
+ </p>
+ <ul>
+ <li>
+ 変更ボックスにチェックを付け、
+ </li>
+ <li>
+ 変更するプロパティを選択するか、編集するかしてください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 変更は直ちに有効になります。OKボタンを押したり、パネルを閉じたりする必要はありません。
+ </li>
+ <li>
+ プロパティパネルを閉じることなく、別のノードを選択することができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<node TEXT="階層別スタイルを適用" STYLE_REF="UnChecked" ID="ID_1391835038">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="線の色を自動選択" STYLE_REF="UnChecked" ID="ID_502377582"/>
+<node TEXT="スタイル" ID="ID_1431348942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 所定のシステムスタイルやユーザ定義スタイルの一覧表を見るためには、
+ </p>
+ <ul>
+ <li>
+ クリックしてください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スタイル > 選択ノードから新スタイルを作成」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノード用条件対応ノードスタイル" ID="ID_1586903922" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに条件対応ノードスタイルを付加、ないし条件を修正する場合は
+ </p>
+ <ul>
+ <li>
+ クリックしてください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スタイル > マップ用条件対応スタイルを管理」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="マップ用条件対応ノードスタイル" ID="ID_30023461" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップに条件対応ノードスタイルを付加、ないし条件を修正する場合は
+ </p>
+ <ul>
+ <li>
+ クリックしてください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スタイル > ノード用条件対応スタイルを管理」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードスタイル" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ スタイル
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="文字色" ID="ID_1017818154">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="背景色" ID="ID_1715234182"/>
+<node TEXT="ノードコア全体の色" STYLE_REF="MenuGroupLabel" ID="ID_729013895" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="テンプレート/書式" FOLDED="true" ID="ID_1589962574">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 計算式を実行できないようにします。
+ </p>
+ </body>
+</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>
+<node TEXT="ノードに番号を振る" ID="ID_1670355105"/>
+<node TEXT="ノードコアのテキスト" STYLE_REF="MenuGroupLabel" ID="ID_1832969838" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="ノードの形" FOLDED="true" ID="ID_1110821777" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードの形</b>は、ノードの外形のことで、縁取りボックスなし(<i>「フォーク」</i>)、縁取りボックス付き(<i>「囲み」</i>)、<i>「親と同じ」</i>、及び<i>「複合」</i>があります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="フォーク" STYLE_REF="OptionalValue" ID="ID_1438908832" STYLE="as_parent" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="囲み" STYLE_REF="OptionalValue" ID="ID_774828193" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="複合" STYLE_REF="OptionalValue" ID="ID_137832332" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 折り畳み状態の場合、囲みに切り替えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="親と同じ" STYLE_REF="OptionalValue" ID="ID_670977408" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="ノードの最小表示幅" ID="ID_1696334412" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ピクセル単位でノードの最小表示横幅を指定します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの最大表示幅" ID="ID_443108256" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ピクセル単位でノードの最大表示横幅を指定します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの形" STYLE_REF="MenuGroupLabel" ID="ID_575182472" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="ノード全体のフォント" FOLDED="true" ID="ID_852543166" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノード全体のフォント</b>は、<i>「フォント名」</i>、<i>「文字サイズ」</i>、<i>「太字」</i>及び<i>「斜体」</i>を指定します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="標準的な文字サイズを設定" ID="ID_627969850">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 矢印型リンクが定義されていれば、下線表示型リンクが未定義であっても、ノードコア全体が下線表示型ハイパーリンクに指定されます。したがって、ユーザは矢印アイコンをアイコンしなくても、コア全体のどこかをクリックするだけで、リンクをたどることができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノードの色" ID="ID_618617648" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードの色</b>とは、<i>「文字色」</i>や「<i>背景色」</i>のことです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 線(エッジ)を隠す場合は、別の箇所を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="線の太さ" ID="ID_1686802072" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>線の太さ</b>とは、線(エッジ)の幅のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="線の形状" ID="ID_1046684670" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>線の形状</b>とは、線(エッジ)の曲がり具合のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="線の色" ID="ID_1289674666" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>線の色</b>とは、ノード間を結ぶ線(エッジ)の色のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="線(エッジ)のプロパティ" STYLE_REF="MenuGroupLabel" ID="ID_701937546" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="雲の色" FOLDED="true" ID="ID_1647687904" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>雲の色</b>とは、雲の背景色のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="雲の標準色を設定" ID="ID_1130479055">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>雲の形</b>とは、雲の外形のことで、例えば、<i>「トンガリ」「矩形」「丸角矩形」</i>などがあります。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="雲" STYLE_REF="MenuGroupLabel" ID="ID_1623448777" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="スタイルをリセット" ID="ID_632536338" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティ項目に変更チェックが付けられると、スタイルの既存設定値よりも、その変更値が優先するようになります。 元のスタイル値に戻すには、「変更」のチェックをはずしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="プロパティパネルに表示されないもの" FOLDED="true" ID="ID_1183497454" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネル上で、すべてのプロパティーが設定できるわけではありません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="ノードを点滅" ID="ID_448837997" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードを点滅</b>とは、ノードの色が順繰りに変わっていくものです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードの文字色を薄く" ID="ID_1262317918" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>マップの背景色</b>とは、マップのノード以外の部分の色のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="線を隠す" ID="ID_898973967" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>線を隠す</b>を指定すると、線(エッジ)が非表示になります。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="カレンダー/属性" FOLDED="true" ID="ID_1378770530">
+<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">
+<icon BUILTIN="icon_not_found"/>
+<icon BUILTIN="../TimeManagementAction"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 時間管理」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="日付形式(年月日)" ID="ID_1787036916">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カレンダーを現在の日時に設定します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="選択中の日付を挿入" ID="ID_1841166395">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 日付の標準書式に従って、ノードテキストに日付を挿入します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="スクリプトを編集..." FOLDED="true" ID="ID_1867868792">
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スクリプト入力用のダイアログを開きます。リマインダの設定時刻にマインドマップが開かれていたら、このスクリプトが実行されることになります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > スクリプトを編集...」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="リマインダでスクリプトを起動" ID="ID_891575752" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ この用例には、このノードに OKアイコン を付けるスクリプトが含まれます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ 「スクリプトを編集」を開き、そこに次の記述があることを確認してください。
+
+ <pre class="code">node.<span class="me1">getIcons</span><span class="br0">()</span>.<span class="me1">addIcon</span><span class="br0">(</span><span class="st0">"button_ok"</span><span class="br0">)</span></pre>
+ </li>
+ <li>
+ ノードに今から2分後のリマインダを付加してください。
+ </li>
+ <li>
+ このマインドマップをメモリに置いたままにしてください(閉じる操作を一切しないでください)。
+ </li>
+ <li>
+ 2分間待ってください。
+ </li>
+ <li>
+ リマインダが作動し始めるのをご覧ください。置時計が点滅しています。OKボタンが付けられるのをご覧ください。
+ </li>
+ <li>
+ 再度試したい場合は、OKボタンを削除してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="カレンダーで選択した日にリマインダを設定" ID="ID_749923119">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カレンダーで選択した日にリマインダをセットします。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ リマインダは、スクリプトが定義されていて、且つ[指定時間に]当該マインドマップが開かれていれば、そのスクリプトを起動します。マップが表示されている必要はありません。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スクリプトを編集...」[Execute script]</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="指定期間経過後にリマインド" ID="ID_760755432"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 数分から数年にわたるまで、指定された期間経過後に、リマインドします。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="リマインダを削除" FOLDED="true" ID="ID_896190385">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スクリプトも削除します。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ スクリプトを削除しないで、日付/時刻を変更する場合は、<i>「カレンダーで指定した日時にリマインダを設定」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+<node TEXT="属性" FOLDED="true" ID="ID_453776568" TEXT_SHORTENED="true">
+<icon BUILTIN="../showAttributes"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノードの機能 > 属性」</i>
+ </li>
+ <li>
+ <i>「表示 > 属性」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="新規属性" ID="ID_769541389">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3"/>
+</node>
+<node TEXT="表示幅を適正化" ID="ID_1893272407">
+<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">
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 属性値の書式を設定する場合は、既存の書式テンプレートから選んで修正してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><i>参 照</i></b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="属性一覧表" ID="ID_1780631612" HGAP="16" VSHIFT="-4" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>属性</b>は、属性名と属性値(データ)からなり、属性名=属性値であることを意味します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 属性一覧は、各行2列のカラムで構成されます。左側のカラムに属性名を、右側に属性値を置くことができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 属性値は自動的に書式変換することができます。「環境設定」を参照。
+ </li>
+ <li>
+ ちなみに、自動書式変換の作動を避けるには、最初に数字以外の文字(キャラクター)キーを入力してください。これで、たとえ最初の文字(キャラクター)が後で消去されても、入力される文字列は、テキストデータとみなされます。例えば
+
+ <ul>
+ <li>
+ "1,2,,3" と入力すると、これは "123" に変換されます(テンプレートの定義を "#,#,#" としている場合を除く)。
+ </li>
+ <li>
+ "1,2,3 and next remove " と入力すると、"1,2,3" となります。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「属性データの書式設定」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_1442016230" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="3,4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 同時に属性を付加したり編集したりできるノードは、1つに限られます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 選択中のノード群に一挙に同じ属性を付加する場合は、<i>「ノードの機能 > 属性<font color="#000000">」</font></i><font color="#000000">を参照。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="拡大表示" ID="ID_280352342" TEXT_SHORTENED="true">
+<icon BUILTIN="../ZoomIn24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">文字サイズとノード間の距離を拡大するもので、表示画面上のマップが小さい場合に向いています。</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="縮小表示" ID="ID_1102837452" TEXT_SHORTENED="true">
+<icon BUILTIN="../ZoomOut24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">文字サイズとノード間の距離を縮小するもので、表示画面上のマップが大きい場合に向いています。</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="ページに合わせて全体表示" ID="ID_1827952663" TEXT_SHORTENED="true">
+<icon BUILTIN="../FitToPage"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="color: #000000; font-family: SansSerif, sans-serif">画面にマップ全体が表示されるように、文字サイズとノード間の距離を調整します。多数のノードを表示(展開)中の場合、表示文字が小さすぎて、読めなくなることがあります。</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="選択ノードを中央へ" FOLDED="true" ID="ID_1924496837" TEXT_SHORTENED="true">
+<icon BUILTIN="../CenterSelectedNodeAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードを表示画面の中央へ移動させ、あわせて周りのノードも移動させます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ショートカット</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Alt + C」</i>
+ </li>
+ <li>
+ アイコンボタン
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="マップをスクロール/移動" ID="ID_586656393">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="12" OBJECT="org.freeplane.features.format.FormattedNumber|12"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ全体[の画面上の位置を]移動させる場合は、表示画面の空白部分をクリックしマップをドラッグするか、表示画面の右脇と最下部のスクロールバーを使ってください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="選択ノードを自動的に中央へ" ID="ID_1299718023">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="ビューモード" FOLDED="true" ID="ID_1492135940">
+<node TEXT="アウトラインビュー" ID="ID_386430636" TEXT_SHORTENED="true">
+<icon BUILTIN="../outline_view"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">マップの表示を、標準形式(放射線型ビュー)とリスト形式(アウトラインビュー)との間で切り替えます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i><font color="#000000" face="SansSerif, sans-serif">「環境設定」</font></i><font color="#000000" face="SansSerif, sans-serif">を使えば、ノードの間隔の精密な調整ができます。. </font>
+ </p>
+ </li>
+ <li>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">アウトラインビューの使用中は、視覚的表示機能の一部が簡略化されるので、通常のマインドマップビューよりも多くの情報を画面上に表示できます。アウトラインビューを使うと、大きなマップの印刷を楽に行なうことができます。</font>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="全画面表示" FOLDED="true" ID="ID_1521008407"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">すべてのメニューバーやツールバーを隠したり、表示したりします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge COLOR="#00ffff"/>
+<node TEXT="" ID="ID_358916035">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">一端<i>「全画面表示」</i>モードにすると、スクリーン上で右クリックし、<i>「全画面表示」</i>のチェックを外すしか、通常画面表示モードに戻す方法がありません。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="プレゼンテーションモード" STYLE_REF="Method" ID="ID_1924930800"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノード以外のすべてのノードをグレーの網掛けで表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="選択ノードを枠囲い表示" ID="ID_1861944976">
+<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">選択ノードの表示をトグルで切り替えます。枠囲いモード時には、選択ノードの周りに実線で丸角矩形の枠がつきます。矩形モードでない時は、選択ノードの背景色がグレーになります。</font></span>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif"><b>参 照</b></font></span>
+ </p>
+ <ul>
+ <li>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif"><i>「ツール > 環境設定 > 画面表示 > 選択ノードの色等」.</i></font></span>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="計算式ノードを枠囲い表示" ID="ID_1847984972">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 計算式[ノード]の印である色付き矩形枠囲いの表示/非表示を切り替えます。標準では枠囲い付きです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノードを短縮表示" ID="ID_180063018"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ クリックすると、ノードの詳細、イメージ、ハイパーリンク(下線表示型)などの機能の非表示/表示が切り替わります。あわせて、ノードコアが短縮表示され、書式なしの表示に変わります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ノードコアの上でカーソルをホバーリングさせると、非表示状態のテキストとハイパーリンクが表示されます。ホバーリンク時には、イメージは表示されません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ノードコアで1件だけハイパーリックを使う必要がある場合は、<a href="#ID_1430712985">矢印型リンク</a> を使ってください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="詳細を隠す" ID="ID_505492779"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキストの下方の詳細フィールドの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 別のやり方:ノードのしたの三角ボタンをクリックしてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールチップの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>表示 > マップ内にノートを表示</i>
+ </li>
+ <li>
+ <i>表示 > 属性</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="ツールチップ" ID="ID_1150336926"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ツールチップとは、<i>「表示 > ツールチップを表示」</i>が設定されている場合に、ノード上にカーソルを置いたときに開くウィンドウです。ユーザが現在テキストをお読みになっているのが、ツールチップウィンドウです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このウィンドウは、上記の状態以外では表示されない内容を、表示するものです。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノード > ノードを短縮表示」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="ツールチップの幅を設定" ID="ID_97393030">
+<edge COLOR="#00ffcc"/>
+</node>
+</node>
+<node TEXT="ノードスタイルをツールチップ表示" ID="ID_1094721175"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに適用されているスタイル一覧の表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ ノード情報をツールチップ表示
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT=" 更新時刻を表示" ID="ID_469328587">
+<icon BUILTIN="../kword"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ カーソルをノード上でホバーリングしたときにつき、更新時刻の表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ [表示されるのは、]最新の作成/修正の日付/時刻です。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="属性" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1722579390" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「編集 > ノード拡張情報 > 属性マネージャ」</i>で設定される属性の表示をトグル切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ オプションは次の3つです。
+ </p>
+ <ul>
+ <li>
+ <i>「表示する属性を限定」</i>
+ </li>
+ <li>
+ <i>「すべての属性を表示」</i>
+ </li>
+ <li>
+ 「<i>すべての属性を隠す」</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>「編集 > ノード拡張情報 > 属性マネージャ」</i>
+ </p>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="表示する属性を限定" ID="ID_1659163007" COLOR="#000000">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="すべての属性を表示" ID="ID_1547638958" COLOR="#000000">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="すべての属性を隠す" ID="ID_1232036138" COLOR="#000000">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="属性付きアイコンを表示" ID="ID_1771820903" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに属性が含まれる場合に、目印となるアイコンを表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性付きアイコンを表示/非表示" ID="ID_194201519" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="228"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 属性付きアイコン表示を標準とする場合は、<i>「ツール > 環境設定 > 画面表示 > アイコン」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">ノートパネルの表示/非表示を切り替えます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ノートパネルの位置」</i>
+ </li>
+ <li>
+ <i>「マップ内にノートを表示」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<hook NAME="FirstGroupNode"/>
+<node TEXT="ノートパネル" ID="ID_1416159748">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノートパネル</b>は、選択ノードの中に設けられる独立ウィンドウで、選択ノードのノートの内容を表示させ編集できます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノートパネルの位置" ID="ID_1945121061" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">ノートパネルの表示位置を指定します。オプションには、上下左右があります。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="マップ内にノートを表示" ID="ID_414331404" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキストの下方への、ノードのノートテキストの表示/非表示を切り替えます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > ノードを短縮表示」</i>
+ </li>
+ <li>
+ <i>「ノートパネル」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノート付きアイコンを表示" ID="ID_1472695653" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードにノードが含まれる場合に、ノート付きアイコンを表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノートの表示" FOLDED="true" ID="ID_1709371267" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="215"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ ノート付きアイコンの非表示を標準とする場合は、<i>「ツール > 環境設定 > 画面表示 > アイコン」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="アイコンの表示" ID="ID_987755339" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="160"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 次の設定を標準にするには、<i>「ツール > 環境設定 > 画面表示 > アイコン」</i>を参照。
+
+ <ul>
+ <li>
+ 属性付きアイコンを表示
+ </li>
+ <li>
+ ノートアイコンを表示しない
+ </li>
+ <li>
+ 左ツールバーのアイコン表示を階層化
+ </li>
+ </ul>
+ </li>
+ <li>
+ Java アプレットについては、次の事項が常時表示されています。
+
+ <ul>
+ <li>
+ 属性付きアイコン (バグです)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffcc"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="書  式" FOLDED="true" ID="ID_258919699" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの体裁を変更します。<i>「表示 > プロパティパネル」</i>を選択すれば、変更可能なプロパティの大半が表示されます。特定のプロパティを変更するには、そのプロパティにチェックを付け、新しい値を入力してください。パネルを閉じるには、再度<i>「表示 > プロパティパネル」</i>を選択してください。この他に、<i>「書式」</i>メニューを通じてプロパティを変えることもできます。例えば、ノードの文字色を変えるには、<i>「書式 > ノードの文字色」</i>を選択するか、又は<i>「Alt + Shift + F」</i>を押してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <i>プロパティパネル</i>で変更できるプロパティは以下のとおりです。
+ </p>
+ <ul>
+ <li>
+ <b>ノードの形:</b> ノードの外形です。縁取りなし(フォーク)縁取り付き(囲み)、親と同じの3種類があります。
+ </li>
+ <li>
+ <b>ノードのフォント:</b> フォント名、文字サイズ、太字、斜体の扱いを変更できます。
+ </li>
+ <li>
+ <b>ノードの色:</b> 文字色や背景色のことです。線(エッジ)を隠す場合については、下記を参照。
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>線の色:</b> ノード間を結ぶ線(エッジ)の色のことです。
+ </li>
+ <li>
+ <b>線の形:</b> 線(エッジ)の曲がり具合のことです。
+ </li>
+ <li>
+ <b>線の太さ:</b> 線(エッジ)の幅のことです。
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>雲の色:</b> 雲の背景色です。
+ </li>
+ <li>
+ <b>雲の形:</b> [モクモクの他に、]トンガリ、矩形、丸角矩形があります。
+ </li>
+ </ul>
+ <p>
+ プロパティの自動設定機能も利用できます。<i>「プロパティパネル」で下記の</i>項目にチェックを付けてください。
+ </p>
+ <ul>
+ <li>
+ <b>自動レイアウト:</b> 階層レベルごとのすべてのノードに独自の体裁を、自動的に付与します。この自動的に作られる体裁は、<i>「スタイル」</i>メニューを通じて変更できます。
+ </li>
+ <li>
+ <b>線の色を自動選択:</b> 新規に[第1階層の]ノードが作成される度に、異なる線の色を自動選択します。
+ </li>
+ </ul>
+ <p>
+ さらに、<i>「書式」</i>メニューを通じて、次のプロパティ項目を設定することもできます。
+ </p>
+ <ul>
+ <li>
+ <b>ノードを点滅:</b> ノードの色が順繰りに変化します。
+ </li>
+ <li>
+ <b>ノードの色を薄く</b>
+ </li>
+ <li>
+ <b>マップの背景色:</b> 背景の色です。
+ </li>
+ <li>
+ <b>線の形 > 隠す:</b> 線(エッジ)を非表示にします。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ノードスタイル一覧表を開きます。選択されたスタイルが選択ノード(複数可)に適用されます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 一度の操作で適用できるスタイルは1つだけです。複数のスタイルを適用する場合は、条件対応スタイルを使用してください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スタイル > ユーザ定義スタイル」</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル」</i>:<i> 「スタイル > ノード用条件対応ノードスタイルを設定」</i>、<i>「スタイル > マップ用条件対応ノードスタイルを設定」</i>
+ </li>
+ <li>
+ <i>「スタイル > 条件対応[ノード]スタイルを管理」</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="標準スタイル" ID="ID_987807688" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このスタイルは、新規作成ノードの一つひとつに適用されるものです。スタイルには、「囲み」や「線の形」等の諸項目が含まれます。
+ </p>
+ <p>
+ したがって、すべての新規作成ノードを「囲み」にしたいならば、標準スタイルでそのように設定してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="詳細" ID="ID_1577454061" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに新規作成されるすべての詳細に自動的に適用すべき特別のスタイルです。「フォント名」、「文字サイズ」及び「文字色」を設定できますが、例えば「囲み」や「線」は指定できません。したがって、すべての「詳細」に特定の色を付けたい場合は、ここで指定してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このノードを普通のスタイルとして適用する場合は、「線」や「囲み」等を指定することができます。ただ、これは、このスタイルの基本目的ではありません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノート" ID="ID_985652023" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに新規作成されるすべてのノートに自動的に適用すべき特別のスタイルです。「フォント名」、「文字サイズ」及び「文字色」を設定できますが、例えば「囲み」や「線」は指定できません。したがって、すべての「ノート」に特定の色を付けたい場合は、ここで指定してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このノードを普通のスタイルとして適用する場合は、「線」や「囲み」等を指定することができます。ただ、これは、このスタイルの基本目的ではありません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="フローティングノード" STYLE_REF="OptionalValue" ID="ID_114978489" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップのノード以外の部分で「Ctrl + クリック」を実行した場合に、自動的に適用すべき特別のスタイルです。また、「編集 > フリーポジションノードに指定」で、このスタイルが自動的に付加されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このノードを普通のスタイルとして適用する場合は、フリーポジションノードに指定は、使用できません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="階層別スタイル" STYLE_REF="Method" ID="ID_1364581880" TEXT_SHORTENED="true"/>
+<node TEXT="標準の「文字サイズ」、「囲み」等." ID="ID_1228191937" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="ユーザ定義スタイル" ID="ID_1409741910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ユーザ定義ノードスタイルの一覧表を開きます。選択されたスタイルが選択ノード(複数可)に適用されます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > スタイルを管理 > 選択ノードから新スタイルを作成」</i>
+ </li>
+ <li>
+ <i>「書式 > スタイルを管理 > スタイルを編集」</i>
+ </li>
+ <li>
+ <i>「スタイル > <font color="#ff0000">定義済みスタイル</font>」</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル」 </i>
+ </li>
+ <li>
+ <i>[書式 > スタイルを管理 > 条件対応スタイルを管理」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+<node TEXT="階層別スタイルを適用" FOLDED="true" ID="ID_1450514499" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 階層別スタイルの適用について、設定/解除します。それぞれのノード階層に応じた所定のスタイルが、ノードに自動的に適用されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ 所定の階層別スタイルは5つです。この数値は、「書式 > スタイルを管理 > スタイルを編集」で開くウィンドウ内でスタイルを追加したり削除したりすることで、増やしたり減らしたりできます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「スタイル > 階層別スタイル」</i> サブメニュー
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル」</i>の<i>「階層別スタイル」</i>のチェックボックス
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="checked"/>
+</node>
+<node TEXT="標準的なスタイル" FOLDED="true" ID="ID_188699461">
+<hook NAME="SummaryNode"/>
+<node TEXT="ルートノード書式" ID="ID_1910558168">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="第1階層ノード書式" ID="ID_1061646156">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="第2階層ノード書式" ID="ID_295345617">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="第3階層ノード書式" ID="ID_1858463079">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="第4階層ノード書式" ID="ID_653069130">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スタイル(クラス classes)は、一連の視覚関連プロパティや内容を、すべての関連ノードに素早く適用したり変更したりする手段の1つです。スタイル(クラス classes)は、特定種類の内容や階層構造との関連で、ノードの検索や選択、フィルタ表示を実行する際に利用することができます。一覧表からスタイルの名称を選択することによって、1つのノードに1ないし複数のスタイルを適用することができます。フィルタルールを用いれば、あるノードに特定のスタイルを適用すべきか否かを自動的に決定することができます。5つの階層レベルのノードについて所定のスタイルセットが用意されており、いつでも適用可能です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>用 例 </b>
+ </p>
+ <ul>
+ <li>
+ ご覧の<i>「Freeplane マニュアル」</i>(<i>Freeplane Documentation</i>)には、機能、例外、用例などの情報指標を類別(classes)するために、視覚的な識別用スタイルが施されています。それぞれのノードに、該当するすべてのスタイル(クラス classes)が付されています。その結果、ユーザはノードの体裁を見ることによって、各ノードに含まれる情報の種類を判断することができます。
+ </li>
+ <li>
+ また、<i>「Definition(定義)」</i>スタイル(クラス class)を用いたフィルタ表示を使えば、特定種類の情報を含むノードだけを表示させることができます。例えば、定義説明ノードだけを(すべて)表示させることができます。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 定義されたスタイルに属性や詳細が付属する場合、これら[の属性等]は、このスタイルを適用するノードが新規作成されたものであったり、この機能の適用を予定したものであったりの場合に限り、そのノードにコピーされます。
+ </li>
+ <li>
+ 個々のスタイルは、ツールバーのドロップダウンメニューを通じて利用することができます。
+ </li>
+ <li>
+ スタイルを簡単に適用できるように、Fキーに割り当てることができます。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i><font color="#ff0033">「ノードの機能 > 属性 > スタイルの属性を付加」</font></i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<edge STYLE="horizontal"/>
+<node TEXT="選択ノードから新スタイルを作成" FOLDED="true" ID="ID_36146276" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのスタイルから新たなユーザスタイルを作成し、そのスタイルの保存名称を指定するためのダイアログを開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スタイルのうちコピーされるのは、次のものです。
+
+ <ul>
+ <li>
+ アイコン
+ </li>
+ <li>
+ 基本ノードテキストの書式
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ スタイルを付加/変更する場合は、<i>「編集 > スタイルを管理 > スタイルを編集」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="詳細と属性のスタイル" ID="ID_543594355">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>「詳細」</i>と<i>「属性」</i>にスタイル(単数)を付加できます。ただし、<i>「スタイルを編集」</i>パネル以外は使えません。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 詳細や属性にスタイルを付加する場合は<i>、「書式 > スタイルを管理 > スタイルを編集 > 編集」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="スタイルを再定義" STYLE_REF="Functie" ID="ID_1707980722"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準ノードスタイルを、選択ノードのスタイルに変更します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="マップ用条件対応スタイルを管理" FOLDED="true" ID="ID_862335179" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ダイアログを開き、各ノードごとに[条件に応じて]特定のスタイルを自動適用する際に用いられるルールを定義します。特定のノードで様々なルールを一度に始動することができます。 その場合、同一ノードに様々なスタイルが適用されます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ルールの条件が真の場合、当該ノードにスタイルが適用されます。複数のルールを同時に発動させることもできるので、一つのノードが複数のスタイルを表示することができます。ルールリストは、一番上の<content ename="content"/>ルールから一番下のルールに向かって実行されます。あるルールが始動し、そのルールに<i>「実行を中止」</i>が設定されている場合、これより下のルールは実行されず、したがって起動されません。スタイルルール自身はフィルタルールと同類のものです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ 条件対応スタイルウィンドウで、<i>「新規」</i>を選択してください。
+ </li>
+ <li>
+ 新規作成される最後の行をダブルクリックして、<i>「フィルタの条件を指定」</i>を開いてください。
+ </li>
+ <li>
+ <font color="#000000">[既存のルール群から使用するルールを]選択するか、新規のルールを定義して選択してください。<i>「フィルタの条件を指定」</i>を見ると、どれかのルールが反転表示されるはずです。</font>
+ </li>
+ <li>
+ OKをクリックしてください。
+ </li>
+ <li>
+ <i>「標準スタイル」</i>をクリックして、表示されるドロップダウンスタイルメニューから使いたいスタイルを選択してください。
+ </li>
+ <li>
+ OKをクリックしてください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタの条件を指定」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 当初、スタイルルール一覧表には何も指定されていません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="新規" ID="ID_480666891"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規ルールを付加する場合に押します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_1156234230"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールを編集します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="削除" ID="ID_856150360"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルール(複数可)を削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="上へ" ID="ID_669310386"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールの位置を一段上に移動させます。したがって、実行の順番が繰り上げられます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="下へ" ID="ID_599078930"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールの位置を一段下に移動させます。したがって、実行の順番が繰り下げられます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="有効/無効" ID="ID_1024757647" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ チェック付きの場合後続のルールが実行され、チェックなしの場合実行されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_1978595059" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ どのような場合にルールを始動させるかを規定する条件のことで、フィルタルールを用いて設定します。ルールが始動すると、当該のスタイルが適用されます。始動しなければ、スタイルは適用されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="常時適用" ID="ID_674682159" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 初期設定のフィルタルールは、常にスタイルを始動するよう設定されています。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="スタイル" STYLE_REF="Method" FOLDED="true" ID="ID_763369934" TEXT_SHORTENED="true">
+<node TEXT="標準スタイル" ID="ID_1063009738" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「標準的なスタイル」</i>です。ダブルクリックすると、利用可能なスタイルのドロップダウンリストが開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="適用を中止" ID="ID_1428874055">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ここにチェックが付けられた状態で、このルールが始動すると、このルールより下のルールは実行されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_1576410916" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規作成の( Freeplane 1.2 用, ≠ 1.1.3 用)マップ上、又はマップスタイルのコピー機能によって Freeplane 1.2 のマップからコピーしたマップスタイルを用いた場合しか、動作しません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="テンプレート" ID="ID_40236894" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <pre wrap="">スタイルマップにある同じノードが、テンプレートとしてもスタイルとしても利用できます。
+明らかにユーザの明示的に割り当てたスタイルものであるか、又はスタイル適用条件に合致するか
+のいずれかの場合、それらはスタイルとして使用されます。スタイルや条件対応スタイルでは、色
+や形、雲、アイコンの書式設定しか参照されません。これらの機能はすべて、編集できず、装着し
+たり削除したりすることしかできない点で共通し、したがって、基本的には関連ノードにスタイル
+が仮想的に添付されることになります。。
+
+実際には、スタイル条件は連鎖を形成しており、複数の条件を満たす場合には、同一ノードに複数
+のスタイルが適用されます。
+例えば、次のような条件対応スタイルがあるとしましょう。
+
+ ノードテキスト, ⊃(含む), "important" ⇒ StyleOne
+ ノードテキスト, ⊃(含む), "error" ⇒ StyleTwo
+
+ノードテキストに両方の語[="important" と "error"]が含まれるノードには両方のスタイル
+が適用されます。そして、当該ノードに適用される書式設定機能はすべて、StyleOne で指定され
+たものでなく、StyleTwo で表明されたものとなります。例えば、StyleOne が太字の文字列を指
+定し、StyleTwo が赤色の背景色を指定している場合、このノードは背景色が赤で太字になります。
+
+属性や詳細といったその他のノードの機能は、編集可能です。したがって、それらは、テンプレー
+トの一部と解されます。その他に、ノートや、さらには後に作成される子ノードまでもをノードの
+機能として扱うことができます。テンプレートは、下記の要領で適用されます。
+
+新規ノードは様々な形で挿入することができます。[選択ノードの]前、後、子ノードや親ノード
+として、まとめノードとして、といった具合です。新規ノード用のスタイルを割り当てておくだけ
+で、新規ノード挿入後、テンプレートが適用されます。この場合、新規作成ノードに対応スタイル
+の内容がコピーされることになります。また、後になって、テンプレートの要素をコピーしたくな
+ったら、一回きりの操作で実行できます。(現在、この点は、属性のコピーしかできませんが、詳
+細など何でもコピーできるように改良できるはずです)。この動作をショートカットに割り当てれ
+ば、たった1回ホットキーを打つだけで実行できるようになります。条件に応じて起動されるスタ
+イルの最初の要素、あるいはすべての要素がコピーされるよう、条件対応スタイルで作動するよう
+にこの動作を変更することもできます。</pre>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="更新" ID="ID_1791624318" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このマップは、マップの更新状況を表示するためにマップの条件対応スタイルを採用しています。
+ </p>
+ <p>
+ 詳しくは、緑色の矢印をクリックして、リンク先をご覧ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="ノード用条件対応スタイルを管理" FOLDED="true" ID="ID_1036704793" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ダイアログを開き、複数のスタイルルールを定義して選択ノードに結合します。</font>ルールの条件が真の場合、当該ノードにスタイルが適用されます。一度に複数のルールを起動させることもできるので、一つのノードに複数のスタイルを表示することができます。
+ </p>
+ <p>
+ ルールリストは、最上部の<content ename="content"/>ルールから最下部のルールに向かって実行されます。あるルールが始動し、そのルールに<i>「実行を中止」</i>が設定されている場合、これより下のルールは実行されず、したがって起動されません。スタイルルール自身はフィルタルールと同類のものです。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ 条件対応スタイルウィンドウで、<i>「新規」</i>を選択してください。
+ </li>
+ <li>
+ 新規作成される最後の行をダブルクリックして、<i>「フィルタの条件を指定」</i>を開いてください。
+ </li>
+ <li>
+ <font color="#000000">[既存のルール群から使用するルールを]選択するか、新規のルールを定義して選択してください。<i>「フィルタの条件を指定」</i>を見ると、どれかのルールが反転表示されるはずです。</font>
+ </li>
+ <li>
+ OKをクリックしてください。
+ </li>
+ <li>
+ <i>「標準スタイル」</i>をクリックして、表示されるドロップダウンスタイルメニューから使いたいスタイルを選択してください。
+ </li>
+ <li>
+ OKをクリックしてください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタの条件を指定」</i>
+ </li>
+ <li>
+ <i>「スタイル > スタイルを編集」。</i>ここで開くパネルで、ノードスタイルを定義することもできます。
+ </li>
+ </ul>
+ </body>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 当初、スタイルルール一覧表には何も指定されていません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="新規" ID="ID_1298449597"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 新規ルールを付加する場合に押します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_406358269"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールを編集します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="削除" ID="ID_1903263169"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルール(複数可)を削除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="上へ" ID="ID_765242491"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールの位置を一段上に移動させます。したがって、実行の順番が繰り上げられます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffff"/>
+</node>
+<node TEXT="下へ" ID="ID_1887002293"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のルールの位置を一段下に移動させます。したがって、実行の順番が繰り下げられます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="有効/無効" ID="ID_1525930437" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ チェック付きの場合、後続のルールが実行され、チェックなしの場合、実行されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_904940681"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ どのような場合にルールを始動させるかを規定する条件のことで、フィルタルールを用いて設定します。ルールが始動すると、当該のスタイルが適用されます。始動しなければ、スタイルは適用されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="常時適用" ID="ID_1758183773">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準のフィルタルールは、常にスタイルを始動するよう設定されています。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="スタイル" STYLE_REF="Method" ID="ID_1608086112" TEXT_SHORTENED="true"/>
+<node TEXT="適用を中止" ID="ID_1550870112" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ここにチェックが付けられた状態で、このルールが始動すると、このルールより下のルールは実行されません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" FOLDED="true" ID="ID_8484574">
+<hook NAME="SummaryNode"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="条件対応ノードスタイル" ID="ID_1620188987" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザがご覧のこのノードは、条件対応ノードスタイルを使って作成されています。適用されているスタイルは、ツールチップの最上部に表示されます。
+ </p>
+ <div>
+ <div>
+ <p>
+
+ </p>
+ <p>
+ <i>「スタイル > 条件対応ノードスタイルを管理」</i>で[ルール指定用]ウィンドウを開くとと、2つのルール、すなわち "Example" スタイル適用ルールと "ToNote" スタイル適用ルールの内容が分かります。これらはともに、常時このスタイルを適用するタイプのものです。これは、適用する条件対応ノードスタイルの中で最もシンプルな使用法で、同一ノードに一度に1つ又は複数のスタイルを適用するものです。
+ </p>
+ <p>
+
+ </p>
+ </div>
+ </div>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+</node>
+</node>
+</node>
+<node TEXT="マップのスタイルをコピー..." ID="ID_750856626"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップスタイルを選択するためダイアログを開きます。これらのスタイルは、実際のマインドマップ[ファイル]のなかにあります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ファイル > 新規作成」</i>は、"<i>standard.mm"</i> のスタイルを使用します。ユーザは、ユーザマップを "standard.mm" に名称変更して<i>「ツール > ユーザディレクトリを開く > テンプレート」</i>の選択によって開くディレクトリに格納すれば、これを "standard.mm" に指定することができます。 <content ename="content"/>
+ </li>
+ <li>
+ <i>「ツール > 環境設定」</i>で標準マインドマップ[ファイル]を別の名称ものもに指定することもできます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="スタイルを編集" STYLE_REF="Functie" ID="ID_802116782"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのスタイルを編集したり、[一部の]スタイルを付加、削除するためのダイアログを開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ このモードで新たなユーザスタイルを定義するには、
+ </p>
+ <ul>
+ <li>
+ ノードの標準スタイルを選択し、
+ </li>
+ <li>
+ 右クリックして<i>「選択中のスタイルをユーザスタイルとして保存」</i>を選択し、
+ </li>
+ <li>
+ 新しい名称をつけて保存し、
+ </li>
+ <li>
+ 新規に作成され保存されたノードに<i>「表示 > プロパティパネル」</i>で修正を施し、
+ </li>
+ <li>
+ プロパティパネルから[マインドマップ画面に]移ります。OKボタンはありません。
+ </li>
+ <li>
+ [マインドマップファイルを]保存するか訊かれたら、OKを押してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="詳細情報" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_222498027" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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"/>
+<attribute NAME="Chapter" VALUE="4"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの<b>スタイル</b>は、一連のノードプロパティと[ノード]内容の基本構造とからなり、それらは、スタイル名を使って呼び出し当該ノードに適用することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードテンプレート" ID="ID_613710379" 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="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ スタイルが属性や詳細を伴っている場合、スタイルに装着されたこれらの事項をノードにコピーします。ただし、この機能は、新規ノード作成時しか使えません。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 後で内容をコピーする場合は、<i>「ノードの機能 > 属性 > スタイルの属性を付加」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="スタイルの事例" ID="ID_1082773930" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スタイルデータは、 "patterns.xml" という設定ファイルに格納されています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ このファイルの名称は、<i>「ツール > 環境設定 > 環境」</i>でユーザが指定することができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Wiki" ID="ID_1760412130" 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>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+</node>
+</node>
+<node TEXT="書式のみコピー" ID="ID_693387904" TEXT_SHORTENED="true">
+<icon BUILTIN="../colorpicker"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノード(単数)の内容をコピーしないで、書式情報だけをコピーします。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式のみ貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="書式のみ貼り付け" ID="ID_1734557080" TEXT_SHORTENED="true">
+<icon BUILTIN="../color_fill"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの内容を貼り付けないで、書式情報だけ貼り付けます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式のみコピー」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="スタイル関連" STYLE_REF="MenuGroupLabel" ID="ID_1980044435">
+<hook NAME="SummaryNode"/>
+</node>
+<node TEXT="マップの背景色" FOLDED="true" ID="ID_1557216828" TEXT_SHORTENED="true">
+<icon BUILTIN="../MapBackgroundColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">色彩選択ダイアログを用いて、マップ全体の背景色を設定します。</span></font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="" ID="ID_1977210206">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このオプションは、<i>「表示 > プロパティパネル」</i>では利用できません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1843588390" TEXT_SHORTENED="true">
+<node TEXT="太字" ID="ID_1005762082" TEXT_SHORTENED="true">
+<icon BUILTIN="../Bold16"/>
+<font NAME="SansSerif" SIZE="10" BOLD="true" ITALIC="false"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノード全体や詳細の字体を太字に変更します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「太字」</i>のアイコン
+ </li>
+ <li>
+ 例外
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="../Italic16"/>
+<font ITALIC="true"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノード全体や詳細の字体を斜体に変更します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「斜体」</i>のアイコン
+ </li>
+ <li>
+ 例外
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="文字を大きく" ID="ID_1187292367" TEXT_SHORTENED="true">
+<icon BUILTIN="../IncreaseNodeFontAction"/>
+<font NAME="SansSerif" SIZE="14" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノード全体や詳細の文字サイズを拡大します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ メニューバーの<i>「文字サイズ」</i>
+ </li>
+ <li>
+ 例外
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="文字を小さく" ID="ID_853991944" TEXT_SHORTENED="true">
+<icon BUILTIN="../DecreaseNodeFontAction"/>
+<font SIZE="10"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノード全体や詳細の文字サイズを縮小します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ メニューバーの<i>「文字サイズ」</i>
+ </li>
+ <li>
+ 例外
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node ID="ID_1704677561" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキスト<b>全体</b>の文字フォント
+ </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"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これらの動作は、基本ノードテキスト全体に作用します。また、[独立]編集ウィンドウやインラインエディタのコンテキストメニューで WYSIWYG 設定<font color="#ff0000">[されている場合は、そちらが]優先されます。</font> 動作は、当初、詳細にも作用しますが、編集ダイアログでの書式設定により、細部設定/無効化することができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 元来は、簡単で敏速な書式設定手段として導入されました。しかし、インラインディタのコンテキストメニューに書式設定機能が取り入れられたことにより、、これらの機能は、多少古臭いものに感じられるようになっています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 元に戻すには、<i>「書式 > ノードコア関連 > 書式のみ削除」</i>を選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > 書式のみコピー」 </i>
+ </li>
+ <li>
+ <i>「書式 > 書式のみ貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="ノードの文字色" ID="ID_335924504" COLOR="#ff3366" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif">色彩選択ダイアログを用いて、選択ノードの文字色を設定します。その色は、ノードのすべてのテキストに適用されます。</font></span>
+ </p>
+ </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">
+<icon BUILTIN="../xeyes"/>
+<edge COLOR="#00ffcc"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font color="#000000" face="SansSerif, sans-serif">ノードを点滅させます。点滅中は、ノードの色が順繰りに変化します。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
+<node TEXT="" ID="ID_1082064875">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このプロパティは、<i>「表示 > プロパティパネルを」</i>では利用できません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="ノードの文字色を薄く" FOLDED="true" ID="ID_497736570" COLOR="#663300" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeColorBlendAction"/>
+<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">選択ノードの文字色を背景色に近づけていきます。繰り返し適用することができます。<i>「書式 > ノードコア関連 > ノードの文字色...> 取り消し」</i>を選択すれば、リセットできます。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<edge COLOR="#00ffcc"/>
+<node TEXT="" ID="ID_1351465676" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このプロパティは、<i>「表示 > プロパティパネルを」</i>では利用できません。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node ID="ID_1852080174" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本ノードテキスト<b>全体</b>の色
+ </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"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これらの動作は、基本ノードテキスト全体に作用します。また、[独立]編集ウィンドウやインラインエディタのコンテキストメニューで WYSIWYG 設定<font color="#ff0000">[されている場合は、そちらが]優先されます。</font> 動作は、当初、詳細にも作用しますが、編集ダイアログでの書式設定により、精緻化/無効化できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 元来は、簡便で手間のかからない書式設定手段として導入されました。しかし、インラインディタのコンテキストメニューに書式設定機能が取り入れられたことにより、これらの機能は、多少古臭いものに感じられるようになっています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 元に戻すには、「<i>書式 > ノードコア関連 > 書式のみ削除」</i>を選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > 書式のみコピー」 </i>
+ </li>
+ <li>
+ <i>「書式 > 書式のみ貼り付け」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="ノードの背景色..." ID="ID_408257432" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
+<icon BUILTIN="../NodeBackgroundColorAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">色彩選択ダイアログを用いて、選択ノードの背景色を設定します。書式設定は当該ノード全体に適用されます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > 書式のみコピー」</i>
+ </li>
+ <li>
+ <i>「書式 > 書式のみ貼り付け」</i>
+ </li>
+ </ul>
+ </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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">「囲み」の設定を無効にし、ノードの内容の下に水平線を表示します。標準設定ではこの形式が用いられます。</font><font face="SansSerif, sans-serif" color="#ff0000">このマップではこのノードのほか大半にこの形式が使用されています。</font><font face="SansSerif, sans-serif" color="#000000">囲みと択一になります。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > ノードコア関連 > 囲み」.</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル > ノードスタイル > 囲み/フォーク」 </i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="囲み" ID="ID_720694634" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ノードの内部エリアを角の丸い枠囲いで縁取りします。このノードには囲みの書式が適用されています。フォーク形式と択一になります。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > ノードコア関連 > フォーク」.</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル > ノードスタイル > 囲み/フォーク」 </i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノードの中心領域を囲む" ID="ID_1543767381" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="書式のみ削除" ID="ID_574252881" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 書式を標準スタイルに戻します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <font color="#ff0000">Work bar <i>Default</i>[エディタのツールバーやコンテキストメニューの<i>「書式を削除」</i>]</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="4"/>
+</node>
+<node TEXT="プレーンテキストを使用" ID="ID_1756064919">
+<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">
+<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>
+<node TEXT="雲の色" ID="ID_1382807141" TEXT_SHORTENED="true">
+<icon BUILTIN="../Colors24"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">雲の色を変えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > 雲」</i>
+ </li>
+ <li>
+ <i>「プロパティパネル > 雲」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="雲のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_132719467" 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">
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">線(エッジ)の形状を選択するダイアログを開きます。選択肢には次のものがあります。</span></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">親と同じ</span></font>
+ </li>
+ <li>
+ 直線
+ </li>
+ <li>
+ ベジェ曲線
+ </li>
+ <li>
+ 先細直線
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">先細ベジェ曲線</span></font>
+ </li>
+ <li>
+ 直角曲がり
+ </li>
+ <li>
+ 線を隠す
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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">
+<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">
+<edge STYLE="linear" WIDTH="4"/>
+</node>
+<node TEXT="ベジェ曲線" ID="ID_417523311" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="bezier" WIDTH="4"/>
+</node>
+<node TEXT="先細直線" ID="ID_883676052" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="sharp_linear" WIDTH="4"/>
+</node>
+<node TEXT="先細ベジェ曲線" FOLDED="true" ID="ID_1907794464" HGAP="40" TEXT_SHORTENED="true">
+<edge STYLE="sharp_bezier" WIDTH="4"/>
+<node TEXT="" ID="ID_1775469652"/>
+</node>
+<node TEXT="直角曲がり" ID="ID_1985550574" TEXT_SHORTENED="true">
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="線を隠す" ID="ID_454401259" BACKGROUND_COLOR="#00ffff" HGAP="50" TEXT_SHORTENED="true">
+<edge STYLE="hide_edge" WIDTH="4"/>
+</node>
+</node>
+</node>
+<node TEXT="線(エッジ)の太さ" ID="ID_525079287" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">選択ノード(複数可)に適用される線(エッジ)の太さを選択するダイアログを開きます。</span></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 選択肢は、次のとおりです。
+ </p>
+ <ul>
+ <li>
+ 親と同じ
+ </li>
+ <li>
+ 細い線
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">1</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">2</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">4</span></font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">8</span></font>
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">表示倍率を小さい場合、「細い線」と「1」の違いは明確に現れないかもしれません。</span></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="線(エッジ)の色" ID="ID_865389195">
+<edge COLOR="#ff0000"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">色彩選択ダイアログを使って、選択ノード(複数可)のフォーク(ないし囲み)の色を設定します。併せて、親ノード・子ノード間の連結線の色も設定します。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="線(エッジ)の色を自動選択" ID="ID_17143142">
+<icon BUILTIN="../AutomaticEdgeColorHookAction"/>
+<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i><font face="SansSerif, sans-serif" color="#000000"><span style="font-family: SansSerif, sans-serif; color: #000000">「スタイル > 自動レイアウト」を参照。</span></font></i>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="線(エッジ)のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 線(エッジ)は親ノードと子ノードの系列[を示すもの]です。線の流れは、線上をクリックし別の場所に引っ張ることで変えることができます。技術的に言えば、線は子ノードに属し、線の色などのプロパティは、子ノード上で変更することができます。<i>「表示 > プロパティパネル」</i>を参照。線は非表示にすることができます。この点については、<i>「線の形」</i>を参照。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードの横幅を変更します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ [このマップの]「リファレンス」ノードの子ノードはすべて最小表示幅=80に設定されています。この方法により、「リファレンス」(に直結する)すべての子ノードが奇麗に並べられています
+ </li>
+ </ul>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">参 照</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル > ノードの最小表示幅」</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル > ノードの最大表示幅」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="ナビゲーション" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<attribute NAME="Chapter" VALUE="1,2,6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ [読込み済みの]マップ間又はノード間を移動したり、ノードを折り畳んだります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="前のマップ" ID="ID_772717665" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_PrevMM"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000"><i>「マップ」</i>メニューのリスト順位が上のマップに移動します。複数のマップが開いている場合にのみ動作します。</font></span>
+ </p>
+ </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">
+<icon BUILTIN="../MoveTo_NextMM"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000"><i>「マップ」</i>メニューのリスト順位が下のマップに移動します。。複数のマップが開いている場合にのみ動作します。.</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2.6"/>
+</node>
+<node TEXT="[他の]マップに移動" ID="ID_1280267907">
+<hook NAME="SummaryNode"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択中のノードの子ノード群の表示/非表示を切り替えます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000"><b>ショートカット </b></font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000"><i>「Space」</i></font>
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="子ノードを折り畳む/展開する" ID="ID_1186846640" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このコマンドは、選択ノードより1階層下の子ノード群を、トグルで折り畳み/展開します。一例を挙げます。この(現在見ている)ノードの下には「子ノードを折り畳む/展開する2」があり、「子ノードを折り畳む/展開する2」の下には「子ノード1」、「子ノード2」、「子ノード3」、「子ノード4」の4つのノードがあります。 このノードから、「折り畳む/展開する」コマンドを使うと、「子ノードを折り畳む/展開する2」の表示/非表示が切り替わります。「子ノードを折り畳む/展開する」コマンドを使うと、「折り畳む/展開するの関連子ノード2」の子ノード群の表示/非表示が切り替わります。
+ </p>
+ <ul>
+ <li>
+ <font color="#ff0000">+ - </font><font face="SansSerif, sans-serif" color="#ff0000">(Un)fold Children 2</font>
+
+ <ul id="fold1_1">
+ <li>
+ <font face="SansSerif, sans-serif" color="#ff0000">Child 1</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#ff0000">Child 2</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#ff0000">Child 3</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#ff0000">Child 4</font>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="1階層分だけ展開する" ID="ID_376192264" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_one_level"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font color="#000000" face="SansSerif, sans-serif">選択ノードの下位ノードを徐々にに展開します。一度クリックすると子ノード群が展開されます。もう一度クリックすると孫ノード群が展開されるといった具合です。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="1階層分だけ折り畳む" ID="ID_721830946" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_one_level"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの最深階層から徐々に下位ノードを折り畳みます。仮に4つの階層があるとすると、一度クリックすると曾孫ノード群が折り畳まれます。もう一度クリックすると孫ノード群が折り畳まれ、次にクリックすると子ノード群が折り畳まれるといった具合です。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="すべて展開する" ID="ID_530681399" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">子ノードや孫ノードなど、選択ノードの下位階層にあたるすべてのノードを展開(見えるように)します。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ホットキー</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Space」</i>を押す。
+ </li>
+ <li>
+ ノード上でシングルクリック。
+ </li>
+ <li>
+ <i>「ツールバー」</i>でアイコンボタンをクリック。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="すべて折り畳む" ID="ID_1834329963" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">子ノードや孫ノードなど、選択ノードの下位階層にあたるすべてのノードを折り畳み(隠し)ます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ホットキー</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Space」</i>を押す。
+ </li>
+ <li>
+ ノード上でシングルクリック。
+ </li>
+ <li>
+ <i>「ツールバー」</i>でアイコンボタンをクリック。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="ノードを折り畳む" ID="ID_101814873" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute_layout VALUE_WIDTH="202"/>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>折り畳む</b>とは、特定ノードの下位のノード群を隠すことです。下位ノードが隠されていることの目印として、小さな丸印が[ノードの外端に]表示されます。展開するとは、これらの[隠された]下位ノードを再表示させることです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="表示中のすべてのノードを選択" ID="ID_1410954936" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップ上に表示中のすべてのノードを選択します。
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノードの子ノードのうち、表示中の(折り畳まれていない)ものをすべて選択します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="選択" ID="ID_719444432" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択フォーカスをルートノード(他のすべてのノードの親)に移動します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ショートカット</b>
+ </p>
+ <ul>
+ <li>
+ <i>「Esc」</i>を押すか、又は、
+ </li>
+ <li>
+ ルートノードをシングルクリックしてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<attribute_layout VALUE_WIDTH="156"/>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ダイアログを開いてノード ID を入力すると、選択フォーカスが該当ノードに移動します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="前のノード" ID="ID_1148907029" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択フォーカスをマップ階層のなかで前に位置するノードに移動させます。前のノードが、非表示中の場合、マップが展開され、当該ノードを表示します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">ショートカット</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Alt + ←」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="次のノード" ID="ID_696016397" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択フォーカスをマップ階層のなかで次に位置するノードに移動させます。次のノードが、非表示中の場合、マップが展開され、当該ノードを表示します。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#000000" face="SansSerif, sans-serif">ショートカット</font></b>
+ </p>
+ <ul>
+ <li>
+ <i>「Ctrl + Alt + →」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="前のノード(折り畳む)" ID="ID_824359474" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択フォーカスをマップ階層のなかで前に位置するノードに移動させ、可能な場合は現在のノードを折り畳んで非表示にします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="次のノード(折り畳む)" ID="ID_1071961971" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">選択フォーカスをマップ階層のなかで次に位置するノードに移動させ、可能な場合は現在のノードを折り畳んで非表示にします。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="次のプレゼンテーションアイテムを展開" ID="ID_1509753321" TEXT_SHORTENED="true">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="選択履歴を遡る" ID="ID_1202592565" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_PrevNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択フォーカスを現在選択中のノードより前に選択されていたノードに移動します。この機能を用いる度に、以前選択されていたノードの履歴に沿って、選択が移動し続けます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="選択履歴を進む" ID="ID_958193774" TEXT_SHORTENED="true">
+<icon BUILTIN="../MoveTo_NextNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000"><i>「戻る」</i>コマンドの使用によって選択されたノードを逆方向にたどります。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="ノードを選択" FOLDED="true" ID="ID_950516167" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードを選択する</b>とは特定のノードをフォーカス状態に置くことで、<b>ノードの選択を解除する</b>とはフォーカス状態を解除することです。フォーカス状態のノードは、メニュー上の諸機能によって操作できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 選択中のノードは、矩形の枠囲いないし[灰色の]陰影付きノードが目印です。初期設定は<font color="#000000">矩形表示</font>です。これは、<i>「表示 > ビューモード > 選択ノードを枠囲い表示」</i>で切り替えることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 選択ノード(複数可)の<b>選択を解除する</b>場合は、ノード以外の場所、つまり背景の空白部分をクリックするか、又は他のノードをクリックします。後者の場合、クリックされたノードが新しい選択状態になります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ カーソルが置かれたノードは、自動的に選択状態になります。マウスカーソルを動かしている間、<b>この選択状態を保持する</b>には、<i>「Shift」</i>を押したまま操作してください。この動作が嫌な場合、<i>「ツール > 環境設定[ > 動作設定 > ノードの選択 > 選択方法]」</i>メニューで自動選択機能を無効にすることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1ないし複数のノードを選択する別のやり方に、特殊キー又は複合キーを押す方法があります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<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">
+<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="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マウスカーソルを動かしている間、選択状態を保持するには、<i>「Shift」</i>を押したまま操作します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 自動選択機能を無効にする場合は、<i>「ツール > 環境設定」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="一番上/一番下の兄弟ノードを選択" STYLE_REF="Method" ID="ID_1447931824" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 現在の選択ノードの一番上、又は一番下の兄弟ノードを選択するには、それぞれ<i>「PgUp」</i>又は<i>「PgDn」</i>を押してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ナビゲーション」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="すべての下位ノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_42041187" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのすべての下位ノードを選択するには、
+ </p>
+ <ul>
+ <li>
+ <i>「Alt + End」</i>を押して、非表示の下位ノードをすべて展開し、
+ </li>
+ <li>
+ <i>「Als + Shift + A」</i>を押して、表示中のすべて下位ノードを選択してください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ナビゲーション」</i>
+ </li>
+ <li>
+ <i>「ツールバー」</i>のアイコンボタン
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_982181678">
+<icon BUILTIN="../unfold_all"/>
+</node>
+<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_1629039399">
+<icon BUILTIN="../fold_all"/>
+</node>
+</node>
+<node TEXT="すべてのノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_543283456" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップ上のすべてのノードを選択するには、
+ </p>
+ <ul>
+ <li>
+ <i>「Esc」</i>を押して、ルートノードを選択し、
+ </li>
+ <li>
+ <i>「Alt + End」</i>を押して、非表示の下位ノードを展開し、
+ </li>
+ <li>
+ <i>「Als + Shift + A」</i>を押して、表示中のすべての下位ノードを選択してください。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ナビゲーション」</i>
+ </li>
+ <li>
+ <i>「ツールバー」</i>のアイコンボタン
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_602297686" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+</node>
+<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_587692878" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#ff0000">フィルタ後のすべてのノードを選択するには、 を参照。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="兄弟ノード群を選択" STYLE_REF="Method" ID="ID_1407618372" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 兄弟ノード群を選択するには、<i>「Shift」</i>を押したままの状態で、始点ノードと終点ノードをクリックしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="任意の複数ノードを選択" STYLE_REF="Method" ID="ID_1462390794" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 2つ以上の任意のノードを選択するには、<i>「Ctrl」</i>を押さえたままで選択したいノード(2つ以上)をクリックしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="矢印キーを使って選択" STYLE_REF="Method" ID="ID_1895256806" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ あるノードから別のノードに選択フォーカスを移動させるには、矢印キー["↑" "↓" "←" "→"]を使ってください。フォーカスが矢印の方向に移動します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ メインメニューの<i>「ノード」</i>
+ </li>
+ <li>
+ <i>メインメニューの「ナビゲーション」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+<node TEXT="非表示テキストのツールチップ表示" ID="ID_79959436" COLOR="#407000" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="8"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 非表示テキストをツールチップ表示させると、現在のノードの下の弟ノードが陰に隠れることがあります。下のノードに移動して、そのノードのツールチップを表示させるには、「↓」キーを使います。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ツールチップの表示をやめるには、該当ノードの上方にカーソルを上に移動させます。
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<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="2"/>
+</node>
+</node>
+<node TEXT="リンク先へジャンプ" ID="ID_1139653335" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードがハイパーリンク付きの場合、このコマンドによってリンクを実行します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「編集 > リンク > リンク先を指定(テキスト入力)...」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="フィルタ" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">特定のノード群だけを表示します。フィルタを構築したり利用するには、フィルタバー又はフィルタメニューを用います。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">クイックフィルタ</font></b><font face="SansSerif, sans-serif" color="#000000">機能を使えば、たいていのフィルタ表示ができます(別ののやり方も使えます)。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>フィルタルール</b>は、3つ要素から構成されます。
+ </p>
+ <ul>
+ <li>
+ <i>ノードの<b>「構成要素」</b></i>(ノードテキスト、詳細、アイコン等)。
+ </li>
+ <li>
+ <b><i>「ルールの型」:</i></b> 構成要素について、<i>「付き」(付いている)、「⊃含む」、「=」、「>」</i>等。
+ </li>
+ <li>
+ 構成要素の<b><i>「値」</i></b>。
+ </li>
+ <li>
+ 値がテキストの場合は、<b><i>「大文字/小文字を区別」</i></b>するかどうか。
+ </li>
+ </ul>
+ <p>
+ <i>クイックフィルタ</i>の適用<b>前に</b>設定すべき<b>フィルタオプション</b>は次のとおりです。
+ </p>
+ <ul>
+ <li>
+ 選択ノード(複数可)に限って適用するかどうか、
+ </li>
+ <li>
+ フィルタ済みノードに適用(絞込み)するかどうか。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <i>クイックフィルタ</i>の適用<b>前又は後に</b>適用できる<b>フィルタオプション</b>に次のとおりです。
+ </p>
+ <ul>
+ <li>
+ 非表示のノードを展開。
+ </li>
+ <li>
+ 上位ノードも表示。
+ </li>
+ <li>
+ 下位ノードも表示。
+ </li>
+ <li>
+ 該当ノードをすべて選択。
+ </li>
+ </ul>
+ <p>
+ フィルタ表示前の状態に戻すには、
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタ解除」</i>(<i>「フィルタ無し」</i>)を<font color="#000000">選択してください。</font>
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ フィルタを掛ける前から非表示になっていたノードは、適用対象にはなりますが、非表示のままです。
+ </li>
+ <li>
+ 可視状態のまま残されたノードはすべて、[矢印キーを押すと]お互いに線(エッジ)に沿って移動しま。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="9"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<node TEXT="フィルタを元に戻す" ID="ID_783522514" TEXT_SHORTENED="true">
+<icon BUILTIN="../undo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 前に使われたフィルタコマンドの効果を無効にします。
+ </p>
+ </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">
+<icon BUILTIN="../redo_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「フィルタ > フィルタを元に戻す」の実行後に、その前に用いられたフィルタコマンドを再適用します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="フィルタをかけ直す" ID="ID_933478204" TEXT_SHORTENED="true">
+<icon BUILTIN="../reapply_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップに変更を加えた後に、改めてフィルタをかけ直します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="クィックフィルタ" FOLDED="true" ID="ID_346354481" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 表示中のノードのうち、フィルタルールとオプションに適合しないものをすべて隠します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ フィルタ表示を終了する場合は、<i>「フィルタ解除」</i>(<i>「フィルタ無し」</i>)。
+ </li>
+ <li>
+ 「フィルタ」メニューのトールチップ(カーソルを<i>「ファイル」</i>メニュー上でホバーリングすると、隠されていた説明テキストを見ることができます。)
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ フィルタを掛ける前に非表示にされていたノードは、非表示のままです。
+ </li>
+ <li>
+ 可視状態のまま残されたノードはすべて、[矢印キーを押すと]お互いに線(エッジ)に沿って移動します。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="最近更新したノードを検索" ID="ID_1331944116" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="2,9"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 特定の日付以降に更新されたすべてのノードをフィルタ表示させるには、<i>「日付フィルタ, 以降に変更された, 日付」</i> 形式のフィルタルールをセットし、すべてのノードを対象に<i>「クィックフィルタ」</i>を実行してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照 </b>
+ </p>
+ <ul>
+ <li>
+ 別の方法として、すべてのノードを対象とする<i>「検索&置換...」</i>を用いるやり方があります。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="選択ノードに絞って適用" ID="ID_371510333" TEXT_SHORTENED="true">
+<icon BUILTIN="../filter_selected_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択中のノード(複数可)だけをフィルタ表示の対象とします。設定によっては、上位ノードや下位ノードも表示します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタ > 上位ノードも表示」 </i>
+ </li>
+ <li>
+ <i>「フィルタ > 下位ノードも表示」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="該当ノードを全て選択" ID="ID_738746195" TEXT_SHORTENED="true">
+<icon BUILTIN="../select_all_found_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フォーカス状態のノードの下位ノード(表示/非表示の両方)につき、フィルタをかけ、[条件に]該当するすべてのものを選択します。そして、それらに挟まれたノードも選択状態に変えます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="フィルタ解除" ID="ID_1725256961" TEXT_SHORTENED="true">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">適用中のあらゆるフィルタの効果を解除します。初期設定は、フィルタ解除状態です。フィルタ解除アイコン。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="フィルタ条件を指定..." FOLDED="true" ID="ID_1159715573" TEXT_SHORTENED="true">
+<icon BUILTIN="../edit_filtering_condition"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">フィルタルールの作成・編集/フィルタ管理用のフィルタ構成ダイアログを開きます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 最初の行に、フィルタルール定義用の3つの入力欄("ノードテキスト"、"⊃含む"、空欄)、及び(照合時に)大文字/小文字区分を適用するかどうか(<i>Match case</i>)を示すチェックボックスが表示されます。これらの編集可能フィールドの下方の枠には、定義済み条件の一覧表が表示されます。初期状態では何も表示されません。右側のボタンを使えば、"And" や "Or" の演算子によってこれらの条件を2つ以上組み合わせたきめ細かな条件を作ることもできます。条件は<i>「名称を指定」</i>ボタンで名前をつけることができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう! </b>
+ </p>
+ <ol>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">フィルタルールの条件を選択ないし入力してください。例えば、("ノードテキスト"、"⊃含む"、"Filter")、「大文字/小文字を区別しない」はチェックしないといった具合です。 </font>
+ </li>
+ <li>
+ <i>「追加」</i>ボタンを押して、ルール一覧にそれを加えてください。
+ </li>
+ <li>
+ 上記作業を繰り返して必要なすべてのルールを指定してください。
+ </li>
+ <li>
+ <i>「OK」</i>ボタンを押してください。
+ </li>
+ </ol>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ "And" や "Or" の演算子によって2つ以上の条件を組み合わせる場合は、[一覧のなかから]該当する条件を選び個別に"And" や "Or"のボタンを押します。
+ </li>
+ <li>
+ 条件にラベルをつける場合は、条件を選び、「名称を指定」ボタンを押します。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタ構成」</i>ダイアログの使用例については、<i>「スタイル > マップの条件対応スタイルを管理」</i>を参照。
+ </li>
+ <li>
+ <i>「スタイル > ノードの条件対応スタイルを管理」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="テキスト(初期設定)" ID="ID_836877261">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="親ノードのテキスト" ID="ID_1906594792">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="詳細" ID="ID_1225439653">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="アイコン" ID="ID_1215653772">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ハイパーリンク" ID="ID_1112769469">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="コネクタのラベル" ID="ID_1034887668">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="コネクタ" ID="ID_1016868966">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="日付フィルタ" ID="ID_438043110">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="優先順位" ID="ID_721879468">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Node" ID="ID_863184223">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="スタイル" ID="ID_209651598">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ノード階層" ID="ID_1065140798">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="リマインダ" ID="ID_590160509">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="スクリプトフィルタ" ID="ID_1101909561">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ユーザ定義スタイル(複数可)..." ID="ID_1897298627">
+<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">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="⊃(含む)(初期設定)" ID="ID_240865267" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="≒" ID="ID_240370852" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT=">=" ID="ID_718771812" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT=">" ID="ID_303668262" 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">
+<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">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="空白のテキストフィールド(初期設定)" STYLE_REF="OptionalValue" ID="ID_1708735229"/>
+</node>
+<node TEXT="チェックボックス" STYLE_REF="Method" FOLDED="true" ID="ID_1500860624" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="9"/>
+<node TEXT="大文字/小文字を区別" ID="ID_745100871" 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">
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="フィルタ作成ダイアログのボタン" STYLE_REF="Method" FOLDED="true" ID="ID_1629780291" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ "And" や "Or" によって構成されたフィルタルールを分割します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="削除" ID="ID_1967282606"/>
+<node TEXT="名称を指定" ID="ID_835941218"/>
+<node TEXT="右側" ID="ID_957976689">
+<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">
+<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">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 緑色の矢印をクリックして、用例に移動してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+</node>
+<node TEXT="フィルタ中のノードに適用(絞り込み)" ID="ID_459453471" TEXT_SHORTENED="true">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">フィルタ中の(可視)ノードへの適用/解除を切り替えます。すなわち、結果を絞り込むために、追加のフィルタ条件を付加します。 </font>
+ </p>
+ </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">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">(<i>「選択ノードに絞って適用」</i>が設定され)フィルタ表示が有効の時、フィルタ条件に適合するノードの上位ノードすべてにつき、表示/非表示を切り替えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「クィックフィルタ」</font></i><font face="SansSerif, sans-serif" color="#000000">実行の前でも後でもセットできます。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="下位ノードも表示" ID="ID_675488656" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">(「選択ノードに絞って適用」が設定され)フィルタ表示が有効の時、フィルタ条件に適合するノードの下位ノードすべてにつき、表示/非表示を切り替えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <i><font face="SansSerif, sans-serif" color="#000000">「クィックフィルタ」</font></i><font face="SansSerif, sans-serif" color="#000000">実行の前でも後でもセットできます。</font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="フィルタの条件/状態" FOLDED="true" ID="ID_583186956" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">フィルタ条件に適合するすべてのノードを展開し表示します。トグルスイッチではありません。ノードは、一度展開すると、他のコマンド(このコマンドの実行直後に行なう<i>「フィルタ > 元に戻す」</i>など)を用いなければ折り畳むことができません。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>参 照</b></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><i>「ナビゲーション > 折り畳む/展開する」</i></font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><i>「ナビゲーション > すべて折り畳む」</i></font>
+ </li>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif"><i>「ナビゲーション > 1階層分だけ折り畳む」</i></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+</node>
+<node TEXT="前方検索" ID="ID_973810586" TEXT_SHORTENED="true">
+<icon BUILTIN="../find_previous"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードの中でテキストなどの指標を検索します。検索は、後方検索と逆方向に行ないます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ 見つかったノードは選択状態になります。.
+ </li>
+ <li>
+ 見つかったノードが折り畳み中の場合は、展開されます。
+ </li>
+ <li>
+ 見つかったノードが表示画面の外にある場合は、表示画面の可視エリアに来るように、マインドマップを動かします。
+ </li>
+ </ul>
+ </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">
+<icon BUILTIN="../find_next"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">選択ノードとその下位ノードでテキストなどの指標を検索します。さらに、見つからない場合は、他の枝も検索します。深さ優先探索方式と呼ばれるやり方です。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ 見つかったノードは選択状態になります。.
+ </li>
+ <li>
+ 見つかったノードが折り畳み中の場合は、展開されます。
+ </li>
+ <li>
+ 見つかったノードが表示画面の外にある場合は、表示画面の可視エリアに来るように、マインドマップを動かします。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="9"/>
+</node>
+<node TEXT="探査/検索" ID="ID_1132074571" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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"/>
+<attribute NAME="Chapter" VALUE="3,6,7,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 好みに合わせて Freeplane を調整し、拡張機能を利用できるようにします。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="時間管理" FOLDED="true" ID="ID_1350875145" TEXT_SHORTENED="true">
+<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 時間管理を使えば、選択ノードに日時(リマインダ)と課題(リマインダテキスト)をセットすることができます。日付は、基本ノードテキストに表示されます。置時計アイコンが、リマインダが設定されていることの目印です。このアイコンは、原則として、当該のノード及びその上位ノードに表示されます。ただし、複数のノードが1つのまとめノード群に属する場合は除きます。点滅中の置時計アイコンは、リマインダの期限が来たことを示します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ これらの機能は、次の2つの場所でを設定したり、編集したりできます。
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 時間管理」 </i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル > カレンダー/属性」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<icon BUILTIN="../TimeManagementAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードに装着される日付(テキスト)やリマインダをセットしたり変更したりするダイアログを開きます。このノードと上位ノードに置時計アイコンを表示します。このアイコンは、リマインダ時刻に点滅します。また、ルートノードで赤色のエクスクラメーションマークが点滅します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 別の形のダイアログについては、<i>「表示 > プロパティパネル > カレンダー/属性」</i>を参照。
+ </li>
+ </ul>
+ </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">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_406208065">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1873112522">
+<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">
+<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>
+<node TEXT="リマインダ(時刻)を削除" STYLE_REF="Method" ID="ID_225994845">
+<attribute NAME="Chapter" VALUE="5"/>
+</node>
+</node>
+<node TEXT="タスクを管理" ID="ID_745272228" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<icon BUILTIN="../TimeListAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">すべてのノードに付されたリマインダを表示するウィンドウを開きます。各リマインダは下記の事項を表示します。</font>
+ </p>
+ <ul>
+ <li>
+ 日付
+ </li>
+ <li>
+ 基本ノードテキスト
+ </li>
+ <li>
+ アイコン
+ </li>
+ <li>
+ 作成時刻
+ </li>
+ <li>
+ 最終変更時刻
+ </li>
+ <li>
+ ノート
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">どの項目も、検索&置換を用いれば、検索、変更することができます。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<icon BUILTIN="../ReminderHookAction"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="5"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードのリマインダを削除します。他のやり方については、
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「時間を管理...」</i>
+ </li>
+ <li>
+ <i>「表示 > プロパティパネル > カレンダー/属性」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="" ID="ID_790614129" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>秘匿化</b>は、正しい暗証キーが入力されないかぎり、特定ノードの下位ノード(だけ)を閲覧や編集から保護する機能です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 使用アルゴリズムは、"javax.crypto.Cipher" の"PBEWithMD5AndDES" です。
+ </li>
+ <li>
+ Use a sentence or long key with capitals, non capitals and special characters to be more safe.
+ </li>
+ <li>
+ 元ファイルの情報も読めなくなります。
+ </li>
+ <li>
+ 用例:プライベート情報の安全錠。<br/>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ マインドマップを編集は禁止にして閲読のみできるようにするには、<i>「マップ > マップ閲覧モード」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<edge STYLE="horizontal" COLOR="#00ffcc"/>
+<node TEXT="パスワードで保護" FOLDED="true" ID="ID_1516836083">
+<icon BUILTIN="../lock"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 選択ノードの下位ノードが勝手に表示されたり編集されたりしないように、保護するために使用するパスワードを付加したり、利用するためのダイアログを開きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font face="SansSerif, sans-serif" color="#000000">ノート</font></b><font face="SansSerif, sans-serif" color="#000000"> </font>
+ </p>
+ <ul>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">マップ全体を保護するには、ルートノードを選択し保護の操作を行なってください。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">選択中のノード自身は保護対象となりません。その情報は引き続き、表示、編集可能です。</font>
+ </li>
+ <li>
+ 多重保護が可能です。保護中の親ノードの子ノードに、別のパスワードを用いて保護設定してください
+ </li>
+ <li>
+ マップを閉じると、該当ノードは自動的に保護状態になります。(toggle <i>Encrypted</i>).
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ ロックを1クリック操作できるようにするには、<i>「編集 > リンク > 機能リンク(メニュー項目に対応)」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+<node TEXT="" FOLDED="true" ID="ID_12483937">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="" ENCRYPTED_CONTENT="/xrv1GAm4ws= SDHE3qFf6C4Vl0egFXFLKlm4c4bM8BiLqYrq662A73HSKPgXuTcuIcpo8zL4HQbjyRUQ59DROyTXLG9/wVqsTLCCA2+sYKCQ7rGDZ1rcB2Mu42TNmau53L0uELTKzBZI" ID="ID_1295571293" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>用 例</b>
+ </p>
+ <p>
+ このノードは、保護されています。このノードの子ノードは、パスワードを入力しなければ、表示されません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ <i>「パスワードでj情報保護/閲覧」</i>を選択して、<i>「freeplane」</i>というパスワードを入力してください。<i> </i>
+ </li>
+ <li>
+ このノードに子ノードが2つあることを確認してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+</node>
+</node>
+<node TEXT="パスワードを廃止" ID="ID_1501945017">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ パスワードを入力することで、選択ノードの保護機能を除去するためのダイアログを開きます。以後、当該ノードの下位ノードを表示させるのに、パスワード入力の必要がなくなります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+</node>
+<node TEXT="アドオン" STYLE_REF="Method" ID="ID_100406395" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、アドオンを通じて機能拡張することができます。アドオンとは、特定のセンターからダウンロードできるパッケージで、標準装備されていない機能を提供するものです。詳細は <a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons">Add-ons wiki</a> をご覧ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ショートカットキーを割り当て" ID="ID_855338219" TEXT_SHORTENED="true">
+<icon BUILTIN="../SetAcceleratorOnNextClickAction"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">メニューコマンドに複合ホットキーを割り当てたり、現在のホットキーの割り当てを変更したりできるようにします。ほとんどのメニューコマンドに使えます。</font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ダイアログを開き、
+ </p>
+ <ol>
+ <li>
+ 案内に従って、[ホットキーを]設定するメニュー項目を選び、
+ </li>
+ <li>
+ キー、複合キー、又はFキーを入力します。
+ </li>
+ </ol>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > ホットキーの設定 > ホットキーの設定を保存」</i>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 用途別に異なるショートカットキーセットを保存することができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 以前に保存されたホットキーセット一覧を開き、そこから選択します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ユーザが定義したセットがない場合、何も表示されません。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif">現在定義されているすべてのホットキーショートカットを専用ファイルに保存するためのダイアログを開きます。これで、複数のコンピュータで共通のキー入力が使えるようにできます。ダイアログは、[保存]ファイルの名称入力を促しますが、ファイル名には自動的に ".properties" という拡張子が付されます。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font color="#000000" face="SansSerif, sans-serif"><b>ノート</b></font>
+ </p>
+ <ul>
+ <li>
+ <font color="#000000" face="SansSerif, sans-serif">ファイルは、ユーザディレクトリのサブディレクトリ "accelerators" に作られます。</font>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > ユーザディレクトリを開く」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="ホットキーセットを削除" STYLE_REF="Functiegroep" ID="ID_349086275" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ツール > ユーザディレクトリを開く」</i>を選択し、"accelerators" というディレクトリからセット名を削除してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="ショートカット" FOLDED="true" ID="ID_1521559282">
+<hook NAME="SummaryNode"/>
+<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">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="ショートカット、又はホットキー" ID="ID_927299127">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="8"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ホットキー</b>は、[ツールバーやコンテキストメニューの]メニュー項目まで移動しなくても、当該メニュー項目を起動できるようにする特定の1キーないし複合キーです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Fキー" ID="ID_1454255501"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Fキー (F1 - F12) は、ホットキーです。割り当てや選択、削除については、上のノードを参照してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="システム指定特殊キーの参考文書" ID="ID_471805988"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ヘルプ > キーマップ一覧」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="8"/>
+</node>
+<node TEXT="未定義の F キー" STYLE_REF="ToNote" FOLDED="true" ID="ID_1373554472"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <pre wrap=""> フォーカス中の構成要素が JTextComponent の場合、定義されていない F キーは、<font color="#ff0000">passed through されます。</font> (1.2.8_05</pre>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_1243435937" 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="スクリプトを選んで実行..." ID="ID_1890181858" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <br/>
+
+
+ <div>
+ <div>
+ <p>
+ ユーザのスクリプトディレクトリに付加された Groovy スクリプトを階層化されたメニューの形で表示します。
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="選択ノードのスクリプトを実行" ID="ID_963866825" COLOR="#000000" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 現在の選択ノード(複数可)に装着されているすべてのスクリプトを実行します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="すべてのスクリプトを実行" ID="ID_266266767" COLOR="#000000" TEXT_SHORTENED="true">
+<icon BUILTIN="../ExecuteScriptForAllNodes"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ スクリプトエディタを使って作成された、現在のマップ上のすべてのスクリプトを実行します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="スクリプトを編集..." ID="ID_1738795858" TEXT_SHORTENED="true">
+<icon BUILTIN="../ScriptEditor"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 個々のノードに装着され、現在のマップファイルにしか保存できないスクリプト作成用のウィンドウを表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane には、次の3種類の計算式があります。
+ </p>
+ <ul>
+ <li>
+ LaTeX で記述された、テキスト内の計算式。
+ </li>
+ <li>
+ スプレッドシート(Excel)と同様に、一度に実行される単純な計算式。この種の計算式は基本ノードテキスト内に記述され、"=" で始まり、その後に "3 + 5" のような通常の数式表現が続きます。そのノードは、計算を行い、計算式の代わりに計算結果を表示します。この種のノードは、色つきの縁取りによって識別されます。
+ </li>
+ <li>
+ Groovy スクリプト言語で定義された応用計算式。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「表示 > ビューモード > 計算式ノードを枠囲い表示」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+<node TEXT="すべての計算式を実行" STYLE_REF="Functie" ID="ID_627469815">
+<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">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="7"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 環境設定で計算式の実行を無効にすることもできます。
+ </li>
+ <li>
+ 公開用のマインドマップ(Java アプレット)では、スクリプトは動作しません。
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ 緑色の矢印をクリッして、環境設定をご覧ください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="" FOLDED="true" ID="ID_1643451776">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="計算式の Wiki" ID="ID_1130453106" 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">
+<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">
+<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.getResourceController().getResource(path))
}

def builder = new SwingBuilder()
def dial = builder.dialog(title:'Insert Image', id:'insertImage', modal:true,
 locationRelativeTo:ui.frame, owner:ui.frame, pack:true, show:true) {
 panel() {
 JTextField urlField
 boxLayout(axis:BXL.Y_AXIS)
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('URL')
 urlField = textField(id:'url', columns:30)
 button(action:action(closure:{
 def chooser = fileChooser(fileSelectionMode:JFileChooser.FILES_ONLY)
 if (chooser.showOpenDialog() == JFileChooser.APPROVE_OPTION)
 urlField.text = chooser.selectedFile.toURL()
 }), icon:getIcon("/images/fileopen.png"))
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('Width:')
 textField(id:'width', columns:3)
 glue()
 label('Height:')
 textField(id:'height', columns:3)
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.LEFT)
 label('Target:')
 buttonGroup().with { group -> 
 radioButton(id:'text', text:'Node Text', selected:true, buttonGroup:group) 
 radioButton(id:'details', text:'Node Details', buttonGroup:group) 
 } 
 }
 panel(alignmentX:0f) {
 flowLayout(alignment:FL.RIGHT)
 button(action:action(name:'OK', defaultButton:true, mnemonic:'O',
 enabled:bind(source:urlField, sourceProperty:'text',
 converter:{ it ? true : false }),
 closure:{variables.ok = true; dispose()}))
 button(action:action(name:'Cancel', mnemonic:'C', closure:{dispose()}))
 }
 }
}

def String insertTag(String text, String htmlTag) {
 if (text == null)
 text = ""
 if ( ! text.startsWith("<html>"))
 text = "<html><head/><body>${text}</body></html>"
 return text.replace("</body>", htmlTag + "</body>")
}

def String imageTag(url, width, height) {
 def attribs = [ "src='${url}'" ]
 if (width)
 attribs << "width='${width}'"
 if (height)
 attribs << "height='${height}'"
 "<img ${attribs.join(' ')} />"
}

def vars = builder.variables
if (vars.ok) {
 def imageTag = imageTag(vars.url.text, vars.width.text, vars.height.text)
 if (vars.details.selected)
 node.details = insertTag(node.detailsText, imageTag)
 else
 node.text = insertTag(node.text, imageTag)
}

"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このノードに定義するスクリプトを実行すれば、詳細部分にイメージを取り込むことができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ このノードをユーザのマインドマップにコピーしてください。
+ </li>
+ <li>
+ <i>「ツール > 環境設定 > プラグイン」</i>で次の項目にチェックが付されていることを、事前に確認してください。、
+
+ <ul>
+ <li>
+ <i>「スクリプトの実行を許可</i>」
+ </li>
+ <li>
+ <i>「ファイルの読み込みを許可」</i>
+ </li>
+ <li>
+ <i>「ファイルの書き込みを許可」</i>
+ </li>
+ </ul>
+ </li>
+ <li>
+ コピーしたノードをクリックして、イメージ挿入用のダイアログを開いてください。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ このノードに装着されているスクリプトをユーザのノードにコピーすることもできます。
+ </p>
+ </li>
+ <li>
+ 元のスクリプトは、模範スクリプトの Wiki にあります。
+ </li>
+ <li>
+ このノードには、<i>T「ツール > ノードのスクリプトを実行」</i>へのリンクが装着されています。
+ </li>
+ <li>
+ この用例には、ひとつだけ欠点があります。イメージを挿入するノードにスクリプトを置くことが必要なことです。もっと一般的な使用法については、下方の用例を参照してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="同一スクリプトを汎用的に使用" ID="ID_776458088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ [上方の]模範スクリプトを、どのノードからでも詳細にイメージを挿入できるようにするには、scrips ディレクトリにそれをインストールしなければなりません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>やってみよう!</b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > ユーザディレクトリを開く」</i>
+ </li>
+ <li>
+ <i>「scripts」</i>というサブメニューを作成するか、又は開くかしてください。
+ </li>
+ <li>
+ 次の要領で、模範スクリプトの Wiki からスクリプトをダウンロードしてください。
+
+ <ul>
+ <li>
+ <font size="2">模範スクリプトの Wiki に行き</font><font size="3">、</font>
+ </li>
+ <li>
+ <i><font size="3">「</font><font size="2">Inserts an inline image into node text or details」</font></i><font size="2">という名のファイルを探し</font><font size="3">、</font>
+ </li>
+ <li>
+ <i>「download script」</i>を押して、「保存」を選択してください。<i>「InsertInlineImage.groovy」</i>がダウンロードされます。
+ </li>
+ <li>
+ このファイルを<i>「scripts」</i>ディレクトリにコピーしてください。
+ </li>
+ </ul>
+ </li>
+ <li>
+ Freeplane を閉じ、再起動すると(!)、 保存したファイルが<i>「ツール > スクリプトを実行」</i>に表示されるようになります。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ これで、ノードを選択し、次の操作でスクリプトが起動できるようになります。
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > スクリプトを選んで実行 > InsertInlineImage」</i> (スクリプト名は、保存時に用いたものになります。)
+ </li>
+ </ul>
+ <p>
+ <b>ノート </b>
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定 > プラグイン」</i>で次の項目にチェックが付されていることを、事前に確認してください。、
+
+ <ul>
+ <li>
+ <i>「スクリプトの実行を許可</i>」
+ </li>
+ <li>
+ <i>「ファイルの読み込みを許可」</i>
+ </li>
+ <li>
+ <i>「ファイルの書き込みを許可」</i>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+</node>
+<node TEXT="外部コマンドを実行" ID="ID_606027222" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font size="1"><code>外部コマンドを実行するには、下記のスクリプトを保存してください。 </code></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font size="1"><code>// @ExecutionModes(on_single_node) </code></font>
+ </p>
+ <p>
+ <font size="1"><code> 'C:\path\to\my\command'.execute() </code></font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font size="1">ノート</font></b>
+ </p>
+ <ul>
+ <li>
+ <font size="1"><code>コマンドにホットキーに割り当てることも可能です。</code></font>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="ユーザディレクトリを開く" FOLDED="true" ID="ID_1899966210" 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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 自動バックアップファイルを格納します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<node TEXT="" ID="ID_1056610579" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マップファイルが消えた時は、ここを探してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="templates ディレクトリ" ID="ID_1073364264" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ すべてのスタイルを ".mm" 形式でを格納しています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ default.mm は、新規マップに使われるシステムファイルです。
+ </li>
+ <li>
+ このディレクトリを使えば、他のユーザとスタイルを交換することができます。
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザ定義スクリプトを格納します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="icons ディレクトリ" ID="ID_140542266" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザ定義アイコンを格納します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ ユーザはここに独自のアイコンを置いたり、アイコンを他のユーザと交換したりすることができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="xml ディレクトリ" ID="ID_471706192" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザが任意で、付加するオプションディレクトリです。
+ </p>
+ <p>
+ このディレクトリを使えば、ユーザの定義に従って階層化されたメニューを格納できます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="accelerators ディレクトリ" ID="ID_482120942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ホットキーセットを格納しています。
+ </p>
+ <p>
+ これらは、ユーザー間で交換することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6,8"/>
+</node>
+<node TEXT="インポート/エクスポート" ID="ID_1576399110" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6,8"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザは、これらのディレクトリを使って、アイコンやスタイル、ショートカットキーセットを他のユーザと交換することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="環境設定..." FOLDED="true" ID="ID_45903753">
+<icon BUILTIN="../PropertyAction"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このノードは、検索・フィルタの目的にしか使われません。説明はありません。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<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">
+<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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>単一プログラムインスタンス</i>
+ </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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="前回終了時のマップを自動的に開く" ID="ID_208333831" 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">
+<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">
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="ファイル" ID="ID_13501482" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="バックアップファイル格納ディレクトリを一つに" ID="ID_479909948" 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">
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="自動保存" ID="ID_1726602559" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="常に保存する" ID="ID_505402157" 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">
+<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">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="保存時の状態で読み込む" ID="ID_579954633" 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">
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="..." ID="ID_1762776087" 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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="絶対的" ID="ID_1428308602" 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">
+<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">
+<hook NAME="FirstGroupNode"/>
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="常に送信" ID="ID_1366268809" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="自動バグレポート" ID="ID_534959328" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="標準" ID="ID_810126819" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Metal" ID="ID_1586991642" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="Windows" ID="ID_1602607369" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="システムの画像解像度をデフォルトとして使用" STYLE_REF="IsChecked" ID="ID_719531600">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="ユーザ定義画面解像度(dpi)" STYLE_REF="Method" FOLDED="true" ID="ID_1436875119">
+<edge COLOR="#00ffcc"/>
+<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038"/>
+</node>
+<node TEXT="タブ表示機能を使用" ID="ID_1089748589" 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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<hook NAME="FirstGroupNode"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="黄色" ID="ID_1123750493" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="#f0f0f0" ID="ID_1285798737" 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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="#002080" ID="ID_1261428639" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="#d2d2d2" ID="ID_1209757699" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="ルートノードの体裁" ID="ID_801804133" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="線だけアンチエイリアス" ID="ID_1613465166" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="アンチエイリアスなし" ID="ID_316108629" 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">
+<hook NAME="SummaryNode"/>
+<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">
+<hook NAME="FirstGroupNode"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="100" ID="ID_217904325" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="600" ID="ID_1244152079" 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">
+<attribute NAME="Chapter" VALUE="1"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="600" ID="ID_962962965" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="#000000" ID="ID_1227669539" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="80" ID="ID_1920834286" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="曲線" ID="ID_1329911663" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="直線(角付き)" ID="ID_571973506" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="2" ID="ID_1211597440" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="SansSerif" ID="ID_121466153" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="12" ID="ID_701404488" 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">
+<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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="150" ID="ID_386494789" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="600" ID="ID_143285276" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="400" ID="ID_1832059342" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="900" ID="ID_216216236" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="5" ID="ID_391477845" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="15" ID="ID_275848914" 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">
+<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">
+<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">
+<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>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="属性付きアイコンを表示" FOLDED="true" ID="ID_1228898153">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>Java アプレット</i>では、いかなる設定状態でも属性付きアイコンが表示されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="アイコン" ID="ID_693765266" 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 NAME="Chapter" VALUE="3,8"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+<node TEXT="キー設定" FOLDED="true" ID="ID_1511501068" 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>
+<node TEXT="動作設定" FOLDED="true" ID="ID_1341988022" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ユーザインタフェースの様々な部面を制御します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="冒頭" ID="ID_530563396" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="ドラッグ&ドロップ" ID="ID_101107635" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="折り畳み中シンボルの幅" FOLDED="true" ID="ID_71858248" TEXT_SHORTENED="true">
+<edge COLOR="#00ffcc"/>
+<node TEXT="6" ID="ID_794404287" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="10" ID="ID_519267964" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="内容を上書き" ID="ID_1849292111" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="兄弟ノードを付加" ID="ID_988048217" 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">
+<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"/>
+<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">
+<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">
+<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">
+<attribute NAME="Chapter" VALUE="4"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="#0.####" ID="ID_314571391" 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">
+<attribute NAME="Chapter" VALUE="4"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="SHORT" ID="ID_980983589" 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">
+<attribute NAME="Chapter" VALUE="4"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="SHORT,SHORT" ID="ID_1966822672" 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">
+<attribute NAME="Chapter" VALUE="4"/>
+<edge COLOR="#00ffcc"/>
+<node TEXT="自動選択(言語リスト)" ID="ID_1150811157" 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"/>
+<attribute NAME="Chapter" VALUE="4,8"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「プロパティパネル > カレンダー/属性 > 日付/時刻、及び数値の書式設定」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+<edge COLOR="#00ffcc"/>
+</node>
+<node TEXT="すべての新規ノードにインラインエディタを表示" ID="ID_172497623" 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">
+<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">
+<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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="確認する" ID="ID_1498341777" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="いいえ" ID="ID_537595889" 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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<hook NAME="SummaryNode"/>
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="マウスオーバー後、間をおいて自動選択" ID="ID_1215619214" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+<node TEXT="クリックで選択" ID="ID_1101176816" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="200" ID="ID_1394408576" 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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="80" ID="ID_1685853892" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="20" ID="ID_388198497" 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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="15" ID="ID_282567967" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="15" ID="ID_425362264" 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">
+<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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="750" ID="ID_1782324302" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="4,000" ID="ID_1660267918" 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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="500" ID="ID_1275414273" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="80" ID="ID_1049715479" 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">
+<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">
+<edge COLOR="#00ffcc"/>
+<node TEXT="100" ID="ID_1108790923" 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">
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="font-family: SansSerif, sans-serif; color: #000000"><font face="SansSerif, sans-serif" color="#000000">ウェブブラウザとの相互関係、及びHTML とのエクスポートやインポートに関するオプションを制御しています。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+<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">
+<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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="OS別の標準ブラウザ起動コマンド" ID="ID_538776406" 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">
+<attribute NAME="Chapter" VALUE="6"/>
+<node TEXT="すべて展開して書き出す" ID="ID_495590352" 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">
+<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">
+<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">
+<icon BUILTIN="pencil"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+</node>
+<node TEXT="アイコンも書き出す" ID="ID_1815431673" 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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+</node>
+<node TEXT="ファイルの読み込み操作を許可" ID="ID_1145756334" 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">
+<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">
+<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">
+<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">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="署名用ユーザキーエイリアス" ID="ID_995760581" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="スクリプトディレクトリ" FOLDED="true" ID="ID_1580438962" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="7"/>
+<node TEXT="スクリプト" ID="ID_1834563527" 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">
+<attribute NAME="Chapter" VALUE="7"/>
+</node>
+<node TEXT="スクリプト" ID="ID_1511750976" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップを選択し、操作します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="マップ編集モード" ID="ID_674391109" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ マインドマップを作成、編集するモードです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+</node>
+<node TEXT="マップ閲覧モード" ID="ID_607287696" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">これは、マップを編集するのでなく、閲覧するためのモードです。主な使い道は2つあります。第1に、「エクスポート > Java アプレットに...」を使う際に、アプレットをリードオンリー開く場合です。それは、ウェブ経由でのマップ編集機能がサポートされていないためです。第2に、Freeplane のヘルプファイルに、「ヘルプ > マニュアル」ないし F1 経由で'アクセスした場合です。これは、ユーザ-が Freeplane の諸機能について学習している間、マニュアルの内容を保護するために、リードオンリーモードで開くものです。その他では、通常、このマップ閲覧モードを使うことはありません。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ファイラーモード" ID="ID_1061396194" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ウェブページにマインドマップを公開" FOLDED="true" ID="ID_344627022" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="6"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">マインドマップを公開したりシェアしたりするには、</font>
+ </p>
+ <ul>
+ <li>
+ オープン時に表示したい形にマインドマップを折り畳みます。
+ </li>
+ <li>
+ <i>「ファイル > エクスポート」</i>を選択し、「<i>Java アプレットに」</i>を選びます。
+ </li>
+ <li>
+ <i>「myFile.html」</i>と<i>「myFile.html_files」</i>という名のファイルとディレクトリが一つずつ作成されます。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ <i>「myFile.html」</i>ファイルと<i>「myFile.html_files」</i>というサブディレクトリは、 アクセスを許可する予定の場所(ディレクトリ)移動することができます。このマインドマップを開くには、「<i>myFile.html」を呼び出します。</i>
+ </li>
+ <li>
+ インターネットに公開する場合は、「myFile.html」を、例えば 「index.html」といった風に名称変更することができます。サブディレクトリについては、名称変更してはいけません。
+ </li>
+ </ul>
+ <p>
+ <b>追加ノート</b>
+ </p>
+ <ul>
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Freeplane アプレットでは、閲覧モードしか使えません。マップを遠隔編集することはできません。ノードを折り畳む/展開するの切り替えを行なったり、リンクをたどる場合は、ノードをクリックしてください。 マップを検索する場合は、ノードコンテキストメニューを利用してください。 </font>
+ </p>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">小さなマップについては、 "Flash にエクスポート"を使うこともできます。Flash でも、提供される閲覧機能に制約があります。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">LaTeX とSVG 画像は、Freeplane アプレットでも、Flash ブラウザでも表示されません。</font>
+ </li>
+ </ul>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「wiki にマインドマップを埋め込む」</i>
+ </li>
+ </ul>
+ </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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ウェブサイトや wiki へのマインドマップ埋め込みについては、インターネット上の説明をご覧ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="ヘ ル プ" FOLDED="true" ID="ID_832864139" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane 使用中に生じる問題の解決に役立つ各種情報源を紹介します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="プログラムの更新確認" ID="ID_373235221" TEXT_SHORTENED="true">
+<icon BUILTIN="../update"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane の新バージョンがリリースされているかどうか、手動で確認します。開いたダイアログの最下部にある対応チェックボックスを有効にすれば、このチェックが自動的に行なわれるようになります
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Freeplane ホームページ" ID="ID_423013051" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane ウェブサイトのホームページを、ウェブブラウザで開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane の Open Discussion Forum を、ウェブブラウザウィンドウに開きます。確認ダイアログが開き、この機能を使うためには、SourceForge.net にログインする必要があるという警告が表示されます。SourceForge.net での無料アカウントの開設は容易です。ログインすると、検索機能を使って疑問に関連する情報をチェックすることができます。検索フィールドは、フォーラムメニューの見出しのすぐ下にあります。さらに、独自の質問をしたいならば、ページの最下部までスクロールダウンして、”Add a Topic" の見出しを見つけてください。"Enter topic title" のラベルのついた行に簡単な表題をタイプし、次に、下方の大きいテキストボックスにメッセージを入力してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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>
+<node TEXT="バグ報告" ID="ID_962008923" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Mantis Bug tracker のページを、ウェブブラウザで開きます。ここからバグを報告してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="機能の追加を要望" ID="ID_98014582" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Mantis Tracker の Freeplane 機能追加要望ページを、ウェブブラウザで開きます。ここから要望を提出することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+</node>
+<node TEXT="ライセンス" ID="ID_27246134" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane の著作権やライセンス情報の要点を示すウィンドウを開きます。GNU 一般公衆利用許諾書の完全版の所在情報も含まれます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 著作権、バージョン、及び技術的情報を表示するダイアログを開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="チュートリアル" ID="ID_1373709444" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「Freeplane チュートリアル」</i>マップを開きます
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="マニュアル" ID="ID_934246709" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本マニュアルファイルを読み込み専用モードで開きます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="マニュアルマップ(オンライン)" ID="ID_566454554" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ インターネット上のマニュアルを開きます。これを利用すると、最新の情報が得られます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font size="1">ノート </font></b>
+ </p>
+ <ul>
+ <li>
+ このマニュアルには、次の URL 経由でリンクすることができます。
+ </li>
+ </ul>
+ <p>
+ <font size="1"> http://</font><font face="Times New Roman,serif" size="1">freeplane.sourceforge.net/doc/1.2.x/freeplane.mm. </font>
+ </p>
+ <ul>
+ <li>
+ FAQノードにリンクするには、次の URL を利用してください。
+ </li>
+ </ul>
+ <p>
+ <font face="Times New Roman,serif" size="1"> </font><font size="1">http://</font><font face="Times New Roman,serif" size="1">freeplane.sourceforge.net/doc/1.2.x/freeplane.mm#</font><font face="Calibri,sans-serif" size="1"> ID_1040911735</font><font size="1"> </font>
+ </p>
+ <ul>
+ <li>
+ 同様に次の URL 経由で、オンラインチュートリアルにリンクすることができます。
+ </li>
+ </ul>
+ <p>
+ <font size="1"> http://</font><font face="Times New Roman,serif" size="1">freeplane.sourceforge.net/doc/1.2.x/freeplaneTutorial.mm</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="キーレファレンス" ID="ID_711310932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ホットキー/ショートカットの概略を見られます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="スクリプト API" ID="ID_1717103039" 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">
+<icon BUILTIN="gohome"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #ffffff; font-weight: bold"><font color="#ffffff"><b>ユーザガイド </b></font></span>
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ この<i>「ユーザガイド」</i>には、Freeplane を理解し、
+ </p>
+ <p>
+ 使用するための基本情報が収められています。<i>「ク </i>
+ </p>
+ <p>
+ <i>ィックスタート」</i>のノードが表示されている場合
+ </p>
+ <p>
+ は、そこに選択フォーカスを移動して閲覧を続け
+ </p>
+ <p>
+ てください。表示されていない場合は、このノー
+ </p>
+ <p>
+ ドをクリックして、展開してください。
+ </p>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このマニュアルでは、次のことを目標とします。
+ </p>
+ <ul>
+ <li>
+ Freeplane に何が可能で、どこに限界があるかについて、ユーザの理解を助けること、
+ </li>
+ <li>
+ 特定の結果に到達するには、どのような手順が必要かについて、ユーザの理解を助けること、
+ </li>
+ <li>
+ これらの手順のなかで、どのような機能を使うか、そしてそれらの機能がどこにあるかについて、ユーザの理解を助けること。
+ </li>
+ </ul>
+ <p>
+ この文書は、チュートリアルではありません。
+ </p>
+ <ul>
+ <li>
+ チュートリアルについては、Freeplane の<i>「ヘルプ」の「チュートリアル」</i>をご覧ください。
+ </li>
+ </ul>
+ <p>
+ この文書は、マインドマップ作成指導書ではありません。
+ </p>
+ <ul>
+ <li>
+ マインドマップ作成についてもっと勉強するには、Tutorial Freeplane wiki を開いてください。 <i>「さあ、始めよう!」</i>の赤い矢印をクリックしてください。
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane">概 要</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このマニュアルは、Freeplane <a href="freeplaneTutorial_ja.mm">クィックリファレンス</a> を前提とし、それへの追加説明です。クィックリファレンスについては、Freeplane メインメニューの<i>「ヘルプ > さあ、始めよう!」</i>をご覧ください。インターネット上のマインドマップ作成入門、及び Freeplane チュートリアルのページを見る場合は、赤い矢印をクリックしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ このマニュアルは、従来のもののように、情報を単線的に表示するものではありません。それぞれのユーザが置かれた状況に応じて最適の情報を引き出せるよう工夫されています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ このマインドマップの右側(<i>「リファレンス」</i>ノード)では、Freeplane のメニューと機能を説明しています。「リファレンス」に従って進めば、ノードのクリックやホバーリングにより、必要な情報を見つけられるでしょう。これは簡単なことで、現に今ユーザが行っていることです。また、検索やフィルタを利用して、情報を入手することもできます。これはもっと強力ですが、幾分かの経験を要します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ フィルタを使えば、<i>「リファレンス」</i>の膨大な情報から必要な情報を抜き出して、一定数のノードからなる「章」(Chapter)ノードを利用することができます。ユーザは、好みのやり方、好みの順序で、各章に表示される情報に目を通すことができます。各章には番号が振られ、初歩から応用に向けて配置されています。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <i>「インストール」</i>ノードは、Freeplane のダウンロードやインストール、希望どおりのチューニングについて説明しています。<i>「 Macintosh」</i>ノードは、Macintosh 上での FP の使用法を説明しています。Macintosh が若干特異なインターフェースを使用しているからです。<i><font color="#000000">「この文書について」</font></i>ノードは、このマインドマップの作成に当たって用いた各種の原則と技術事項について説明しています。これは、このような複雑なマインドマップを設計、作成する方法の好例ともなります。また、上手な情報検索に役立つかもしれません。<i>「FAQ」</i>ノードには、頻繁に訊かれる質問のいくつかが収められています。より詳細な回答は、「リファレンス」にあるはずです。ここには、ユーザが直面しやすい既知のバグについての説明も含まれます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="内容の識別法" STYLE_REF="UserGuide" FOLDED="true" ID="ID_740355128" TEXT_SHORTENED="true">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このマニュアルの利用方針決定の一助として、またより簡便な情報
+ </p>
+ <p>
+ 検索の手がかりとなるよう、内容の種類に応じて異なる表示スタイ
+ </p>
+ <p>
+ ルを採用しています。これらのスタイルを見るには、このノードを
+ </p>
+ <p>
+ クリックしてください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="定義(Definition)" STYLE_REF="Definition" ID="ID_956317163" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 定義はすべて definition (定義)スタイルによって識別できます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ フィルタ表示を使えば、すべての定義の一覧を表示させることができます。用例を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="機能(Method)" STYLE_REF="Method" ID="ID_1120480647" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 機能とは、メニュー項目に掲げたような Freeplane の動作のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="手順(Procedure)" STYLE_REF="Procedure" ID="ID_1538273710" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 手順とは、特定の効果を実現するために諸々の機能をどのように使用するかを、説明するものです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="例外(Exception)" STYLE_REF="Exception" ID="ID_873140029" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 例外とは、想定されていないの動作のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="留意事項(ToNote)" STYLE_REF="ToNote" ID="ID_1101759572" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 留意すべき情報で、関連する動作への注意を促します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="詳しい説明(Refine)" STYLE_REF="Refine" ID="ID_369686575" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このスタイルで表示される情報は、背景や細部についてより詳しく説明します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="用例(Example)" STYLE_REF="Example" ID="ID_584103658" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このスタイルで表示される情報は、用例を示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="更新(Revision)" STYLE_REF="Revision" ID="ID_599389034" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードに修正があったことを示します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ マップの条件適応スタイルの設定事例
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="メインメニュー(MainMenu)" STYLE_REF="MainMenu" ID="ID_1469688782" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="1,2"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このスタイルで表示される情報は、<i>メインツールバー</i>上に示されるメニューを意味します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="メニューグループ(MenuGroup)" STYLE_REF="MenuGroupLabel" ID="ID_1698050814" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このスタイルで表示される情報は、相互に関連する諸機能を一括表示します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="2"/>
+</node>
+</node>
+</node>
+<node TEXT="基本用語" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1133619038" HGAP="30" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 基本的に、マインドマップは<b>ノード</b>と<b>ノード相 </b>
+ </p>
+ <p>
+ <b>互間の関係</b>によって構成されています。ノード
+ </p>
+ <p>
+ には、機能とプロパティ[=特性]が付きます。
+ </p>
+ <p>
+ 詳しくは、このノードをクリックして、続きの説
+ </p>
+ <p>
+ 明をお読みください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="ノード" FOLDED="true" ID="ID_1676021072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノード</b>は、マップの情報収納場所です。情報の基本単位であり、通常
+ </p>
+ <p>
+ はテキストと画像を含みます。ユーザが現在お読みのテキストは、
+ </p>
+ <p>
+ このノードに入力されたものです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ルートノード</b>は、中心のノードで、階層的に見ると他のノードはそこから始まります。初期状態では Freeplane の作業スペースの中心に位置し、楕円形をしています。削除することも、また複数のルートノードを作ることもできません。
+ </p>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>親ノード</b>は、階層構造上、別のノードの上位に位置するノードの呼称です。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>子ノード</b>は、階層構造上、別のノード(親ノード)の<font color="#000000">下位に位置する</font>ノードです。
+ </p>
+ </body>
+</html>
+</richcontent>
+<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_1766953193" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>兄弟ノード</b>は、他の一定のノードと同一階層に位置するノードです。したがって、あるノードを挿入し、次にその下側に別のノードを挿入する場合、兄弟ノードを作成したことになります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="関係表記は親戚用語で" ID="ID_1939948284" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ これらの家族関連用語は、祖父母や孫、叔父・伯父等といった個別の関係にまで拡張することができます。[●訳者注:日本語訳では、多くの場合、子孫ノードを「下位ノード」、先祖筋のノードを「上位ノード」と訳している。]指示された用語は、相対的なものです。したがって、同じノードが、親ノードに対しては子ノードとなり、子ノードに対しては親ノードになるといった具合であることに留意してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
+</hook>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、様々な関係を表現することができます。線(エッジ)
+ </p>
+ <p>
+ は、論理的な階層関係を形成します。コネクタは、ユーザが定義する
+ </p>
+ <p>
+ 概念的関係を形成します。このほか、まとめノードや雲といった別種の
+ </p>
+ <p>
+ 関係を示すものもあります。これらについては、後ほど説明します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>線(エッジ)</b>は、ツリー構造の視覚的表現です。ノードの下及びノード間に引かれる線です。この線は隠すことができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 線(エッジ)は下記のような特徴を備えています。
+ </p>
+ <ul>
+ <li>
+ <b>線の色:</b> ノード間を結ぶ線(エッジ)の色。
+ </li>
+ <li>
+ <b>線の形:</b> 線(エッジ)の曲がり具合。線(エッジ)を表示するか、隠すか。
+ </li>
+ <li>
+ <b>線の太さ:</b> 線(エッジ)の幅。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>枝</b>とは、一つのノードとその下位ノードからなるノード群のことです。メインの枝は、ルートノードの子ノードから発します。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b><font color="#ff0000">枝分け</font></b>とは、ある枝のノード群を切り取り、別のマップにエクスポートすることを意味します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="コネクタ" STYLE_REF="Definition" ID="ID_1337501519"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>コネクタ</b>は、基本的なツリー階層構造から外れた結びつき示す視覚的連結手段です。それは、任意の2つのノード間を結ぶ矢印ないし線の形をとり、ユーザの定義に従って暗示的な意味を表現します。ラベルを用いて、この意味を明示することもできます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="雲" STYLE_REF="Definition" ID="ID_1109822175"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>雲</b>は、枝の一環をなすノード群を視覚的に包み込むものです。このグループは、1つのノードに帰属し、このノード自身とそのすべての下位ノードが含まれます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<font BOLD="false"/>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="まとめノード" STYLE_REF="Definition" ID="ID_1831303797"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>まとめノード</b>は、ユーザが定義する兄弟ノード群の構造を可視化するものです。グループの始点となゆ要素と終点の要素が、波括弧の両端になります。グループの中央に、グループ関連情報を示すノード、つまり事実上のまとめノードができます。.
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+</node>
+<node TEXT="ノードの機能" ID="ID_1808675557">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードの機能</b>は、基本ノードに付加できる追加的な機能です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ ノート、属性、ハイパーリンク、画像などがその例です。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードのプロパティ" ID="ID_502368623">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノードのプロパティ</b>は、ノードや関係、機能の(主に視覚に関わる)
+ </p>
+ <p>
+ 諸々の側面を現します。テキストの色や文字サイズなどがその例です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「書式設定」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="章別学習ガイド" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1933523009" HGAP="30" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>Freeplane メニューの学習ガイド </b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 下記の章を閲覧するには、 <b> </b>下記の<b>フィルタルール</b>を適用してくださ<i>い。</i>
+ </p>
+ <ol>
+ <li>
+ <i>第1章 初めてのマインドマップ </i> (Chapter,⊃(含む),1)
+ </li>
+ <li>
+ <i>第2章 ノードを操作 </i> (Chapter,⊃(含む),2)
+ </li>
+ <li>
+ <i>第3章 ノードの機能 </i>(Chapter,⊃(含む),3)
+ </li>
+ <li>
+ <i>第4章 書式とスタイル </i>(Chapter,⊃(含む),4)
+ </li>
+ <li>
+ <i>第5章 日付、時刻、リマインダ </i> (Chapter,⊃(含む),5)
+ </li>
+ <li>
+ <i>第6章 ノードの移動とマップの公開 </i>(Chapter,⊃(含む),6)
+ </li>
+ <li>
+ <i>第7章 スクリプトと計算式 </i>(Chapter,⊃(含む),7)
+ </li>
+ <li>
+ <i>第8章 セキュリティと環境設定 </i>(Chapter,⊃(含む),8)
+ </li>
+ </ol>
+ <p>
+ フィルタ設定時には、<b>フィルタ条件</b>を次のように設定してください。
+ </p>
+ <ul>
+ <li>
+ 「上位ノードも表示」 : <b>無効</b>
+ </li>
+ <li>
+ 「下位ノードも表示」 : <b>無効</b>
+ </li>
+ <li>
+ 「フィルタ中のノードに適用」: <b>無効</b>
+ </li>
+ <li>
+ 「非表示ノードを展開」 : <b>有効</b>
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ フィルタの説明は、<i>「第1章 初めてのマインドマップ」</i>の子ノードにあります。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
+<edge STYLE="horizontal"/>
+<node TEXT="目次" ID="ID_381308225" HGAP="50" VSHIFT="-10" TEXT_SHORTENED="true">
+<font BOLD="true"/>
+<edge STYLE="hide_edge"/>
+</node>
+<node TEXT="初めてのマインドマップ" FOLDED="true" ID="ID_420753301" NUMBERED="true" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「さあ、始めよう!」</i>に関するすべてのノードを表示するには、フィルタ表示を使ってください。そのためには、次の要領で「(Chapter,⊃(含む),1)」と定義し、フィルタ表示させてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1. フィルタバーの冒頭にある3つのフィールドに順に次のように選択/入力してください。
+ </p>
+ <ul>
+ <li>
+ <i>「Chapter」</i> ( 注意:"C" とタイプすると、"C" で始まるメニュー項目にスクロールします。)
+ </li>
+ <li>
+ <i>「⊃(含む)」</i>
+ </li>
+ <li>
+ <i>「1」</i>
+ </li>
+ </ul>
+ <p>
+ 2. フィルタ条件のチェックを次のように指定してください。
+ </p>
+ <ul>
+ <li>
+ <p>
+ <i>「非表示ノードを展開」</i>のショートカットアイコン : <b>有効</b>
+ </p>
+ </li>
+ <li>
+ <i>「上位ノードも表示」</i>ショートカットアイコン : <b>無効</b>
+ </li>
+ </ul>
+ <p>
+ 3. <i>「Esc」 </i>を押し、次いで<i>「Alt + Enter」</i>ですべてのノードを表示させてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 4. <i>「クィックフィルタ」</i>のショートカットアイコンを選択し、<i>「第1章」</i>のすべてのノードを見えるようにしてください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 5 次に、カーソルを各ノード上に移動させてその内容を表示させ、お読みください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 終了時には、
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 6. 「フィルタ解除」のショートカットアイコンを選択してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>全体の手順や使用するアイコンボタンについては、左方のノードを参照してください。</b>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="フィルタルールを定義" FOLDED="true" ID="ID_1560702956" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「章」(Chapter)</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+<hook NAME="FirstGroupNode"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ "C" をタイプすると、ウィンドウが "C" で始まる項目までスクロールダウンします。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1715867501" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「⊃(含む)」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="「1」を選択/入力" STYLE_REF="ProcedureStep" ID="ID_1895233466" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="フィルタバー上の3つの入力フィールド" ID="ID_838435676" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<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">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「クィックフィルタ」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1969361758" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「上位ノードも表示」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="ツールバーのアイコンを参照。" ID="ID_1657145431" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+<node TEXT="フィルタ条件の初期設定をチェック" FOLDED="true" ID="ID_1208609141" 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">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「下位ノードも表示」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_479968616" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタ中のノードを展開」</i>を有効に
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_994463798" TEXT_SHORTENED="true">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 「<i>フィルタ中のノードに適用」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+</node>
+<node TEXT="ツールバーのアイコンボタンを参照" ID="ID_1864246990" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+<hook NAME="SummaryNode"/>
+</node>
+<node FOLDED="true" ID="ID_1748243017" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「1. 初めてのマインドマップ」</i>のフィルタ表示を終える
+ </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">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタ解除」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1072388476" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ルートへジャンプ」</i>(<i>「Esc」</i>を押す)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_903301760" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「すべて折り畳む」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+<node TEXT="すべてのノードを折り畳む" ID="ID_1661316242" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+<attribute NAME="Chapter" VALUE="1"/>
+</node>
+</node>
+</node>
+<node TEXT="ノードを操作" ID="ID_1864348201" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ フィルタ表示機能を使って、すべてのノードを表示させてください。 この場合は、(Chapter,⊃(含む),2)と条件を定義し、フィルタ表示してください
+ </p>
+ <p>
+ 。
+ </p>
+ <p>
+ 1. まず最初に、フィルタバーの3つのフィールドで、以下のように選択/入力します。
+ </p>
+ <ul>
+ <li>
+ <i>Chapter</i>
+ </li>
+ <li>
+ ⊃(含む)
+ </li>
+ <li>
+ 2
+ </li>
+ </ul>
+ <p>
+ 2. 手順については、「1.<i> 初めてのマインドマップ</i>」の章を参照。
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="ノードの機能" ID="ID_1896982231" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),3)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="書式とスタイル" ID="ID_247370880" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),4)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="日付、時刻、リマインダ" ID="ID_1279850712" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),5)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="ノードの移動とマップの公開" ID="ID_691709596" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),6)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="スクリプトと計算式" ID="ID_444100909" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),7)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="セキュリティと環境設定" ID="ID_1261425134" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),8)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
+<node TEXT="9 検索とフィルタ表示" ID="ID_1941664006" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="9"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 本章のノードを見る場合は、(Chapter,⊃(含む),9)でフィルタ表示してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>参 照</b>
+ </p>
+ <ul>
+ <li>
+ <i>「1. 初めてのマインドマップ」</i>
+ </li>
+ </ul>
+ </body>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>用 例</b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ すべてのノードを表示した後、定義(definition)ノードに絞るには、
+ </p>
+ <ul>
+ <li>
+ <font color="#000000">フィルタバーに、アイコンボタンと同様に4つの条件を表示するようセットし、</font>
+ </li>
+ <li>
+ フィルタバーでフィルタルールを(<i>Class, ⊃(含む), Definition)</i>と定義し、
+ </li>
+ <li>
+ <i>「クィックフィルタ」</i>アイコンを押してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<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_925717472" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 左方に表示されたアイコンボタンがすべて解除されているかどうかチェックし、そうでなければ[そのアイコンを]押して解除します。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="「上位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_558856858" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="「下位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_1230042883" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+</node>
+<node TEXT="「非表示のノードを展開」を無効に" STYLE_REF="ProcedureStep" ID="ID_1360058790" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+</node>
+<node TEXT="「フィルタ中のノードに適用」を無効に" STYLE_REF="ProcedureStep" ID="ID_135928948" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ルートへジャンプ」</i> (<i>「Esc」</i>を押す)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_1437799222" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「すべて[の下位ノードを]展開する」</i>を押す
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「Class」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_1232714581" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「⊃(含む)」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1783341782" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「Definition」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1492821244" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「クィックフィルタ」</i>を押す
+ </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">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタ解除」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1535041398" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ルートへジャンプ」 </i>(<i>「Esc」</i>を押す)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_253518936" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「すべて[の下位ノードを]</i>展開する」を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="すべてのノードを折り畳む" ID="ID_1018925528" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+<node TEXT="フィルタ表示に関する完全説明" FOLDED="true" ID="ID_172327975" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <b>用 例</b>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ フィルタ表示に関するすべてのノードを表示させるには、以下の要領でフィルタを定義し適用してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 1. フィルタバーで、次のようにフィルタルールを設定してください。
+ </p>
+ <ul>
+ <li>
+ <font color="#000000"><i>「ノードテキスト」</i>(初期設定値です。違っていれば、左端のドロップダウンメニューから選択してください。) </font>
+ </li>
+ <li>
+ <font color="#000000"><i>「⊃(含む)」</i>(初期設定値です。違っていれば、左端のドロップダウンメニューから選択してください。) </font>
+ </li>
+ <li>
+ <i>「filter」</i>(3番目の編集フィールドに "filter" とタイプ入力してください。)
+ </li>
+ </ul>
+ <p>
+ 2. 「<i>「Esc」</i> を選択し、続けて <i>「Alt + End」</i>、<i>「クィックフィルタ」</i>を押してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ これで、フィルタ表示に関するすべてのノードが表示されます。また、<i>「フィルタを解除」</i>(<i>「フィルタ無し」</i>)は解除されます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 3. これらのモードの閲覧を終えるときは、
+ </p>
+ <ul>
+ <li>
+ <i>「フィルタを解除」</i>を選択し、フィルタ無し状態に戻し、
+ </li>
+ <li>
+ <i>「Esc」</i>を押し、次に<i>「すべて折り畳む」</i>を押してください。
+ </li>
+ </ul>
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 左記のアイコンボタンがすべて非選択状態になっているかどうかチェックし、違っていればボタンを押して選択解除してくだ
+ </p>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_597594722" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_ancestors"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「上位ノードも表示」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_186774997" TEXT_SHORTENED="true">
+<icon BUILTIN="../show_descendants"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「下位ノードも表示」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1079412775" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_filtered_ancestors"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「非表示のノードを展開」</i>を無効に
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1827735442" TEXT_SHORTENED="true">
+<icon BUILTIN="../applies_to_filtered_nodes"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタ中のノードに適用」</i>を無効に
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ルートへジャンプ」</i> (<i>「Esc」</i>を押す)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_1445171717" TEXT_SHORTENED="true">
+<icon BUILTIN="../unfold_all"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「すべて[の下位ノードを]展開する」</i>を押す
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ノードテキスト」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_1867972368" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「⊃(含む)」</i>を選択
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_909882711" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「filter」</i>をタイプ入力
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_676302966" TEXT_SHORTENED="true">
+<icon BUILTIN="../apply_quick_filter"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「クィックフィルタ」</i>を押す
+ </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">
+<icon BUILTIN="../remove_filtering"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「フィルタを解除」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_378729960" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「ルートへジャンプ」</i> (<i>「Esc」</i>を押す)
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_1457654479" TEXT_SHORTENED="true">
+<icon BUILTIN="../fold_all"/>
+<richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「すべて[の下位ノードを]展開する」</i>を押す
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="すべてのノードを折り畳む" ID="ID_309050985" TEXT_SHORTENED="true">
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="インストール" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1367092560" HGAP="31" VSHIFT="2" TEXT_SHORTENED="true">
+<edge STYLE="horizontal"/>
+<node TEXT="ダウンロード" ID="ID_1964917961" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane Wiki 上に OS別のサポートページがあります。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Freeplane のホームページ" ID="ID_916980386" 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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <span style="color: #000000; font-family: SansSerif, sans-serif"><font face="SansSerif, sans-serif" color="#000000">Microsoft Windows に Freeplane をインストールする場合は、Sun から Java をインストールし、Freeplane インストーラを使って Freeplane をインストールしてください。</font></span>
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT=" Java Runtime Environment ( J2RE1.5以降)をダウンロード" FOLDED="true" ID="ID_1977713840" TEXT_SHORTENED="true">
+<icon BUILTIN="full-1"/>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="10"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane ホームページから Freeplane をダウンロードすると、大抵は自動的にこの動作が実行されます。
+ </p>
+ </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>
+<node TEXT="Freeplane のアプリケーションをダウンロード" FOLDED="true" ID="ID_1388419354" TEXT_SHORTENED="true">
+<icon BUILTIN="full-2"/>
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="10"/>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane ホームページから Freeplane をダウンロードすると、大抵は自動的にこの動作が実行されます。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="Freeplane のホームページ(英語)から" ID="ID_1482343480" 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>
+<node TEXT="スペルチェック用の辞書をインストール" ID="ID_1368535250" TEXT_SHORTENED="true">
+<icon BUILTIN="full-3"/>
+</node>
+</node>
+<node TEXT="Linux プラットホーム" STYLE_REF="Functiegroep" ID="ID_223844455" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Linux に Freeplane をインストールする場合は、Java Runtime Environment と Freeplane アプリケーションをダウンロードしてください。最初に Java をインストールし、次に Freeplane を解凍してください。Freeplane を起動するには、Freeplane.sh を実行してください。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Ubuntu" ID="ID_461043347"/>
+<node TEXT=" MAC プラットホーム" STYLE_REF="Functiegroep" ID="ID_824405171" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Mac OS X に Freeplane をインストールする場合、まず、内蔵のソフトウェアアップデート機能を使って、利用可能な最新のアップデートを、特に Java について、すべて済ませていることを確認してください。「ソフトウェアアップデート」は、画面左上隅にある Apple ロゴメニューの下にあります。 次に、Freeplane の Mac 専用バージョンをダウンロードしてください。".zip" バージョンも利用できますが、もっとも容易にインストールできるのは ".dmg" バージョンです。ダウンロードが完了すると、ユーザの WEB ブラウザの設定によっては、ファイルが自動的に組み込まれ(たり、又は解凍されたりす)るかもしれません。そうならない場合は、ダウンロードした ".dmg" ファイルをダブルクリックして「組み込む」か、又はダウンロードした ".zip" ファイルをダブルクリックして解凍してください。ここで、ユーザは Freeplane アプリケーションのアイコンを目にするはずで、これをアプリケーションフォルダにドラッグすることができます。次に、必要があれば、デスクトップ上やドックにエイリアス(ショートカット)を作成してもよいでしょう。Freeplane を起動するには、(アプリケーションフォルダの)アプリケーションアイコン、もしくはデスクトップ上のショートカットをダブルクリックするか、又はドックのアイコンをワンクリックします。Freeplane Wiki の Macintosh ページにもっと詳しい情報があります 。</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ポータブル Freeplane" ID="ID_672630297" TEXT_SHORTENED="true"/>
+<node ID="ID_797098004"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Wiki <a href="http://freeplane.sourceforge.net/wiki/index.php/Support">Download help</a> を参照。
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="SummaryNode"/>
+</node>
+</node>
+<node TEXT="インストール" FOLDED="true" ID="ID_653448739" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 環境設定を行なう場合は、
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定」 </i>を選択してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="システム表示言語" FOLDED="true" ID="ID_1505415448" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane メニューで使用する言語を変更するには、
+ </p>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定 > 環境 > 言語」</i>を選択し、
+ </li>
+ <li>
+ 使用言語を選択し、
+ </li>
+ <li>
+ Freeplane を再起動してください。
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 言語の「自動選択」を選ぶと、ユーザのオペレーティングシステムの使用言語を使うよう設定されます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node TEXT="日本語使用時の注意事項" ID="ID_1720635001">
+<icon BUILTIN="info"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane 1.2.x で、日本語が正常に入力できないとの訴えがあります。
+ </p>
+ <p>
+ これは、デフォルトの状態が日本語入力に適さない設定されているためです。インストールが終わったら、必ず「ツール > 環境設定 > 動作設定 > インラインノードエディタ > すべてのノードにインラインエディタを表示」にチェックを付けてください。[日本語訳者からの補足]
+ </p>
+ </body>
+</html>
+</richcontent>
+<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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 標準のスペルチェックは英語に設定されています。他の言語を使う場合は、ハイパーリンクをクリックしてください。
+ </p>
+ <p>
+ language_XX.ortho(xx は言語を示す2文字コード)をダウンロードしてください。このファイルを、「ツール > ユーザディレクトリを開く > resources\ortho」に保存してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="アドオン" ID="ID_1531090414" HGAP="16" VSHIFT="-4"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane には、特殊環境設定をインストールすることができます。それらは、Freeplane ユーザディレクトリ(<i>「ツール > ユーザディレクトリを開く」</i>を参照)に格納されます。アドオンはこれらの機能の一部ないし全部からなるパッケージで、一操作でインストールできます。詳しくは、<a href="http://freeplane.sourceforge.net/wiki/index.php/Add-ons">ここをご覧</a>ください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="自動バックアップ" ID="ID_53546807" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Freeplane は、編集対象マップのあるフォルダ毎に ".backup" という名称のサブフォルダを作成します。そこには、 編集対象マップの自動保存コピーとともに、マップの旧バージョンが保存されます。自動保存コピーは、<i>".autosave"</i> という拡張子付きのファイルとなります。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">初期設定では、自動保存は毎分行われ、事故によるFreeplane の終了、例えばコンピュータダウンなどへの備えとして、最新の自動保存ファイルが10まで保持されることになっています。 </font>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 自動保存ファイルを復元する場合は、手動で、".autosave" という拡張子と、その前に置かれた連番を取り除かなければなりません。初期設定では、連番は1~10の範囲となります。例えば、最新の自動保存ファイルから "Freeplane.mm" を復元するには、".backup\freeplane.mm.10.autosave" を "freeplane.mm" に名称変更(又はコピー)してください。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 自動保存、及び自動バックアップは、<i>「ツール > 環境設定 > 環境 > 自動保存」</i>経由で必要に合わせて調整することができます。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Windows 7 で *.MM インデックスを設定" ID="ID_1978530827" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Windows 7 のフィルタ機能に、マインドマップの内容を付加するには、
+ </p>
+ <ul>
+ <li>
+ 「コントロールパネル -> インデックスのオプション」に入るか、「ヘルプ」で "インデックス作成" をタイプ入力するかして、
+ </li>
+ <li>
+ 「詳細設定」("Advanced")を選択してください。すると、ページ上に「インデックスの設定]と「ファイルの種類」の2つのタブ表示されます
+ </li>
+ <li>
+ 「ファイルの種類」のタブを選択してください。
+ </li>
+ <li>
+ ".mm"が現れるまで、ファイル一覧をスクロールしてください。
+ </li>
+ <li>
+ フィルタの説明に「ファイルプロパティのフィルタ」という表記があるはずです。
+ </li>
+ <li>
+ 「プロパティとファイルのコンテンツのインデックスを作成する」と書かれた2番目のラジオボタンをクリックしてください。これで、上のフィルタの記載が「プレーンテキストフィルタ」に変わるはずです。
+ </li>
+ <li>
+ 「OK」を選択して、ダイアログを閉じます。インデックスの作成機能が再開し、作業が終わると、インデックスを利用できるようになります。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 通常のやり方では、ノードプロパティだけのインデックスが作成され、ノードの内容は含まれません。上記の手順をを使えば、ノードの内容部分もインデックス機能に加えることができます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ユーザ指定システムアイコン" ID="ID_5170948" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ システムアイコンはすべて、ユーザ指定のものに置換することができます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ その場合は、Freeplane ディレクトリで、以下の措置を取ってください。
+ </p>
+ <ul>
+ <li>
+ Freeplane システムファイルを開き、Freeplaneeditor.jar 及び Freeplaneviewe.jar.のファイルに行き、
+ </li>
+ <li>
+ これらのファイルの名前を、Freeplaneeditar.zip 及び Freeplaneviewe.zip に変更し、
+ </li>
+ <li>
+ これらの Zip ファイルのディレクトリを解凍します。
+ </li>
+ <li>
+ それぞれの解凍ディレクトリのなかで、イメージディレクトリを探してください。すべてのアイコンファイルはここにあります。
+ </li>
+ <li>
+ 置換したいアイコンの名前を探してください。
+ </li>
+ </ul>
+ <p>
+ 次に Freeplane メニューで、<content ename="content"/>ツール > ユーザディレクトリを開く」をクリックして、
+ </p>
+ <ul>
+ <li>
+ 「Reources\Images」 ディレクトリを作成又は開いてください。
+ </li>
+ <li>
+ 上の作業で見つけた名称で、新しいアイコンを保存してください。
+ </li>
+ </ul>
+ <p>
+
+ </p>
+ <p>
+ Freeplane を再起動すると、旧来のシステムアイコンに代えて新しいアイコンが、表示されるはずです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_426952510" HGAP="30" VSHIFT="9" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane は、最近、Apple の Mac OS Xについて完全サポートを開始しました。ドキュメントの一部は、まだ Windows や Linux を使用する PC ユーザ向けとなっています。 Mac ユーザは、下記のような、いくつかの差異に留意すれば、話のすじをたどることができるでしょう。
+ </p>
+ <p>
+
+ </p>
+ <ul>
+ <li>
+ + - コマンドキーとコントロール(「Ctrl」)キー
+
+ <ul id="fold1_1">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Mac OS X で Freeplane を動かす場合、通常、ユーザは PC で「Ctrl」totoトラベル表示されるコントロールキーでなく、Apple コマンドキーを使用します。コマンドキーは、□形のクローバーの印が付いており、 "command" ないし "cmd" の形で表示されたり、あるいは Apple ロゴ付きで示されます。</font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Freeplane のドキュメントで「Ctrl」キーへの言及を目にしたら、大抵の場合、代わりにコマンドキーを使うべきです。</font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">ごく稀に、ユーザの Mac でも、Freeplane が、コマンドキーの代わりに実際に「コントロール」キーを使用するよう求めることがあります。これらのケースについて、このドキュメントでは、はっきりした強調形式で「コントロール」キー と表記します。この他に、文書が「Ctrl」キーに言及している場合は、Mac 上でコマンドキーを用いてもコントロールキーの代用の役割を果たしませんので、その代わりに「コントロール」キーを使ってみてください。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - マウス、右クリック、及びコンテキストメニュー
+
+ <ul id="fold1_2">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Apple ブランドのマウスやトラックパッドの多くは、クリックボタンをひとつしか備えていません。コンテキスト依存メニュー(すなわち「コンテキストメニュー」)を起動する場合、Mac ユーザは、コントロールキーを押し下げた状態でのマウスクリックを利用できます(「Control +Click」と略記する)。ここでは、コマンドキーではなくコントロールキーを、使ってください。というのは、この機能は Mac OS X に組み込まれているもので、Freeplane では変更できないからです。Apple は「Control + click」をふたつのボタン付きのマウスで使用できる「右クリック」相当のものとしています。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - メニューの違い
+
+ <ul id="fold1_3">
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">少数のメニュー項目が、Mac OS X 基準によって配置換えされています。それは、以下に掲げるものです。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">「ヘルプ > Freeplane について」を、「Freeplane アプリケーションメニュー > Freeplane について」に移しています。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">「ツール > 環境設定」を、「Freeplane アプリケーションメニュー > 環境設定」に移しています。</font>
+ </li>
+ <li>
+ <font face="SansSerif, sans-serif" color="#000000">「ファイル > 終了」を、「Freeplane アプリケーションメニュー > 終了」に移しています。F</font>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - 拡大/縮小表示
+
+ <ul id="fold1_4">
+ <li>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">Mac OS X は、コントロールキーを押し下げた状態で前方にマウスホイールすることで、画面の一部拡大手段としています。この措置は、Mac OS に組み込まれたもので、Freeplane 独自の「拡大/縮小表示」機能の制御に、この機能を利用することはできません。したがって、Mac ユーザは、Freeplane が提供するいくつかの拡大/縮小調整手段のどれかを用いなければなりません。 </font>
+ </p>
+ <p>
+ <font face="SansSerif, sans-serif" color="#000000">OS X の「Control + マウスホイール」機能に不慣れな場合、いくつかのマウス機能が使いにくく、さらには拡大中には使えなくなることに注意してください。画面を通常の状態に戻す場合は、コントロールキーを押し下げマウスホイールを後方に動かして、行き着くところまで戻してください。</font>
+ </p>
+ </li>
+ </ul>
+ </li>
+ <li>
+ + - <font face="SansSerif, sans-serif" color="#000000">Freeplane Wiki</font>
+
+ <ul id="fold1_5">
+ <li>
+ <a href="http://freeplane.sourceforge.net/wiki/index.php/Macintosh" target="_blank">~ <font face="SansSerif, sans-serif" color="#000000">Mac での Freeplane 利用について詳細を学習する場合は、Freeplane オンライン Wiki の Macintosh ページをご覧ください。</font></a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+</node>
+<node TEXT="この文書について" STYLE_REF="UserGuide" FOLDED="true" ID="ID_112557731" HGAP="32" VSHIFT="4" TEXT_SHORTENED="true">
+<edge STYLE="horizontal"/>
+<node FOLDED="true" ID="ID_7136454" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: centre">
+ マニュアル Freeplane 1.2 の作成
+ </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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ コントラストを強調
+ </li>
+ <li>
+ 色彩を限定使用(グループ分けのみ)
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="目的に即した範囲を表示" FOLDED="true" ID="ID_514607477" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ タスク関連で
+ </p>
+ </body>
+</html>
+</richcontent>
+<node TEXT="所定の条件によるフィルタ表示" ID="ID_1046642159" 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>
+<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>
+<node TEXT="details: what/how to" ID="ID_715096689" TEXT_SHORTENED="true"/>
+</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">
+<hook NAME="SummaryNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p class="MsoNormal">
+ Freeplane は、この作業の実行に関わって2つの仕組みを提供してくれる。
+ </p>
+ <ol>
+ <li>
+ 第1の仕組みは、親ノード(=見出し)と子ノード(=内容説明)から構成され、子ノードを折り畳むことで、概略と必要箇所への敏速な移動を可能にします。現行FPで残念ことは、どのノードが見出しであり、どのノードがないよう説明であるかを定義できないことです。その結果、初期設定で内容説明ノードを折り畳んでおくことができません。これは根本的に不利な点です。あわせて、用例マニュアルに見られるように、内容説明ノード(子ノード)の展開時に、しばしばテキストが可視範囲から外れてしまうことも問題です。最後に、フィルタ解除/フィルタ無しの代わりにフィルタ表示を使うと、フィルタ表示操作により、ノードが展開状態に置かれることです。すなわち、内容説明をすべて折り畳み状態にしておくことが容易でないことです。この点は、複雑なマップで概略が掴みにくいという事態(混乱状態)を引き起こします。<br/><br/>
+ </li>
+ <li>
+ 第2の仕組みは、ノードコア(=見出し)とノードの詳細(=内容説明)で、詳細を非表示にすることで、概略と必要箇所への敏速な移動を可能にします。この仕組みは論理的な構成という意図にうまくフィットします。詳細は、意図的に隠すことができます。詳細が非表示の場合、概観と[必要箇所への]移動に焦点が合わせられます。詳細を表示にセットすれば、ノードの下方に詳細が現れ、子ノードに比べれば、可視エリアから外れる恐れが小さくなります。ホバーリングによる表示(ツールチップ)時には、詳細は必ず可視エリア内に止まります。
+ </li>
+ </ol>
+ <p>
+ 論理構成優先のほうが実用的に思われるので、このマニュアルでは、第2の方法を選択しました。
+ </p>
+ </body>
+</html>
+</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>
+</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>
+</node>
+<node TEXT="真っさらなマインドマップを用意" FOLDED="true" ID="ID_1571541949" TEXT_SHORTENED="true">
+<node TEXT="「線の色を自動選択」機能を無効に" ID="ID_1087840240" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <i>「表示 > プロパティパネル > 線の色を自動選択」</i>の選択を外してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性を非表示に" ID="ID_1495523505" TEXT_SHORTENED="true" HGAP="12" VSHIFT="8"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <i>「表示 > 属性 > すべての属性を隠す」</i>を選択してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="属性付きアイコンを非表示に" ID="ID_1937953602" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ <i>「ツール > 環境設定 > 画面表示 > 属性付きアイコンを表示」</i>の選択を外してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ メニュー項目を指します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="手順" ID="ID_153521049"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 一連の動作のことです。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="オプション値" ID="ID_1289169912"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ その機能の中で使用可能な値です。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="例外" ID="ID_251764436"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 特殊な状況を指します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="詳しい説明" ID="ID_736889881"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ より詳細な説明です。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="用例" ID="ID_735271488"/>
+<node TEXT="留意事項" ID="ID_579539049"/>
+</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>
+<node TEXT="更新" ID="ID_1381557619"/>
+</node>
+<node TEXT="章を定義" FOLDED="true" ID="ID_651974088" TEXT_SHORTENED="true">
+<node TEXT="目標" ID="ID_239426432" TEXT_SHORTENED="true">
+<icon BUILTIN="full-0"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このフィルタは、Scope=GS1 のノード群だけを表示するように、フィルタルールやフィルタ条件を設定する手順を示します。
+ </p>
+ </body>
+</html>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 第1章をマスターすると、以下のことが解ります。
+ </p>
+ <ul>
+ <li>
+ ノードの基本定義及びノード間の関係
+ </li>
+ <li>
+ 初めてのマップの(再)オープンと保存の方法
+ </li>
+ <li>
+ 子ノードや兄弟ノードの作成方法
+ </li>
+ <li>
+ 2種類の編集方法(インライン方式とダイアログ方式)の活用場面
+ </li>
+ <li>
+ すべての下位ノードを折り畳んだり(非表示化)、展開したりする方法
+ </li>
+ <li>
+ メインメニューの<i>「ノード」</i>と<i>「ノードの機能」</i>の基本的な違い
+ </li>
+ <li>
+ メインメニューの<i>「書式」</i>と<i>「スタイル」</i>の基本的な違い
+ </li>
+ <li>
+ フィルタ表示が便利なこと
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="1"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第2章 ノードを操作" ID="ID_782482897" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="2"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 以下の点を理解し、容易にノードを操作できるようになったら、第2章をマスターしたことになります。
+ </p>
+ <ul>
+ <li>
+ すべてのメニューバー/ツールバーの意味
+ </li>
+ <li>
+ ノード選択に関するすべて
+ </li>
+ <li>
+ ノードを移動させる方法
+ </li>
+ <li>
+ 基本的なファイル操作
+ </li>
+ <li>
+ 折り畳み操作についての追加的知識
+ </li>
+ <li>
+ 最後に更新したノードの検索
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<font BOLD="true"/>
+</node>
+<node TEXT="第3章 ノードの基本機能" ID="ID_1058695096" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 以下のノード機能を操作できるようになれば、第2章をマスターしたことになります。
+ </p>
+ <ul>
+ <li>
+ アイコンの付加と削除
+ </li>
+ <li>
+ イメージの付加や編集、非表示化
+ </li>
+ <li>
+ 詳細の付加や編集、非表示化
+ </li>
+ <li>
+ 属性の付加や編集、非表示化
+ </li>
+ <li>
+ ノートの付加や編集、非表示化、およびノートパネルの使用
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<attribute NAME="Chapter" VALUE="3"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第4章 書式とスタイル" ID="ID_1235799492" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="4"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第5章 日付、時刻、リマインダ" ID="ID_1278646882" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="5"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第6章 ノードの移動とマップの公表" ID="ID_253479537" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="6"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第7章 スクリプトと計算式" ID="ID_902036427" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="7"/>
+<font BOLD="true"/>
+</node>
+<node TEXT="第8章 セキュリティと環境設定" ID="ID_1715639791" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
+</hook>
+</node>
+<node TEXT="機能(Method)" ID="ID_474774837" 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">
+<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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+</node>
+<node TEXT="例外(Exception)" ID="ID_823869965" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+</hook>
+</node>
+<node TEXT="詳しい説明(Refine)" ID="ID_1051644329" 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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+</node>
+<node TEXT="メインメニュー(MainMenu)" ID="ID_1613603317" 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">
+<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>
+<node TEXT="条件対応スタイルを定義" FOLDED="true" ID="ID_4604251" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <ul>
+ <li>
+ Class 種類ごとに条件対応スタイルを定義します。
+ </li>
+ <li>
+ ノードごとに属性に Class を設定します。
+ </li>
+ <li>
+ 入門用のすべてのノードの属性に「Scope = さあ、始めよう!」と設定します。
+ </li>
+ <li>
+ 「さあ、始めよう!」ノード用の groovy スクリプトを設定します。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<node ID="ID_336620757"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 属性の<i>「Class」</i>が、適用するスタイルを定義します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="「Class」の値 = スタイル名一覧" ID="ID_303101789"/>
+</node>
+</node>
+<node TEXT="このマニュアルの翻訳" LOCALIZED_STYLE_REF="default" ID="ID_1859568483" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane の翻訳に際しては、以下の諸点に留意しなければなりません。
+ </p>
+ <ul>
+ <li>
+ ルック&フィールは、スタイルと条件対応スタイルいかんで変わります。条件対応スタイルが良好に機能するためには、「Class」という非表示属性の存在が前提となります。
+ </li>
+ <li>
+ 所定のフィルタ表示オプションは、「Chapter」と「Class」という非表示属性の存在を前提としています。
+ </li>
+ <li>
+ 計算式と Groovy スクリプトは元のままにしておくべきです。
+ </li>
+ <li>
+ 英語版のマニュアルは、特定の折り畳み状態で保存しています。
+ </li>
+ </ul>
+ <p>
+ 翻訳中にこれらの構成要素が無くなったり、矛盾をきたしたりするようなこと絶対に起こらないようにするためには、
+ </p>
+ <ul>
+ <li>
+ 英語版のマニュアル文書のコピーを作り、メインノードと詳細のテキストを翻訳します。
+ </li>
+ <li>
+ 属性については、翻訳しないでください。翻訳する場合は、Note++ などのエディタにマインドマップを読み込み、<i>「検索&置換」</i>を使ってすべての属性値を同じように翻訳してください。
+ </li>
+ <li>
+ 環境設定で<i>「折り畳み状態を保存する」</i>に設定し、次に<i>「すべて展開する」</i>、<i>「すべて折り畳む」</i>、<i>「Chapter を展開</i>」を実行し、その後でマップを保存してください。
+ </li>
+ </ul>
+ <p>
+ 次の問題は、英語版のマニュアルの修正に翻訳を同期させることです。何が変化したかを知るには、
+ </p>
+ <ul>
+ <li>
+ <i><b>「最新の更新を検索」</b></i>の手順を見つけて読んで、<i>「フィルタ > クィックフィルタ」</i>又は<i>「編集 > 検索&置換...」</i>を実行します。これで、更新ノードが表示されます。[ただし、]削除されたノードは表示されません。
+ </li>
+ </ul>
+ <p>
+ 変更を加える場合に、最も確実な手順は、
+ </p>
+ <ul>
+ <li>
+ 修正されたノードを一つ一つコピーして翻訳ファイルに貼り付け、(再度)翻訳することです。このやり方だと、非表示の構造も確実に転送されます。
+ </li>
+ </ul>
+ <p>
+ 別の方法として、すべての構成要素(基本テキスト、オプションのアイコン、計算式、ハイパーリンク、詳細、属性、イメージ、及び Groovy スクリプト)をチェックし、必要な変更を加えるやり方があります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ OpenOffice などのテキストエディタにマニュアル mm を読み込ませれば、マップ全体のスペルチェックを行なうことができます。
+ </li>
+ <li>
+ 色を変えたい場合は、使用されているスタイルを編集することで、可能です。<i>「書式 > スタイルを管理 > スタイルを編集」</i>を参照。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="バージョン、更新、及びクレジット" FOLDED="true" ID="ID_1678241727">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
+</hook>
+<attribute NAME="Chapter" VALUE="1"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 各バージョンでどのノードが変更されたかを見る場合は、
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > スタイルを管理 > マップの条件対応スタイル」</i>を選択し。
+ </li>
+ <li>
+ 関心のある更新の前方のボックスにチェックを入れてください。(元に戻す場合は、チェックを外してください。)
+ </li>
+ </ul>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 更新ノードは、青色の "i" 字アイコンが目印です。
+ </li>
+ <li>
+ これらのノードは、(スタイル,=, 更新)で、検索又はフィルタ表示できます。
+ </li>
+ </ul>
+ </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>
+<node TEXT="最終更新日:" ID="ID_21798827" 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>
+<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>
+</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">
+<hook NAME="NodeConditionalStyles">
+ <conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
+ <conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
+</hook>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ よくある質問への解答です。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ なお、この他に以下の方法も試してください。「ノードの詳細」を検索/フィルタ表示したうえで、
+
+ <ul>
+ <li>
+ 例外的な事例を探す場合は、(スタイル, ⊃(含む), 例外)を実行。
+ </li>
+ <li>
+ 重要情報を探す場合は、(スタイル, ⊃(含む), 留意事項) を実行。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+<edge STYLE="horizontal"/>
+<node TEXT="新規ノードがすべて囲みになる、特殊フォントになる、特殊なエッジの線が出る、等" ID="ID_391816540" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 規作成ノードは、<i>「標準」</i>スタイルに従って形状が決まります。新規の詳細は<i>「詳細」</i>スタイルとなり、新規ノートは<i>「ノート」</i>スタイルになります。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ 「標準」スタイルは、文字サイズを大きくしたり、エッジの形を変えたり、枠囲い表示にしたり、横幅を変更したりといった具合に、編集することができます(<a href="#ID_1277682010">ここを参照</a>)「ノート」スタイルや「詳細」スタイルは、フォント種類や文字サイズ、文字色を変更するなど、編集することができまが、エッジの形や枠囲い等、ノードコアに関連する項目については変更できません。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>ノート</b>
+ </p>
+ <ul>
+ <li>
+ 文字サイズを変更すると、当初ダイアログに表示されるフォントサイズ番号よりも、変更結果が優先適用されます。ただし、この状態は、ユーザが新たにフォントサイズ番号を指定するまでの間に限られます。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="書式なしで貼り付け" ID="ID_547441247" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「編集 > 形式を選択して貼り付け」</i>を参照。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="制限事項と既知のバグ" FOLDED="true" ID="ID_1288924719">
+<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>
+<node TEXT="マップ/ノードが編集できない" ID="ID_138844829" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <i>「マップ > マップ閲覧モード」</i>でなく<i>「マップ > マップ編集モード」</i>を使ってください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="メニューが表示されない" ID="ID_376454406" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ メニューバーが表示されない場合は、画面上の空白部分で右クリックして、「ツールバー」を選択してください。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="ノードを展開できない" ID="ID_1598827129" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ こうした事態がフィルタ表示後に生じた場合は、
+ </p>
+ <ul>
+ <li>
+ フィルタ機能を元に戻し、
+ </li>
+ <li>
+ フィルタ設定を下位ノード/非表示ノードにも適用できるように調整してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="スタイルが適用されない" ID="ID_1903605589" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ プロパティパネルのチェックをすべて外します。チェック項目は、スタイルよりもここでの設定が優先します。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node ID="ID_1194109651"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <a href="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=77">ノードの横幅に関する問題</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="画像へのアクセスが拒否される(Java アプレット)" ID="ID_688930881" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ このエラーは、パス名に "Drop box" のようなスペース付きのディレクトリが含まれる場合に起きます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <b>解決法</b>
+ </p>
+ <ul>
+ <li>
+ スペースをアンダースコアに置換してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="フリーフローティング&フリーポジションノード" ID="ID_413418407"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 制限事項については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Mind_map_gallery#Free_positioned_versus_floating_nodes.">forum</a> を参照。
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="新規ノードの標準スタイル(フォント、囲み等)を変える" ID="ID_256904484" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ ノードコアの「標準」システムスタイルの文字サイズを変更、あるいはノートについては「ノート」スタイルの文字サイズを変更してください。この設定は、ダイアログに表示されるフォントサイズ番号よりも、変更結果が優先適用されます。ただし、この状態は、ユーザが新たにフォントサイズ番号を指定するまでの間に限られます。
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <i><b>参 照</b></i>
+ </p>
+ <ul>
+ <li>
+ <i>「書式 > スタイルを管理 > スタイルを編集」</i>を選択し<i>「標準」</i>スタイルノード、又は<i>「ノート」</i>ノードを編集してください。
+ </li>
+ </ul>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="マップオープン時に実行するスクリプト" ID="ID_470865141" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 条件設定書式のなかに、フィルタ条件の形でスクリプトがサポートされています。 <a href="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=161&sid=019395cb323fe8ff8794fb10a3fa0237#p969">参照リンク</a>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="バッチ処理" ID="ID_1030060663" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane の機能はすべて、コマンドラインインターフェース経由でバッチ処理に使えます。
+ </p>
+ <p>
+ これを用いれば、例えば以下のようなことが可能になります。
+ </p>
+ <ul>
+ <li>
+ 起動時に特定の機能を走らせる。
+ </li>
+ <li>
+ スクリプトを実行して閉じる。
+ </li>
+ </ul>
+ <p>
+ 方法については、<a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Batch_Job">http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Batch_Jobs</a> をお読みください。
+ </p>
+ <p>
+
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="画面表示を拡大・縮小しても、ツールチップの文字サイズが変わらない。" ID="ID_571521721"><richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 画面表示を読みやすくするために、表示倍率を変更することができます。しかし、ツールピップのテキスト文字サイズは、これによって影響されません。対応の1つとして、コアテキストの文字サイズを変更する方法があります。ツールチップのテキスト文字サイズは、コアテキストの文字サイズに連動します。これを簡単に行なう方法は、(標準)スタイルの文字サイズを変更することです。
+ </p>
+ </body>
+</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>
+<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>
+</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">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ オンラインマニュアル
+ </p>
+ </body>
+</html>
+</richcontent>
+<hook NAME="FreeNode"/>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ 最新情報が見られます。
+ </p>
+ </body>
+</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>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_menuposition_nl.jpg b/freeplane/doc/freeplane_menuposition_nl.jpg
new file mode 100644
index 0000000..90f82b1
Binary files /dev/null and b/freeplane/doc/freeplane_menuposition_nl.jpg differ
diff --git a/freeplane/doc/freeplane_nl.jpg b/freeplane/doc/freeplane_nl.jpg
new file mode 100644
index 0000000..dd651f3
Binary files /dev/null and b/freeplane/doc/freeplane_nl.jpg differ
diff --git a/freeplane/doc/freeplane_ru.mm b/freeplane/doc/freeplane_ru.mm
new file mode 100644
index 0000000..721d3b2
--- /dev/null
+++ b/freeplane/doc/freeplane_ru.mm
@@ -0,0 +1,965 @@
+<map version="0.9.0">
+<!--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>
+<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
Сохранить схему    - Ctrl+S
Сохранить как      - Ctrl+A
Печать        - Ctrl+P
Закрыть        - Ctrl+W
Выход         - Ctrl+Q
Предыдущая схема - Ctrl+LEFT
Следущая схема     - Ctrl+RIGHT
Экспортировать в HTML          - Ctrl+E
Экспортировать ветвь в HTML        - Ctrl+H
Экспортировать ветвь в новый MM файл - Alt+A
Открыть последний файл   - Ctrl+Shift+W

Команды редактирования:
Поиск        - Ctrl+F
Найти далее   - Ctrl+G
Вырезать         - Ctrl+X
Копировать        - Ctrl+C
Копировать только этот узел - Ctrl+Y
Вставить       - Ctrl+V

Команды режимов:
Режим редактирования - Alt+1
Обзор схем  - Alt+2 
Файл-браузер    - Alt+3

Команды редактирования узлов:
Курсив                 - Ctrl+I
Жирный                      - Ctrl+B
Облако                     - Ctrl+Shift+B
Изменить цвет узла         - Alt+C
Высветить          - Alt+B
Изменить цвет дуги    - Alt+E
Увеличить размер шрифта узла   - Ctrl+L
Уменьшить размер шрифта узла   - Ctrl+M
Увеличить размер шрифта всей ветви - Ctrl+Shift+L
Уменьшить размер шрифта всей ветви - Ctrl+Shift+M

Команды перемещения:
К корневому узлу  - ESCAPE
Вверх     - UP
Вних   - DOWN
Влево   - LEFT
Вправо  - RIGHT
Перейти по сслыке - Ctrl+ENTER
Отдалить    - Alt+UP
Приблизить     - Alt+DOWN

Новые команды узлов:
Добавить узел-брат   - ENTER
Добавить узел-потомок     - INSERT
Добавить узел-брат перед - Shift+ENTER

Редактирование узлов:
Изменить текущий узел        - F2
Изменить в редакторе            - Alt+ENTER
Объеденить узлы                - Ctrl+J
Свернуть/развернуть             - SPACE
Свернуть/развернуть потомков    - Ctrl+SPACE
Выбрать файл для ссылки   - Ctrl+Shift+K
Ввести ссылку вручную    - Ctrl+K
Выбрать изображение для ссылки  - Alt+K
Поднять узел              - Ctrl+UP
Опустить узел            - Ctrl+DOWN">
+<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">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Скачать приложение" 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 используя установщик Freeplane."/>
+<node TEXT="Для установки Freeplane в Linux, скачайте Java Runtime Environment и Freeplane самостоятельно. Сначала установите Java, затем распакуйте Freeplane. Для запуска Freeplane, выполняйте freeplane.sh."/>
+<node TEXT="В Microsoft Windows и Mac OS X, вы так же можете просто дважды кликать на freeplane.jar расположенный в папке lib для запуска Freeplane."/>
+</node>
+<node TEXT="Обзор файлов на вашем компьютере" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="Для обзора файлов, переключитесь в режим Обозревателя файлов в меню Карты > Обозреватель файлов."/>
+<node TEXT="Вы видите дерево файлов как если бы оно было схемой сознания."/>
+<node TEXT="Для центрирования обзора на узле, в контекстном меню выберите Center."/>
+<node TEXT="Для просмотра, редактирования или запуска файла, перейдите по ссылке его узла."/>
+<node TEXT="Обзов файлов вобщем не очень полезен. Это демонстрация того, что довольно просто преобразовать данные из какого-либо источника в дерево. Возможно даже что никто не будет использовать этот режим."/>
+</node>
+<node TEXT="Обзор схем" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="Для обзора схем и последущего редактирования, переключитесь в режим Обозреватель схем в меню Карты > Обзор схем. Без использования Freeplane applet, эта функция вполне бесполезна."/>
+<node TEXT="Причины наличия раздельных режимов обзора - технические. Обзор - единственное что вы можете делать в Freeplane applet который может быть на вашем веб-сайте. Скорее всего вам не придется использовать режимы обзора непосредственно в Freeplane."/>
+</node>
+<node TEXT="О режимах" FOLDED="true" POSITION="left" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Хотя Freeplane в основном используется для редактирования схем мышления, проект разработан с возможностями обзора различных типов данных. Чтобы сделать возможным обработку особых типов данных в Freeplane, программисты пишут так называемые режимы для этих типов данных. Например режим обзора файловой системы. Мы не знаем сколько разнообразных режимов еще будет внедрено. Неизвесто, захочет ли еще кто-нибудь использовать эту возможность; она здесь есть на случай если кому-то понадобится.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Есть код, почти готовый, для режима scheme, который дает возможность редактирования программ на языке scheme. Опять же его полезность под вопросом. В отличие от режима режактирования схем, другие режимы больше демонстрируют возможности, чем реальное применение.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Установка Freeplane applet на ваш веб-сайт" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="Вы можете установить applet на ваш веб-сайт так, что другие пользователи могли видеть ваши схемы мышления." COLOR="#000000">
+<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. Внутри freeplanebrowser.html измените путь на путь к своей схеме."/>
+<node TEXT="Jar файл апплета должен находится на том же сервере что и схема, из-за особенностей безопасности в Java. Вам надо загрузить Freeplane applet jar-файл и вашу схему на веб-сайт."/>
+</node>
+<node TEXT="Использование апплета Freeplane" FOLDED="true" POSITION="left" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="В апплете Freeplane, вы можете только просматривать схемы; вы не можете редактировать удаленные схемы. Кликните на узле чтобы свернуть/развернут его или чтобы перейти по ссылке. Перетаскивайте фон чтобы прокручивать схему. Для поиска по схеме используйте контекстное меню.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Изменения в интерфейсе с версии 0.6.5" FOLDED="true" POSITION="left" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Некоторые настройки клавиатуры были изменены так, что сейчас мы полагаем они больше соответствуют общим стантартам или интуитивному использованию. Некоторые из новых настроек клавиатуры исходят от продуктов Microsoft. Новые настройки клавиш включая Enter для создания узла-брата, insert для создания потомков, F2 для редактирования - вот влияние Microsoft, т.к. очевидно что нет ни одной интуитивной причины понимать под F2 редактирование. Но так как вы, возможно, используете их во многих приложениях, вам вероятно так же хотелось бы использовать из и в Freeplane.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Настройки клавиатуры можно изменить в меню Дополнительни > Установки.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Создатели" FOLDED="true" POSITION="left" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Авторы" FOLDED="true" COLOR="#006699">
+<node TEXT="Joerg Mueller" FOLDED="true" 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">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+<node TEXT="Университет Фрейбурга, Германия" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Daniel Polansky" COLOR="#996600" LINK="http://danpolansky.blogspot.com/">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Petr Novak" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Christian Foltin" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitri Polivaev" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Помощь оказали" FOLDED="true" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Andrew Iggleden" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Установщик для Windows" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Bob Alexander" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Руководство по Eclipse" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="David Butt" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Руководство по flash" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="David Low" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Полезен" 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">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Перевод на итальянский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Knud Riishøjgård" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Перевод на датский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Takeshi Kakeda" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Перевод на японский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Kohichi Aoki" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на японский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Alex Dukal" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Перевод на испанский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Hugo Gayosso" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на испанский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
+</node>
+</node>
+<node TEXT="Sylvain Gamel" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на французский" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Koen Roggemans" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на голландский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Rafal Kraik" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на польский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Goliath" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на корейский" 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">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="William Chen" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на китайский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Radek Švarc" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на чешский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Balázs Márton" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на венгерский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Luis Ferreira " FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на португальский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Velesyuk Maxim" FOLDED="true" COLOR="#996600">
+<node TEXT="Перевод на русский" COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Список переводчиков может быть не полным. Если мы вас забыли, дайте нам знать. Все люди которые помогли с переводом, даже незавершенным, могут быть перечислены здесь." COLOR="#999999">
+<font NAME="SansSerif" SIZE="10"/>
+</node>
+</node>
+</node>
+<node TEXT="Нажмите Ctrl + F для поиска. Нажмите Ctrl + G для переходя к следущему результату. Чтобы поиск был глобальным, нажмите ESC перед началом поиска." POSITION="right" COLOR="#0033ff"/>
+<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. Назначения клавиш и расположение пунктов меню могут изменяться от версии к версии."/>
+</node>
+<node TEXT="Демонстрация некоторых возможностей" FOLDED="true" POSITION="right" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Внешний вид" FOLDED="true" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Узлы могут иметь разные цвета." FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Красный" COLOR="#ff0000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Зеленый" COLOR="#009900">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Синий" COLOR="#0000cc">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="У узлов могут быть разные цвета фона" FOLDED="true">
+<node TEXT="Такой"/>
+<node TEXT="Вот такой"/>
+</node>
+<node TEXT="Узлы могут отличаться стилями шрифтов" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Жирный">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+</node>
+<node TEXT="Курсив">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
+</node>
+<node TEXT="Жирный курсив">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
+</node>
+</node>
+<node TEXT="Шрифт может быть разного размера" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="маленький">
+<font NAME="SansSerif" SIZE="11"/>
+</node>
+<node TEXT="средний">
+<font NAME="SansSerif" SIZE="13"/>
+</node>
+<node TEXT="по-больше">
+<font NAME="SansSerif" SIZE="15"/>
+</node>
+<node TEXT="Огромный" FOLDED="true">
+<font NAME="SansSerif" SIZE="20"/>
+<node TEXT="УУХ">
+<font NAME="SansSerif" SIZE="123"/>
+</node>
+</node>
+</node>
+<node TEXT="Могут быть использованы разрые шрифты" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Такой">
+<font NAME="Times New Roman" SIZE="16"/>
+</node>
+<node TEXT="Или такой">
+<font NAME="Verdana" SIZE="12"/>
+</node>
+<node TEXT="Или вот такой">
+<font NAME="Dialog" SIZE="21"/>
+</node>
+</node>
+<node TEXT="Узлы могу быть разного стиля" FOLDED="true">
+<node TEXT=""Ветка"" FOLDED="true">
+<node TEXT=""Ветка""/>
+<node TEXT=""Ветка""/>
+</node>
+<node TEXT=""Пузырь"" FOLDED="true" STYLE="bubble">
+<node TEXT=""Пузырь"" STYLE="bubble"/>
+<node TEXT=""Пузырь"" STYLE="bubble"/>
+</node>
+</node>
+</node>
+<node TEXT="Узлы могут быть вложенными" FOLDED="true" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Что-то содержит" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Спрятанный узел">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Дерево" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Дуб">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Бук">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Вяз">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Узлы могут содержать действующие ссылки на ... " FOLDED="true" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Веб-страницы" FOLDED="true" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="http://www.google.com/" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="www.google.com" FOLDED="true" LINK="www.google.com">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Freeplane думает что это выполняемая программа :)" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+</node>
+<node TEXT="Локальные директории" FOLDED="true" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:/Program Files/" LINK="file:/C:/Program%20Files/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="/home/" LINK="/home/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Исполняемые файлы" FOLDED="true" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" LINK="file:/C:/WINNT/regedit.exe">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Вы видите, что узел запускается по иконке." COLOR="#006600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Любой документ на вашем компьютере или в вашей сети">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Многострочные узлы" FOLDED="true" COLOR="#669900">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Многострочные узлы могут состоять как из одного параграфа, так из нескольких. Если вы собираетесь строить базу знаний используя Freeplane, вам незачем избегать их использования. Вместо того, чтобы делать записи в простом текстовом файле, вы можете сделать один небольшой узел с множеством многострочных узлов-потомков."/>
+<node TEXT=""Наука - это факты; как дома сделаны из камня, так и наука состоит из фактов; но куча камней это не дом и просто собрание фактов нельзя считать наукой." --Henri Poincaré"/>
+</node>
+<node TEXT="Разделение многострочных узлов пустыми линиями" FOLDED="true" COLOR="#669900">
+<node TEXT="Линия,
и вторая,

и еще одна,
как вам это?"/>
+</node>
+<node TEXT="Вы можете эмулировать подписанные дуги" FOLDED="true" COLOR="#669900">
+<node TEXT="Дерево" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="это" FOLDED="true" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Дуб">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="это" FOLDED="true" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Бук">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="это" FOLDED="true" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Вяз">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Дерево" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<>" FOLDED="true" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Лист">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="<>" FOLDED="true" COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+<node TEXT="Труба">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="В узлах можно использовать множество иконок" 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>
+</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>
+<node ID="_Freeplane_Link_1249400461" TEXT="С другим">
+<arrowlink COLOR="#6600ff" 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>
+<node ID="_Freeplane_Link_1789233193" TEXT="Другим положением"/>
+</node>
+<node TEXT="Узлы можно располагать свободно" FOLDED="true" COLOR="#407000">
+<node TEXT="Один"/>
+<node TEXT="Другой"/>
+</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>
+<node TEXT="Редактирование текста узла" FOLDED="true" POSITION="right" COLOR="#407000">
+<node ID="_Freeplane_Link_519923426" TEXT="Для редактирования, нажмите F2, HOME или кнопку END, или контекстное меню Редактировать. Для завершения редактирования, нажмите ENTER.">
+<arrowlink DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Чтобы заменить текст в узле новым, просто начните печатать."/>
+<node TEXT="Для вызова полноценного редактора, нажмите Alt + Enter."/>
+<node TEXT="Чтобы разделить большой узел, используйте кнопку Разделить в редакторе, или нажмите Alt + S так же в редакторе."/>
+<node TEXT="Для перевода строки нажмите Control + Enter в редакторе. Строку нельзя перевести в обычном режиме редактирования.">
+<arrowlink DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Для копирования, как всегда, используйте правую кнопку мыши и выберите Копировать."/>
+<node TEXT="Для вставки спец-символов типа ©, введите их в своем любимом текстовом редакторе, например Emacs, а затем скопируйте в Freeplane."/>
+<node ID="_Freeplane_Link_1445647544" TEXT="По-умолчанию, Enter заканчивает редактирование в редакторе, и Control + Enter вставляет новые строки. Если убрать влажок "Enter confirms" вы можете изменить вышеупомянутые действия, т.е. ENTER вводит новую линию, а CONTROL ENTER завершает редактирование. Вы можете восстановить значение по-умолчанию в настройках. Кроме того, значение сохраняется в сеансе Freeplane."/>
+<node TEXT="Freeplane полностью поддерживает юникод. Так что вы можете использовать любые скрипты, какие захотите."/>
+</node>
+<node TEXT="Форматирование узла" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для выделения узла жирными, нажмите Ctrl + B.">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для выделения куривом, нажмите Ctrl + I.">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12" ITALIC="false"/>
+</node>
+<node TEXT="Для изменения цвета текста, нажмите Alt + C.">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Для изменения цвета фона, используйте контекстное меню Формат > Фоновй цвет узла."/>
+<node TEXT="Для увеличения размера узла, нажмите Control + плюс (не тот плюс что на цифровой клавиатуре).">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для уменьшения размера узла, нажмите Control + минус (не минус цифровой клавиатуры).">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для изменения типа шрифта, используйте список в главном меню."/>
+<node TEXT="Для копирования формата узла, нажмите Alt + C">
+<font NAME="Aharoni" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Для применения формата, нажмите Alt + V.">
+<font NAME="Aharoni" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+</node>
+<node TEXT="Использование уведомительных стилей" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для применения такого стиля, выберите в контекстном меню Стиль > Стиль на ваш выбор. Для ускорения применения стилей, используйте горячии клавиши, как показано в контекстном меню."/>
+<node TEXT="Для добавления собственного стиля, для опытных пользователей, отредактируйте файл "patterns.xml" расположенный в папке ".freeplane" вашей домашней директории."/>
+<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>
+<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>
+</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.">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для e-мэйл ссылки с заданной темой письма, сделайте ссылку вида: 

 mailto:reciever at somemail.com?subject=Тема вашего письма."/>
+<node TEXT="Ссылки могут быть на веб-страницы, локальные файлы, или е-мэйл адреса."/>
+</node>
+<node TEXT="Добавление иконок" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Узел может иметь несколько иконок. "/>
+<node TEXT="Для добавлени иконки к узле, выберите узел и нажмите на одну из иконок, изображенных на панели слева. Перемещая курсор к левой панели, зажмите ALT или CONTROL чтобы не потерять фокус."/>
+<node TEXT="Для удаления одной иконки, нажмите на красный крест на верху панели иконок. "/>
+<node TEXT="Для удаления всех иконок, нажмите на "корзину" на верху панели иконок."/>
+<node TEXT="Для добавления новой иконки без использования панели, нажмите Alt + I.">
+<font NAME="Aharoni" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Пока невозможно использовать собственные иконки; вы можете выбирать только из иконок идущих с Freeplane."/>
+<node TEXT="Чтобы показать или убрать панель иконок, в контекстном меню фона (не узла или дуги) выберите Показать/спрятать панель с пиктограммами . Так же эта панель называется "левой"."/>
+<node TEXT="Доступны иконки находящиеся в этом узле, и многие другие.">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="icon_not_found"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<icon BUILTIN="licq"/>
+</node>
+</node>
+<node TEXT="Добавление графических связей" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для создания связи между двумя узлами, перетащите и отпустите один узел на другой, удерживая одновременно shift и control; отпустите кнопку мыши до того как отпустите shift и control.">
+<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Или, можно выбрать 2 узла используя Ctrl и нажав "Добавить связь" из пункти "Вставка" контекстного меню или горячих клавиш Ctrl+L"/>
+<node TEXT="Для изменения цвета связи, используйте контекстное меню связи, нажав правой кнопкой мыши на графической стрелке.">
+<font ITALIC="false"/>
+</node>
+<node TEXT="Для изменения направления связи, используйте ее контекстное меню."/>
+<node TEXT="Для удаления связи, используйте ее контекстное меню,"/>
+<node ID="_Freeplane_Link_266716332" TEXT="Для перемещения к одному из связанных узлов, используйте контекстное меню связи."/>
+<node TEXT="Для изменения положения связи, захватите ее мышкой и двигайте.">
+<arrowlink 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>
+<node TEXT="Узел с под-узлом" FOLDED="true" COLOR="#996600">
+<node ID="_Freeplane_Link_1492563156" TEXT="Под-узел"/>
+</node>
+<node TEXT="Другая связь" COLOR="#996600">
+<arrowlink 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">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для нахождения текста среди всех потомков узла, нажмите Ctrl + F или в меню "Правка" - Искать.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для перехода к следущейй найденной строке, нажмите Ctrl + G или в меню "Правка" Искать далее.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для поиска по всей карте, выберите центральный узел, нажав Escape перед поиском."/>
+<node TEXT="Поиск работает по алгоритму поиск в ширину. Это соответствует идее - чем глубже узел, тем более детально он  описан."/>
+<node TEXT="Помните, что по-умолчанию поиск идет не по всей карте, только в узле и его потомках."/>
+</node>
+<node TEXT="Выбор нескольких узлов" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для выделения нескольких узлов, зажмите control или shift, и кликайте на узлы.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для добавления отдельных узлов, удерживайте control пока кликаете по ним.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для выделения радом расположенных узлов, удерживайте shift и кликайте по ним, или удерживайте shift и обойдите узлы стрелками клавиатуры.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для выбора всего поддерева, зажмите AltGr перед выбором узла, или shift и пройдите стрелками путь от узла до необходимого предка. Или наконец Ctrl+Shift+A делает то же самое.">
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Для отмены выделения нескольких узлов, кликните на фоне карты или на невыделенном узле."/>
+</node>
+<node TEXT="Перетаскивание" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Вы можете перемещать узлы перетаскивая их мышью.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для вставки узла как потомка, держите курсор на "выходящей" части узла, когда отпускаете.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для вставки узла как брата, держите курсор со стороны его связи с предыдущим узлом, когда отпускаете.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для копирования а не перемещения узла, удерживайте control при перетаскивании , или перетаскивайте средней кнопкой мыши.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Для редактирования существующей схемы, перетащите ее файл на фон Freeplane; пока это работает тольк в Microsoft Windows."/>
+<node TEXT="Для создания графической связи, перетаскивайте удерживая правую кнопку мыши.">
+<font NAME="Aharoni" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Если вы выделили несколько узлов, то они все будут скопированы/перемещены.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Вы можете перетаскивать данные из внешних приложений, например из файлов в Microsoft Windows, или выбранный текст из Microsoft Internet Explorer."/>
+</node>
+<node TEXT="Копирование и вставка" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Вы можете копировать и вставлять узлы в разные схемы. А так же вы можете вставлять простой текст или HTML из других приложений.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Если вы вставляете простой текст, несколько строк интерпретируются как несколько узлов, с глубиной, определяемой по количеству впереди стоящих пробелов в строке. Далее пример."/>
+<node TEXT="Дерево
     Дуб
     Вяз
     " FOLDED="true" COLOR="#996600">
+<node TEXT="вставляется как" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Дерево" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Дуб" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Вяз" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="Если вы вставляете HTML-текст, он вставится как обычный текст. Так же, ссылки содержащиеся в HTML вставляются как потомки этого узла, в узел с названием "Ссылки". Далее пример."/>
+<node TEXT="Например после вставки:" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Покупки (120236)">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Городская жизнь (4)">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Ссылки" FOLDED="true">
+<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/">
+<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/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Если вы вставите список файлов, выбранный в Проводнике в Microsoft Windows, он вставится как группа узлов-ссылок на эти файлы."/>
+<node TEXT="Если вы скопируете ветвь из Freeplane и вставите в обычный текстовый редактор, структура будет отображена в виде отступов. Гиперссылки будут заключены в  <> скобки. Пример далее."/>
+<node TEXT="Дерево" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Дуб" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Вяз" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="is pasted as" FOLDED="true">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Дерево
     Дуб
     Вяз
     Гугл <http://www.google.com/>" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Гугл" COLOR="#996600" LINK="http://www.google.com/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Если в Freeplane вы скопируете ветвь и вставите ее в редактор, понимающий формат Rich Text, сохранятся также и цвета и форматирование шрифта. Гиперссылки будут в <> скобках, как и в простом тексте. Редакторы умеющие работать с форматом Rich Text : Microsoft Word, Wordpad или Microsoft Outlook, и очень многие в великолепнейшем Linux."/>
+<node TEXT="Для копирования узла без его зависимостей, нажмите Ctrl + Y или в контекстном меню Копировать только этот узел."/>
+</node>
+<node TEXT="Перемещение" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для перемещения выделения вверх, вниз, влево или вправо, используйте стрелки клавиатуры."/>
+<node TEXT="Для перемещения к верхнему узлу текущего поддерева, нажмите PageUp."/>
+<node TEXT="Для перемещения к нижнему узлу текущего дерева, нажмите PageDown."/>
+<node TEXT="Для перемещения к Центральному узлу, нажмите Escape."/>
+<node TEXT="Для свободного перемещения узлов, хватайте их за невидимую ручку расположенную со стороны присоединения узла к родителю, и перемещайте куда захотите."/>
+</node>
+<node TEXT="Сворачивание и разворачивание" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для сворачивания узла, нажмите пробел, или в контекстном меню Свернуть/Развернуть."/>
+<node TEXT="Для разворачивания узла, нажмите пробел, или в контекстном меню Развернуть, или нажмите стрелку в направлении разворачивания.">
+<font NAME="Aharoni" SIZE="12"/>
+<icon BUILTIN="help"/>
+</node>
+<node TEXT="Для сворачивания/разворачивания всех узлов, зажмите Alt и поворачивайте колесо мыши, или нажмите Alt + PageUp или Alt + PageDown. Будьте осторожны с большими схемами - это может сильно сказаться на свободной памяти."/>
+<node TEXT="Для разворачивания всего, нажмите кнопку "Разворачивает все узлы" на главной панели, или в выпадающем меню Узел > Развернуть все."/>
+<node TEXT="Для сворачивания всех узлов, нажмите "Сворачивает выбранные узлы" на главной панели, или выпадающее меню Узел > Свернуть все."/>
+<node TEXT="Разворачиваемые узлы помечены маленьким кружком со стороны разворачивания."/>
+</node>
+<node TEXT="Переключение схем" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для переключения к другой открытой схеме, кликните правой кнопкой мыши на фоне и выберите нужную карту из меню.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Прокрутка схемы" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для прокрутки схем перетаскивайте фон, или используйте колесо мыши. Для гориронтальной прокрутки с помощью колеса мыши, зажмите shift или одну из кнопок на мыши.">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Масштабирование" FOLDED="true" POSITION="right" 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>
+<node TEXT="Экспорт в HTML" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для экспорта ветви в HTML, нажмите Control + H. Експортированная HTML страница может сворачивать/разворачивать ветви, если это установлено в настройках."/>
+<node TEXT="Так же можно экспортировать через меню Файл > Экспортировать > Как XHTML (использовать Javascript)."/>
+<node TEXT="Для экспортирования схемы с просмотром картинок в HTML, используйте Файл > Экспортировать > Как XHTML (навигация с картинкой)."/>
+</node>
+<node TEXT="Экспорт в растровое или векторное изображение" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для экспорта в PNG картинку, используйте Файл > Экспортировать > Как PNG."/>
+<node TEXT="Для экспорта в JPEG картинку, используйте Файл > Экспортировать > Как JPEG."/>
+<node TEXT="Для экспорта в SVG, используйте Файл > Экспортировать > Как SVG. Эта функция доступна только если у вас установлено SVG-дополнение."/>
+</node>
+<node TEXT="Экспортирование в другие XML форматы" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Для экспорта в другой XML формат у вас есть преобразующая XSLT таблица, в меню Файл > Экспортировать > Через XSLT."/>
+<node TEXT="Для экспорта в OpenOffice 1.4 Writer документ, используйте Файл > Экспортировать > Как OpenOffice Writer Document."/>
+</node>
+<node TEXT="Импорт структуры каталогов" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="Dialog" SIZE="12"/>
+<node TEXT="Для импорта структуры каталогов, в контекстном меню узла Файл > Импортировать > Импортировать Структуру каталогов. Затем выберите необходимый каталог, чью структуру вы хотите импортировать. Под структурой подразумевается дерево всех (не напрямую) поддиректорий с ссылками на файлы этих поддиректорий. Ниже пример."/>
+<node TEXT="Например" FOLDED="true" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Выбранная директория" FOLDED="true" 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">
+<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>
+<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>
+</node>
+</node>
+<node TEXT="Импортирование закладок из Internet Explorer" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Для импортирования закладок Internet Explorer в Freeplane, используйте Файл > Импортировать > Закладки из IE. Затем выберите директорию, содержащую эти закладки. Имя директории "Избранное" и вы можете найти ее на диске. В Windows 2000, она находится в C:\Documents and Settings\<пользователь>\Избранное."/>
+<node TEXT="Ключевые слова: Microsoft Internet Explorer, MSIE, MS IE." 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>
+<node TEXT="Интеграция с Word или Outlook" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Вы можете вставлять схемы или ветви в Microsoft Word, Wordpad или Outlook. Вобще, вы можете вставлять их в любое приложение, умеющее работать с форматом Rich Text. Формат текста и ссылки так же сохраняются.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Нажатие на ссылке (mailto:don.bonton at supermail.com) откроет Outlook для написания нового письма, если в Windows не установлено по-другому." LINK="mailto:don.bonton at supermail.com">
+<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 и вставляя в Word."/>
+</node>
+<node TEXT="Настройки" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для изменения настроек, используйте Дополнительно > Установки. Большинство изменений будут применены только после перезапуска Freeplane."/>
+<node TEXT="Настройки включают в себя назначение комбинаций клавишь, кроме того для экспорти в HTML, способ выбора узлов мышью, тип сглаживания, и многое другое."/>
+<node TEXT="Ключевые слова: настройка." COLOR="#999999">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node TEXT="Печать" FOLDED="true" POSITION="right" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Вы можете как распечатать всю схему на одном листе, так и на нескольких листах бумаги. Это вы можете настроить в меню: Файл > Параметры Страницы > ... ."/>
+<node TEXT="Для лучшего использования пространства, установите масштаб в Параметрах Страницы.">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Не обязательно использовать предпросмотр схемы перед печатью. Если у вас postscript-принтер или обычный postsript-драйвер, вы можете распечатать схему в файл и посмотреть postscript-файл используя Ghostview или подобную программу. Если вы попытаетесь распечатать схему на принтере, который не поддерживает postscript, результирующий файл не будет postscript-документом, а возможно будет PCL, который для вас бесполезен."/>
+<node TEXT="Так же вы можете распечатать через ваш браузер после экспорта схемы в HTML, или через текстовый редактор, скопировав в него схему. Так же вы можете экспортировать схему в 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-содержание. Но все же, использование HTML очень удобно для публикаций в сети, используя Freeplane's Applet.">
+<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, или в контекстном меню узла Вставка > Изображение. При вставке изображения весь текст находящийся в узле пропадет. Изображения вставленные таким способом в последствии не корректно вставляются в другие приложения из  Freeplane и могут неверно экспортироваться в HTML. Изображения в Freeplane пока еще пробная возможность."/>
+<node TEXT="Поддерживаемые форматы изображений: PNG, JPEG и GIF."/>
+<node TEXT="Для того, чтобы на месте ссылки на файл изображения появилось это изображение, нажмите ALT + SHIFT + K. Вы можете сделать это и с множеством файлов изображений в Freeplane, выберите их как несколько узлов, и замените на изображения, нажав ALT + SHIFT + K."/>
+<node TEXT="Есть так же более сложный и не очень дружелюбный способ вставки изображений. Можно включать HTML-код в узлы. Начните содержание узла тегом <html>. Таким образом вы также можете вставлять изображения в узлы." COLOR="#000000">
+<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">
+<font NAME="SansSerif" SIZE="12" BOLD="true"/>
+<node TEXT=""/>
+<node TEXT=""/>
+<node TEXT="" FOLDED="true">
+<node TEXT=""/>
+</node>
+<node TEXT="" FOLDED="true">
+<node TEXT="" FOLDED="true">
+<node TEXT=""/>
+</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>
+</node>
+<node TEXT="Использование тестового блокирования файлов" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Текущая версия Freeplane имеет эксперементальную опцию блокировки файлов, по-умолчанию отключенную. Текущая реализация не предотвращает обращения к файлам идеально, но этого должно быть достаточно для большинства практических задач."/>
+<node TEXT="Блокировка файлов гарантирует что несколько пользователей не смогут одновременно редактировать одну и ту же схему, предотвращая случайное перезаписываение информации друг-друга."/>
+<node TEXT="Чтобы включить эксперементальную опция блокирования файлов, используйте меню Дополнительно > Установки."/>
+</node>
+</node>
+</map>
diff --git a/freeplane/doc/freeplane_vi.mm b/freeplane/doc/freeplane_vi.mm
new file mode 100644
index 0000000..f3fed65
--- /dev/null
+++ b/freeplane/doc/freeplane_vi.mm
@@ -0,0 +1,885 @@
+<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ánh ra HTML - Ctrl+H
Xuất nhánh ra sơ đồ mới - Alt+A
Mở tập tin lần trước - Ctrl+Shift+W

Lệnh chỉnh sửa:
Tìm - Ctrl+F
Tìm tiếp - Ctrl+G
Cắt - Ctrl+X
Chép - Ctrl+C
Chép riêng - Ctrl+Y
Dán - Ctrl+V

Lệnh chuyển chế độ:
Chế độ Sơ đồ tư duy - Alt+1
Chế độ duyệt - Alt+2 
Chế độ tập tin - Alt+3

Các lệnh định dạng nút:
Chữ nghiêng - Ctrl+I
Chữ đậm - Ctrl+B
Mây - Ctrl+Shift+B
Đổi màu nút - Alt+C
Blend node color - Alt+B
Change node edge color - Alt+E
Tăng cỡ chữ cho nút - Ctrl+L
Giảm cỡ chữ cho nút - Ctrl+M
Tăng cỡ chữ cho nhánh - Ctrl+Shift+L
Giảm cỡ chữ cho nhánh - Ctrl+Shift+M

Lệnh di chuyển giữa các nút:
Về nút gốc - ESCAPE
Đi lên - UP
Đi xuống - DOWN
Sang trái - LEFT
Sang phải - RIGHT
Mở liên kết - Ctrl+ENTER
Thu nhỏ - Alt+UP
Phóng to - Alt+DOWN

Lệnh tạo nút mới:
Thêm nút anh - ENTER
Thêm nút con - INSERT
Thêm nút anh phía trước - Shift+ENTER

Lệnh sửa nút:
Sửa nút đã chọn - F2
Sửa nút dài - Alt+ENTER
Join nodes - Ctrl+J
Mở rộng/Thu gọn - SPACE
Mở rộng/Thu gọn cấp con - Ctrl+SPACE
Đặt liên kết bằng bộ duyệt tập tin - Ctrl+Shift+K
Đặt liên kết bằng ô văn bản - Ctrl+K
Đặt ảnh bằng bộ duyệt tập tin - Alt+K
Move node up - Ctrl+UP
Đem nút xuống - Ctrl+DOWN
">
+<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)">
+<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ề">
+<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>
+<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ắc rằng bạn sẽ có lúc dùng chế độ này."/>
+</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à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"/>
+<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 được một nguồn dữ liệu nào đó, nhà lập trình phải viết một chế độ để xem dữ liệu cho nguồn mình cần xử lý. Chế độ Tập tin là một ví dụ về việc này. Nhóm phát triển không biết được sẽ có bao nhiêu chế độ được viết ra sau này, cũng như có bao nhiêu người sẽ tận dụng được đặc điểm này. Nếu bạn cần lấy dữ liệu từ một nguồn khác, hãy thử xem!">
+<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ủa chương trình, hơn là có tác dụng thực sự trong đời sống.">
+<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 đó.">
+<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ỉ tới sơ đồ cần cho người khác xem."/>
+<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ình."/>
+</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">
+<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 đó. Muốn di chuyển bên trong sơ đồ, bạn bấm chuột vào nền và di sang vị trí khác. Để tìm kiếm bên trong sơ đồ, hãy dùng trình đơn ngữ cảnh dành cho nút.">
+<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"/>
+<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"/>
+<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">
+<font NAME="Dialog" SIZE="10"/>
+</node>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="University of Freiburg, Germany">
+<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"/>
+<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"/>
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+</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"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1797108956" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Installer Windows">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Eclipse howto">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Tutorial flash">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_226818637" MODIFIED="1124560950701" TEXT="David Low">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Helpful">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Italian translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Danish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_74531183" MODIFIED="1124560950701" TEXT="Alex Dukal">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
+<edge WIDTH="thin"/>
+<font NAME="Dialog" SIZE="10"/>
+</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"/>
+<font NAME="Dialog" SIZE="10"/>
+</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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<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">
+<edge COLOR="#808080" WIDTH="thin"/>
+<font NAME="Dialog" 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.">
+<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>
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1212777551435" TEXT="Diện mạo">
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#ff0000" CREATED="1124560950701" ID="Freeplane_Link_1928775947" MODIFIED="1212777159263" TEXT="Đỏ">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#009900" CREATED="1124560950701" ID="Freeplane_Link_1270985808" MODIFIED="1212777153600" TEXT="Xanh lá cây">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#0000cc" CREATED="1124560950701" ID="Freeplane_Link_1751102424" MODIFIED="1212777147831" TEXT="Xanh nước biển">
+<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>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1213254128" MODIFIED="1212777308799" TEXT="Mỗi nút có kiểu chữ riêng">
+<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>
+<node CREATED="1124560950701" ID="Freeplane_Link_706890134" MODIFIED="1212777370515" TEXT="Chữ nghiêng">
+<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+</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>
+</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">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="nhỏ">
+<font NAME="Dialog" SIZE="11"/>
+</node>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="bình thường">
+<font NAME="Dialog" SIZE="13"/>
+</node>
+<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="lớn">
+<font NAME="Dialog" SIZE="15"/>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_547633802" MODIFIED="1124560950701" TEXT="LỚN">
+<font NAME="Dialog" SIZE="20"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_1471232064" MODIFIED="1212777407803" TEXT="CỰC LỚN">
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_363896058" MODIFIED="1212777444214" TEXT="Times">
+<font NAME="Dialog" SIZE="16"/>
+</node>
+<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1212777454684" TEXT="Hoặc Verdana">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_655292275" MODIFIED="1212777478602" TEXT="Hoặc Arial">
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_529813828" MODIFIED="1212777568093" TEXT="Thu gọn các nút">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1212777574812" TEXT="Thu gọn">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_445954768" MODIFIED="1212777586138" TEXT="Ẩn">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1212777578738" TEXT="Cây">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" ID="Freeplane_Link_1469000164" MODIFIED="1212777599197" TEXT="Sồi">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1452025216" MODIFIED="1212777636660" TEXT="Bạch Đàn">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" ID="Freeplane_Link_1692720585" MODIFIED="1212777644092" TEXT="Dừa">
+<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 ... ">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096564272" MODIFIED="1124560950701" TEXT="các trang Web">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Freeplane coi đó là thực thi được :)">
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950701" LINK="file:/C:/Program%20Files/" MODIFIED="1124560950701" TEXT="C:/Program Files/">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950701" LINK="/home/" MODIFIED="1124560950701" TEXT="/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">
+<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">
+<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">
+<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">
+<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">
+<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. Thay vì phải tạo ra một tập tin khác để ghi các lưu ý, bạn có thể tạo một nút ngắn với nhiều nút cấp con có nhiều dòng."/>
+<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ớ sự thật thì không nhất thiết phải là khoa học." --Henri Poincaré"/>
+</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>
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1736834382" MODIFIED="1212778216365" TEXT="là">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1045607374" MODIFIED="1212778233261" TEXT="Sồi">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_238870301" MODIFIED="1212778222678" TEXT="là">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_822090058" MODIFIED="1212778260217" TEXT="Dừa">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1142791359" MODIFIED="1212778226462" TEXT="là">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_687154358" MODIFIED="1212778269821" TEXT="Bạch đàn">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+</node>
+<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_600637247" MODIFIED="1212778211448" TEXT="Cây">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1566093997" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1360724162" MODIFIED="1212778284996" TEXT="Lá">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_874353698" MODIFIED="1124560950717" TEXT="<>">
+<font NAME="Dialog" SIZE="10"/>
+<node CREATED="1124560950717" ID="Freeplane_Link_442156920" MODIFIED="1212778280357" TEXT="Thân">
+<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">
+<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>
+</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>
+<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>
+<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>
+<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1212778358052" TEXT="Và đường đi khác nhau"/>
+</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>
+</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>
+<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>
+<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>
+<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, ENTER sẽ xuống dòng và CTRL+ENTER sẽ kết thúc việc soạn thảo. Giá trị mặc định của ô này có thể được thiết lập trong phần Tuỳ chỉnh. Ngoài ra, thiết lập này còn được lưu lại trong phiên làm việc trên Freeplane."/>
+<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>
+<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">
+<edge WIDTH="thin"/>
+<font BOLD="true" NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" ID="Freeplane_Link_887688331" MODIFIED="1212939523169" TEXT="Để làm nghiêng nút, nhấn CTRL+I">
+<edge WIDTH="thin"/>
+<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+</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"/>
+<font NAME="Dialog" SIZE="12"/>
+</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ố).">
+<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ố).">
+<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.">
+<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.">
+<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ím tắt như trình đơn ngữ cảnh đã chỉ ra."/>
+<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ể chứa thẻ <font> chỉnh phông chữ. Xin xem tập tin "patterns.xml" đi kèm chương trình để biết cụ thể hơn."/>
+</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>
+</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>
">
+<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=Last 
 phone call</i>.
 </body>
</html>
"/>
+<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>
+<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"/>
+<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, nút cũ vẫn được chọn."/>
+<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ện ra."/>
+<node CREATED="1124560950717" ID="Freeplane_Link_1660196267" MODIFIED="1213116794303" TEXT="Các biểu tượng có trong Freeplane...">
+<icon BUILTIN="help"/>
+<icon BUILTIN="messagebox_warning"/>
+<icon BUILTIN="idea"/>
+<icon BUILTIN="button_ok"/>
+<icon BUILTIN="button_cancel"/>
+<icon BUILTIN="back"/>
+<icon BUILTIN="forward"/>
+<icon BUILTIN="attach"/>
+<icon BUILTIN="ksmiletris"/>
+<icon BUILTIN="clanbomber"/>
+<icon BUILTIN="desktop_new"/>
+<icon BUILTIN="flag"/>
+<icon BUILTIN="gohome"/>
+<icon BUILTIN="kaddressbook"/>
+<icon BUILTIN="knotify"/>
+<icon BUILTIN="korn"/>
+<icon BUILTIN="Mail"/>
+<icon BUILTIN="password"/>
+<icon BUILTIN="pencil"/>
+<icon BUILTIN="stop"/>
+<icon BUILTIN="wizard"/>
+<icon BUILTIN="xmag"/>
+<icon BUILTIN="bell"/>
+<icon BUILTIN="bookmark"/>
+<icon BUILTIN="penguin"/>
+<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ạ">
+<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;"/>
+<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.">
+<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.">
+<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.">
+<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.">
+<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.">
+<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;"/>
+<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.">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_8762214" MODIFIED="1213142775774" TEXT="Ví dụ">
+<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>
+<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>
+<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>
+</node>
+</node>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1212778439962" POSITION="right" TEXT="Tìm kiếm">
+<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.">
+<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..">
+<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ệm, vấn đề chi tiết hơn cấp cao."/>
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1212778434777" POSITION="right" TEXT="Chọn nhiều nút">
+<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.">
+<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.">
+<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.">
+<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ện thời."/>
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1212778428135" POSITION="right" TEXT="Kéo và thả">
+<edge WIDTH="thin"/>
+<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.">
+<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.">
+<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.">
+<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.">
+<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.">
+<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>
+<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1212778423691" POSITION="right" TEXT="Chép và dán">
+<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.">
+<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ống nằm ở đầu dòng. Xem ví dụ sau."/>
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1241327831" MODIFIED="1124560950717" TEXT="Tree">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Oak">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Beech">
+<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:">
+<font NAME="Dialog" SIZE="12"/>
+<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Shopping (120236)">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Urban Living (19)">
+<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">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1124560950717" TEXT="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ẽ được đặt trong dấu ngoặc nhọn <>. Ví dụ sau."/>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_903550993" MODIFIED="1124560950717" TEXT="Tree">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Oak">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1997185283" MODIFIED="1124560950717" TEXT="Beech">
+<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">
+<font NAME="Dialog" SIZE="12"/>
+<node COLOR="#996600" CREATED="1124560950732" MODIFIED="1124560950732" TEXT="Tree
 Oak
 Beech
 Google <http://www.google.com/>
">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+</node>
+<node COLOR="#996600" CREATED="1124560950732" LINK="http://www.google.com/" MODIFIED="1124560950732" TEXT="Google">
+<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ẽ được đặt trong dấu ngoặc <>, như lúc dán ra văn bản thô. Các trình soạn thảo văn bản phức hợp bao gồm OpenOffice Writer hoặc Thunderbird."/>
+<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>
+<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>
+<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áy do thiếu bộ nhớ."/>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1213144715606" POSITION="right" TEXT="Chuyển sang sơ đồ khác">
+<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.">
+<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ơ đồ">
+<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.">
+<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>
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1212779034059" POSITION="right" TEXT="Xuất ra HTML">
+<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>
+<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>
+<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>
+<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">
+<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ẽ được đưa vào sơ đồ. Xem ví dụ bên dưới."/>
+<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_122139198" MODIFIED="1213145516875" TEXT="Ví dụ">
+<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">
+<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">
+<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>
+<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>
+</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"/>
+<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. Thông thường, thư mục này tên là "Favorites" và nằm trong C:\Documents and Settings\<tên người dùng>\Favorites."/>
+<node COLOR="#999999" CREATED="1124560950732" MODIFIED="1124560950732" TEXT="Key words: Microsoft Internet Explorer, MSIE, MS IE.">
+<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">
+<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 dạng văn bản cũng như liên kết sẽ được giữ nguyên khi dán.">
+<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) để soạn thư tới địa chỉ đó.">
+<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>
+<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">
+<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>
+<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1528828442" MODIFIED="1213145851893" POSITION="right" TEXT="In ấn">
+<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.">
+<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ào Writer rồi in từ đó. Bằng cách này, ta có thể hiệu đính văn bản kỹ hơn trước khi in.">
+<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
 </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" style="border: none" class="msonormaltable" border="1" cellspacing="0">
 <tr>
 <td style="border: solid windowtext 1.0pt; padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-top: .75pt">
 <p class="msonormal">
Ô thứ nhất
 </p>
 </td>
 <td style="border: solid windowtext 1.0pt; border-left: none; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
 <p class="msonormal">
Ô thứ hai
 </p>
 </td>
 </tr>
 <tr>
 <td style="border: solid windowtext 1.0pt; border-top: none; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
 <p class="msonormal">
Ô thứ ba
 </p>
 </td>
 <td style="border-bottom: solid windowtext 1.0pt; border-top: none; border-left: none; padding-left: .75pt; padding-right: .75pt; border-right: solid windowtext 1.0pt; 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>
"/>
+<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ụng Freeplane vào trình duyệt.">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</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án vào các ứng dụng khác, cũng như xuất ảnh ra HTML. Do vậy, nên hạn chế dùng chức năng này."/>
+<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 ảnh (ALT + SHIFT + K)."/>
+<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>.">
+<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.">
+<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ày đã hỗ trợ hầu hết các nhu cầu thực tế."/>
+<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>
+</node>
+</map>
diff --git a/freeplane/doc/history_en.txt b/freeplane/doc/history_en.txt
new file mode 100644
index 0000000..dfdaed0
--- /dev/null
+++ b/freeplane/doc/history_en.txt
@@ -0,0 +1,2153 @@
+===============================
+1.2.20
+===============================
+Install as 64 bit program on 64 bit windows
+Do not check for java in windows installer
+Do not change edge width or style when AutomaticEdgeColorHook is executed
+#1801: improve consistency of data formatting
+Add min/maxNodeWidth to scripting API
+===============================
+1.2.19
+===============================
+Use launch4j as windows launcher
+Use standard portable app launcher
+copy user icons from freeplane 1.1.x on the first start
+build test dist version for PortableApps.com
+do not draw text on spash if the splash comes from a file
+Bug fixes
+===============================
+1.2.18
+===============================
+Java 5 compatibility fixes
+Release
+===============================
+1.2.17
+===============================
+Bug fixes
+===============================
+1.2.16 rc
+===============================
+Bug fixes
+Support for free nodes in the scripting API
+Support for debugging of external groovy script files
+
+===============================
+1.2.15 beta
+===============================
+Approximative search in rich text editor
+Add and remove reminders via scripting api
+Rich text editor: add "Paste plain text" context menu item and "default paste mode" preference option
+
+===============================
+1.2.14 beta
+===============================
+Fix calculation of all font sizes
+Properties "Apply system screen resolution default" and "User defined screen resolution (dpi)"
+Various fixes for formatting of attributes
+Scripting: treat URIs special to allow clickable attribute values
+Presentation mode (see menu View and preferences->Appearance->default colors)
+Unfold children one-by-one by shift + SPACE, Navigate -> Show next child or shift + click inside folding circle
+Creating of links between nodes and maps using link anchor actions
+
+===============================
+1.2.13 beta
+===============================
+Search enhancements: Approximate search feature, control search via key presses, busy cursor, some fixes
+Fix editable Comboboxes for some L&Fs
+New UI for folding
+Formatting option to display hyper links as HTML
+Insert free nodes on double click + folding
+Options for editing on double click and folding on click inside a node
+Drop images if control is pressed and links to files otherwise
+Hyperlink in text as node text style option
+Performance and memory optimizations for scaling of external bitmap images
+
+===============================
+1.2.12 beta
+===============================
+All documentation maps displayed in MindMapMode
+Online documentation map accessible
+Action "Open map from URL" for accessing maps from the internet
+Action "Restore from local history" for easy access of backuped or autosaved maps
+Settings "Display attribute icon" and "display note icon" saved with each map separately
+Files ending on addon.mm are recognized as add-on packages
+Icon support for add-ons
+Action "Highlight all matching nodes"
+Fixes for date and number input parsing
+Node can be split from the in-line editor pressing alt+S .
+Nodes containing child nodes can be joined, their child nodes are moved as well.
+New node property "always unfolded node"
+New properties for standard attribute key and attribute values widths
+New node format "Text" for disabling formulas and format for selected nodes
+Rename automatic level styles to Title and Heading X
+Automatic recognition of URLs in attributes
+Command line arguments allow batch execution of menu items
+Remind later feature
+Pan the map with Ctrl+Shift+Cursor up/down/left/right
+Inline editor and detail editor start on Ctrl + mouse click (META on Mac OS) instead of double click
+Control (META on Mac OS) should be held for creating free nodes
+
+===============================
+1.2.11 beta
+===============================
+First beta
+===============================
+1.2.10 alpha
+===============================
+Minimal node width and maximal node width as node / style property
+Add-on support
+===============================
+1.2.9 alpha
+===============================
+Better support for hyperlinks in editor dialog
+Links can be accessed from inline editor and tooltips
+Free positioned nodes
+Paste of images from clipboard
+===============================
+1.2.8 alpha
+===============================
+Scripting API has improved support for formats
+Scripting API allows to implement filters in Groovy
+Conditional styles for single nodes and for styles (!!)
+Notes can be edited on styles and assigned to related nodes
+Reminder based filter conditions
+Script based filter conditions
+Scripts in reminders
+Scripting support math with nodes: node.text = "2"; assert 3 * node * 2 == 12
+Code completion in formula editor
+Performance optimizations for printing
+Filter flag "Unfold hidden nodes" removed
+Filter flag "apply to visible nodes" no more automatically set / unset
+Obsolete documentation key maps and menu references removed
+
+===============================
+1.2.7 alpha
+===============================
+New splash and icons
+Multiple bug fixes
+Enable Details for Styles
+Copy style attributes and details if is the first user action performed on an new node assigns a style
+Improved design of attributes in node tooltips
+
+===============================
+1.2.6 alpha
+===============================
+Auto formatting of numbers
+Formatting of attributes
+Improved connector editor
+Configurable parsing of dates and numbers
+filter conditions "Attribute contains", "Attribute matches" and "Icon exists"
+Reorganized user menu
+Font and colors of node details is controlled by style "Details"
+Font of notes is controlled by style "Notes"
+In-line editor for new details available, edit details in separate dialog is possible as another action
+Always run "assign new short cut" for unassigned F-keys
+Goto Node with ID Action
+
+===============================
+1.2.5 alpha
+===============================
+New features:
+New menu structure
+Summary nodes
+Multiline connector labels
+Individual connector label font family and font size
+"Add connector" action creates also connectors to self
+Preferences->Behavior->In-line node editor->Layout map during editing
+ disable for better performance
+
+===============================
+1.2.4 alpha
+===============================
+New features:
+Display content type icon in status line, attribute editors and find/filter editor
+Use META key for multiple selects on mac
+External object slideshow-function + extended progress display
+Progress up, Progress down, Extended progress 10% and Extended progress 25% in icon menu
+<freeplane-user-dir>/resources added to resources search path
+
+===============================
+1.2.3 alpha
+===============================
+New features:
+Date comparison for nodes and attributes
+Attributes in node styles
+Insert "external images" on drag and drop to a node
+Date format selection in calendar and attribute panel
+New style options format/template and node numbering
+Hyperlinks in attributes
+Inline editor for Node Details (on single click)
+Links to nodes in attributes. Shortened content of the linked nodes is displayed.
+Date and time selection in Filter / Search
+Enable printing from rich text editor
+===============================
+1.2.2 alpha
+===============================
+New features:
+Different shapes, line types, width and transparency for connectors
+Resize-able style, calendar and attribute panel
+Syntax coloring for latex
+Time in date filters
+
+===============================
+1.2.1 alpha
+===============================
+New features:
+Node styles replace style patterns (like in text processors)
+Conditional node styles: node formatting depends on its content and position
+Hyperlinks for menu items
+Keyboard shortcut documentation: Map and HTML table generation added for the documentation map
+Check for newer auto save files on opening of a map
+343] Single instance mode: open files in existing program instance instead of opening a new one
+Node level dependent filters
+Improvements in search and replace functions
+Different shapes for clouds
+Node details
+Shortened node view
+Formula plugin ("spreadsheet plugin")
+Extended scripting API
+Single backup directory
+Improved node tool tips with copy and scroll bar
+Script and formula editor JSyntaxPane from http://code.google.com/p/jsyntaxpane/
+When Formula Editor is visible, double click on node inserts node ID, single click folds/unfolds.
+Inline editor supports some HTML formatting, use pop-up menu->format or hot keys
+Automatic Edge Color
+"Grid" for moving of nodes (Preferences->Behaviour->Grid gap size)
+Copy and paste attributes between nodes
+Named filter conditions
+
+===============================
+1.1.3, 2010-12-06
+===============================
+Bug fixes:
+732]: Saving to any networkshare takes extremely long time
+749]: highlighted text does not appear highlighted anymore
+add dutch translation to spell checker
+Dutch docs and translation
+translations for it, zh_TW
+multiple bug fixes in spell checker
+bug fix: freeplane did not start if unsupported language code was set in properties
+770]: Find and Replace... runs into infinite loop on certain HTML nodes
+Fix layout for long textes in BNodeNoteViewer: use JEditorPane instead of JLabel
+Bug fix in remove format action of simply html
+
+===============================
+1.1.2, 2010-08-22
+===============================
+Bug fixes in applet browser
+Catch exceptions thrown from hook writers
+414: handling of non letter characters in spell checker
+722]: Image http url putted in open file dialog for inserting an image hangs freeplane
+
+===============================
+1.1.1, 2010-07-17
+===============================
+New version of latex component included
+
+===============================
+1.1.0, 2010-06-26
+===============================
+Bug fixes:
+662]: Printing all works wrongly after printing defined page(s) (workaround for windows java bug)
+665]: After a contextual "Copy" the "Paste" command creates a new node
+
+===============================
+1.0.45 rc, 2010-06-06
+===============================
+New features:
+Display filled folding mark if there are some descendant folded nodes with visible descendants are hidden by a filter
+
+===============================
+1.0.44 rc, 2010-05-23
+===============================
+Bug fixes:
+ignore gragging of connectors in outline view
+inserting text strings as siblings using drag and drop
+633]: tree_&_outline_views_differ_depending_on_edge_style,_color_and_position
+635]: note cursor position seems to assume different font-width than displayed text
+make page number label in preview dialog wider
+627]: In OptionPanel : size of the extra width is displayed with value "0" after change
+NextNodeAction worked wrong if no next node was available
+getAbsoluteUrl worked wrong for unsaved maps
+attribute table worked wrong if Assign Attributes dialog was used when the table was edited
+645]: Note-Edit-Switch becomes unusable when assigned certain key-combinations
+646]: Command "New encrypted map" should always be available in Freeplane
+
+===============================
+1.0.43 rc, 2010-05-09
+===============================
+New features:
+Documentation map reworked
+Menu reference map added
+New number icons added to flash browser (0, 8 and 9)
+Display icon toolbar with the scroll pane as default
+Paint all links with line width = 2
+Preserve links colors and edge widths in Outline View
+Action "note edit switch" moved to menu Edit
+Add Map.getFile() to scripting API
+Added question "remove file from last opened file list" if file is not found
+Added option "Environment->Files->Load last and new maps"
+Connector menu and arrows available in outline view
+
+
+Bug fixes:
+Map background color properly displayed in flash browser
+551: deleting nodes via scripting interface using each iterator throws exception
+448: separators of pulldown menu Navigate
+453: Icon repeated twice
+548: Assign new short cut only on real menu item mouse click
+Bug fix for removing attributes / values using AttributeManagerDialog
+576]: PanelOption : the default Window size for SimplyHTML
+Translations
+
+===============================
+1.0.42 rc, 2010-03-30
+===============================
+New features: Automatic bug report requests user support depending on submitted information
+
+Bug fixes:
+HierarchicalIcons caused endless node refresh
+Text properties and documentation improvements
+
+===============================
+1.0.41 beta, 2010-03-15
+===============================
+New features:
+add empty icon empty.png to resources
+Take link icons URLs from properties
+Wrap toolbars for narrow windors
+add bzr info to distributions
+Filter by regexp
+Export to mediawiki (from export using XSLT dialog)
+
+Script API:
+support for multiple valued attributes
+
+Bug fixes:
+use node id in links to other maps
+425]: Drag and drop from file explorer under Linux does not create a node with relative link
+Use fractional metrics for calculating bounds of images to be exported
+Reduce size of buffer for exporting map as image
+406]: Clouds are truncated when exporting to bitmap: add small space around the exported image
+Use print instead of paint for exporting maps as bitmaps
+Antialiasing of cloud around the root node
+451]: Error when browsing a map Exported as a Java Applet
+General protection from writing non ASCII characters in XMLWriter
+Adjust calendar dialog size to screen
+SimplyHTML.jar: bug fix for drag and drop
+AttributePopupMenu: do not display it if table is being edited
+uri pattern in MLinkController
+bug fix in JoinNodesAction for not standard html nodes
+bug fixes in AttributeTable and FButtonBar
+482]: Scroll speed of some dialogs are slow.
+479]: Valid URL triggers Automatic Bug Report
+bug fixes for automatic bug reports
+470]: Experimental file locking problem in - Export Branch as new map
+467: Scroll speed of Manage Patterns Dialogs
+Toolbar layout bug fix
+Painting of toggled buttons under mac improved
+463]: display warning if applet can not display images because of SecurityException "no file access"
+bug fix for full screen under linux
+fix build target dmg4mac
+462]: Escape key deletes the currently typed text in node and the parent node's text if created just before
+454]: Clear hyperlink
+450]: Some French Keyboard keys do not work under Linux
+
+
+===============================
+1.0.40 beta, 2010-02-23
+===============================
+New Features:
+Mac OS support
+CopyIDAction
+SetAcceleratorOnNextClickAction
+Introduce charset option in preferences to overload the default
+Filter node text by regular expression
+
+Script API:
+Controller, Node: find methods for searches on the whole map and subtrees
+Controller: methods for accessing the status line
+
+Bug fixes:
+FButtonBar layout
+Executing of scripts on multiple nodes
+use clipboard mode on export
+385: Unwanted icon delete
+419]: Turn links to images
+420]: Shortcuts (accelerator keys) don't work going from 1.0.37 to 1.0.39
+415]: Truncated F-Bar
+425]: Drag and drop from file explorer under Linux does not create a node with relative link: rewrite MLinkController.findLink
+429]: Cannot load Freeplane after updating Java: check jre version on start
+fix comment handling in richcontent
+always substitute non ascii character in xhtml
+match plain text instead of html for notes too (like in bug 437)
+433: Same choices in Look and Feel selection
+441: No Undo for changes of NodeModel.getHistoryInformation().lastModifiedAt
+442: Freeplane is opened "in the background"
+437: unexpected behaviour of function (find - Node text - Contains)
+option enter_confirms_by_default moved to behavior tab
+439: Enter and Alt+Enter for inline node editor and long node editor
+opening of map files by drag and drop under linux
+390: drag and drop of files to nodes under linux
+426]: Encrypted portions of maps don't export properly:
+do not start node editing on BACKSPACE
+
+===============================
+1.0.39 beta, 2010-02-01
+===============================
+New Features:
+Implemented script content caching
+added script introspection for source annotations @ExecutionModes and @CacheScriptContent
+freeplane_ru.mm, translations fr and it
+Filter Hyperlink exists and Connector exists
+enclose the script execution in a UndoHandler transaction and do a rollback on errors
+Display node id in status line(can be set in preferences->appearance)
+Add access top map and getting node by id to scripting API
+410]: Unable to assign space bar to insert new node
+Move note cursor to the end added
+add MapProxy with method node(id) to scripting api
+workaround for windows launcher "FREEPLANE_MAX_HEAP_SIZE=512m"
+
+Script API:
+new interface Proxy.Map introduced
+Method Proxy.Node.getRootNode removed
+
+Change default settings:
+Move note cursor to the end by default
+freeplane2flash.xsl : fold from level 2
+standarddrawrectangleforselection = true
+time_for_delayed_selection=200 ms
+save_only_intrisically_needed_ids=true
+save_folding=never_save_folding
+load_folding=load_folding_from_map_default_fold_all
+load_folding_start_level=2
+extract a new interface method AttributesProxy.getAttributeNames()
+
+Bug fixes:
+windows launcher checks available memory
+follow links only for the link region
+Increase scrolling unit increment for some scroll panes
+Add OK and Cancel buttons to Latex Editor
+390]: 1.0.39.-1: cannot insert some kind of links manually
+test as osgi
+fix resource leak
+doc folder
+bug fix for displaying svg graphics with not integer dimension
+undo-redo, cut and paste of nodes with links
+local links
+move focus to node view after editin latex
+380]: modification time not always shown
+384]: Filtering by icon
+layout bugs for filtered maps
+379]: Script run from pattern - doesn't run - Mishandling of Quote characters
+
+===============================
+1.0.38 beta, 2010-01-14
+===============================
+New features:
+warn user on loading incorrect links
+lazy loading of the spell check dictionary
+enable spell check for note editor only while it has focus
+hierarchical menus for groovy scripts
+Resources_ja.properties
+Resources_fr.properties
+jlatexmath-0.8.5.jar
+
+Bug fixes:
+377]: wikimindmap can be opened by Freemind but not by Freeplane
+set permission to execute freeplane.sh in ant script
+store property 'filter_ignore_case' between sessions
+376]: designating the tab key as the default for insert new child doesn't work on new installations
+bug fixes in attribute dialogs
+374]: "Remove Last Icon" keyboard shortcut does not work
+bug fix in UndoHandler for transactions
+373]: Scripting: Compilation errors result in inoperative scripting engine
+372]: Unable to create filter "containing attribute icon.
+371]: Status of arrows for local links is not restored in the menu
+366]: wrong bubble node layout when done the first time fixed (NodeView.java)
+
+===============================
+1.0.37 beta, 2010-01-02
+===============================
+New features:
+Loading and execution of external Groovy scripts (Volker Boerchers, Dimitry)
+http://freeplane.sourceforge.net/mediawiki-1.14.1/index.php/External_script_file_execution
+
+JLatexMath replaces HotEqn
+http://forge.scilab.org/index.php/p/jlatexmath/
+
+Bug fixes:
+367]: "View->Attributes->Show selected attributes" not restored
+362]: outline view behaves inconsistent when deleting node
+jlatexmath-0.8.4.jar
+366]:Spacing at the begin of bubble node
+363]: Two minor bug about note
+ChangeSelectionOnPropertyChange
+Resources_hr.properties
+new italian translation + automatic translations
+355]: note tooltip appears truncated on the right side : do not limit maximum width of tooltips with long lines
+364]: folding symbol eats the last letter of the bubbled node
+new italian translation + automatic translations
+display selected attribute view type in menu
+363]: Two minor bug about note
+JLatexMath replaces HotEqn
+support spellchecker options
+better solution for inserting nodes into encrypted nodes
+356]: Encryption violation triggers Automatic bug report
+185]: Menu radiobutton not updated on node selection for format edge style or width
+360]: Inserted graphics node doesn't give up input focus
+performance optimizations
+load all plug-ins from <install-dir>/plugins und <user-home>/.freeplane/plugins on start
+355]: note tooltip appears truncated on the right side: always place tooltip under the node
+
+===============================
+1.0.36 beta, 2009-12-21
+===============================
+Bug fixes:
+remove memory leak for long node editor
+bug fixes in scripting
+fixes for automatic bugreports
+346]: Menu Accelerator Keys Missing for Maps ans Help
+Bug for % in user icon names
+348]: Applying dates to nodes : append date to node text field / attribute is it is being edited
+use only visible nodes in find/replace
+bug fix for SelectAllAction
+bug fix in ExportBranchAction
+bug fix in OpenUri with map
+bug fix: do not request focus in note editor on start
+341]: Scripting API bugs
+335]:Toggle Encrypted/Decrypted
+bug fix in grabbing short cut
+build patch from ewl: separate properties
+freeplane.sh patch for MAC OS
+ApplicationViewController.openDocument refactored
+changes in GrabKeyDialog
+336]: Shortcut key to switch note window on/off (Ctrl+Shift+Less) does not work
+334]: Attributes disappearing
+333]: Export as HTML does not show icons
+333]: Icon file name in exported HTML
+332]: connector options works only for option "both"
+bug fix in open url
+330]: New scripting API bug in proxy.Connector (?), general problem with scripting engine
+insert 4 spaces if tab is pressed in text editor
+Replace Freeplane by FreeMind for old program versions in history_en.txt
+
+===============================
+1.0.35 beta, 2009-12-06
+===============================
+New features:
+Freeplane as Portable App (*.paf.exe)
+support changing drive for last opened map list portable apps
+maximum node width saved in the map file
+save zoom and layout type in the map file
+Use current map content (no file required) for exports using ExportWithXsltDialog
+new splash design
+
+Bug fixes:
+316: Export menu for "Using XSLT" duplicates the pull-down file options each time it is accessed
+310]: note window - refresh bug
+315]: Export of user icons
+bug fix in icon toolbar menu hierarchy
+bug fixes for automatic bug reports
+326]: mailto: feature not working in v1.0.34
+323]: Map Area Coordinates Are Inaccurate
+320]: Alt+Tab from/to Freeplane can cause menu to be highlighted
+322]: clicking local link opens "Save As..." instead of moving to the linked target node
+321]: Scrollbar Speed
+bug fixes for menu bar, f-bar and NodeView.contains
+new createURI (by Eric and Dimitry)
+bug fix for Clear Case: do not lock read file
+
+key mapping guide
+
+===============================
+1.0.34 beta, 2009-11-06
+===============================
+New features:
+menu hierarchy for user icons based of folder structure
+
+Bug fixes:
+new splash screen
+SharpBezier shape changed
+306]: Sub folders under user icons
+305]: Absolute/relative hyper link for external objects
+305]: Absolute/relative hyper link for images
+use wider sharp bezier edges (299]: Thicker edge width and few proposal about Bezire sharp edges)
+bug 303: Hierarchical Icons unacceptably slow performance
+bug 291: Priority filtering is broken
+
+===============================
+1.0.33 alpha, 2009-10-30
+===============================
+Bug fixes:
+Improved node selection using arrow keys for outline view
+287:Format message for changed zoom in Italian and French
+Update check for localized versions
+285, 281, 229, 246, 248, 272: Use proper URI for open URL
+228: load empty files as a new mindmap
+227: In the preferences > Move "Hyperlink Types" from "Appearance" tab : moved to environment
+216 Focus after note window
+Temporarily remove help plugin
+Add jortho to source distribution
+177: Modification times
+include freeplane_framework into src dist
+278: Bold on and italic on icons don't show properly in SimplyHtml toolbar
+250: Tag balancer in xhtml writer
+
+===============================
+1.0.32 alpha, 2009-10-22
+===============================
+Refactoring for icons (Tamas)
+
+Bug fixes:
+bug fix for full screen mode: properly display modal dialogs on top
+System dependent memory allocation for windows OS
+0000243: Find and replace doesn't replace all occurrence of a pattern within a node
+0000245: Navigation in File Mode is (almost) not working
+0000253: can't edit name on exported branch as a new card
+0000252: Attribute assignation kinematic
+0000236: simulate edge feature is buggy when used with "horizontal" edge style
+0000273: File -> Open dialog shows by default all files instead of only showing map files.
+0000275: Freeplane 1.0.32 a does not open encrypted maps
+0000277: After saving a new map, exception thrown when selecting "Map1" on right-click menu
+
+===============================
+1.0.30 alpha, 2009-09-02
+===============================
+New features:
+Search and Replace in all maps
+Automatic Layout moved from menu Tools to menu Format
+
+Bug fixes:
+[Bugs 0000217]: Enter key gives new line in node rather than end node edit
+[Bugs 0000221]: parasitical line in outline view when connectors present an a map
+[Bugs 0000222]: vertical and horizontal distance problem (outline view)
+[Bugs 0000223]: fit width and height
+Consider edge width in outline view
+remove timer for blinking node if the node is removed from map
+
+===============================
+1.0.29 alpha, 2009-09-02
+===============================
+New features:
+Outline view available from menu View
+Distance between nodes in outline view can be configured in Preferences->Appearance
+Options "fit map to page width", "fit map to page height" in page setup dialog (useful for outline view)
+
+Bug fixes:
+[Bugs 0000211]: Some maps can not be loaded anymore
+bug fix: do not create already existing edgemodel and cloudmodel on loading
+[Bugs 0000213]: Freeplane 1.0.28 a: graphics' size is not reminded when map is reopened
+[Bugs 0000214]: mouse pointer after note
+[Bugs 0000212]: Link with clouds - not visible
+[Bugs 0000207]: user's icons break edge nodes
+
+===============================
+1.0.28 alpha, 2009-08-27
+===============================
+Bug fixes:
+Save map after node is encrypted
+Bug fixes in reminder: properly show and remove state icons (flag) when reminder is active
+Do not cancel editing in text field if some node is changed
+Proper handling of missing URI for viewer/preview
+Window state properly recovered after full screen
+Text rendering in inline editor
+Collision detecting for connectors
+Middle lable positioning for connectors
+Encrypted nodes
+
+===============================
+1.0.27 alpha, 2009-08-24
+===============================
+New features:
+External bitmap and SVG images can be attached using menu Insert->External object
+The action is also available from pop-up menu
+Images can be scaled by dragging the bottom right corner
+Image size can be reseted double clicking on the bottom right corner
+The attached file can be opened by double click on the image itself
+
+Insert image dialog and insert external object dialog have file previews
+
+New navigation actions useful for presentation "next node" and "previous node".
+They traverse the map in depth-first order.
+Hot keys: CONTROL + ALT + RIGHT, CONTROL + ALT + LEFT
+
+Text rendering mode use more exact fractional metric based version.
+
+Batik version updated to 1.7
+
+Fwdir is not created any more, knopflerfish updated to 2.3.3 nightly build 2911
+
+Performance optimization: do not paint links which both source and target
+ are far away from the visible part of the screen
+
+===============================
+1.0.26 alpha, 2009-08-17
+===============================
+New features:
+proper use of ESCAPE=cancel and ENTER=save when link label is edited
+Arrow (graphical) links renamed to Connectors
+Connector Label Filter Condition
+Full screen mode
+Hide tabs if only one map is loaded
+Selective paste from edit menu (Paste...)
+edit nodes with line breaks in in-line editor (alt+enter to quit , shift+enter for line break)
+new icons: 0%, 25%, 50%, 75%, 100%
+no follow up links in link pop-up menu
+
+Bug fixes:
+installer bug fixes
+insert text area directly into MainView
+add some zoom support to latex plugin
+do not add already registered LoadAcceleratorPResetsAction when preset file is saved again
+remove link from map links if its source node is removed
+[Bugs 0000191]: Save after move node
+[Bugs 0000188]: Fold / Unfold for multiple selection
+[Bugs 0000193]: date appended to rich text node is invisible
+[Bugs 0000198]: Pasting clipboard into a new node results in node of massive size
+work around for external html containing unknown tags
+
+Performance issues:
+repaint only visible part of the map
+
+===============================
+1.0.25 alpha, 2009-08-11
+===============================
+New features:
+edge like links (available from link menu)
+
+Bug fixes:
+bug fix in date filter
+bug fix in map positioning if root is selected after the filter was applied
+bug fixes in calculating text area editor size
+
+===============================
+1.0.24 alpha, 2009-08-07
+===============================
+Bug fixes
+bug fix in node editor
+
+===============================
+1.0.23 alpha, 2009-08-06
+===============================
+Bug fixes
+export only packages from java 5 (important for compatibility with java 7)
+[Bugs 0000180]: Parsing error -- bug fixes for edge style null
+[Bugs 0000179]: editing long nodes : problem ! -- use old style long node editor for nodes containing line break
+bug fix: do not process document events after text area is hidden
+ignore wrong zip file by importMindManagerFiles
+
+===============================
+1.0.22 alpha, 2009-08-03
+===============================
+New features:
+inline editor width step as a setting
+inline editor border color depends on selection display type
+enable link pop-up menu even if neither target nor source node is selected.
+Links where target or source are selected are found first.
+
+Bug fixes
+
+[Bugs 0000167]: Hyperlinks containing ? not directed correctly
+[Bugs 0000164]: Bezier end line too fat
+[Bugs 0000166]: Map loading error at launch -> freeplane can't start
+[Bugs 0000148]: Scroll map, Load files dropped into open map view
+bug fix for cut / paste alert [freeplane - Open Discussion]
+bug fix: close edit field if node is deleted
+
+===============================
+1.0.21 alpha, 2009-08-02
+===============================
+New features:
+New text input component
+Allow dragging of map if node is edited
+cleanup for french translation contributed by Pierre-Yves Baumann, thanx!
+always display f-bar in a new line
+
+Bug fixes
+
+[Bugs 0000143]: "copy format" considers default values too now
+bug fix: keep selected node position after filtering
+bug fix: use actual values for selection delay
+bug fix: disable F-bar short cuts in file/browse modes
+bug fix in last opened list for '&' in file names
+bug fix if in "import folder structure"
+
+===============================
+1.0.20 alpha, 2009-07-25
+===============================
+Bug fixes
+[Bugs 0000146]: Freeplane hangs after being idle for longer time :
+ - reminder could lead to out-of-memory and freeze the program
+Resize tool bar and properly display F-Bar on key events
+[Bugs 0000156]: Filter moved selected node out of window
+[Bugs 0000157]: Freeplane hangs at start when last opened map file names contained ';' character
+
+===============================
+1.0.19 alpha, 2009-07-22
+===============================
+New features:
+Filter tool bar can be hidden like all other tool bars,
+active filter status is displayed in status line
+test feature: stack traces can be obtained by command "stack" from the console
+
+Bug fixes:
+properly display button selection in tool bars
+links to mind map files
+child nodes of encrypted node loaded in wrong order
+bug fix in pasting file list from clipboard
+bug fix for loading maps with auto layout
+
+===============================
+1.0.18 alpha, 2009-07-20
+===============================
+New features:
+Hot key CONTROL+ALT+SHIFT+ 'B' for awakening frozen application up and sending a bug report
+use uri for links
+include styles made by Ryan
+use UITools.getFrame() for displayed modal dialogs
+keep attributes manually set in attribute manager
+use only no more than one icon if pattern with icon is applied
+replace alt accelerators by alt+shift accelerators to keep alt not used because of possible mnemonic use
+improvements in export with xslt dialog
+
+Bug fixes:
+bug fix: update map view name after exporting branch
+transactions for undo (startTransaction/commit/rollback) for dialog operations used in AttributeManager
+bug fix: use cloud properties copying/pasting format
+bug fix in f-bar
+save note when note window is closed
+
+===============================
+1.0.17 alpha, 2009-07-16
+===============================
+New features:
+Delayed F-bar switch if modifier key is pressed
+Disable the most actions if no map is shown
+icon actions moved in separate menu
+icon toolbar hidden by default
+move map tabs to the bottom
+"Save hot key set action" in Tools->Hot Key Presets
+
+Bug fixes:
+Handling of hot keys assigned twice
+Bug fix in DesEncrypter
+Bug fix in SimplyHTML
+[Bugs 0000139]: Tooltip shows only first attribute when multiple attributes for the node
+completely hide tool bar panel if all tool bars are disabled
+Bug fix in ReminderExtension
+[Bugs 0000140]:Sometimes most recent files menu is not updated with the last file opened.
+
+===============================
+1.0.16 alpha, 2009-07-10
+===============================
+Bug fixes:
+[Bugs 0000130]: Ambiguous filter options state in menu after switching to another tab
+[Bugs 0000133]: SEVERE BUG: specially formatted nodes within encrypted nodes corrupt the original file
+Bug fix for copying single nodes
+Bug fix for loading maps with automatic layout
+
+===============================
+1.0.15 alpha, 2009-07-07
+===============================
+Bug fixes:
+Bug fixes for saving maps,
+Bug fix for loading preset hot keys,
+Bug fix for file locking
+
+===============================
+1.0.14 alpha, 2009-07-06
+===============================
+New features:
+F-Toolbar
+
+Bug fixes:
+Bug fixes for saving maps,
+Bug fixes for exporting applet,
+Bug fixes for links to map files,
+Other important bug fixes
+Bug fixes for automatically reported bugs
+
+===============================
+1.0.13 alpha, 2009-06-16
+===============================
+New features:
+[Feature Requests 0000104]: protocol handler: FreeMind patch for linking to arbitrary URL integrated
+
+Bug fixes:
+[Bugs 0000076]: Notes window size not remembered between sessions
+[Bugs 0000094]: Error splitting (rich text) long node - with revsion tracking
+Bug fixes for automatically reported bugs
+
+===============================
+1.0.12 alpha, 2009-06-15
+===============================
+New features:
+Automatic backup for all loaded files on first save.
+Backup and autosave use directory ".backup" created in the map directory.
+All backup or autosave files are numbered from 1 to maximum number, the bigger number the latest file.
+Exception traces for internal errors are automatically sent to freeplane team for analysis.
+
+Bug fixes:
+[Bugs 0000076]: Notes window size not remembered between sessions
+[Bugs 0000094]: Error splitting (rich text) long node - with revsion tracking
+Bug fix in showing modification times
+
+===============================
+1.0.11 alpha, 2009-06-09
+===============================
+New features:
+use .freeplane as user folder
+Search and filter on note content
+Icon toolbar menu improved
+Osgi does not use jar bundles but directories.
+Attributes are shown as tooltips if they are hidden
+ or only selected attributes are displayed.
+
+Bug fixes:
+Internal representation of linked files should not use escape characters
+[Bugs 0000085] handling of empty notes in html
+[Bugs 0000067]: Display message if invalid hyperlink to an external map file is handled
+
+===============================
+1.0.10 alpha, 2009-06-01
+===============================
+New features:
+Lock map files on load/save
+Patterns support clouds, "Floating node" pattern
+Load all previously loaded maps on start
+
+Bug fixes:
+[Bugs 0000062]: eol in long nodes are saved/copied
+[Bugs 0000063] bug fixes when empty mode is selected
+[Bugs 0000064]: F1 keyboard shortcut to open Freeplane documentation
+[Bugs 0000065]: Error message box shown when Cancel button is pressed in save file as dialog
+[Bugs 0000066]: Export as HTML of unsaved map not working
+[Bugs 0000071]: In Notes Window, the default font remains as Serif even if you change Preferences to Times New Roman
+[Bugs 0000071]: In rich text editor window
+[Bugs 0000071]: use default font in tool tips
+[Bugs 0000072]: Edit Long Node window at right of screen edge
+[Bugs 0000081]: "Cursor jumping in notes text entry"
+
+
+===============================
+1.0.9 alpha, 2009-05-24
+===============================
+hierarchical icon tool bar
+find dialog uses filter conditions
+Tool tip times can be changed in preferences
+bug fix: reading of attribute information, bug fixes for encrypted nodes and maps
+translations unified
+
+===============================
+1.0.8 alpha, 2009-05-19
+===============================
+update check
+open bug/feature trackers from help menu
+warning if map file is corrupted
+big fix for changing left/right map sides
+simplyhtml loaded only if should be displayed
+
+===============================
+1.0.7 alpha, 2009-05-09
+===============================
+bug fix in xml parser
+auto clean up
+bug fix in remove icon action
+bug fix: place dialogs visible if properties become corrupted
+bug fix: drag and drop oh html links from firefox
+bug fix: encrypted nodes
+bug fix: Java export
+font size option added to preferences
+bug fix: Max-Y-size in preferences is repeated
+bug fix: show filter tool bar button
+
+===============================
+1.0.6 alpha
+===============================
+Priority filters based on priority icons
+filter conditions for numeric values return false for non numeric values
+links optionally painted behind nodes
+
+different bug fixes
+
+===============================
+1.0.5 alpha
+===============================
+Tool tips for nodes can be switched off in preferences
+https://sourceforge.net/forum/message.php?msg_id=7224634
+
+Place editing dialog under the node
+Filter icons
+Horizontal Edge Style
+Filter menu
+Filter history (almost) as proposed by Rigel
+Hot keys can be set by pressing mouse button1 + ctrl on menu item
+Use default font and paragraph spacing for notes too
+Center selected nodes as user setting and as action
+Selected node position is kept after filtering
+
+Performance optimization: repaint only small area around selected node
+if selection is changed
+
+Resources for map background color selection added
+Link Navigation History can be used if CTRL is hold when you press
+nNvigation buttons
+New XSLT export dialog translations from ewl
+
+New options for saving
+<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"/>
+
+New options for loading
+<comboname="load_folding">
+ <choice value="always_fold_all_after_load"/>
+ <choice value="load_folding_from_map_default_fold_all"/>
+ <choice value="load_folding_from_map_default_unfold_all"/>
+ <choice value="always_unfold_all_after_load"/>
+</combo>
+
+Zoom saved between sessions
+The same zooms applies to all maps
+Plain text search for filter in html nodes added
+Zoom keep selected node position
+Date based filter
+Structured HTML paste
+Hidden Edges
+Spell checker
+Personal modification color
+text labels can be added to any end and in the middle of any link by link pop-up menu
+
+=================================
+FreeMind 0.9.0 Beta20, 2008-08-29
+=================================
+* Fixed some documentation bugs reported by Edmund Laugasson. Thanks.
+* Bug fix: Untranslatable strings and places * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=2020259&group_id=7118
+* Documentation fixes.
+* Mac: Spaces in files names corrected.
+* Bug fix: B19 startup fails with "Mode not available: Mindmap" * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=2025279&group_id=7118
+* "Open hyperlink" works for multiple selected nodes.
+* FreeMindStarter uses reflection. Thus, it can detect java < 1.4.
+* Icons revised. Thanks to Predrag.
+* Fixed: copying to clipboard for Linux.
+* Fixed: saving of xhtml - tag <option>.
+* Application type of freeplane.exe changed to Win32 GUI to prevent DOS box.
+* Fixed: images in notes.
+* Added translations (thanks to all authors):
+- 2034191 French - 0.9.0 Beta 19 - FM_Key_Mappings_Quick_Guide_fr.pdf by dberthereau
+- 2034187 French - 0.9.0 Beta 19 - FM_Key_Mappings_Quick_Guide by dberthereau
+- 2031743 Russian 0.9.0 - beta 19 - full
+* Integrated [ 2025876 ] MS Project export with dependencies + example
+* Integrated [ 2027826 ] Word export with notes - Thanks to Eric.
+
+=================================
+FreeMind 0.9.0 Beta19, 2008-07-21
+=================================
+* Fixed: in key based navigation in filtered maps.
+* Fixed: displaying of fork node in filtered maps.
+* Fixed: branch selection in filtered maps.
+* Fixed: calculation of dialog position relative to nodes.
+* Fixed: text in filter descriptions.
+* Fixed: [ 1984842 ] Cursor in long node editor set to the last position.
+* Fixed: export of filtered maps to PDF
+* Fixed: Patterns can't be customized in FM beta18 * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1985406&group_id=7118
+* Fixed: onCreateNodeHook fixed.
+* FreeMind includes document icons now. Thanks to Predrag.
+* Bug fix: storing of scripts in patterns corrected.
+* Key documentation added. Thanks to Ryan.
+* New icons (thanks to Predrag), Icons and their order is customizable in preferences, now.
+* Fixed: Error opening files from network PCs in Windows * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1984395&group_id=7118
+* New translation from Krymmel. Thanks to the author.
+* New slovak translation. Thanks to the author Viliam Bur - viliambur.
+* Updates czech translation. Thanks to the author.
+* Updated translation norsk from Larsa - larslem. Thanks to the author.
+* Updated dutch translation. Thanks to the author Walter Huwels - kiwaki.
+* New translation from jmasesch - jmases1. Thank you.
+* New translation to greek from sarikoudis - sarikoudis. Thank you.
+* New ukranian translation. Thanks to Serhij Dubyk - dubyk.
+* Updated portugese translation. Thanks to Luis Valente - alvalente.
+* New freeplane documentation in french. Thanks to rickenbroc - rickenbroc.
+* Updated french translation. Thanks to Sébastien Rombauts - srombauts.
+* Updated korean translation. Thanks to Yang gyu, Lee - lyg73.
+* Updated japonese translation. Thanks to Tomohiro Sembongi - tomophy.
+* New indonesian translation. Thanks to Perry Harahap - permataharahap.
+* Updated slovenian translation. Thanks to Martin Srebotnjak - filmsi.
+* New indonesian documentation. Thanks to Perry Harahap - permataharahap.
+* New vietnamese translation and documentation. Thanks to Nguyen Dinh Trung - dinhtrung.
+* Updated chinese translation. Thanks to willyann - willyann.
+* New estonian translation and documentation. Thanks to Edmund Laugasson - elaugasson.
+* Updated russian translation. Thanks to ksd - sergeykotkin.
+* New key mappings in russian. Thanks to ksd - sergeykotkin.
+* Updated groovy to version 1.5.6.
+
+=================================
+FreeMind 0.9.0 Beta18, 2008-06-03
+=================================
+* Fixed: bubble / fork style not correctly cascading * http://sf.net/tracker/index.php?func=detail&aid=1822099&group_id=7118&atid=107118
+* Fixed: java.lang.OutOfMemoryError: Java heap space * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1965270&group_id=7118
+* new translations. Thanks to the authors.
+* bug fixes in the "new script" action.
+* Bug fix: Script editor divider locations start with some reasonable values.
+* Fixed URL handling for older mm files
+* Fixed URL handling for file: type under Windows 2000.
+* Fixed: button "Add" "assign attributes" dialog.
+* Fixed: displaying of accelerator keys in selected language.
+* Fixed: Mnenonics for yes/no/cancel buttons in "Save" Dialog.
+* Fixed: displaying of changes made using "Assign attributes" dialog if only selected attributes are visible.
+* Refactoring of FreeMindStarter such that preferences are only read once.
+* Fixed: confirmation dialogs were placed outside of the screen
+* Fixed: position of files dragged to a node
+* Splash updated by Predrag via mail from 28.05.2008 (GPLv2+). Many thanks.
+* Icon taken form Predrag. FreeMind started recompiled. Thank you.
+
+=================================
+FreeMind 0.9.0 Beta17, 2008-05-06
+=================================
+* Scripts can be installed as menu functions (look into ScriptingEngine.xml).
+* Security Enhancements for Scripting Engine.
+* Fixed "Cannot follow links if new/unsaved map is open" https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1900401&group_id=7118
+* Fixed "typo: estabilishOwnFont()" https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1889819&group_id=7118
+* Fixed "Focus changed after window switching" https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1872277&group_id=7118
+* Fixed "Calendar can only be opened once" https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1911717&group_id=7118
+* Fixed "Clouds on root node are not displayed" https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1911883&group_id=7118
+ and https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1911883&group_id=7118
+* Inverted the mouse wheel zoom direction to make it compatible with e.g. OpenOffice.
+* Fixed: Large mind maps produce invalid PDF https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1921334&group_id=7118
+* Fixed: Following of connectors - dedicated text required https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1846702&group_id=7118
+* new base 64 coding compatible with gplv2+
+* Fixed: Misleading option in 'Time Management' https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1917188&group_id=7118
+* Fixed: Script exceptions are now displayed in any case.
+* Fixed: Scripts with multiples lines supported in patterns.
+* Fixed: Layout of pattern manager.
+* Fixed: .toURL() is deprecated in Java 1.6 https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1812246&group_id=7118
+* This fixes as well: Hyperlinks dont work with interntional chars in filename * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1801949&group_id=7118
+* Fixed: On first start FreeMind should show new map to newbies * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1752516&group_id=7118
+* Fixed: Print Preview can be closed with ESC.
+* Fixed: English used by FreeMind... (thanks to the author) * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1933938&group_id=7118
+* Fixed: Missing tooltips in Manager Patterns dialog * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1848057&group_id=7118
+* Fixed: Format dialog remembers its position on screen.
+* Fixed: Like in 0.8 nodes are still unfolded, when others are dragged into. This can changed in the preferences.
+* Fixed: Notes icon appears now in Applet: Summary: Note Icon not showing * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1766025&group_id=7118
+* Notes icon can be hidden via preferences.
+* Fixed: When multiple maps are opened, their Z-order seems to be fixed. For example, if I open map A, B and C one by one, and then close map C, I may get map A on the front, depending how the program assigns order to maps.
+* Fixed: keys "home", "end" and <character> work in the same way for all node editors
+* Fixed: Key Events are not lost during node editor dialog is being created
+* Mnemonics for (some) Dialog Buttons configurable by "&" character in language properties
+* Fixed: placement of text field editor if attribute table is wider than the node text
+* Fixed: height of attribute table rows for zoom factor != 100 %
+* Fixed: Valid html output * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1063430&group_id=7118
+* Fixed: faulty undo for edge types after auto layouting * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1937927&group_id=7118
+* Fixed: Issues with action "Clear note" * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1842855&group_id=7118
+* A link to the FreeMind's webpage is available in Help Menu
+* Fixed: Folding not saved * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1938342&group_id=7118
+* Scripts can be signed by a FreeMind key or with a user key (specified in the options)
+ and have then full rights.
+* FreeMind version is now a structure that can be used by scripts or plugins to guarantee compatibility.
+* New design of logo (thanks to mmeitzner) and splash (thanks to bernardlang) integrated
+* Fixed: Wrong language name for Norwegian * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1935818&group_id=7118
+* New croatian language. Thanks to Predrag.
+* Fixed: When pressing Option+F in Mac OS X, the Format->Node color dialog should show up, but instead the File menu does (in a weird position) * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1947269&group_id=7118
+* Icon order moved to properties.
+* Fixed: encrypted node just looks to be locked * https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1945302&group_id=7118
+* New icons from Predrag (put under GPLV2+ via private mail from 2.5.2008). Thanks to the author.
+* Fixed: "null incompatible with text-specific antialiasing enable key" error under Mac OS X.
+
+=================================
+FreeMind 0.9.0 Beta16, 2008-03-02
+=================================
+* Bug fix: do not add new <p> for HTML nodes copied as HTML
+* Bug fix: remove HTML tags by generating RTF
+* Bug fix: Overlapping edges of the root node
+* Bug fix: Map movements after folding
+* Bug fix: Avoid storing style element in rich text nodes
+* Bug fix: not possible to pick / fold / unfold nodes after exception in SVG/PDF Plugin
+* Bug fix: Edit box for new child node can appear in the wrong location
+* Disable small buggy hide/open - arrows for split pane
+* Bug fix: Remove '&' character from tooltips and ui elements
+* Link connectors - new arrows in popup menu changed as proposed by Dan
+* Bug fix for "Java exception entering text"
+* Bug fix Look and feel - no propagation into scroll bar
+* Bug fix: copy text field selection to clipboard
+* Bug fix: repaint after text field is removed
+* Bug fix: Map hidden after switching from docs (JRE 6)
+* New version of SimplyHTML with some bug fixes
+* Bug fix: In browse mode and file mode, scroll wheel AKA mouse wheel
+* Filter toolbar looks similar to the other toolbars.
+* Bug fix: italic and bold handling in patterns (eg. automatic layout)
+* Check marks for a lot of menu items added
+* Changed mouse wheel behaviour.
+* Cut gets a confirmation window, too. See https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1846766&group_id=7118
+* Bug fix: Hyperlink action renamed and it is only enabled, when there is actually a hyperlink. See https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1846702&group_id=7118
+* Updated to Batik 1.6 (for Eric, as this version is already integrated in Debian)
+* Script Editor now has "Add new Script" and is able to assign the script results
+ to an (new) attribute using "attr_name=<script>".
+* Updated groovy to version 1.5.1
+* RemoveNote is automatically disabled when no notes found
+* fold/unfoldall at toolbar is applied to current node as before.
+* Format node window has now scroll bars if needed.
+* Option to store ids only, when needed added.
+* Patch: [ 1897283 ] Multiple reminders added up in parent nodes
+* New installer variant "Java embedded" started, but this
+ variant will not be released soon due to open license questions
+
+=================================
+FreeMind 0.9.0 Beta15, 2007-11-30
+=================================
+* Option added that map conversions are confirmed
+* Bug fix: Browser applet can be started twice
+* Bug fix: alt+i in English
+* Bug fix: save and use setting "left toolbar invisible" in auto.properties.
+* Bug fix in writing content of HTML nodes into clipboard.
+* Bug fixes in rich text editor component (Version shtml_0_12_2_beta3).
+* Enable main menu mnemonics for note editor.
+* Bug fix: attribute table column width not retrieved.
+* Item "Remove Notes" in the "Tools" menu.
+* OPTION "OLD_ROUTING_OF_ROOT_EDGES" configurable from Preferences->Appearance.
+* Time Management is no longer modal.
+* Fold/Unfold all on toolbar applies to root.
+* Styles can hold scripts. Script editor improvements.
+* Pattern dialog has now a short cut.
+* Bug fix: background color of edited nodes.
+* Bug fix: node selected after cut&paste if attributes are shown.
+
+==================================
+FreeMind 0.9.0 Beta 14, 2007-11-21
+==================================
+* Open Office Export now for the ODT format.
+* Nicer automatic format with sharp bezier curves.
+* Security question for script execution.
+* Notes window is completely hidden if requested.
+* Tabs show dirty state of map
+* Bug fix: Automatic layout with icons.
+* Bug fix: Drag&Drop in Pattern Dialog
+* Bug fix: Map conversion of version 0.8.0 fixed.
+* bug fix for export to PDF (SVG).
+* Bug fix : update all nodes if standard text color has been changed.
+* Use node text and background colors in editors.
+* Bug fix: use edge color for folding mark.
+* Bug fix: new maps should not have "saved" attribute set.
+* Bug fix: FreeMind non-responsive after application focus change.
+* Bug fixes in filter management.
+* Bug fix: export to PNG.
+* Bug fix: mnemonics for starting Attribute Manager Dialog.
+* Bug fix: layout after zoom change.
+* Bug fix: printing of filtered maps with hidden links.
+* System.out and System.err redirected to special logger.
+* Bug fix: join for rich text nodes.
+* Display help message for node movement as tool tip.
+* Bug fix: nodes cut when zoom not 100%.
+* Menu item "Split" moved to menu item "Join nodes"
+
+==================================
+FreeMind 0.9.0 Beta 13, 2007-09-02
+==================================
+* Menu Item to show SimplyHTML about box
+* Use cloud or map backgroung color in WYSIWYG Editor if the node has no own background color.
+* Selection text color no more used for unselected text in Textfield / Textarea
+* Latex plugin added
+* Persistent map filters added
+* Click on icon with control key hold removes the first matched icon, with alt key removes the last one
+* Icon hot keys available in "Select Icon" popup can be set in Preferences
+* Bug fixes.
+* Displaying Selection as Rectangle as default.
+* Optional "unfold on paste"
+* Confirmation on delete added.
+* Decision whether or not to take rich text edit added.
+* Icon selection popup, long node editor and WYSIWYG editor do not hide the edited node is possible
+* Bug fix: mind manager import: sides fixed.
+* bug fix: strings containing \n must be saved as XML elements, not as attributes
+* bug fixes and necessary refactorings for paste and cut - actions
+ only UndoActionHandler uses the undo - action from the action pair,
+ the undo action is prepared during paste action is executed
+* Bug fix: patterns repaired
+* Bug fix: edge properties in patterns
+* Mnemonics for english and german completed
+* Enter on root gives a new child
+* Bug fix: edges scale now with zoom.
+* Enter on root gives new child, shift-enter on root causes root to get a child of a new root node.
+
+==================================
+FreeMind 0.9.0 Beta 12, 2007-07-21
+==================================
+* Map background color may be set via Format menu and saved with the map.
+* Bug fixes: problems if auto.properties does not exist
+* FreeMind Accelerators work from Note Editor
+
+==================================
+FreeMind 0.9.0 Beta 11
+==================================
+* New menu option: Display Selection as Rectangle.
+* Standard colors are taken from Look&Feel settings.
+* Node is unfolded on paste or drop.
+* In-place node editor scrolls with the map.
+* Bug fix in note editor: space does not fold/unfold the node
+* Bug fix: tab closing fixed for java4+5
+
+===============================
+FreeMind 0.9.0 Beta 10
+===============================
+* New option: velocity of mouse wheel movements.
+* Bug fix: F6 and F8 can be used for formats again.
+* Bug fix: sorting keeps graphical links now.
+* user_icons is no more required,
+* all *.png files in .../.freeplane/icons are handled as user icons
+* Bug fix: moving of encrypted nodes is working again.
+* Bug fix: moving or removing a node with active reminder flags clears all parent flags.
+* Bug fix: OOo export of empty nodes
+
+* Class hierarchy of descendands of NodeView removed
+* NodeView is made responsible for painting of its cloud, children edges and folding marks
+* Class hierarchy for MainView introduced
+* All own components of NodeView (MainView and AttributeTable) are put inside of JComponent,
+which can be obtained using NodeView.getContent().
+* New classes for NodeView Layout, MindMapLayout and Viewport Layout introduced
+* NodeViewLayout sets locations of NodeView Content and all its direct children
+ and NodeView size
+* NodeViewFactory for putting NodeView components and LayoutManager together
+* EdgeView is no more part of NodeView, it is managed by NodeViewFactory
+* setLeft is no more initiated by view
+* multiple map views for map are allowed by the new design, but only one NodeView for Node on each MapView
+* NodeView implements TreeModelListener
+* standard TreeModelEvents are used for communicating the map changes
+* If only MainView exists, getContent() returns the MainView.
+* If some special node has its own content component, it can be added to Component given by
+ NodeView.getContentPane(). Futher efforts are needed to make such contents like e.g.
+ math formulas possible
+
+* focus in the long node editor goes to the text area after the dialog is opened
+* Back and forward added: Even between different maps.
+* Tabbed mind maps added (it is possible to switch it off in the preferences -> appereance)
+* New translations. Thanks to the authors.
+* Integrated the TWiki export. Thanks to the author scf_code.
+* Integrated html to plain patch from Dan. Thanks.
+
+* Plugin API improved, StatefulNodeHook with Undo-Support introduced
+* Window position, size and state are saved and restored correctly
+
+* Adjusting not only the background color of selected node but also its text color.
+* System colors used instead of FreeMind default colors
+ for default window background color, default node text color,
+ default selected node background and text colors.
+* Alternative displaying of selected nodes showing rounded rectangle around the node (may be set in preferences)
+
+=================================
+FreeMind 0.9.0 Beta 9, 2007-03-08
+=================================
+* Bug fix: nodes selection does not change if FreeMind is not focused
+* Select All is aplied to the filtered nodes only if filter is active
+* Bug fix: new nodes are directly closed.
+* Performance of note editor improved. Thanks to Dimitri.
+* Bug fix: long node handling corrected.
+* New shortcut for note editing: control LESS.
+* Open Office Writer Export: Notes added, styles started
+* [ 1581112 ] starting freeplane with soft link to freeplane.sh does not work
+* HTML Note window automatically opens and closes on control LESS.
+* Correct encoding of htmls: Thanks to gulpman.
+* Log of node styles removed.
+* HTML Note window show/hide state is controlled via shift+control LESS (present in view menu and map context popup window).
+* Taskjuggler integration from aki integrated. Thanks to the author.
+* Bug fix: proper zoom of HTML nodes
+* Bug fix: better "zoom to fit"
+* Bug fix: scroll to selected node after zoom change
+* Improvements in Map Layout
+* Bug Fixes concerning the Left Toolbar
+* Blinking Node Hook does not change the model color, only the view color
+* Bug fix on start if the last map has been deleted
+* Short cuts are traced to the actions even if menu bar is not visible
+* FreeMind Base Dir used for searching the plugins is taken from the classpath, not from the properties
+* FreeMind Base Dir is also used for localizing the docu
+* The Internet Docu Version is used if FreeMind Base Dir can not be defined (applet in browser)
+* Search & Replace Dialog with menu and nicer. Bug fixes...
+* Changes for Java 6.0
+* changes in getFreeMindBaseDir (TODO)
+* Local Short Cuts and Properties => Bug Fix for control PLUS etc.
+* Using Shift+Click on icon bar substitutes the current icons by the new one. (Same with Shift+Enter in the icon selection dialog)
+* user friendly closing of the node edit dialogs
+* moved time management to internal plugins.
+* revised build process for external plugins.
+* New feature: Sort children nodes added.
+* Calendar scrolls with arrow keys through months and years now (JCalendar improvement).
+* Search&Replace: Title corrected
+* NodeModel: attribute selectors in HashMap style added.
+* Bug fix: double click on root node makes it editable
+* Bug fix: starting edit and continue with long node editor keeps changes
+* Bug fix: null pointer in AttributeTable
+* New feature: Script Editor
+* New feature: split of multi paragraph HTML nodes (Edit->Split, plugin)
+* New feature: split of HTML nodes im WYSIWYG Editor
+* SimplyHTML Properties integrated
+* Bug Fix in copy to clipboard
+* MAC Java options include more memory (for graphics export)
+* Writing of HTML refactored out to class MindMapHTMLWriter in package freeplane.modes.mindmapmode
+* Copy creates HTML for multiple selection.
+* Light Bulb as icon integrated.
+* new spanish translation of documentation map. Thanks to Natxo.
+* Copy limited to filtered nodes
+
+===============================
+FreeMind 0.9.0 Beta 8
+===============================
+* bug fix: feedback.increase must not be called before auto properties with language setting has been loaded
+* SimpleHTML: icons for bold and italic actions replaced
+* SimpleHTML: shift + enter inserts <br>
+* SimpleHTML: <END > - Markierung removed
+* bug fix: NodeNote.Registration.NotesManager.mLastContentEmpty declared static
+* Filter has no border in the toolbar, in order to look like every other toolbar item
+* Bug fix: automatic save when note window is changed.
+* Bug fix: Close closes maps when modes without maps are displayed.
+* Bug fix: [ 1559543 ] Space into attribute folds the node (0.9.0 beta7)
+* Bug fix: Note is not cleaned if newly selected node has no note
+* Bug fix: HTML Tab opened first with plain text content
+* Bug fix: I have a multiline node that there is allways an empty line displayed between the text
+* Bug fix: [ 1563410 ] "use plain text" adds blank lines
+* Bug fix: Background of the inline editor must not be gray
+* Bug fix: Startup user directory creation
+* Bug fix: slider position at first start corrected.
+* New polish translation. Thanks to the author.
+* New slovenian translation. Thanks to the author.
+* Fixed html exports. New JUnit tests available.
+* Fixed browser applet.
+* Keyboard support for enter/leave note at alt-n.
+* Bug fix: Delayed selection time and others are number properties now.
+* Notes are displayed in tooltips (currently, the entire note is displayed).
+* ToolTips are back and its width is an option, now.
+* Moved new search to search menu.
+* Title gets a '*', when map gets dirty. Path is added to title.
+* Bug fix: patterns are saved now.
+* Important Bug Fix: Notes are saved in XML now.
+* Mac Changes: integration in system improved.
+
+===============================
+FreeMind 0.9.0 Beta 7
+===============================
+* Kafenio replaced by SimplyHTML
+* Bug fixes: two HTML exports adapted to new file format
+* Patch from Eric for XSLT export introduced. Thanks.
+
+===============================
+FreeMind 0.9.0 Beta 6
+===============================
+* Restrictions on node positions removed,
+* the node motion view oval is filled red if node overlap is possible.
+* Selected nodes are not indicated on printed / exported maps
+* Bug fixes
+* Mac changes: whole application is in one package
+* Slider for Notes introduced.
+* FreeMindStarter introduced to detect wrong java versions.
+* user.properties are obsolete and were removed. auto.properties are replacing them
+* Logging to file enabled.
+* Notes are always present and directly stored (without the plugin notation)
+* Added option to preferences to not load last opened map on startup.
+* Startup shows progress messages.
+* Limited the plugin search to two directory levels.
+* Added the turkish translation. Thanks to the author.
+* Note symbols are back.
+* Bug fix: [ 1536205 ] Fail to revert
+* Load of plugins generalized for Mac, more flexible ClassLoaders now.
+* Started to generalize URL and hyperlink handlings. Done.
+* Patch revised and introduced: 1532279 link between nodes on different freeplane maps, thanks to the authors.
+* New feature: history of node is exportable now.
+* Fixed map dragging outside of the window.
+* New feature: Scripting via Groovy introduced.
+* Bug fix: layout of root with attributes
+* Enhancements of the scripting feature.
+
+===============================
+FreeMind 0.9.0 Beta 5
+===============================
+* Search and Replace in History Dialog.
+* Load and Save Format of HTML nodes realized as discussed by the directors board.
+* Save All implemented.
+* Adapted for intel macs. Thanks to tizzyd
+* Safety extension for Html nodes: if they don't give well formed Xml, we replace the tags.
+* \0 characters are removed from HTML.
+
+===============================
+FreeMind 0.9.0 Beta 2
+===============================
+* Kafenio for notes
+* Paste and Encrypted Node register new attributes in the attribtue registry correctly
+* Bug fix for Attribute Registry
+* Button on/off removed from Filter Toolbar
+* Standard filter conditions "No Filtering" and "Selected Nodes" added to Filter Toolbar
+* Pattern: Duplicate, create from nodes, intersection of patterns from nodes.
+* Bug fix im Browser Toolbar: the browsed file was loaded twice, if its name was typed in the combobox
+* Attribute View Type is saved in a Mind Map document
+* Changes from Henning Dierks (thanks!): node selection and text field background colors adjusted.
+* NodeView has got a new multi component capable layout manager
+* Export of local hyperlinks to XHTML/HTML with image corrected.
+
+===============================
+FreeMind 0.9.0 Beta 1
+===============================
+* VariableSizeCardLayout implemented for Preference Dialog
+* Automatic layout preference design bugs fixed
+
+===============================
+FreeMind 0.9.0 Alpha 1.02
+===============================
+Merged with WYSIWYG Version
+
+===============================
+FreeMind 0.9.0 Alpha 1.01
+===============================
+Merged with Attribute Version
+
+===============================
+FreeMind 0.8.1 FA Alpha 10.02
+===============================
+Attributes can be leaved with alt+F9
+
+===============================
+FreeMind 0.8.1 FA Alpha 10.01
+===============================
+Print Preview
+
+===============================
+FreeMind 0.8.1 FA Alpha 9.04
+===============================
+* Key strokes for attributes can be set using the preferences Dialog
+* Save as HTML, RTF and Text consider filter settings
+* Size of buttons with empty key strokes in the Option Panel are set correctly
+
+===============================
+FreeMind 0.8.1 FA Alpha 9.03
+===============================
+*The export plugins using XSLT changed:
+ Only nodes passed the filter condition inclusive settings
+ in the "Show Ancestors" and "Show Descendants" - checkboxes in the Filter Toolbar
+ are exported in OOWriter and generally by the XSLT exporter.
+*Bugfixes
+
+===============================
+FreeMind 0.8.1 FA Alpha 9.01
+===============================
+Merge with FreeMind 0.8.1 beta 3
+
+===============================
+FreeMind 0.8.FA Alpha 8
+===============================
+* Undo for all attribute operations
+
+* There are only four possible situations:
+ (a) all the attributes are shown everywhere,
+ (b) no attributes are shown anywhere, and
+ (c) only some attributes are shown, accross the whole map
+ (d) all attributes are temporarily shown for the currently selected node, a shortcut alt+f9
+* the "show all", "hide all" ans "show selected" attribute actions are a submenu of the view menu
+* the rest attribute actions (dialogs) have been put to tools
+
+* the button On/Off only switch the filtering, rather than editing
+* When the label "No Filtering" is shown in the combo box, the On/Off button is be inactive
+
+Filter Composer Dialog:
+* Apply applies the filter selected in the list of filters, regardless of the filter selected in the combobox in the toolbar
+* OK closes the dialog and sets the currently selected filter in the list of filters as the current filter in the combobox
+
+Other improvements:
+* Radio Button Items in Menus
+* other changes and refactorings
+
+===============================
+FreeMind 0.8.1, 2008-02-27
+===============================
+* Word wrap enabled for notes.
+* Refactoring: MindMap specific actions moved to mindmapmode.
+* Refactoring: Each Model comes with its specific ModeController.
+* Refactoring: Each mode has a default ModeController for the case that all maps are closed.
+* Refactoring: Each model has its own HookFactory.
+* Startup: ProgressBar added.
+* Browse Mode: Note viewer written.
+* Browse Mode: Encrypted node viewer written
+* Browse Mode: Reminder viewer written
+* Encryption: Bug fix for empty encrypted nodes.
+* New and revised translations nn and se (thanks to the authors)
+* New translation of the main documentation into german (thanks to the authors)
+* Clean up: Removed clipboard image export that has never worked.
+* Bug fix: Removing reminders call nodeChanged.
+* Documentation is opened in german, if german is the current language.
+* Bug fix: screen title when all maps are closed.
+* Integrated: [ 1274572 ] open / save : remember last directory
+* Implemented undo for notes.
+* '"' are not used to generate File Name Proposals in Save dialogs.
+* Bug fix: Menu bars are displayed correctly when all (browse) maps are closed.
+* Local links get local arrows and are supported in the browser.
+* Bug fix: folded empty nodes have the bubble symbol. Thanks to Dimitri.
+* flash export when title is html corrected [ 1893891 ] flash export not visible in IE7
+* script cookies added
+* sort nodes: bug fix for nodes with same text
+
+Beta 2:
+-------
+* Introduced: [ 1390137 ] patch for bug [ 1368727 ] oowriter 2.0 freeplane.0.8.0-oowriter.2.0.patch
+* Switched from JaxB to JibX, which is free. Thanks to Dennis Sosnoski for the help.
+* New icon: bad smily
+
+Beta3:
+------
+* New features: Export to Applet and Flash added.
+* New feature: move nodes left/right.
+* Bug fix: fit to page (thanks to Dimitri).
+
+Beta4:
+------
+* Style editor added.
+* Pattern editor added.
+* Modes menu integrated into map menu to save menu place.
+* Root node curves improved.
+* Automatic layout patterns can be specified in the preferences dialog
+
+===============================
+FreeMind 0.8.0-ALPHA-DAN-5:
+===============================
+ * HTML selections are pasted directly as rich text, whether they
+ were made in a web browser, Microsoft Word document, or any
+ other application that puts HTML to the clipboard. Whether the
+ picture elements should be pasted or filtered away is driven by
+ the user property cut_out_pictures_when_pasting_html (=true or
+ =false),
+
+ * HTML nodes are edited using WYSIWYG editor,
+
+ * HTML nodes with <body> tag get limited width, like plain text
+ nodes. To have HTML nodes with unlimited width, use the tag
+ <body width=""> or the like of <body width="900">,
+
+ * after a single HTML node is copied to the clipboard, it is
+ pasted by applications understanding HTML directly, as rich
+ text. An example of such an application is Microsoft Word,
+
+ * copying of HTML nodes and pasting them as plain text does not
+ paste HTML tags
+
+ * when exporting to HTML, title of the web page does not show HTML
+ tags
+
+ * there is a new function Use Rich Formatting that turns plain
+ text node into HTML node
+
+ * action Use Plain Text added
+
+ * after Use Rich Formatting action, new long nodes are rich
+ formatted. After Use Plain Text action, new long nodes are plain
+ text
+
+ * scrollbars can be switched off using the property no_scrollbar =
+ true; can be only set manually in user.properties,
+
+ * user icons can be added. PNG files of the icons have to be added
+ to the folder .../.freeplane/icons; the comma separated list of
+ icon names without the .png extension has to be set in the user
+ property user_icons,
+
+ * style to be used in HTML nodes can be determined by setting the
+ user property html_long_node_head, like html_long_node_head =
+ <style><!-- td { border-style: solid } th { border-style: solid
+ } table { border-style: solid } --></style>,
+
+ * in the long node editor, SHIFT+ENTER enters a new line,
+ regardless of the "Enter Confirms" setting. Also, ALT+ENTER
+ confirms regardless of the "Enter Confirms" setting,
+
+ * when exporting to HTML using the exporting function as of
+ FreeMind 0.7.1, the list bullets in exported HTML nodes are
+ shown. HTML link contained in HTML nodes are styled normally and
+ underlined.
+
+ * find function now works as a keyword search. An example of
+ search is - word "two other"; node matches if it (a) contains
+ substring "word", and (b) it contains substring "two other".
+
+===============================
+FreeMind 0.8.0, 2005-09-06
+===============================
+* From Koh (thanks): Standard Macintosh application use Command(meta) key based Keyboard shortcut. (ex. copy is Command(meta) + C). I think that mac version's freeplane should allow to assign meta key based shortcut.
+* Bug fix: AutomaticLayout.java
+* Undo action added.
+* Added edit node to the undo-actions.
+* Added addNode/deleteNode to the undo-actions.
+* Added cut/paste/del to undo-actions.
+* no root folding.
+* Rearranged the menus.
+* Bug fix: icon selection can be canceled.
+* Plugins are now well distributed over the menus.
+* Blind icons to align the menus (in development)
+
+* NodeView selection mechanism refactored
+* Background color is changeable
+* Plugin for "change management" introduced
+* Now, TAB is usable for insertion of nodes. This is useful for Macs.
+
+* Unified JaxB usage
+* Transfer from plugin properties to XML started
+
+* Plugins are configured via XML now.
+* Checked menu items added.
+
+* Bold menu is now checked/unchecked if bold/normal
+
+* Plugins can have registration parts that are called at each map startup.
+* UnfoldAll is mouse wheel sensitive.
+* Folding can be undone (for children too).
+* Multiple move nodes is now possible + undoable
+
+* More undoables: Edge color, italic, underline
+* Format of new nodes is now automatically taken from the last format changes
+* Find has an icon, such that it is more visible.
+* There is a filter possibility for XmlActions
+* Selection corrected after execution of NodeHookActions.
+
+* Font family and font size are undoable now.
+
+* Changed several occurences of setFolded to the undoable method.
+* Added the help plugin
+* Changed the plugin class loader behaviour completely.
+
+* Splash screen added
+* Automatic layout layouted
+* NodeNote improved
+* Bug with zoomIn corrected
+
+* Application is more or less fit for Mac OS X
+
+* NewParentNode is working again and is undoable
+* ImportLinked... are messaging if the node is not correct (i.e. admits no link to another mindmap).
+
+* Node color action is undoable now.
+
+* Undo respects bundle of changes as a single change now.
+* Undo refactored.
+
+* Hooks are undoable now, tested with AutomaticLayout.
+
+//commented out: * Icons appear on the right side on the right side of the node.
+* More Undo: icon adding and removing and node blend action.
+
+* icon selection and other MindMapHooks (like unfold all) are undoable now
+ (here, no undo- or redoaction are performed, the undo information is given by the actions
+ the hook performs).
+* Apply patterns, edge width, edge style and node styles are undoable
+* Format copy introduced.
+* Cloud actions undoable. (Color treatment for new clouds is missing).
+* Arrows are undoable now (including color, remove, heads).
+* Icons improved, node background is editable now, strings extracted
+* NEW Add arrow link action added to insert menu.
+
+* Local hyperlinks enabled.
+* Link targets are shown in the status bar on mouse over.
+* Text of the status bar content improved.
+* Bug fix for reading arrow link inclinations.
+
+* Export to image reactivated. Export to clipboard added but not tested.
+* Export via XSLT revised. New HTML export added (java script version from Miika Nurminen, 12.7.2004. Thanks.
+* New HTML export added from Markus Brueckner. Thanks
+
+* Help and SVG Export added as Plugins.
+* PDF export added.
+* Startuptime reduced.
+* Little improvement for the Icon selector: the last position is restored next time it is opened.
+* Bugfix: New parent node. Export to HTML III.
+
+* Repaired: Icons appear on the right side on the right side of the node.
+* Bug fix: NewParentNode and root
+* icon for "insert child node"
+* Packaging of default plugins
+
+* Plugins internationalized.
+* Bug fix: Plugins under Windows.
+* Bug fix: Export to XHTML
+* Bug fix: Export branch.
+* Bug fix: Classpath and Mac OS X
+* Icon selector has remove actions
+* Japanese translation merged (thanks to Koh for the fast reaction).
+* Fixed the proposed file names of all export hooks
+
+
+RC 1
+----
+* Bug fix: Cut/Paste
+* New translations chinese and russian.
+
+* Bug fix: Drag'n'Drop to children nodes with total loss is no longer possible.
+
+* New Feature: encrypted nodes introduced (DON'T RELY ON THIS ENCRYPTION. IT IS WEAK BECAUSE IT IS PASSWORD BASED!)
+* New Feature: HTML export III enhanced by a clickable image map.
+* Bug fix: export unsaved maps.
+* Import actions are new undoable.
+* Join node is undoable
+* Split node is undoable
+* Two new portugese translations (thanks to the authors).
+* New Feature: Encrypted Maps (and not only encrpyted nodes).
+* Icons for encryption improved
+* Bug fix: docu map for mac os x.
+
+* Bug fix for the moving node bug provided by Dimitri. Thanks!
+* Icons revised. Now, mostly come along in 16x16 format and are taken from /usr/share/icons/crystalsvg/16x16/...
+
+* Encrypted nodes store their randomly generated salt. This salt is changed each time the map is saved.
+* Wrong passwords produce a dialog.
+* Menu structure revised.
+* Bug fix: Toggle children corrected
+* Debugging removed from encrypted nodes.
+* Popup menu: format actions added.
+
+* GTK and free form as look and feel added
+* Export menus revised.
+* Merged new version from Miika Nurminen. Thanks!
+* Merged the new splash screen from Marc Carson. Thanks.
+* Bug fix for: For editing long nodes I could set el__enter_confirms_by_default = false.
+* Bug fix: Show revisions in yellow. Thanks to michaelschwarz.
+* Bug fix: packaging under linux.
+* Bug fix: Quit and Cancel under Macintosh.
+* Bug fix: Toggle encrypted nodes for unencrypted nodes give an error message.
+
+RC2
+---
+* New freeplane.sh from Eric.
+* Arrow moves with the mouse are undoable now.
+* mm files can be associated with FM under Mac OSX now.
+* Patch for icons in patterns integrated. Thanks to the community.
+* Bug fix: FoldAll bug removed.
+* Delayed selection is back (due to Dimitris wish).
+* Introduced Dimitris patch on not synchronized Edit-Boxes. Thanks to Dimitri.
+* Introduced Dans Resource changes.
+* Adjusted popup menus
+* http://www.apple.com/support/downloads/javaupdate142.html
+* Bug fix: Class Loader generation is now cached.
+* New external plugin: time management. It is now possible to add dates to nodes and
+ to schedule resubmissions, which remind at a certain date to a given node.
+
+* japanese traduction introduced.
+* new state icons (look for reminders)
+* tooltips may occur more than one
+* bug fix: move of nodes with created/modified information
+* bug fix: created/modified info appears directly.
+* bug fix: upper case and xml (for the turkish version)
+* bug fix: Find and Find Next work again.
+
+* plugin data survive even when the plugin is not present.
+* bug fix: reminders can be deleted and changed.
+* Reminder have hours and minutes now.
+* bug fix: reminders are undoable now.
+* bug fix: Time Management Window has a title now.
+
+* enhanced german translation.
+* timed out nodes are selected.
+* some insert menu points are put into the popup menu.
+* bin-max.zip created.
+
+RC 3:
+-----
+* Bug fix: dot removed.
+* New feature: hierarchical icons.
+* Bug fix: icon from encrypted node corrected.
+
+* Bug fix from Dimitri: Random Node id generation.
+* Bug fix: english translation typos from Dan.
+* Bug fix: "new parent" order of childs.
+
+* New icons: priority 1-7
+* Bug fix: pdf/svg fonts are now embedded.
+
+* Bug fix: mapOpened removed from ControllerAdapter
+* With permission of Dan, the NodeNotes are back.
+* Bug fix: Node background colour in bubble nodes.
+* Bug fix: No appropiate actions are enabled when all maps are closed.
+* Bug fix: font name is copied by Format Copy.
+
+* New feature: Collaboration mode (alpha version)
+* Bug fix: java 1.5 compiler changes (thanks to Dimitri and to brcha)
+* Bug fix: Typing into the node gulps the first letter. Due to Dimitri.
+
+* New feature: Revert map.
+* Started to write down a scheme of the mm format.
+
+* Collaboration: The map is sent to the invited user.
+* New translation into korean. Thanks to the author.
+* Translation into chinese enhanced. Thanks to william chen - (willyann).
+
+* Today button added for time management.
+* Encryption menu items disabled if not applicable.
+* Bug fix: Automatic layout applies to folded childs.
+* New feature: Time Scheduler list added.
+
+* Bug fix: revision plugin shutdown implemented.
+* Storage of creation/modification times moved to <node> tag. This times are always updated, even if its display is turned off.
+* Bug fix: removal of node background colors introduced.
+
+* Moved personal freeplane folder to '.freeplane' to hide it under Linux and MacOSX. The old folder is moved the first time.
+
+* Window properties of TimeList window is stored in preferences
+* Nodebackground color is used in patterns and copy-format
+
+* New map: filename is better chosen (special characters are removed).
+* Collaboration: messages are sent zipped now.
+
+* patch from ewl (thanks): new version of classpath resolution suggested by ewl under patch [ 1154510 ] Be able to give absolute classpath entries in plugin.xml
+* corrected behaviour of centerNode and displayNode.
+
+* Bug fix: encrypted nodes are stored correctly, even if they are closed before saving.
+* Patch introduced: Drag&Drop of files into FM under Windows. Thanks to cerney.
+
+* Window properties of TimeList window enhanced by sorting info. Close action fixed.
+* Added selection methods to MindmapActions.
+* Select all and select branch added.
+* Version updater installed. All mindmaps loaded are automatically converted in the eventually changed
+ actual mindmap xml format by the freeplane_version_updater.xml
+* Automatic language chooser added. (Now, FM tries to load the user's language. If this does not exist, english is chosen).
+* New slowenian translation.
+
+* Merged the node moving algorithm and implementation of Dimitri. Many thanks.
+* Bug fix: isPrinting and title of screen.
+* Bug fix: copying of links generates new unique ids.
+
+* Bug fix: cutting nodes preserves order.
+* Time Management Reminders don't display boxes anymore. Instead they use
+ blinking nodes.
+* MindMapIcons are singletons now.
+* Bug fix: folded root can be unfolded now.
+* Docu bug fix: no popup in reminders any more.
+
+* First version of preference window added.
+* Some property change listener implemented.
+* Bug fix: new nodes have a proper text box.
+
+RC 4:
+------------
+* Some new languages
+* Size+Position is stored for the option panel. Moreover, the first size is adjusted to 800x600.
+* Bug fix: [ 1207937 ] [0.8 rc3] Null pointer exception on map load blocks whole FM
+* Notes have an icon now.
+* Hack removed: encrypted nodes: the xml attribute AA_NODE_CLASS needs not to occur as the first attribute.
+* Antialias and selection option changes are now directly applied.
+* Option panel stores its panel
+* Removing clouds stores its color for undo.
+* Added icons to popup menu.
+* Version updater adapted to process renames from RC3->RC4.
+* Added readme.txt for the src package
+* XML must not contain any zero characters.
+* Fixed: Filename construction
+* Integrated patch: NodeFoldingPatch 1166708. Thanks to John Cerney.
+* Node styles, color, selected node, edge, cloud, link color change with option change.
+* Little bugs in XSLT exports removed.
+* All colors in the option panel now have a "Reset color" popup menu.
+* Moved "Goto" to navigate menu.
+* Renamed XML representation of encrypted nodes.
+* Fixed: File mode (added linkRegistry to FileMapModel).
+* New french translation.
+* Separators in ToolBar
+* Bug fix: folding with the mouse wheel folds selected nodes.
+* Changed cursor when over the ellipsis that enables node moving.
+* Added keyboard shortcut for property menu.
+* Cleaned up format menu.
+* Changed option panels keystroke page to have two columns
+* Merge with Dimitris Layout adjustments:
+ - node positions do not change, when nodes are folded or unfolded.
+ - node spacing and graphical link positions returned to the version of 0.7.1
+ - padding for bubble style node is bigger now.
+* Fix: HYPERLINK_POSITION: the hyperlink is activated when clicked to the region of the node closer to root.
+
+RC 5:
+-----
+* Enabled standard preferences menu under Mac OS X.
+* Bug fix: NodeNote icon is present at file load.
+* New layout of edges emerging from root.
+* Started to write import XSLT from MindManager X5.
+* Reduced memory consumption due to lazy initialization of Node attributes like icons, tooltips, etc.
+* Validation task added to build-file
+* Translations introduced (thanks to the authors).
+* freeplane.xsd improved. Works on the command line (but not with ant...) using
+ find . -name "*.mm" -exec xmllint --noout --schema freeplane.xsd {} \;
+* mindmanager2mm.xsl done.
+* New feature: Import from Mind M*nager X5.
+* Commented new layout for root nodes out. To reactivate, go to method
+ Point getOutPoint(Point destinationPoint, boolean isLeft) and say if(true)
+* Problem solution: Faster shutdown of maps, as redisplay of the map is only performed if the changed node is visible.
+* Import folder structure now folds the nodes. This method is to slow to be useful.
+* New feature: Export to Open Office Writer
+* Memory consumption reduced.
+
+RC 6:
+-----
+* Added option for amount of undo steps.
+* set image by file chooser corrected (undoable).
+* html export (variant with map picture) corrected and enhanced by notes and embedded images.
+* Unused method removed from MapModel.
+* Bug fix: Hierarchical Icons with "cut", "delete" and "undo add icon".
+* Actions are disabled if no map is open.
+* Bug fix: [ 1251054 ] Unicode input and display in HTML.
+* New lithuanian translation. Thanks to oxiris.
+* Update version XSLT is only applied if neccessary (for 0.7.1 it is not applied).
+
+===============================
+FreeMind 0.7.2:
+===============================
+* Pluginmechanism added
+* Messagebox if recent file not present
+* Special key for mac insert
+* ModeControllerHookAction added.
+* Permanent Hooks can save their things as XML
+* Toolbar size reduced by Stefan Zechmeister
+* FitToPage corrected by Dimitri
+* Lazy initialization of Jython to increase startup speed.
+* Icon size reduced
+* Unfold all added
+* Bug fix: XMLWriter addes additional \n for contents.
+* setNode is now called automatically.
+* Jython is substituted by an attrappe
+* Fold and Unfold one stage is available now.
+
+===============================
+FreeMind 0.7.1, 2004-02-15
+===============================
+* Bug fix: automatic save occurs not so often (in fact, only if something has changed since the last automatic save), and uses a better filename.
+* Daniel changed the documentation.
+* Bug fix: Documentation opened twice.
+* Security fix: path for auto save is changeable and points to the freeplane user properties directory by default
+* At normal shutdown, the auto saves are deleted, but this is configurable.
+* Bug fix: When a map is closed, the saving stops (Thanks to Karim).
+* Bug fix: Blocking is enabled for graphical link popup menu.
+* Ant task (development only): ant run is working.
+
+RC3:
+----
+* Bug fix: select sons of root with shift now gives only sons on the correct side.
+* Removed the delayed selection from the menu, it is deprecated now, and will be removed completely at the next release.
+* Corrected shading of the rood node for drag&drop
+* Bug fix: Selection mechanism: if drag&drop is started, the node under the cursor is selected. Branches are now selected using AltGr or Alt (depends on OS).
+* Mac change: the browser call is changed according to Nick. Thanks.
+* Bug fix: If more than one selection, folding and editing with mouse disabled. The old behaviour was not useful as the last selected was opened in the editor or was folded even if one pressed on another node.
+* Little feature: folding of many selected nodes is working.
+* Bug fix: Continuous selection with Shift key corrected. Now, more than one of these selection ranges can be used.
+* Logger is now available at the FreeMind interface.
+* Automatic save introduced (necessary feature until undo is available)
+
+RC2:
+----
+* Bug fix: the context menu for graphical links appears not only in the neighbourhood of the link line, but appears in the *FILLED* arc, that is surrounded by the arc. Fixed.
+* Selection method added: selection via mouse click as in office programs.
+* Click method:
+ - inner node
+ + single click: fold
+ + double click: fold
+ - leaf (node without childs)
+ + single click: edit
+ + double click: edit
+* POSITION is only saved if the node is son of root. This prevents having lots of POSITION tags in the saved XML.
+* POSITION is chosen right if dropped onto root. (left half, pasted to left, right half, pasted to - you guess it? - right!)
+* Left and Right is respected with ENTER.
+* Bug fix: cutting nodes including any of their children or grant-children works now. This removes the bug with a moved tree that is completely marked.
+
+RC1:
+----
+* Bug fix: nodes with arc and bubble nodes have antialiased text when the antialiasing of edges is on
+* Removed the arc, that distinguished bubble nodes from folded nodes. More discussion is needed.
+* Selection method changed: double click is now only for editing if the node is *not* an inner node.
+* Documentation enhanced: Creation of graphical links is better described
+* Bug fix: Zoom in/out uses step one again.
+* Bug fix: System default look and feel is set if so stated in the freeplane.properties or user.properties.
+
+===============================
+FreeMind 0.7.0:
+===============================
+* Bug fix: Open and Quit are working if no map is present
+* The last closed map can be reopend using a key stroke.
+* Bug fix: Context menu is back.
+* Selection method changed and simplified: double click is now for editing and single for mark and fold.
+* Browser is working again.
+* Folded nodes have now an arc on their outer side, where the edge comes into.
+* Solved the left/right problem of FreeMind.
+* Patches for PrintSetup, RTF and FoldedIcons added. Thanks to the contributors.
+* Japanese traduction added
+* Corrected the browser call statement. Hopefully, it is right now.
+* Changed behaviour of user.porperties. It is now created if not present.
+* Moreover, added a FAQ menu item.
+* Two maps with same name bug solved.
+*
+* Add new files for the browse mode.
+* Browse mode is working again. Some structural improvements. Deleted doc/pics and doc/compile.
+* Bug in printing routine removed
+* Copy&Paste works now even with links (they are properly removed)
+* Delay in node selection introduced.
+* Changed version number to 0.7.0.
+* Introduced Dimitris patch for nodes starting with /.
+* German translation revised.
+* Documentation enhanced.
+* First not integrated version of the link registry
+* First version with clouds and arrow links.
+* Images corrected. Now they display correctly (at least under Linux).
+* Internal link handling entierly improved. Now there is a goto on right click onto a link.
+* Moreover, it is possible to zoom the map using shift + mouse wheel.
+* Link feature matured.
+* Mouse wheel zoom support using control key.
+* Lots of bugs removed.
+* The selection method is now changeable.
+* freeplane.sh is now better (thanks to Peter Torngaard).
+* Now arrow links can be cut and pasted right.
+* Moreover, we have to new translations (dk and it).
+* Now the directory structure is as of version 0.6.7
+* Now, right clicking an arrow link, a list of all link targets is presented.
+* Build corrected.
+* Pasting link sources works now good. Link targets are removed from paste.
+* Pattern can also affect it sons, selection method improved.
+* Clouds are now better drawn.
+* Registry is starting to work.
+* Now, hidden links can be reached via right click.
+* Removed historic text files
+* Some structural changes
+* Two nice features: choose the default browser
+* Long node dialog remembers the enter-confirm-state
+* adapted the standard color of a cloud to a brighter value (f0f0f0)
+
+===============================
+Freemind 0.6.7, 2003-10-25
+===============================
+* Introduction of icons
+
+===============================
+FreeMind 0.6.5, 2003-09-04
+===============================
+
+===============================
+FreeMind 0.6.1, 2003-02-08
+===============================
+
+===============================
+FreeMind 0.6, 2003-02-01
+===============================
+
+===============================
+FreeMind 0.5, 2002-08-24
+===============================
+
+===============================
+FreeMind 0.4, 2001-07-07
+===============================
+
+===============================
+FreeMind 0.3.1, 2001-03-27
+===============================
+
+===============================
+FreeMind 0.3.0, 2001-03-25
+===============================
+
+===============================
+FreeMind 0.2.0, 2000-11-02
+===============================
+
+===============================
+FreeMind 0.1.0, 2000-08-05
+===============================
+
+===============================
+FreeMind 0.0.3, 2000-07-09
+===============================
+
+===============================
+FreeMind 0.0.2, 2000-06-27
+===============================
diff --git a/freeplane/external-resources/ortho/dictionary_de.ortho b/freeplane/external-resources/ortho/dictionary_de.ortho
new file mode 100644
index 0000000..d48ccb3
Binary files /dev/null and b/freeplane/external-resources/ortho/dictionary_de.ortho differ
diff --git a/freeplane/external-resources/ortho/dictionary_en.ortho b/freeplane/external-resources/ortho/dictionary_en.ortho
new file mode 100644
index 0000000..bb5d8f6
Binary files /dev/null and b/freeplane/external-resources/ortho/dictionary_en.ortho differ
diff --git a/freeplane/external-resources/ortho/dictionary_fr.ortho b/freeplane/external-resources/ortho/dictionary_fr.ortho
new file mode 100644
index 0000000..f2ada61
Binary files /dev/null and b/freeplane/external-resources/ortho/dictionary_fr.ortho differ
diff --git a/freeplane/external-resources/templates/conceptMap.mm b/freeplane/external-resources/templates/conceptMap.mm
new file mode 100644
index 0000000..7807a89
--- /dev/null
+++ b/freeplane/external-resources/templates/conceptMap.mm
@@ -0,0 +1,67 @@
+<map version="0.9.0">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node TEXT="New Concept Map">
+<hook NAME="MapStyle" max_node_width="600">
+ <conditional_styles>
+ <conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="styles.connection">
+ <node_periodic_level_condition PERIOD="2" REMAINDER="1"/>
+ </conditional_style>
+ <conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="styles.topic">
+ <node_level_condition VALUE="2" IGNORE_CASE="true" COMPARATION_RESULT="0" SUCCEED="true"/>
+ </conditional_style>
+ <conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="styles.subtopic">
+ <node_level_condition VALUE="4" IGNORE_CASE="true" COMPARATION_RESULT="0" SUCCEED="true"/>
+ </conditional_style>
+ <conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="styles.subsubtopic">
+ <node_level_condition VALUE="6" IGNORE_CASE="true" COMPARATION_RESULT="0" SUCCEED="true"/>
+ </conditional_style>
+ </conditional_styles>
+ <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="Arial" 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.connection" COLOR="#606060" STYLE="fork">
+ <font NAME="Arial" SIZE="8" BOLD="false"/>
+ </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>
+</map>
diff --git a/freeplane/external-resources/templates/essay.mm b/freeplane/external-resources/templates/essay.mm
new file mode 100644
index 0000000..febbd8f
--- /dev/null
+++ b/freeplane/external-resources/templates/essay.mm
@@ -0,0 +1,105 @@
+<map version="0.9.0">
+<!--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">
+<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="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.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"/>
+<edge STYLE="hide_edge"/>
+</stylenode>
+<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.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="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.question">
+<icon BUILTIN="help"/>
+<font NAME="Aharoni" SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.key" COLOR="#996600">
+<icon BUILTIN="password"/>
+<font NAME="Liberation Sans" SIZE="10" BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.idea">
+<icon BUILTIN="idea"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.note" COLOR="#990000">
+<font NAME="Liberation Sans" SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.date" COLOR="#0033ff">
+<icon BUILTIN="calendar"/>
+<font NAME="Liberation Sans" SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.website" COLOR="#006633">
+<font NAME="Liberation Sans" SIZE="10"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.list" COLOR="#cc6600">
+<icon BUILTIN="list"/>
+<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.quotation" COLOR="#338800" STYLE="fork">
+<font NAME="Liberation Sans" SIZE="10" BOLD="false" ITALIC="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.definition" COLOR="#666600">
+<font NAME="Liberation Sans" SIZE="10" BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.description" COLOR="#996600">
+<font NAME="Liberation Sans" SIZE="10" BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.pending" COLOR="#b3b95c">
+<font NAME="Liberation Sans" SIZE="10"/>
+</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>
+<hook NAME="AutomaticEdgeColor"/>
+</node>
+</map>
diff --git a/freeplane/external-resources/templates/standard.mm b/freeplane/external-resources/templates/standard.mm
new file mode 100644
index 0000000..0e7a717
--- /dev/null
+++ b/freeplane/external-resources/templates/standard.mm
@@ -0,0 +1,54 @@
+<map version="0.9.0">
+<!--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">
+<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="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>
+<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>
+<hook NAME="AutomaticEdgeColor"/>
+</node>
+</map>
diff --git a/freeplane/external-resources/xslt/mm2freeplane1_1-mm.xsl b/freeplane/external-resources/xslt/mm2freeplane1_1-mm.xsl
new file mode 100644
index 0000000..dac2f67
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2freeplane1_1-mm.xsl
@@ -0,0 +1,24 @@
+<?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="UTF-8" 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/external-resources/xslt/mm2html.xsl b/freeplane/external-resources/xslt/mm2html.xsl
new file mode 100644
index 0000000..d63bb03
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2html.xsl
@@ -0,0 +1,139 @@
+<?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/
+ -->
+
+<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>

+
+ <xsl:if test="@ID != ''">
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of select="$thisid"/>
+ </xsl:attribute>
+ </a>

+ </xsl:if>
+
+ <xsl:if test="arrowlink/@DESTINATION != ''">
+ <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: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:attribute name="href">
+ <xsl:text>#</xsl:text><xsl:value-of select="$target"/>
+ </xsl:attribute>
+
+ <xsl:value-of select="$nodetext"/>
+ </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>

+ </xsl:if>
+
+
+ <xsl:apply-templates/>
+ </li>

+ </ul>

+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2latexartcl.xsl b/freeplane/external-resources/xslt/mm2latexartcl.xsl
new file mode 100644
index 0000000..1541922
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2latexartcl.xsl
@@ -0,0 +1,267 @@
+<?xml version='1.0'?>
+
+
+ <!--
+ MINDMAPEXPORTFILTER tex %xslt_export.latex
+
+ : This code released under the GPL.
+ : (http://www.gnu.org/copyleft/gpl.html)
+ Document : mm2latexarticl.xsl
+ Created on : 01 February 2004, 17:17
+ Author : joerg feuerhake joerg.feuerhake at free-penguin.org
+ Description: transforms freeplane mm format to latex scrartcl,
+ handles crossrefs ignores the rest.
+ feel free to customize it while leaving the ancient
+ authors mentioned. thank you
+ Thanks to: Tayeb.Lemlouma at inrialpes.fr for writing the LaTeX escape scripts and giving inspiration
+
+ ChangeLog: See: http://freeplane.sourceforge.net/
+ -->
+
+<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ version='1.0'>
+ <xsl:output omit-xml-declaration="yes" />
+
+ <xsl:template match="map">
+
+ <xsl:text>
+\documentclass[a4paper,12pt,single,pdftex]{scrartcl}
+\usepackage{ngerman}
+ \usepackage{color}
+ \usepackage{html}
+ \usepackage{times}
+ \usepackage{graphicx}
+ \usepackage{fancyheadings}
+ \usepackage{hyperref}
+ \setlength{\parindent}{0.6pt}
+ \setlength{\parskip}{0.6pt}
+ \title{</xsl:text>
+ <xsl:value-of select="node/@TEXT" />
+ <xsl:text>}
+ </xsl:text>
+ <!-- ======= Document Begining ====== -->
+ <xsl:text>
+
+\begin{document}
+\maketitle
+\newpage
+
+</xsl:text>
+ <!-- ======= Heading ====== -->
+ <xsl:apply-templates select="Heading" />
+ <xsl:apply-templates select="node" />
+
+
+ <xsl:text>
+\newpage
+%\tableofcontents
+
+\end{document}
+</xsl:text>
+</xsl:template>
+
+
+<!-- ======= Body ====== -->
+
+<!-- Sections Processing -->
+<xsl:template match="node">
+<xsl:variable name="target" select="arrowlink/@DESTINATION"/>
+
+<xsl:if test="@ID != ''">
+<xsl:text>\label{</xsl:text><xsl:value-of select="@ID"/><xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:if test="(count(ancestor::node())-2)=1">
+<xsl:text>\section</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+
+</xsl:text></xsl:if>
+<xsl:if test="(count(ancestor::node())-2)=2">
+<xsl:text>\subsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+
+</xsl:text></xsl:if>
+
+<xsl:if test="(count(ancestor::node())-2)=3">
+<xsl:text>\subsubsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+
+</xsl:text></xsl:if>
+
+<xsl:if test="arrowlink/@DESTINATION != ''">
+<xsl:text>\ref{</xsl:text>
+<xsl:value-of select="arrowlink/@DESTINATION"/>
+<xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:if test="(count(ancestor::node())-2)=4">
+<xsl:text>\paragraph</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+
+</xsl:text>
+<xsl:if test="current()/node">
+<xsl:call-template name="itemization">
+</xsl:call-template>
+</xsl:if>
+</xsl:if>
+
+<!--<xsl:if test="(count(ancestor::node())-2)>4">
+
+<xsl:call-template name="itemization"/>
+
+</xsl:if>-->
+
+<xsl:if test="5 > (count(ancestor::node())-2)">
+<xsl:apply-templates select="node"/>
+</xsl:if>
+
+
+</xsl:template>
+
+<xsl:template name="itemization">
+<xsl:param name="i" select="current()/node" />
+
+<xsl:text>\begin{itemize}
+</xsl:text>
+<xsl:for-each select="$i">
+
+<xsl:if test="@ID != ''">
+<xsl:text>\label{</xsl:text><xsl:value-of select="@ID"/><xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:text>\item </xsl:text>
+<xsl:value-of select="@TEXT"/>
+
+<xsl:if test="arrowlink/@DESTINATION != ''">
+<xsl:text>\ref{</xsl:text>
+<xsl:value-of select="arrowlink/@DESTINATION"/>
+<xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:text>
+</xsl:text>
+
+</xsl:for-each >
+
+<xsl:if test="$i/node">
+<xsl:call-template name="itemization">
+<xsl:with-param name="i" select="$i/node"/>
+</xsl:call-template>
+</xsl:if>
+<xsl:text>\end{itemize}
+</xsl:text>
+</xsl:template>
+<!--Text Process -->
+<!--<xsl:apply-templates select="Body/node()"/>-->
+
+<!-- End of Sections Processing -->
+
+
+
+<!-- LaTeXChar: A recursif function that generates LaTeX special characters -->
+<xsl:template name="LaTeXChar">
+<xsl:param name="i"/>
+<xsl:param name="l"/>
+
+<xsl:variable name="SS">
+<xsl:value-of select="substring(normalize-space(),$l - $i + 1,1)" />
+</xsl:variable>
+
+<xsl:if test="$i > 0">
+
+<xsl:choose>
+ <xsl:when test="$SS = 'é'">
+ <xsl:text>\'{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ê'">
+ <xsl:text>\^{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'è'">
+ <xsl:text>\`{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ï'">
+ <xsl:text>\"{\i}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'î'">
+ <xsl:text>\^{i}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'Ã '">
+ <xsl:text>\`{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'á'">
+ <xsl:text>\'{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'â'">
+ <xsl:text>\^{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ç'">
+ <xsl:text>\c{c}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ô'">
+ <xsl:text>\^{o}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ù'">
+ <xsl:text>\`{u}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'û'">
+ <xsl:text>\^{u}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = '|'">
+ <xsl:text>$|$</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = '_'">
+ <xsl:text>\_</xsl:text>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$SS"/></xsl:otherwise>
+</xsl:choose>
+
+<xsl:text></xsl:text>
+
+<xsl:call-template name="LaTeXChar">
+<xsl:with-param name="i" select="$i - 1"/>
+<xsl:with-param name="l" select="$l"/>
+
+</xsl:call-template>
+</xsl:if>
+
+</xsl:template>
+<!-- End of LaTeXChar template -->
+
+
+
+
+
+<!-- Enumerates Process -->
+<xsl:template match="Enumerates">
+<xsl:text>
+\begin{enumerate}</xsl:text>
+<xsl:for-each select="Item">
+<xsl:text>
+\item </xsl:text>
+<xsl:value-of select="."/>
+</xsl:for-each>
+<xsl:text>
+\end{enumerate}
+</xsl:text>
+</xsl:template> <!--Enumerates Process -->
+
+<!-- Items Process -->
+<xsl:template match="Items">
+<xsl:text>
+\begin{itemize}</xsl:text>
+<xsl:for-each select="node">
+<xsl:text>
+\item </xsl:text>
+<xsl:value-of select="@TEXT"/>
+</xsl:for-each>
+<xsl:text>
+\end{itemize}
+</xsl:text>
+</xsl:template> <!--Items Process -->
+
+</xsl:stylesheet>
+
diff --git a/freeplane/external-resources/xslt/mm2latexbook.xsl b/freeplane/external-resources/xslt/mm2latexbook.xsl
new file mode 100644
index 0000000..f9f4a44
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2latexbook.xsl
@@ -0,0 +1,254 @@
+<?xml version='1.0'?>
+
+ <!--
+ MINDMAPEXPORTFILTER txt %xslt_export.latexbook
+
+ : This code released under the GPL. :
+ (http://www.gnu.org/copyleft/gpl.html) Document : mm2latexarticl.xsl
+ Created on : 01 February 2004, 17:17 Author : joerg feuerhake
+ joerg.feuerhake at free-penguin.org Description: transforms freeplane mm
+ format to latex scrartcl, handles crossrefs ignores the rest. feel
+ free to customize it while leaving the ancient authors mentioned.
+ thank you Thanks to: Tayeb.Lemlouma at inrialpes.fr for writing the LaTeX
+ escape scripts and giving inspiration ChangeLog: See:
+ http://freeplane.sourceforge.net/
+ -->
+
+<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ version='1.0'>
+ <xsl:output omit-xml-declaration="yes" />
+
+ <xsl:template match="map">
+
+ <xsl:text>
+\documentclass[a4paper,12pt,single,pdftex]{scrbook}
+\usepackage{ngerman}
+ \usepackage{color}
+ \usepackage{html}
+ \usepackage{times}
+ \usepackage{graphicx}
+ \usepackage{fancyheadings}
+ \usepackage{hyperref}
+ \setlength{\parindent}{0.6pt}
+ \setlength{\parskip}{0.6pt}
+ \title{</xsl:text>
+ <xsl:value-of select="node/@TEXT" />
+ <xsl:text>}
+ </xsl:text>
+ <!-- ======= Document Begining ====== -->
+ <xsl:text>
+
+\begin{document}
+\maketitle
+%\newpage
+\tableofcontents
+\newpage
+
+</xsl:text>
+<!-- ======= Heading ====== -->
+<xsl:apply-templates select="Heading"/>
+<xsl:apply-templates select="node"/>
+
+
+<xsl:text>
+\end{document}
+</xsl:text>
+</xsl:template>
+
+
+<!-- ======= Body ====== -->
+
+<!-- Sections Processing -->
+<xsl:template match="node">
+<xsl:variable name="target" select="arrowlink/@DESTINATION"/>
+
+<xsl:if test="@ID != ''">
+<xsl:text>\label{</xsl:text><xsl:value-of select="@ID"/><xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:if test="(count(ancestor::node())-2)=1">
+<xsl:text>\chapter</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+</xsl:text></xsl:if>
+<xsl:if test="(count(ancestor::node())-2)=2">
+<xsl:text>\section</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+</xsl:text></xsl:if>
+<xsl:if test="(count(ancestor::node())-2)=3">
+<xsl:text>\subsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+</xsl:text></xsl:if>
+<xsl:if test="(count(ancestor::node())-2)=4">
+<xsl:text>\subsubsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+</xsl:text></xsl:if>
+
+<xsl:if test="arrowlink/@DESTINATION != ''">
+<xsl:text>\ref{</xsl:text>
+<xsl:value-of select="arrowlink/@DESTINATION"/>
+<xsl:text>}</xsl:text>
+</xsl:if>
+
+<xsl:if test="(count(ancestor::node())-2)=5">
+<xsl:text>\paragraph</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:value-of select="@TEXT"/><xsl:text>}
+</xsl:text>
+<xsl:if test="current()/node">
+<xsl:call-template name="itemization"/>
+</xsl:if>
+</xsl:if>
+
+<!--<xsl:if test="(count(ancestor::node())-2)>4">
+
+<xsl:call-template name="itemization"/>
+
+</xsl:if>-->
+
+<xsl:if test="5 > (count(ancestor::node())-2)">
+<xsl:apply-templates select="node"/>
+</xsl:if>
+
+
+</xsl:template>
+
+<xsl:template name="itemization">
+<xsl:param name="i" select="current()/node" />
+
+<xsl:text>\begin{itemize}
+</xsl:text>
+<xsl:for-each select="$i">
+<xsl:if test="@ID != ''">
+<xsl:text>\label{</xsl:text><xsl:value-of select="@ID"/><xsl:text>}</xsl:text>
+</xsl:if>
+<xsl:text>\item </xsl:text>
+<xsl:value-of select="@TEXT"/>
+<xsl:if test="arrowlink/@DESTINATION != ''">
+<xsl:text>\ref{</xsl:text>
+<xsl:value-of select="arrowlink/@DESTINATION"/>
+<xsl:text>}</xsl:text>
+</xsl:if>
+<xsl:text>
+</xsl:text>
+</xsl:for-each >
+<xsl:if test="$i/node">
+<xsl:call-template name="itemization">
+<xsl:with-param name="i" select="$i/node"/>
+</xsl:call-template>
+</xsl:if>
+<xsl:text>\end{itemize}
+</xsl:text>
+</xsl:template>
+<!--Text Process -->
+<!--<xsl:apply-templates select="Body/node()"/>-->
+
+<!-- End of Sections Processing -->
+
+
+
+<!-- LaTeXChar: A recursif function that generates LaTeX special characters -->
+<xsl:template name="LaTeXChar">
+<xsl:param name="i"/>
+<xsl:param name="l"/>
+
+<xsl:variable name="SS">
+<xsl:value-of select="substring(normalize-space(),$l - $i + 1,1)" />
+</xsl:variable>
+
+<xsl:if test="$i > 0">
+
+<xsl:choose>
+ <xsl:when test="$SS = 'é'">
+ <xsl:text>\'{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ê'">
+ <xsl:text>\^{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'è'">
+ <xsl:text>\`{e}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ï'">
+ <xsl:text>\"{\i}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'î'">
+ <xsl:text>\^{i}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'Ã '">
+ <xsl:text>\`{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'á'">
+ <xsl:text>\'{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'â'">
+ <xsl:text>\^{a}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ç'">
+ <xsl:text>\c{c}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ô'">
+ <xsl:text>\^{o}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'ù'">
+ <xsl:text>\`{u}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = 'û'">
+ <xsl:text>\^{u}</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = '|'">
+ <xsl:text>$|$</xsl:text>
+ </xsl:when>
+ <xsl:when test="$SS = '_'">
+ <xsl:text>\_</xsl:text>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$SS"/></xsl:otherwise>
+</xsl:choose>
+
+<xsl:text></xsl:text>
+
+<xsl:call-template name="LaTeXChar">
+<xsl:with-param name="i" select="$i - 1"/>
+<xsl:with-param name="l" select="$l"/>
+
+</xsl:call-template>
+</xsl:if>
+
+</xsl:template>
+<!-- End of LaTeXChar template -->
+
+
+
+
+
+<!-- Enumerates Process -->
+<xsl:template match="Enumerates">
+<xsl:text>
+\begin{enumerate}</xsl:text>
+<xsl:for-each select="Item">
+<xsl:text>
+\item </xsl:text>
+<xsl:value-of select="."/>
+</xsl:for-each>
+<xsl:text>
+\end{enumerate}
+</xsl:text>
+</xsl:template> <!--Enumerates Process -->
+
+<!-- Items Process -->
+<xsl:template match="Items">
+<xsl:text>
+\begin{itemize}</xsl:text>
+<xsl:for-each select="node">
+<xsl:text>
+\item </xsl:text>
+<xsl:value-of select="@TEXT"/>
+</xsl:for-each>
+<xsl:text>
+\end{itemize}
+</xsl:text>
+</xsl:template> <!--Items Process -->
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2latexinput.xsl b/freeplane/external-resources/xslt/mm2latexinput.xsl
new file mode 100644
index 0000000..bc5c575
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2latexinput.xsl
@@ -0,0 +1,385 @@
+<?xml version='1.0'?>
+
+
+ <!--
+ MINDMAPEXPORTFILTER tex latex input
+
+ : This code released under the GPL.
+ : (http://www.gnu.org/copyleft/gpl.html)
+ Document : mm2latexarticl.xsl
+ Created on : 01 February 2004, 17:17
+ Author : joerg feuerhake joerg.feuerhake at free-penguin.org
+ Description: transforms freeplane mm format to latex scrartcl,
+ handles crossrefs ignores the rest.
+ feel free to customize it while leaving the ancient
+ authors mentioned. thank you
+ Thanks to: Tayeb.Lemlouma at inrialpes.fr for writing the LaTeX escape scripts and giving inspiration
+
+ ChangeLog: See: http://freeplane.sourceforge.net/
+ -->
+
+<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ version='1.0'>
+ <xsl:output omit-xml-declaration="yes" method="text"/>
+
+ <xsl:template match="map">
+ <xsl:apply-templates select="node/node" />
+ </xsl:template>
+
+
+<!-- ======= Body ====== -->
+
+<!-- Sections Processing -->
+<xsl:template match="node">
+<xsl:variable name="target" select="arrowlink/@DESTINATION"/>
+
+<xsl:choose>
+<xsl:when test="hook[@NAME='ExternalObject']">
+<xsl:text>\begin{figure}[htb]
+\begin{center}
+\includegraphics[width=12cm]{</xsl:text>
+<xsl:value-of select="substring-before(hook/@URI, '.png')"/>
+<xsl:text>}
+\caption{</xsl:text>
+<xsl:apply-templates select="@TEXT|richcontent" />
+<xsl:text>}
+\end{center}
+\end{figure}
+</xsl:text>
+</xsl:when>
+<xsl:when test="count(ancestor::node())-2<=1">
+<xsl:text>\section</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:apply-templates select="@TEXT|richcontent" /><xsl:text>}
+</xsl:text></xsl:when>
+<xsl:when test="node and not(@LOCALIZED_STYLE_REF) and count(ancestor::node())-2=2">
+<xsl:text>\subsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:apply-templates select="@TEXT|richcontent" /><xsl:text>}
+</xsl:text></xsl:when>
+<xsl:when test="node and not(@LOCALIZED_STYLE_REF) and count(ancestor::node())-2=3">
+<xsl:text>\subsubsection</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:apply-templates select="@TEXT|richcontent" /><xsl:text>}
+</xsl:text></xsl:when>
+<xsl:when test="node and not(@LOCALIZED_STYLE_REF)">
+<xsl:text>\par \textbf</xsl:text>
+<xsl:text>{</xsl:text>
+<xsl:apply-templates select="@TEXT|richcontent"/>
+<xsl:text>}
+</xsl:text>
+</xsl:when>
+<xsl:when test="@TEXT=''"></xsl:when>
+<xsl:otherwise>
+<xsl:apply-templates select="@TEXT|richcontent" mode="addEol"/>
+</xsl:otherwise>
+</xsl:choose>
+<xsl:apply-templates select="node" />
+</xsl:template>
+<xsl:template match="richcontent" >
+ <xsl:apply-templates select="html"/>
+</xsl:template>
+<!--Text Process -->
+<!--<xsl:apply-templates select="Body/node()"/>-->
+
+<!-- End of Sections Processing -->
+<xsl:template match="@TEXT" mode="addEol">
+ <xsl:text>
+\par </xsl:text> <xsl:apply-templates select="."/>
+</xsl:template>
+<xsl:template match="richcontent" mode="addEol">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+<!-- LaTeXChar: A recursive function that generates LaTeX special characters -->
+<xsl:template match = "@*|text()">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='" "'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"#"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"$"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"%"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"&"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"~"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"_"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"^"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"{"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"}"'/>
+ <xsl:with-param name="s">
+ <xsl:call-template name="esc">
+ <xsl:with-param name="c" select='"\"'/>
+ <xsl:with-param name="s">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="esc">
+ <xsl:param name="s"/>
+ <xsl:param name="c"/>
+
+ <xsl:choose>
+ <xsl:when test='contains($s, $c)'>
+ <xsl:value-of select='substring-before($s, $c)'/>
+ <xsl:choose>
+ <xsl:when test='$c = "\"'>
+ <xsl:text>\textbackslash </xsl:text>
+ </xsl:when>
+ <xsl:when test='$c = " "'>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\</xsl:text>
+ <xsl:value-of select='$c'/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="esc">
+ <xsl:with-param name='c' select='$c'/>
+ <xsl:with-param name='s' select='substring-after($s, $c)'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$s'/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- End of LaTeXChar template -->
+
+
+<!-- XHTML -->
+<xsl:template match="html">
+ <xsl:apply-templates select="body"/>
+</xsl:template>
+
+<!-- body sections -->
+<xsl:template match="h1">
+ <xsl:text>\section{</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}
+ </xsl:text>
+</xsl:template>
+
+<xsl:template match="h2">
+ <xsl:text>\subsection{</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}
+ </xsl:text>
+</xsl:template>
+
+<xsl:template match="h3">
+ <xsl:text>\subsubsection{</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}
+ </xsl:text>
+</xsl:template>
+
+<!-- section labels. -->
+<!-- lists -->
+<xsl:template match="ul">
+ <xsl:text>\begin{itemize}
+ </xsl:text>
+ <xsl:for-each select="li">
+ <xsl:text>\item </xsl:text>
+ <xsl:apply-templates />
+ </xsl:for-each>
+ <xsl:text>
+ \end{itemize}
+ </xsl:text>
+</xsl:template>
+
+<xsl:template match="ol">
+ <xsl:text>\begin{enumerate}
+ </xsl:text>
+ <xsl:for-each select="li">
+ <xsl:text>\item </xsl:text>
+ <xsl:apply-templates />
+ </xsl:for-each>
+ <xsl:text>
+ \end{enumerate}
+ </xsl:text>
+</xsl:template>
+
+<xsl:template match="dl">
+ <xsl:text>\begin{description}
+ </xsl:text>
+ <xsl:for-each select="*">
+ <xsl:if test='local-name() = "dt"'>
+ <xsl:text>\item[</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates />
+
+ <xsl:if test='local-name() = "dt"'>
+ <xsl:text>] </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>
+ \end{description}
+ </xsl:text>
+</xsl:template>
+
+<!-- tables -->
+<xsl:template match="table">
+ <xsl:text>\begin{center}</xsl:text>
+ <xsl:text>\begin{tabular}{|</xsl:text>
+ <xsl:for-each select="tr[1]/*">
+ <xsl:text>c|</xsl:text>
+ </xsl:for-each>
+ <xsl:text>}
</xsl:text>
+
+ <xsl:for-each select="tr">
+ <xsl:text>\hline
</xsl:text>
+ <xsl:for-each select="*">
+ <xsl:if test="name() = 'th'">{\bf </xsl:if>
+ <xsl:apply-templates />
+ <xsl:if test="name() = 'th'">}</xsl:if>
+ <xsl:if test="position() != last()">
+ <xsl:text> & </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text> \\
</xsl:text>
+ </xsl:for-each>
+ <xsl:text>\hline
</xsl:text>
+
+ <xsl:text>\end{tabular}
</xsl:text>
+ <xsl:text>\end{center}
</xsl:text>
+</xsl:template>
+
+<!-- ol, img code untested -->
+<xsl:template match="img[@class='graphics'
+ or @class='includegraphics']">
+ <xsl:text>\includegraphics[width=</xsl:text>
+ <xsl:value-of select="@width"/>
+ <xsl:text>,height=</xsl:text>
+ <xsl:value-of select="@height"/>
+ <xsl:text>]{</xsl:text>
+ <xsl:value-of select="@src"/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+
+<!-- blockquote -->
+<xsl:template match="blockquote">
+ <xsl:text>
+ \begin{quote}
+ </xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>
+ \end{quote}
+ </xsl:text>
+</xsl:template>
+
+<!-- misc pre/verbatim -->
+<xsl:template match="pre">
+ <xsl:text>\begin{verbatim}</xsl:text>
+ <xsl:apply-templates mode="verbatim"/>
+ <xsl:text>\end{verbatim}</xsl:text>
+</xsl:template>
+
+
+<!-- paragraphs -->
+
+<xsl:template match="br">
+ <xsl:text> \newline
</xsl:text>
+</xsl:template>
+
+<xsl:template match="p">
+ <xsl:choose>
+ <xsl:when test="string(.) != ''">
+ <xsl:apply-templates/>
+ <xsl:text>\\
</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>
</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- phrase markup -->
+
+<xsl:template match="em|dfn">
+ <xsl:text>{\em </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+<xsl:template match="code">
+ <xsl:text>{\tt </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+<xsl:template match="tt">
+ <xsl:text>{\tt </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+<xsl:template match="i">
+ <xsl:text>{\it </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+<xsl:template match="b">
+ <xsl:text>{\bf </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>}</xsl:text>
+</xsl:template>
+
+<xsl:template match="q">
+ <xsl:text>``</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>''</xsl:text>
+</xsl:template>
+
+<xsl:template match="samp">
+ <!-- pass-thru, for \Sigma -->
+ <xsl:text>$</xsl:text>
+ <xsl:value-of select='.'/>
+ <xsl:text>$</xsl:text>
+</xsl:template>
+
+<xsl:template match="samp" mode="math">
+ <!-- pass-thru, for \Sigma -->
+ <xsl:value-of select='.'/>
+</xsl:template>
+</xsl:stylesheet>
+
diff --git a/freeplane/external-resources/xslt/mm2msp_utf8.xsl b/freeplane/external-resources/xslt/mm2msp_utf8.xsl
new file mode 100644
index 0000000..f8e6ced
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2msp_utf8.xsl
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ MINDMAPEXPORTFILTER xml %xslt_export.ms_project
+
+ (c) by Naoki Nose, 2006, and Eric Lavarde, 2008 This code is licensed under
+ the GPLv2 or later. (http://www.gnu.org/copyleft/gpl.html) Check
+ 'mm2msp_utf8_TEMPLATE.mm' for detailed instructions on how to use this sheet.
+
+ (c) by Max Bukovskiy, 2011.
+ This code is licensed under the GPLv2 or later. (http://www.gnu.org/copyleft/gpl.html)
+ -->
+<xsl:stylesheet version="1.0" xmlns="http://schemas.microsoft.com/project" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="xml" indent="yes" encoding="UTF-8" standalone="yes" />
+
+ <xsl:key name="deps" match="arrowlink" use="@DESTINATION" />
+
+ <xsl:template match="/">
+ <Project>
+ <xsl:apply-templates />
+ </Project>
+ </xsl:template>
+
+ <xsl:template match="//map">
+ <Title>
+ <xsl:value-of select="node/@TEXT" />
+ </Title>
+ <xsl:apply-templates select="node/attribute">
+ <xsl:with-param name="prefix" select="'prj'" />
+ </xsl:apply-templates>
+ <Tasks>
+ <xsl:apply-templates select="node" mode="tasks" />
+ </Tasks>
+ </xsl:template>
+
+ <xsl:template match="node" mode="tasks">
+ <xsl:param name="level" select="0" />
+ <Task>
+ <UID>
+ <xsl:if test="$level > 0">
+ <xsl:number level="any" count="//map/node//node" format="1" />
+ </xsl:if>
+ <xsl:if test="$level = 0">0</xsl:if>
+ </UID>
+ <ID>1</ID>
+ <Type>1</Type>
+ <IsNull>0</IsNull>
+ <OutlineNumber>1</OutlineNumber>
+ <OutlineLevel><xsl:value-of select="$level" /></OutlineLevel>
+ <xsl:call-template name="output-node-text-as-name" />
+ <xsl:call-template name="output-note-text-as-notes" />
+ <xsl:if test="not(attribute[@NAME = 'tsk-FixedCostAccrual'])">
+ <FixedCostAccrual>1</FixedCostAccrual>
+ </xsl:if>
+ <xsl:if test="not(attribute[@NAME = 'h'])">
+ <RemainingDuration>PT8H0M0S</RemainingDuration>
+ <Estimated>1</Estimated>
+ </xsl:if>
+ <xsl:if test="attribute[@NAME = 'h']">
+ <RemainingDuration>PT<xsl:apply-templates select="attribute">
+ <xsl:with-param name="prefix" select="'h'" />
+ </xsl:apply-templates>H0M0S</RemainingDuration>
+ </xsl:if>
+ <PercentComplete>0</PercentComplete>
+
+ <Priority><xsl:apply-templates select="icon">
+ <xsl:with-param name="prefix" select="'full'" />
+ </xsl:apply-templates></Priority>
+
+ <xsl:for-each select="key('deps', at ID)">
+ <xsl:call-template name="output-arrow-as-predecessor">
+ <xsl:with-param name="level" select="$level" />
+ </xsl:call-template>
+ </xsl:for-each>
+
+ </Task>
+ <xsl:apply-templates mode="tasks">
+ <xsl:with-param name="level" select="$level + 1" />
+ </xsl:apply-templates>
+ </xsl:template>
+
+ <xsl:template name="output-node-text-as-name">
+ <Name>
+ <xsl:choose>
+ <xsl:when test="@TEXT">
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ </xsl:when>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:value-of
+ select="normalize-space(richcontent[@TYPE='NODE']/html/body)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </Name>
+ </xsl:template>
+
+ <xsl:template name="output-note-text-as-notes">
+ <xsl:if test="richcontent[@TYPE='NOTE' or @TYPE='DETAILS']">
+ <Notes>
+ <xsl:value-of select="string(richcontent[@TYPE='DETAILS']/html/body)" />
+ <xsl:value-of select="string(richcontent[@TYPE='NOTE']/html/body)" />
+ </Notes>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="output-arrow-as-predecessor">
+ <xsl:param name="level" select="0" />
+ <PredecessorLink>
+ <PredecessorUID>
+ <xsl:if test="$level > 0">
+ <xsl:number level="any" count="//map/node//node" format="1" />
+ </xsl:if>
+ <xsl:if test="$level = 0">0</xsl:if>
+ </PredecessorUID>
+ <Type>
+ <xsl:choose>
+ <xsl:when test="@ENDARROW = 'Default'">
+ <xsl:choose>
+ <xsl:when test="@STARTARROW = 'Default'">3</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@STARTARROW = 'Default'">2</xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </Type>
+ </PredecessorLink>
+ </xsl:template>
+
+ <xsl:template match="attribute">
+ <xsl:param name="prefix" />
+ <xsl:if test="starts-with(@NAME,$prefix)">
+ <xsl:value-of select="@VALUE" />
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="icon">
+ <xsl:param name="prefix" />
+ <xsl:if test="starts-with(@BUILTIN,$prefix)">
+ <xsl:value-of select="substring(@BUILTIN,6)" />
+ </xsl:if>
+ </xsl:template>
+
+ <!-- required to _not_ output other things than nodes -->
+ <xsl:template match="*" mode="tasks"></xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2msp_utf8_TEMPLATE.mm b/freeplane/external-resources/xslt/mm2msp_utf8_TEMPLATE.mm
new file mode 100644
index 0000000..744c7b2
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2msp_utf8_TEMPLATE.mm
@@ -0,0 +1,785 @@
+<map version="0.9.0">
+<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node CREATED="1216809870908" ID="ID_1507004962" MODIFIED="1216826585940" TEXT="Example of project plan ready for export
using XSLT export with mm2msp_utf8.xsl">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The note of the root node is exported as project comments (in the properties) but <b>formatting</b> is <i>lost. </i>
+ </p>
+ <p>
+ Any attribute starting with the prefix "prj-" is used as parameter for the project (after removal of the prefix). Possible parameter/value combinations need to be guessed from the XML output of MS Project. The below lines give some examples and hints.
+ </p>
+ <p>
+ Any attribute starting with the prefix "tsk-" is used as parameter for the task (after removal of the prefix)
+ </p>
+ <h2>
+ Examples of possible project parameters and values
+ </h2>
+ <p>
+ The following lines show examples of parameters/values combinations found in MS Project's XML file. Combinations in Bold are easy to understand, meaningful and safe to use, ones in Italic are to be avoided, for the others let me know.
+ </p>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <Name>Project1.xml</Name>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <i><Title>Project Name Bla Bla</Title> DO NOT USE, generated from the node text.</i>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <b><Company>Acme Corp.</Company></b>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <b><Author>John Smith</Author></b>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CreationDate>2008-07-23T12:48:00</CreationDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <LastSaved>2008-07-23T16:37:00</LastSaved>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <ScheduleFromStart>1</ScheduleFromStart>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <StartDate>2008-07-23T08:00:00</StartDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <FinishDate>2008-07-29T17:00:00</FinishDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <FYStartDate>1</FYStartDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CriticalSlackLimit>0</CriticalSlackLimit>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CurrencyDigits>2</CurrencyDigits>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CurrencySymbol>€</CurrencySymbol>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CurrencySymbolPosition>0</CurrencySymbolPosition>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CalendarUID>1</CalendarUID>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultStartTime>08:00:00</DefaultStartTime>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultFinishTime>17:00:00</DefaultFinishTime>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MinutesPerDay>480</MinutesPerDay>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MinutesPerWeek>2400</MinutesPerWeek>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DaysPerMonth>20</DaysPerMonth>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultTaskType>0</DefaultTaskType>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultFixedCostAccrual>3</DefaultFixedCostAccrual>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultStandardRate>0</DefaultStandardRate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultOvertimeRate>0</DefaultOvertimeRate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DurationFormat>7</DurationFormat>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <WorkFormat>2</WorkFormat>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <EditableActualCosts>0</EditableActualCosts>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <HonorConstraints>0</HonorConstraints>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <InsertedProjectsLikeSummary>1</InsertedProjectsLikeSummary>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MultipleCriticalPaths>0</MultipleCriticalPaths>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <NewTasksEffortDriven>1</NewTasksEffortDriven>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <NewTasksEstimated>1</NewTasksEstimated>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <SplitsInProgressTasks>1</SplitsInProgressTasks>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <SpreadActualCost>0</SpreadActualCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <SpreadPercentComplete>0</SpreadPercentComplete>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <TaskUpdatesResource>1</TaskUpdatesResource>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <FiscalYearStart>0</FiscalYearStart>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <WeekStartDay>1</WeekStartDay>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MoveCompletedEndsBack>0</MoveCompletedEndsBack>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MoveRemainingStartsBack>0</MoveRemainingStartsBack>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MoveRemainingStartsForward>0</MoveRemainingStartsForward>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MoveCompletedEndsForward>0</MoveCompletedEndsForward>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <BaselineForEarnedValue>0</BaselineForEarnedValue>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <AutoAddNewResourcesAndTasks>1</AutoAddNewResourcesAndTasks>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <CurrentDate>2008-07-23T08:00:00</CurrentDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <MicrosoftProjectServerURL>1</MicrosoftProjectServerURL>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <Autolink>1</Autolink>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <NewTaskStartDate>0</NewTaskStartDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <DefaultTaskEVMethod>0</DefaultTaskEVMethod>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <ProjectExternallyEdited>0</ProjectExternallyEdited>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <ExtendedCreationDate>1984-01-01T00:00:00</ExtendedCreationDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <ActualsInSync>1</ActualsInSync>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <RemoveFileProperties>0</RemoveFileProperties>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <AdminProject>0</AdminProject>
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <OutlineCodes />
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <WBSMasks />
+ </div>
+ </div>
+ <div class="e">
+ <div style="margin-left: 0; text-indent: 0">
+ <ExtendedAttributes />
+ </div>
+ </div>
+ </div>
+ </div>
+ </body>
+</html></richcontent>
+<attribute NAME="prj-Company" VALUE="Acme Corp."/>
+<attribute NAME="prj-Author" VALUE="John Smith"/>
+<node CREATED="1216809884057" ID="ID_596157601" MODIFIED="1216825866317" POSITION="right" TEXT="task 1">
+<node CREATED="1216809884057" ID="ID_551098884" MODIFIED="1216826500604" TEXT="task 1.1">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Any attribute starting with the prefix "tsk-" is used as parameter for the task (after removal of the prefix). Possible parameter/value combinations need to be guessed from the XML output of MS Project. The below lines give some examples and hints.
+ </p>
+ <h2>
+ Examples of possible tasks parameters and values
+ </h2>
+ <p>
+ The following lines show examples of parameters/values combinations found in MS Project's XML file. Combinations in Bold are easy to understand, meaningful and safe to use, ones in Italic are to be avoided, for the others let me know.
+ </p>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <i><UID>1</UID> DO NOT USE, generated automatically.</i>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ID>1</ID>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <i> <Name>task 1</Name> DO NOT USE, generated from the node text.</i>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Type>1</Type>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <IsNull>0</IsNull>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <CreateDate>2008-07-23T12:48:00</CreateDate>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <WBS>1</WBS>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <OutlineNumber>1</OutlineNumber>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <OutlineLevel>1</OutlineLevel>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <b><Priority>200</Priority></b>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Start>2008-07-22T08:00:00</Start>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Finish>2008-07-29T17:00:00</Finish>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Duration>PT48H0M0S</Duration> the duration of the task in hours/minutes/seconds (but doesn't work as such).
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <DurationFormat>53</DurationFormat>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Work>PT8H0M0S</Work> the effort required for the task in hours/minutes/seconds (but doesn't work as such).
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ResumeValid>0</ResumeValid>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <EffortDriven>0</EffortDriven>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Recurring>0</Recurring>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <OverAllocated>0</OverAllocated>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Estimated>1</Estimated>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Milestone>0</Milestone>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Summary>1</Summary>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Critical>1</Critical>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <IsSubproject>0</IsSubproject>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ExternalTask>0</ExternalTask>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <EarlyStart>2008-07-22T08:00:00</EarlyStart>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <EarlyFinish>2008-07-29T17:00:00</EarlyFinish>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LateStart>2008-07-23T08:00:00</LateStart>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LateFinish>2008-07-29T17:00:00</LateFinish>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <StartVariance>0</StartVariance>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <FinishVariance>0</FinishVariance>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <WorkVariance>0</WorkVariance>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <FreeSlack>0</FreeSlack>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <TotalSlack>0</TotalSlack>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <FixedCost>0</FixedCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <FixedCostAccrual>1</FixedCostAccrual>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <PercentComplete>0</PercentComplete>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <PercentWorkComplete>0</PercentWorkComplete>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Cost>0</Cost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <OvertimeCost>0</OvertimeCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <OvertimeWork>PT0H0M0S</OvertimeWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualDuration>PT0H0M0S</ActualDuration>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualCost>0</ActualCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualOvertimeCost>0</ActualOvertimeCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualWork>PT0H0M0S</ActualWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualOvertimeWork>PT0H0M0S</ActualOvertimeWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RegularWork>PT0H0M0S</RegularWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RemainingDuration>PT48H0M0S</RemainingDuration>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RemainingCost>0</RemainingCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RemainingWork>PT0H0M0S</RemainingWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RemainingOvertimeCost>0</RemainingOvertimeCost>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <RemainingOvertimeWork>PT0H0M0S</RemainingOvertimeWork>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ACWP>0</ACWP>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <CV>0</CV>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ConstraintType>0</ConstraintType>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <CalendarUID>-1</CalendarUID>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LevelAssignments>1</LevelAssignments>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LevelingCanSplit>1</LevelingCanSplit>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LevelingDelay>0</LevelingDelay>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <LevelingDelayFormat>8</LevelingDelayFormat>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <i> <Notes>bla bla</Notes> DO NOT USE, will be generated from the node's note.</i>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <HideBar>0</HideBar>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <Rollup>0</Rollup>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <BCWS>0</BCWS>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <BCWP>0</BCWP>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <PhysicalPercentComplete>0</PhysicalPercentComplete>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <EarnedValueMethod>0</EarnedValueMethod>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualWorkProtected>PT0H0M0S</ActualWorkProtected>
+ </div>
+ </div>
+ <div class="e">
+ <div style="text-indent: 0; margin-left: 0">
+ <ActualOvertimeWorkProtected>PT0H0M0S</ActualOvertimeWorkProtected>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="107" VALUE_WIDTH="107"/>
+<attribute NAME="tsk-Priority" VALUE="200"/>
+</node>
+<node CREATED="1216809890907" ID="ID_1321935745" MODIFIED="1216825825567" TEXT="task 1.2">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The note of any node is exported as task notes but <b>formatting</b> is <i>lost. </i>
+ </p>
+ <p>
+ The sub-nodes show how graphical links are transformed into predecessors relations.
+ </p>
+ </body>
+</html>
+</richcontent>
+<node CREATED="1216809898648" ID="ID_896868759" MODIFIED="1216825200032" TEXT="task 1.2.1 - predecessor of all following tasks">
+<arrowlink DESTINATION="ID_661978653" ENDARROW="Default" ENDINCLINATION="199;0;" ID="Arrow_ID_1192464141" STARTARROW="Default" STARTINCLINATION="199;0;"/>
+<arrowlink DESTINATION="ID_1453547974" ENDARROW="None" ENDINCLINATION="76;0;" ID="Arrow_ID_831124590" STARTARROW="Default" STARTINCLINATION="76;0;"/>
+<arrowlink DESTINATION="ID_869034720" ENDARROW="None" ENDINCLINATION="94;0;" ID="Arrow_ID_851487381" STARTARROW="None" STARTINCLINATION="94;0;"/>
+<arrowlink DESTINATION="ID_1048991478" ENDARROW="Default" ENDINCLINATION="195;0;" ID="Arrow_ID_1795574541" STARTARROW="None" STARTINCLINATION="195;0;"/>
+</node>
+<node CREATED="1216809902163" ID="ID_1048991478" MODIFIED="1216825125382" TEXT="task 1.2.2 - uses Finish-to-Start relation"/>
+<node CREATED="1216809906259" ID="ID_661978653" MODIFIED="1216825194484" TEXT="task 1.2.3 - uses Start-to-Start relation"/>
+<node CREATED="1216825049830" ID="ID_1453547974" MODIFIED="1216825170078" TEXT="task 1.2.4 - uses Start-to-Finish relation"/>
+<node CREATED="1216825055158" ID="ID_869034720" MODIFIED="1216825200032" TEXT="task 1.2.5 - uses Finish-to-Finish relation"/>
+</node>
+</node>
+<node CREATED="1216809914482" ID="ID_1308741003" MODIFIED="1216826803952" POSITION="left" TEXT="task 2 - how to export a mindmap to MS Project ?">
+<node CREATED="1216809917636" ID="ID_199484608" MODIFIED="1216826829891" TEXT="task 2.1 - create a map following the notes and hints expressed in this example map"/>
+<node CREATED="1216809921221" ID="ID_1681718272" MODIFIED="1216826859865" TEXT="task 2.2 - export the map using the File -> Export -> Using XSLT... menu">
+<node CREATED="1216826868748" ID="ID_1660904657" MODIFIED="1216826921937" TEXT="task 2.2.1 - select the mm2msp_utf8.xsl XSL file from the accessories directory in the Freeplane base directory."/>
+<node CREATED="1216826924521" ID="ID_1561412985" MODIFIED="1216827030567" TEXT="task 2.2.2 - export to a file with a name ending in .xml"/>
+</node>
+<node CREATED="1216826940554" ID="ID_769680777" MODIFIED="1216827227358" TEXT="task 2.3 - open Microsoft Office Project">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You need a version of MS Project supporting XML, I think MS Project 2003 and later.
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node CREATED="1216826953904" ID="ID_999549737" MODIFIED="1216826968235" TEXT="task 2.4 - select the File -> Open menu point">
+<node CREATED="1216826972942" ID="ID_1853962830" MODIFIED="1216827047893" TEXT="task 2.4.1 - make sure the file dialog filters on XML files"/>
+<node CREATED="1216827051148" ID="ID_1363816861" MODIFIED="1216827068093" TEXT="task 2.4.2 - select the file.xml you've just exported"/>
+</node>
+<node CREATED="1216827072099" ID="ID_785390572" MODIFIED="1216827091417" TEXT="task 2.5 - you're done, enjoy!"/>
+</node>
+<node CREATED="1216809929423" ID="ID_180931108" MODIFIED="1216825071502" POSITION="left" TEXT="task 3"/>
+<node CREATED="1216822804682" ID="ID_1397543137" MODIFIED="1216825071502" POSITION="left" TEXT="task 4"/>
+</node>
+</map>
diff --git a/freeplane/external-resources/xslt/mm2mwiki.xsl b/freeplane/external-resources/xslt/mm2mwiki.xsl
new file mode 100644
index 0000000..0117114
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2mwiki.xsl
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <!--
+ MINDMAPEXPORTFILTER mwiki %xslt_export.mediawiki
+ (c) by Stephen Fitch, 2005
+ (c) by Dimitry Polivaev, 2010
+ This file is licensed under the GPL.
+ -->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <xsl:output method="text" indent="no" />
+ <xsl:strip-space elements="*" />
+ <xsl:template match="/map">
+ <xsl:apply-templates select="node" />
+ </xsl:template>
+ <xsl:template match="@TEXT">
+ <xsl:value-of select="normalize-space(.)" />
+ </xsl:template>
+ <!-- match "node" -->
+ <xsl:template match="node">
+ <xsl:variable name="depth" select="count(ancestor::node)" />
+ <xsl:if test="@TEXT">
+ <xsl:choose>
+ <xsl:when test="node and @TEXT and not(contains(@TEXT, '
')) and $depth <= 5">
+ <xsl:call-template name="chars">
+ <xsl:with-param name="char" select="'='"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ <xsl:call-template name="chars">
+ <xsl:with-param name="char" select="'='" />
+ <xsl:with-param name="count" select="$depth" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains(@TEXT, '
')">
+ <xsl:text>
<pre>
</xsl:text>
+ <xsl:value-of select="@TEXT" />
+ <xsl:text>
</pre>
</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ <xsl:text>
</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <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="indent">
+ </xsl:template>
+
+ <xsl:template match="richcontent">
+ <xsl:if test="@TYPE='DETAILS'">
+ <xsl:text>
DETAILS: </xsl:text>
+ </xsl:if>
+ <xsl:if test="@TYPE='NOTE'">
+ <xsl:text>
NOTE: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="html"/>
+ <xsl:text>

</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="chars">
+ <xsl:param name="count" select="1" />
+ <xsl:param name="char" select="' '" />
+ <xsl:if test="$count > 0">
+ <xsl:value-of select="$char"/>
+ <xsl:call-template name="chars">
+ <xsl:with-param name="count" select="$count - 1" />
+ <xsl:with-param name="char" select="$char" />
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="html">
+ <xsl:value-of select="normalize-space(.)" />
+ </xsl:template>
+ <xsl:template match="p|br|div" mode="html">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>

</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="html"/>
+ </xsl:template>
+
+ <xsl:template match="li" mode="html">
+ <xsl:text>
*</xsl:text>
+ <xsl:apply-templates mode="html" />
+ </xsl:template>
+ <xsl:template match="i" mode="html">
+ <xsl:text>''</xsl:text>
+ <xsl:apply-templates mode="html" />
+ <xsl:text>''</xsl:text>
+ </xsl:template>
+ <xsl:template match="b" mode="html">
+ <xsl:text>'''</xsl:text>
+ <xsl:apply-templates mode="html" />
+ <xsl:text>'''</xsl:text>
+ </xsl:template>
+ <xsl:template match="tt" mode="html">
+ <xsl:text><tt></xsl:text>
+ <xsl:apply-templates mode="html" />
+ <xsl:text></tt></xsl:text>
+ </xsl:template>
+ <xsl:template match="pre" mode="html">
+ <xsl:text>
<pre>
</xsl:text>
+ <xsl:apply-templates mode="html" />
+ <xsl:text>
</pre>
</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="table" mode="html">
+ <xsl:text>
{| </xsl:text>
+ <xsl:apply-templates select="@*" mode="table_attributes" />
+ <xsl:apply-templates mode="html" />
+ <xsl:text>
|}
</xsl:text>
+ </xsl:template>
+ <xsl:template match="th" mode="html">
+ <xsl:text>
! </xsl:text>
+ <xsl:apply-templates select="@*" mode="table_attributes" />
+ <xsl:apply-templates mode="html" />
+ </xsl:template>
+ <xsl:template match="tr" mode="html">
+ <xsl:text>
|- </xsl:text>
+ <xsl:if test="@*">
+ <xsl:apply-templates select="@*" mode="table_attributes" />
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="html" />
+ </xsl:template>
+ <xsl:template match="td" mode="html">
+ <xsl:text>
| </xsl:text>
+ <xsl:if test="@*">
+ <xsl:apply-templates select="@*" mode="table_attributes" />
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="html" />
+ </xsl:template>
+
+ <xsl:template match="@*" mode="table_attributes">
+ <xsl:value-of select = "name(.)"/>
+ <xsl:text>="</xsl:text>
+ <xsl:value-of select = "string(.)" />
+ <xsl:text>" </xsl:text>
+ </xsl:template>
+ </xsl:stylesheet>
+
+
+
+
+
+
diff --git a/freeplane/external-resources/xslt/mm2oowriter.manifest.xsl b/freeplane/external-resources/xslt/mm2oowriter.manifest.xsl
new file mode 100644
index 0000000..21dc84d
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2oowriter.manifest.xsl
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+ <!--
+ adapted from mm2oowriter.xsl by Ondrej Popp /*Freeplane - A Program
+ for creating and viewing Mindmaps *Copyright (C) 2000-2008 Christian
+ Foltin and others. * *See COPYING for Details * *This program is free
+ software; you can redistribute it and/or *modify it under the terms of
+ the GNU General Public License *as published by the Free Software
+ Foundation; either version 2 *of the License, or (at your option) any
+ later version. * *This program is distributed in the hope that it will
+ be useful, *but WITHOUT ANY WARRANTY; without even the implied
+ warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ the *GNU 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. * */
+ -->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
+
+ <xsl:output method="xml" version="1.0" indent="yes"
+ encoding="UTF-8" omit-xml-declaration="no" />
+ <xsl:strip-space elements="*" />
+
+ <xsl:template match="map">
+ <manifest:manifest
+ xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
+ <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text"
+ manifest:full-path="/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/statusbar/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/accelerator/current.xml" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/accelerator/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/floater/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/popupmenu/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/progressbar/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/menubar/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/toolbar/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/images/Bitmaps/" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Configurations2/images/" />
+ <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration"
+ manifest:full-path="Configurations2/" />
+ <manifest:file-entry manifest:media-type="text/xml"
+ manifest:full-path="content.xml" />
+ <manifest:file-entry manifest:media-type="text/xml"
+ manifest:full-path="styles.xml" />
+ <manifest:file-entry manifest:media-type="text/xml"
+ manifest:full-path="meta.xml" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Thumbnails/thumbnail.png" />
+ <manifest:file-entry manifest:media-type=""
+ manifest:full-path="Thumbnails/" />
+ <manifest:file-entry manifest:media-type="text/xml"
+ manifest:full-path="settings.xml" />
+ </manifest:manifest>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2oowriter.xsl b/freeplane/external-resources/xslt/mm2oowriter.xsl
new file mode 100644
index 0000000..d662cf1
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2oowriter.xsl
@@ -0,0 +1,576 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ /*Freeplane - A Program for creating and viewing Mindmaps *Copyright
+ (C) 2000-2008 Christian Foltin and others. * *See COPYING for Details
+ * *This program is free software; you can redistribute it and/or
+ *modify it under the terms of the GNU General Public License *as
+ published by the Free Software Foundation; either version 2 *of the
+ License, or (at your option) any later version. * *This program is
+ distributed in the hope that it will be useful, *but WITHOUT ANY
+ WARRANTY; without even the implied warranty of *MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the *GNU 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. * */
+ -->
+<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+ xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+ xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+ xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+ xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer"
+ xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events"
+ xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <xsl:output method="xml" version="1.0" indent="yes"
+ encoding="UTF-8" omit-xml-declaration="no" />
+ <xsl:strip-space elements="*" />
+
+ <xsl:template match="map">
+ <office:document-content
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+ xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+ xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+ xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+ xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+ xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer"
+ xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events"
+ xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0">
+ <office:scripts />
+ <office:font-face-decls>
+ <style:font-face style:name="StarSymbol"
+ svg:font-family="StarSymbol" />
+ <style:font-face style:name="DejaVu Sans"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="roman" style:font-pitch="variable" />
+ <style:font-face style:name="DejaVu Sans1"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="swiss" style:font-pitch="variable" />
+ <style:font-face style:name="DejaVu Sans2"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="system" style:font-pitch="variable" />
+ </office:font-face-decls>
+ <office:automatic-styles>
+ <style:style style:name="P1" style:family="paragraph"
+ style:parent-style-name="Text_20_body" style:list-style-name="L1" />
+ <style:style style:name="P3" style:family="paragraph"
+ style:parent-style-name="Standard">
+ <style:paragraph-properties
+ fo:text-align="center" style:justify-single-word="false" />
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph"
+ style:parent-style-name="Standard">
+ <style:paragraph-properties
+ fo:text-align="end" style:justify-single-word="false" />
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph"
+ style:parent-style-name="Standard">
+ <style:paragraph-properties
+ fo:text-align="justify" style:justify-single-word="false" />
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-weight="bold"
+ style:font-weight-asian="bold" style:font-weight-complex="bold" />
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:font-style="italic"
+ style:font-style-asian="italic" style:font-style-complex="italic" />
+ </style:style>
+ <style:style style:name="T3" style:family="text">
+ <style:text-properties
+ style:text-underline-style="solid" style:text-underline-width="auto"
+ style:text-underline-color="font-color" />
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet
+ text:level="1" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="0.635cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="2" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="1.27cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="3" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â ">
+ <style:list-level-properties
+ text:space-before="1.905cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="4" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="2.54cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="5" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="3.175cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="6" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â ">
+ <style:list-level-properties
+ text:space-before="3.81cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="7" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="4.445cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="8" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="5.08cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="9" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â ">
+ <style:list-level-properties
+ text:space-before="5.715cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet
+ text:level="10" text:style-name="Bullet_20_Symbols"
+ style:num-suffix="." text:bullet-char="â">
+ <style:list-level-properties
+ text:space-before="6.35cm" text:min-label-width="0.635cm" />
+ <style:text-properties style:font-name="StarSymbol" />
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:body>
+ <office:text>
+ <office:forms form:automatic-focus="false"
+ form:apply-design-mode="false" />
+ <text:sequence-decls>
+ <text:sequence-decl text:display-outline-level="0"
+ text:name="Illustration" />
+ <text:sequence-decl text:display-outline-level="0"
+ text:name="Table" />
+ <text:sequence-decl text:display-outline-level="0"
+ text:name="Text" />
+ <text:sequence-decl text:display-outline-level="0"
+ text:name="Drawing" />
+ </text:sequence-decls>
+ <xsl:apply-templates select="node" />
+ </office:text>
+ </office:body>
+
+ </office:document-content>
+ </xsl:template>
+
+ <xsl:template match="node">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement" />
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$depth=0"><!-- Title -->
+ <xsl:call-template name="output-nodecontent">
+ <xsl:with-param name="style">
+ Title
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="hook|@LINK" />
+ <xsl:call-template name="output-notecontent"> <xsl:with-param name="contentType" select="'DETAILS'"/> </xsl:call-template>
+ <xsl:call-template name="output-notecontent"> <xsl:with-param name="contentType" select="'NOTE'"/> </xsl:call-template>
+ <xsl:apply-templates select="node" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="ancestor::node[@FOLDED='true']">
+ <text:list text:style-name="L1">
+ <text:list-item>
+ <xsl:call-template name="output-nodecontent">
+ <xsl:with-param name="style">
+ Standard
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="hook|@LINK" />
+ <xsl:call-template name="output-notecontent">
+ <xsl:with-param name="contentType" select="'DETAILS'" />
+ </xsl:call-template>
+ <xsl:call-template name="output-notecontent">
+ <xsl:with-param name="contentType" select="'NOTE'" />
+ </xsl:call-template>
+ <xsl:apply-templates select="node" />
+ </text:list-item>
+ </text:list>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="heading_level">
+ <xsl:text>Heading_20_</xsl:text>
+ <xsl:value-of select="$depth" />
+ </xsl:variable>
+ <xsl:element name="text:h">
+ <xsl:attribute name="text:style-name"><!--
+ --><xsl:value-of
+ select="$heading_level" /><!--
+ --></xsl:attribute>
+ <xsl:attribute name="text:outline-level"><xsl:value-of
+ select="$depth" /></xsl:attribute>
+ <xsl:call-template name="output-nodecontent">
+ <!--No Style for Headings.-->
+ <xsl:with-param name="style"></xsl:with-param>
+ </xsl:call-template>
+ </xsl:element>
+ <xsl:apply-templates select="hook|@LINK" />
+ <xsl:call-template name="output-notecontent"> <xsl:with-param name="contentType" select="'DETAILS'"/> </xsl:call-template>
+ <xsl:call-template name="output-notecontent"> <xsl:with-param name="contentType" select="'NOTE'"/> </xsl:call-template>
+ <xsl:apply-templates select="node" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template match="hook" />
+
+ <!--
+ <xsl:template
+ match="hook[@NAME='accessories/plugins/NodeNote.properties']">
+ <xsl:choose> <xsl:when test="./text"> <text:p
+ text:style-name="Standard"> <xsl:value-of select="./text"/> </text:p>
+ </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="node"
+ mode="childoutputOrdered"> <xsl:param name="nodeText"></xsl:param>
+ <text:ordered-list text:style-name="L1"
+ text:continue-numbering="true"> <text:list-item> <xsl:apply-templates
+ select=".." mode="childoutputOrdered"> <xsl:with-param
+ name="nodeText"><xsl:copy-of select="$nodeText"/></xsl:with-param>
+ </xsl:apply-templates> </text:list-item> </text:ordered-list>
+ </xsl:template> <xsl:template match="map" mode="childoutputOrdered">
+ <xsl:param name="nodeText"></xsl:param> <xsl:copy-of
+ select="$nodeText"/> </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>
+
+
+ <!-- Give links out. -->
+ <xsl:template match="@LINK">
+ <text:p text:style-name="Standard">
+ <xsl:element name="text:a" namespace="text">
+ <xsl:attribute namespace="xlink" name="xlink:type">simple</xsl:attribute>
+ <xsl:attribute namespace="xlink" name="xlink:href"><xsl:value-of
+ select="." />
+ </xsl:attribute>
+ <xsl:value-of select="." />
+ </xsl:element>
+ </text:p>
+ </xsl:template>
+
+ <xsl:template name="output-nodecontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:apply-templates select="richcontent[@TYPE='NODE']/html/body"
+ mode="richcontent">
+ <xsl:with-param name="style" select="$style" />
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$style = ''">
+ <!--no style for headings. -->
+ <xsl:call-template name="textnode" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="text:p">
+ <xsl:attribute name="text:style-name"><xsl:value-of
+ select="$style" /></xsl:attribute>
+ <xsl:call-template name="textnode" />
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template> <!-- xsl:template name="output-nodecontent" -->
+
+ <xsl:template name="output-notecontent">
+ <xsl:param name="contentType"/>
+ <xsl:if test="richcontent[@TYPE=$contentType]">
+ <xsl:apply-templates select="richcontent[@TYPE=$contentType]/html/body"
+ mode="richcontent">
+ <xsl:with-param name="style">
+ Standard
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:template> <!-- xsl:template name="output-note" -->
+
+
+ <xsl:template name="textnode">
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:choose>
+ <xsl:when test="@TEXT = ''">
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@TEXT" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template> <!-- xsl:template name="textnode" -->
+
+
+ <!-- replace ASCII line breaks through ODF line breaks (br) -->
+ <xsl:template name="format_text">
+ <xsl:param name="nodetext"></xsl:param>
+ <xsl:if test="string-length(substring-after($nodetext,'
')) = 0">
+ <xsl:value-of select="$nodetext" />
+ </xsl:if>
+ <xsl:if test="string-length(substring-after($nodetext,'
')) > 0">
+ <xsl:value-of select="substring-before($nodetext,'
')" />
+ <text:line-break />
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:value-of select="substring-after($nodetext,'
')" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template> <!-- xsl:template name="format_text" -->
+
+ <xsl:template match="body" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <!-- <xsl:copy-of select="string(.)"/> -->
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:template>
+ <xsl:template match="text()" mode="richcontent">
+ <xsl:copy-of select="string(.)" />
+ </xsl:template>
+ <xsl:template match="br" mode="richcontent">
+ <text:line-break />
+ </xsl:template>
+ <xsl:template match="b" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:span text:style-name="T1">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:span>
+ </xsl:template>
+ <xsl:template match="p" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$style = ''">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="@style='text-align: center'">
+ <text:p text:style-name="P3">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:p>
+ </xsl:when>
+ <xsl:when test="@style='text-align: right'">
+ <text:p text:style-name="P4">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:p>
+ </xsl:when>
+ <xsl:when test="@style='text-align: justify'">
+ <text:p text:style-name="P5">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:p>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="text:p">
+ <xsl:attribute name="text:style-name"><xsl:value-of
+ select="$style" /></xsl:attribute>
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="i" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:span text:style-name="T2">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:span>
+ </xsl:template>
+ <xsl:template match="u" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:span text:style-name="T3">
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:span>
+ </xsl:template>
+ <xsl:template match="ul" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:list text:style-name="L1">
+ <xsl:apply-templates select="text()|*" mode="richcontentul">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:list>
+ <text:p text:style-name="P3" />
+ </xsl:template>
+ <xsl:template match="ol" mode="richcontent">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:list text:style-name="L2">
+ <xsl:apply-templates select="text()|*" mode="richcontentol">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates>
+ </text:list>
+ <text:p text:style-name="P3" />
+ </xsl:template>
+ <xsl:template match="li" mode="richcontentul">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:list-item>
+ <text:p text:style-name="P1"><!--
+ -->
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates><!--
+ -->
+ </text:p>
+ </text:list-item>
+ </xsl:template>
+ <xsl:template match="li" mode="richcontentol">
+ <xsl:param name="style">
+ Standard
+ </xsl:param>
+ <text:list-item>
+ <text:p text:style-name="P2"><!--
+ -->
+ <xsl:apply-templates select="text()|*" mode="richcontent">
+ <xsl:with-param name="style" select="$style"></xsl:with-param>
+ </xsl:apply-templates><!--
+ -->
+ </text:p>
+ </text:list-item>
+ </xsl:template>
+
+ <xsl:template match="a" mode="richcontent">
+ <xsl:element name="text:a" namespace="text">
+ <xsl:attribute namespace="xlink" name="xlink:type">simple</xsl:attribute>
+ <xsl:attribute namespace="xlink" name="xlink:href"><xsl:value-of
+ select="@href" />
+ </xsl:attribute>
+ <xsl:apply-templates select="text()" />
+ </xsl:element>
+ </xsl:template>
+
+
+ <!--
+ <text:list-item> <text:p text:style-name="P1">b </text:list-item>
+ <text:list-item> <text:p text:style-name="P1">c</text:p>
+ </text:list-item> <text:p text:style-name="P2"/>
+ -->
+ <!--
+ <text:ordered-list text:style-name="L2"> <text:list-item> <text:p
+ text:style-name="P3">1</text:p> </text:list-item> <text:list-item>
+ <text:p text:style-name="P3">2</text:p> </text:list-item>
+ <text:list-item> <text:p text:style-name="P3">3</text:p>
+ </text:list-item> </text:ordered-list> <text:p text:style-name="P2"/>
+ -->
+ <!--
+ Table: <table:table table:name="Table1" table:style-name="Table1">
+ <table:table-column table:style-name="Table1.A"
+ table:number-columns-repeated="3"/> <table:table-row>
+ <table:table-cell table:style-name="Table1.A1"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T11</text:p> </table:table-cell> <table:table-cell
+ table:style-name="Table1.A1" table:value-type="string"> <text:p
+ text:style-name="Table Contents">T21</text:p> </table:table-cell>
+ <table:table-cell table:style-name="Table1.C1"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T31</text:p> </table:table-cell> </table:table-row>
+ <table:table-row> <table:table-cell table:style-name="Table1.A2"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T12</text:p> </table:table-cell> <table:table-cell
+ table:style-name="Table1.A2" table:value-type="string"> <text:p
+ text:style-name="Table Contents">T22</text:p> </table:table-cell>
+ <table:table-cell table:style-name="Table1.C2"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T32</text:p> </table:table-cell> </table:table-row>
+ <table:table-row> <table:table-cell table:style-name="Table1.A2"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T13</text:p> </table:table-cell> <table:table-cell
+ table:style-name="Table1.A2" table:value-type="string"> <text:p
+ text:style-name="Table Contents">T23</text:p> </table:table-cell>
+ <table:table-cell table:style-name="Table1.C2"
+ table:value-type="string"> <text:p text:style-name="Table
+ Contents">T32</text:p> </table:table-cell> </table:table-row>
+ </table:table>
+ -->
+
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2opml.xsl b/freeplane/external-resources/xslt/mm2opml.xsl
new file mode 100644
index 0000000..7d38262
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2opml.xsl
@@ -0,0 +1,47 @@
+<?xml version='1.0' encoding='ISO-8859-1'?>
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+ <xsl:output media-type='text/xml' />
+ <xsl:template match='/'>
+ <opml version='1.0'>
+ <head>
+ <title>elbowarthros.opml</title>
+ <dateCreated>Tue, 17 Apr 2001 18:35:55 GMT</dateCreated>
+ <dateModified>Tue, 16 Mar 2004 20:29:12 </dateModified>
+ <ownerName>none</ownerName>
+ <ownerEmail />
+ <expansionState>/opml[1]/body[1]/outline[1]</expansionState>
+ <vertScrollState>1</vertScrollState>
+ <windowTop>23</windowTop>
+ <windowLeft>-13</windowLeft>
+ <windowBottom>648</windowBottom>
+ <windowRight>558</windowRight>
+ </head>
+ <xsl:apply-templates select='map' />
+ </opml>
+ </xsl:template>
+ <xsl:template match='map'>
+ <body>
+ <xsl:apply-templates select='node' />
+ </body>
+ </xsl:template>
+ <xsl:template match='node'>
+ <xsl:choose>
+ <xsl:when test='@LINK'>
+ <outline>
+ <xsl:attribute name='text'><xsl:value-of
+ select='@TEXT' /></xsl:attribute>
+ <xsl:attribute name='type'>link</xsl:attribute>
+ <xsl:apply-templates select='node' />
+ </outline>
+ </xsl:when>
+ <xsl:otherwise>
+ <outline>
+ <xsl:attribute name='text'><xsl:value-of
+ select='@TEXT' /></xsl:attribute>
+ <xsl:apply-templates select='node' />
+ </outline>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/freeplane/external-resources/xslt/mm2raw.xsl b/freeplane/external-resources/xslt/mm2raw.xsl
new file mode 100644
index 0000000..3b2892d
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2raw.xsl
@@ -0,0 +1,16 @@
+<?xml version="1.0" standalone="no" ?>
+ <!--
+ MINDMAPEXPORTFILTER xml Export raw xml with node formatting
+ -->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+
+<xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2text.xsl b/freeplane/external-resources/xslt/mm2text.xsl
new file mode 100644
index 0000000..b1898af
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2text.xsl
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+ <!--
+
+ MINDMAPEXPORTFILTER txt %xslt_export.text
+
+ : This code released under the GPL. :
+ (http://www.gnu.org/copyleft/gpl.html) 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" />
+
+ <xsl:template match="/">
+ <xsl:text>#MindMapExport FreeplaneVersion:</xsl:text>
+ <xsl:value-of select="map/@version" />
+ <xsl:text>
</xsl:text>
+ <xsl:text>
</xsl:text>
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="/map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <xsl:template match="richcontent">
+ <xsl:if test="@TYPE='DETAILS'">
+ <xsl:text>
DETAILS: </xsl:text>
+ </xsl:if>
+ <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="node">
+ <xsl:variable name="thisid" select="@ID" />
+ <xsl:variable name="target" select="arrowlink/@DESTINATION" />
+ <xsl:number level="multiple" count="node" format="1" />
+ <xsl:text> </xsl: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>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2wordml_utf8.xsl b/freeplane/external-resources/xslt/mm2wordml_utf8.xsl
new file mode 100644
index 0000000..21f80eb
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2wordml_utf8.xsl
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+ <!--
+
+ MINDMAPEXPORTFILTER doc;xml %xslt_export.ms_word
+
+ (c) by Naoki Nose, 2006, and Eric Lavarde, 2008 This code is licensed under
+ the GPLv2 or later. (http://www.gnu.org/copyleft/gpl.html) Check
+ 'mm2wordml_utf8_TEMPLATE.mm' for detailed instructions on how to use
+ this sheet.
+ -->
+<xsl:stylesheet version="1.0"
+ xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml"
+ xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
+ xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
+ xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="xml" indent="yes" encoding="UTF-8"
+ standalone="yes" />
+
+ <!--
+ the variable to be used to determine the maximum level of headings, it
+ is defined by the attribute 'head-maxlevel' of the root node if it
+ exists, else it's the default 4 (maximum possible is 9)
+ -->
+ <xsl:variable name="maxlevel">
+ <xsl:choose>
+ <xsl:when test="//map/node/attribute[@NAME='head-maxlevel']">
+ <xsl:value-of select="//map/node/attribute[@NAME='head-maxlevel']/@VALUE" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'4'" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:template match="/">
+ <xsl:processing-instruction name="mso-application">
+ progid="Word.Document"
+ </xsl:processing-instruction>
+ <w:wordDocument>
+ <xsl:apply-templates mode="DocumentProperties" />
+ <xsl:call-template name="output-styles" />
+ <w:body>
+ <wx:sect>
+ <xsl:apply-templates mode="heading" />
+ </wx:sect>
+ </w:body>
+ </w:wordDocument>
+ </xsl:template>
+
+ <!--
+ the 2 following templates transform the doc-* attributes from the root
+ node into document properties
+ -->
+ <xsl:template match="//map" mode="DocumentProperties">
+ <o:DocumentProperties>
+ <o:Title>
+ <xsl:value-of select="node/@TEXT" />
+ </o:Title>
+ <xsl:apply-templates select="node/attribute">
+ <xsl:with-param name="prefix" select="'doc'" />
+ </xsl:apply-templates>
+ </o:DocumentProperties>
+ </xsl:template>
+
+ <xsl:template match="attribute">
+ <xsl:param name="prefix" />
+ <xsl:if test="starts-with(@NAME,concat($prefix,'-'))">
+ <xsl:element
+ name="{concat('o:',substring-after(@NAME,concat($prefix,'-')))}">
+ <xsl:value-of select="@VALUE" />
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- output each node as heading -->
+ <xsl:template match="node" mode="heading">
+ <xsl:param name="level" select="0" />
+ <xsl:choose> <!-- we change our mind if the NoHeading attribute is present -->
+ <xsl:when test="attribute/@NAME = 'NoHeading'">
+ <xsl:apply-templates select="." />
+ </xsl:when>
+ <xsl:otherwise>
+ <wx:sub-section>
+ <w:p>
+ <w:pPr>
+ <xsl:choose>
+ <xsl:when test="$level = 0">
+ <w:pStyle w:val="Title" />
+ </xsl:when>
+ <xsl:otherwise>
+ <w:pStyle w:val="Heading{$level}" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </w:pPr>
+ <w:r>
+ <w:t>
+ <xsl:call-template name="output-node-text-as-text" />
+ </w:t>
+ </w:r>
+ </w:p>
+ <xsl:call-template name="output-note-text-as-bodytext"><xsl:with-param name="contentType" select="'DETAILS'"/></xsl:call-template>
+ <xsl:call-template name="output-note-text-as-bodytext"><xsl:with-param name="contentType" select="'NOTE'"/></xsl:call-template>
+ <!--
+ if the level is higher than maxlevel, or if the current node is
+ marked with LastHeading, we start outputting normal paragraphs,
+ else we loop back into the heading mode
+ -->
+ <xsl:choose>
+ <xsl:when test="attribute/@NAME = 'LastHeading'">
+ <xsl:apply-templates select="node" />
+ </xsl:when>
+ <xsl:when test="$level < $maxlevel">
+ <xsl:apply-templates select="node" mode="heading">
+ <xsl:with-param name="level" select="$level + 1" />
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="node" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </wx:sub-section>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- output each node as normal paragraph -->
+ <xsl:template match="node">
+ <w:p>
+ <w:pPr>
+ <w:pStyle w:val="Normal" />
+ </w:pPr>
+ <w:r>
+ <w:t>
+ <xsl:call-template name="output-node-text-as-text" />
+ </w:t>
+ </w:r>
+ </w:p>
+ <xsl:call-template name="output-note-text-as-bodytext" />
+ <xsl:apply-templates select="node" />
+ </xsl:template>
+
+ <xsl:template name="output-node-text-as-text">
+ <xsl:choose>
+ <xsl:when test="@TEXT">
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ </xsl:when>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:value-of select="normalize-space(richcontent[@TYPE='NODE']/html/body)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="output-note-text-as-bodytext">
+ <xsl:param name="contentType"></xsl:param>
+ <xsl:if test="richcontent[@TYPE=$contentType]">
+ <w:p>
+ <w:pPr>
+ <w:pStyle w:val="BodyText" />
+ </w:pPr>
+ <w:r>
+ <w:t>
+ <xsl:value-of select="string(richcontent[@TYPE='DETAILS']/html/body)" />
+ </w:t>
+ </w:r>
+ </w:p>
+ </xsl:if>
+ </xsl:template>
+
+ <!--
+ The following is a very long template just to output the necessary
+ styles, this is the part you should edit if you'd like different
+ default styles.
+ -->
+
+ <xsl:template name="output-styles">
+ <w:styles>
+ <w:versionOfBuiltInStylenames w:val="4" />
+ <w:latentStyles w:defLockedState="off"
+ w:latentStyleCount="156" />
+
+ <w:style w:type="paragraph" w:default="on" w:styleId="Normal">
+ <w:name w:val="Normal" />
+ <w:rsid w:val="00831C9D" />
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ <w:sz w:val="24" />
+ <w:sz-cs w:val="24" />
+ <w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading1">
+ <w:name w:val="heading 1" />
+ <wx:uiName wx:val="Heading 1" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading1" />
+ <w:keepNext />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="0" />
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" />
+ <wx:font wx:val="Arial" />
+ <w:b />
+ <w:b-cs />
+ <w:kern w:val="32" />
+ <w:sz w:val="32" />
+ <w:sz-cs w:val="32" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading2">
+ <w:name w:val="heading 2" />
+ <wx:uiName wx:val="Heading 2" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading2" />
+ <w:keepNext />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="1" />
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" />
+ <wx:font wx:val="Arial" />
+ <w:b />
+ <w:b-cs />
+ <w:i />
+ <w:i-cs />
+ <w:sz w:val="28" />
+ <w:sz-cs w:val="28" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading3">
+ <w:name w:val="heading 3" />
+ <wx:uiName wx:val="Heading 3" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading3" />
+ <w:keepNext />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="2" />
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" />
+ <wx:font wx:val="Arial" />
+ <w:b />
+ <w:b-cs />
+ <w:sz w:val="26" />
+ <w:sz-cs w:val="26" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading4">
+ <w:name w:val="heading 4" />
+ <wx:uiName wx:val="Heading 4" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading4" />
+ <w:keepNext />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="3" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ <w:b />
+ <w:b-cs />
+ <w:sz w:val="28" />
+ <w:sz-cs w:val="28" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading5">
+ <w:name w:val="heading 5" />
+ <wx:uiName wx:val="Heading 5" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading5" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="4" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ <w:b />
+ <w:b-cs />
+ <w:i />
+ <w:i-cs />
+ <w:sz w:val="26" />
+ <w:sz-cs w:val="26" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading6">
+ <w:name w:val="heading 6" />
+ <wx:uiName wx:val="Heading 6" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading6" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="5" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ <w:b />
+ <w:b-cs />
+ <w:sz w:val="22" />
+ <w:sz-cs w:val="22" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading7">
+ <w:name w:val="heading 7" />
+ <wx:uiName wx:val="Heading 7" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading7" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="6" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading8">
+ <w:name w:val="heading 8" />
+ <wx:uiName wx:val="Heading 8" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading8" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="7" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ <w:i />
+ <w:i-cs />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Heading9">
+ <w:name w:val="heading 9" />
+ <wx:uiName wx:val="Heading 9" />
+ <w:basedOn w:val="Normal" />
+ <w:next w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Heading9" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:outlineLvl w:val="8" />
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" />
+ <wx:font wx:val="Arial" />
+ <w:sz w:val="22" />
+ <w:sz-cs w:val="22" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont">
+ <w:name w:val="Default Paragraph Font" />
+ <w:semiHidden />
+ </w:style>
+
+ <w:style w:type="table" w:default="on" w:styleId="TableNormal">
+ <w:name w:val="Normal Table" />
+ <wx:uiName wx:val="Table Normal" />
+ <w:semiHidden />
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ </w:rPr>
+ <w:tblPr>
+ <w:tblInd w:w="0" w:type="dxa" />
+ <w:tblCellMar>
+ <w:top w:w="0" w:type="dxa" />
+ <w:left w:w="108" w:type="dxa" />
+ <w:bottom w:w="0" w:type="dxa" />
+ <w:right w:w="108" w:type="dxa" />
+ </w:tblCellMar>
+ </w:tblPr>
+ </w:style>
+
+ <w:style w:type="list" w:default="on" w:styleId="NoList">
+ <w:name w:val="No List" />
+ <w:semiHidden />
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="Title">
+ <w:name w:val="Title" />
+ <w:basedOn w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="Title" />
+ <w:spacing w:before="240" w:after="60" />
+ <w:jc w:val="center" />
+ <w:outlineLvl w:val="0" />
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" />
+ <wx:font wx:val="Arial" />
+ <w:b />
+ <w:b-cs />
+ <w:kern w:val="28" />
+ <w:sz w:val="32" />
+ <w:sz-cs w:val="32" />
+ </w:rPr>
+ </w:style>
+
+ <w:style w:type="paragraph" w:styleId="BodyText">
+ <w:name w:val="Body Text" />
+ <w:basedOn w:val="Normal" />
+ <w:rsid w:val="00BA7540" />
+ <w:pPr>
+ <w:pStyle w:val="BodyText" />
+ <w:spacing w:after="120" />
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman" />
+ </w:rPr>
+ </w:style>
+
+ </w:styles>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2wordml_utf8_TEMPLATE.mm b/freeplane/external-resources/xslt/mm2wordml_utf8_TEMPLATE.mm
new file mode 100644
index 0000000..24599c3
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2wordml_utf8_TEMPLATE.mm
@@ -0,0 +1,112 @@
+<map version="0.9.0">
+<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node CREATED="1216974513042" ID="ID_833600903" MODIFIED="1216991733257" TEXT="Example of map exportable to Word">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ The root node is exported as document title (with format "Title").
+ </p>
+ <p>
+ Attributes of the root node are exported as document properties if they have the prefix "doc-" in their name. Acceptable names are Subject, Author, Manager, Keywords, Category, Company and Description.
+ </p>
+ <p>
+ The attribute "header-maxlevel" is used to define the maximum of nodes until which "Heading N" styles are used. If the attribute is not defined, the default value is 4. The maximum possible is 9.
+ </p>
+ </body>
+</html></richcontent>
+<attribute_layout NAME_WIDTH="91" VALUE_WIDTH="91"/>
+<attribute NAME="doc-Subject" VALUE="TheSubject"/>
+<attribute NAME="doc-Author" VALUE="TheAuthor"/>
+<attribute NAME="doc-Manager" VALUE="TheManager"/>
+<attribute NAME="doc-Keywords" VALUE="TheKeywords"/>
+<attribute NAME="doc-Category" VALUE="TheCategory"/>
+<attribute NAME="doc-Company" VALUE="TheCompany"/>
+<attribute NAME="doc-Description" VALUE="TheDescription"/>
+<attribute NAME="header-maxlevel" VALUE="4"/>
+<node CREATED="1216974528086" ID="ID_1996762094" MODIFIED="1216974692827" POSITION="left" TEXT="Chapter 1">
+<node CREATED="1216974536680" ID="ID_418841879" MODIFIED="1216974708501" TEXT="Chapter 1.1">
+<node CREATED="1216974544352" ID="ID_1231871458" MODIFIED="1216991404490" TEXT="Chapter 1.1.1">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This is a note belonging to Chapter 1.1.1, such notes are exported with style "Body Text" but any formatting,
+ </p>
+ <p>
+ or even new lines are lost. That's sad but that's reality.
+ </p>
+ </body>
+</html></richcontent>
+<node CREATED="1216974561800" ID="ID_35441158" MODIFIED="1216974730363" TEXT="Chapter 1.1.1.1">
+<node CREATED="1216974620653" ID="ID_1657992058" MODIFIED="1216991329486" TEXT="Text wich is"/>
+<node CREATED="1216974660607" ID="ID_1076025767" MODIFIED="1216991352258" TEXT="deeper than the"/>
+<node CREATED="1216974664012" ID="ID_1612257345" MODIFIED="1216991345298" TEXT="header-maxlevel attribute"/>
+<node CREATED="1216974667197" ID="ID_1877504467" MODIFIED="1216991366458" TEXT="is exported with "Normal" style."/>
+</node>
+<node CREATED="1216974674739" ID="ID_843043724" MODIFIED="1217604631678" TEXT="This nodes will be exported as a normal paragraph">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ By marking a node with the attribute 'NoHeading' (the value is not important), you make sure that this chapter will be exported as normal paragraph, together with all nodes below.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="62" VALUE_WIDTH="91"/>
+<attribute NAME="NoHeading" VALUE=""/>
+<node CREATED="1217604758817" ID="ID_863632446" MODIFIED="1217604766680" TEXT="Like also this one"/>
+</node>
+</node>
+</node>
+<node CREATED="1216974696283" ID="ID_1342553402" MODIFIED="1217604572992" TEXT="Chapter 1.2 - mark a header as last heading">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ By marking a node with the attribute 'LastHeading' (the value is not important), you make sure that this chapter will be exported as the last heading in the hierarchy, i.e. all nodes below the chapter will be exported as normal paragraphs.
+ </p>
+ </body>
+</html>
+</richcontent>
+<attribute_layout NAME_WIDTH="69" VALUE_WIDTH="91"/>
+<attribute NAME="LastHeading" VALUE=""/>
+<node CREATED="1217603132140" ID="ID_1323406791" MODIFIED="1217603515832" TEXT="this node becomes a normal paragraph
even though it's above the defaultlevel">
+<node CREATED="1217603804767" ID="ID_630190221" MODIFIED="1217603812619" TEXT="And this one as well"/>
+</node>
+<node CREATED="1217603814001" ID="ID_1067471434" MODIFIED="1217603819328" TEXT="And also this one"/>
+</node>
+</node>
+<node CREATED="1216991067197" ID="ID_334419387" MODIFIED="1216991070354" POSITION="left" TEXT="Chapter 2"/>
+<node CREATED="1216809914482" ID="ID_1308741003" MODIFIED="1216991809773" POSITION="right" TEXT="Chapter 3 - how to export a mindmap to MS Word ?">
+<node CREATED="1216809917636" ID="ID_199484608" MODIFIED="1216991907919" TEXT="Chapter 3.1 - create a map following the notes and hints expressed in this example map"/>
+<node CREATED="1216809921221" ID="ID_1681718272" MODIFIED="1216991918173" TEXT="Chapter 3.2 - export the map using the File -> Export -> Using XSLT... menu">
+<node CREATED="1216826868748" ID="ID_1660904657" MODIFIED="1216991964598" TEXT="Chapter 3.2.1 - select the mm2wordml_utf8.xsl XSL file from the accessories directory in the Freeplane base directory."/>
+<node CREATED="1216826924521" ID="ID_1561412985" MODIFIED="1216991975934" TEXT="Chapter 3.2.2 - export to a file with a name ending in .doc (or .xml)"/>
+</node>
+<node CREATED="1216826940554" ID="ID_769680777" MODIFIED="1216991935017" TEXT="Chapter 3.3 - just double click in the Explorer on the newly created file and Microsoft Office Word should open the file properly.">
+<richcontent TYPE="NOTE"><html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ You need a version of MS Project supporting XML, I think MS Project 2003 and later.
+ </p>
+ </body>
+</html></richcontent>
+</node>
+<node CREATED="1216827072099" ID="ID_785390572" MODIFIED="1216991949417" TEXT="Chapter 3.4 - you're done, enjoy!"/>
+</node>
+<node CREATED="1216991668227" ID="ID_1657343694" MODIFIED="1216991670530" POSITION="right" TEXT="Chapter 4"/>
+</node>
+</map>
diff --git a/freeplane/external-resources/xslt/mm2xbel.xsl b/freeplane/external-resources/xslt/mm2xbel.xsl
new file mode 100644
index 0000000..b5e2c36
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2xbel.xsl
@@ -0,0 +1,53 @@
+<?xml version="1.0" standalone="no" ?>
+ <!--
+ : mm2xbel.xsl : XSL stylesheet to convert from Mindmap to XBEL : :
+
+ MINDMAPEXPORTFILTER xbel XBEL
+
+ This code released under the GPL. :
+ (http://www.gnu.org/copyleft/gpl.html) : : William McVey
+ <wam at cisco.com> : September 11, 2003 : : $Id: mm2xbel.xsl,v 1.1.34.1
+ 2007/04/20 20:31:31 christianfoltin Exp $ :
+ -->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:strip-space elements="*" />
+ <xsl:output method="xml" indent="yes" encoding="UTF-8" />
+
+ <xsl:template match="/map/node">
+ <xbel version="1.0" folded="no">
+ <title>
+ <xsl:value-of select="@TEXT" />
+ </title>
+ <xsl:for-each select="node">
+ <xsl:call-template name="node" />
+ </xsl:for-each>
+ </xbel>
+ </xsl:template>
+
+ <xsl:template name="node">
+ <xsl:if test="string-length(@LINK) > 0">
+ <bookmark>
+ <xsl:attribute name="href">
+ <xsl:value-of select="@LINK" />
+ </xsl:attribute>
+ <title>
+ <xsl:value-of select="@TEXT" />
+ </title>
+ </bookmark>
+ </xsl:if>
+ <xsl:if test="string-length(@LINK) = 0">
+ <folder>
+ <title>
+ <xsl:value-of select="@TEXT" />
+ </title>
+ <xsl:for-each select="node">
+ <xsl:call-template name="node" />
+ </xsl:for-each>
+ </folder>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2xls_utf8.xsl b/freeplane/external-resources/xslt/mm2xls_utf8.xsl
new file mode 100644
index 0000000..65a79ae
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2xls_utf8.xsl
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ MINDMAPEXPORTFILTER xls;xml %xslt_export.ms_excel
+
+ (c) by Naoki Nose, Eric Lavarde 2006 This code is licensed under the GPL.
+ (http://www.gnu.org/copyleft/gpl.html) 2006-12-10: added support for
+ notes and attributes (EWL)
+ -->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
+ <xsl:output method="xml" indent="yes" encoding="UTF-8"
+ standalone="yes" />
+
+ <xsl:template match="/map">
+ <xsl:processing-instruction name="mso-application">
+ progid="Excel.Sheet"
+ </xsl:processing-instruction>
+ <Workbook>
+ <Styles>
+ <Style ss:ID="s16" ss:Name="attribute_cell">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Left" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Right" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Top" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ </Borders>
+ </Style>
+ <Style ss:ID="s17" ss:Name="attribute_header">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Left" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Right" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ <Border ss:Position="Top" ss:LineStyle="Continuous"
+ ss:Weight="1" />
+ </Borders>
+ <Font ss:Bold="1" />
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Freeplane Sheet">
+ <Table>
+ <xsl:apply-templates select="node">
+ <xsl:with-param name="index" select="1" />
+ </xsl:apply-templates>
+ </Table>
+ </Worksheet>
+ </Workbook>
+ </xsl:template>
+
+ <xsl:template match="node">
+ <xsl:param name="index" />
+ <Row>
+ <Cell ss:Index="{$index}">
+ <xsl:call-template name="output-node-text-as-data" />
+ </Cell>
+ <xsl:if test="attribute">
+ <Cell ss:StyleID="s17">
+ <Data ss:Type="String">Names</Data>
+ </Cell>
+ <Cell ss:StyleID="s17">
+ <Data ss:Type="String">Values</Data>
+ </Cell>
+ </xsl:if>
+ </Row>
+ <xsl:apply-templates select="attribute">
+ <xsl:with-param name="index" select="$index + 1" />
+ </xsl:apply-templates>
+ <xsl:apply-templates select="node">
+ <xsl:with-param name="index" select="$index + 1" />
+ </xsl:apply-templates>
+ </xsl:template>
+
+ <xsl:template match="attribute">
+ <xsl:param name="index" />
+ <Row>
+ <Cell ss:Index="{$index}" ss:StyleID="s16">
+ <Data ss:Type="String">
+ <xsl:value-of select="@NAME" />
+ </Data>
+ </Cell>
+ <Cell ss:StyleID="s16">
+ <Data ss:Type="String">
+ <xsl:value-of select="@VALUE" />
+ </Data>
+ </Cell>
+ </Row>
+ </xsl:template>
+
+ <xsl:template name="output-node-text-as-data">
+ <xsl:choose>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:element name="ss:Data" namespace="urn:schemas-microsoft-com:office:spreadsheet">
+ <xsl:attribute name="ss:Type">String</xsl:attribute>
+ <xsl:copy-of select="richcontent[@TYPE='NODE']/html/body/*" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <Data ss:Type="String">
+ <xsl:value-of select="@TEXT" />
+ </Data>
+ <!-- xsl:value-of select="normalize-space(@TEXT)" / -->
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="output-note-text-as-comment" />
+ </xsl:template>
+
+ <xsl:template name="output-note-text-as-comment">
+ <xsl:if test="richcontent[@TYPE='NOTE' or @TYPE='DETAILS']">
+ <Comment>
+ <xsl:element name="ss:Data" namespace="urn:schemas-microsoft-com:office:spreadsheet">
+ <xsl:copy-of select="richcontent[@TYPE='DETAILS']/html/body/*" />
+ <xsl:copy-of select="richcontent[@TYPE='NOTE']/html/body/*" />
+ </xsl:element>
+ </Comment>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
+
+
diff --git a/freeplane/external-resources/xslt/tohtml.xsl b/freeplane/external-resources/xslt/tohtml.xsl
new file mode 100644
index 0000000..c643db8
--- /dev/null
+++ b/freeplane/external-resources/xslt/tohtml.xsl
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+ <!--
+ todo: kopioi html-käsittely xhtml-stylesheetiin, lisää body-käsittely
+
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (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.mozilla.org/MPL/ Software distributed under the License is
+ distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ express or implied. See the License for the specific language
+ governing rights and limitations under the License. Miika Nurminen
+ (minurmin at cc.jyu.fi) 13.7.2004. Transforms Freeplane (0.6.7) mm file
+ to HTML 4.0 transitional. Output is valid (possibly apart HTML entered
+ by user in Freeplane).
+ -->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <!-- mozilla doesn't parse method xhtml (in xslt 2.0) -->
+ <xsl:output method="html" version="1.0" encoding="iso-8859-1"
+ doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
+ doctype-system="http://www.w3.org/TR/html4/loose.dtd" />
+
+ <xsl:strip-space elements="*" />
+ <xsl:template match="/">
+ <html>
+ <head>
+ <title>mmTree</title>
+ <xsl:text disable-output-escaping="yes">
+<link rel="stylesheet" href="treestyles.css" type="text/css">
+</xsl:text>
+</head>
+<body>
+
+<div id="base" class="basetext">
+<ul>
+
+<xsl:apply-templates />
+
+</ul>
+</div>
+
+</body>
+</html>
+</xsl:template>
+
+<xsl:template match="font"><xsl:if test="string-length(@SIZE) > 0">font-size:<xsl:value-of select="round((number(@SIZE) div 12)*100)" />%;</xsl:if><xsl:if test="@BOLD='true'">font-weight:bold;</xsl:if><xsl:if test="@ITALIC='true'">font-style:italic;</xsl:if></xsl:template>
+
+<xsl:template name="link">
+ <xsl:if test="string-length(@LINK) > 0">
+ - [ <a> <xsl:attribute name="href"><xsl:value-of select="@LINK" />
+ </xsl:attribute><xsl:value-of select="@LINK"/></a> ]
+ </xsl:if>
+</xsl:template>
+
+<!-- cutting off inline html headers -->
+<xsl:template name="html">
+ <xsl:choose>
+ <xsl:when test="(substring(@TEXT,string-length(@TEXT)-13,14)='</body></html>') and
+ (substring(@TEXT,1,12)='<html><body>')">
+ <xsl:value-of select="substring(@TEXT,13,string-length(@TEXT)-26)" disable-output-escaping="yes"/>
+ </xsl:when>
+ <xsl:when test="substring(@TEXT,string-length(@TEXT)-6,7)='</html>'">
+ <xsl:value-of select="substring(@TEXT,7,string-length(@TEXT)-14)" disable-output-escaping="yes"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring(@TEXT,7,string-length(@TEXT))" disable-output-escaping="yes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="spantext">
+ <xsl:element name="span">
+ <xsl:attribute name="style">
+ <xsl:if test="string-length(@COLOR) > 0">color:<xsl:value-of select="@COLOR" />;
+ </xsl:if>
+ <xsl:apply-templates select="font" />
+ </xsl:attribute>
+ <xsl:value-of select="@TEXT" />
+ </xsl:element>
+ <xsl:call-template name="link" />
+ <xsl:if test="string-length(normalize-space(@TEXT)) = 0">
+ <br> <!-- anonymous node -->
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="spanbold">
+ <xsl:element name="span">
+ <xsl:attribute name="style">
+ font-weight:bold;
+ <xsl:if test="string-length(@COLOR) > 0">color:<xsl:value-of select="@COLOR" />;
+ </xsl:if>
+ <xsl:apply-templates select="font" />
+ </xsl:attribute>
+ <xsl:value-of select="@TEXT" />
+ </xsl:element>
+ <xsl:call-template name="link" />
+ <xsl:if test="string-length(normalize-space(@TEXT)) = 0">
+ <br> <!-- anonymous node -->
+ </xsl:if>
+</xsl:template>
+
+
+<xsl:template match="node">
+ <xsl:choose>
+ <xsl:when test="(string-length(normalize-space(@TEXT)) = 0) and (string-length(normalize-space(@LINK))= 0)">
+
+ <xsl:if test="count(child::node)>0" > <!-- anonoymous nodes are not processed, but their children are -->
+<xsl:apply-templates select="node" />
+</xsl:if>
+ <xsl:if test="count(child::node)=0" > <!-- anonoymous nodes are not processed, but their children are -->
+ <li></li><!-- must be here to render valid html -->
+</xsl:if>
+
+ </xsl:when>
+ <xsl:when test="(string-length((@TEXT)) > 0) or (string-length(@LINK) > 0)">
+ <xsl:if test="count(child::node)=0">
+ <li>
+ <xsl:choose>
+ <xsl:when test="substring(@TEXT,1,6)='<html>'">
+ <xsl:call-template name="html" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="spantext" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+ </xsl:if>
+ <xsl:if test="count(child::node)>0" >
+ <li>
+ <xsl:choose>
+ <xsl:when test="substring(@TEXT,1,6)='<html>'">
+ <xsl:call-template name="html" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="spanbold" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <ul><xsl:apply-templates select="node" /></ul>
+ </li>
+ </xsl:if>
+</xsl:when>
+<xsl:otherwise>
+ <xsl:apply-templates select="node" />
+</xsl:otherwise>
+</xsl:choose>
+
+
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/xbel2mm.xsl b/freeplane/external-resources/xslt/xbel2mm.xsl
new file mode 100644
index 0000000..d09decd
--- /dev/null
+++ b/freeplane/external-resources/xslt/xbel2mm.xsl
@@ -0,0 +1,53 @@
+<?xml version="1.0" standalone="no" ?>
+ <!--
+ : xbel2mm.xsl : XSL stylesheet to convert from XBEL to Mindmap : :
+ This code released under the GPL. :
+ (http://www.gnu.org/copyleft/gpl.html) : : William McVey
+ <wam at wamber.net> : September 11, 2003 : : $Id: xbel2mm.xsl,v 1.1
+ 2003/11/03 11:02:42 sviles Exp $ :
+ -->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:strip-space elements="*" />
+ <xsl:output method="xml" indent="yes" encoding="UTF-8" />
+
+ <xsl:template match="/xbel">
+ <map>
+ <node>
+ <xsl:attribute name="TEXT">
+ <xsl:value-of select="title" />
+ </xsl:attribute>
+ <xsl:apply-templates />
+ </node>
+ </map>
+ </xsl:template>
+
+ <xsl:template match="folder">
+ <node>
+ <xsl:attribute name="TEXT">
+ <xsl:value-of select="title" />
+ </xsl:attribute>
+ <xsl:attribute name="FOLDED">
+ <xsl:value-of select="@folded" />
+ </xsl:attribute>
+ <xsl:apply-templates />
+ </node>
+ </xsl:template>
+
+ <xsl:template match="bookmark">
+ <node>
+ <xsl:attribute name="TEXT">
+ <xsl:value-of select="title" />
+ </xsl:attribute>
+ <xsl:attribute name="LINK">
+ <xsl:value-of select="@href" />
+ </xsl:attribute>
+ </node>
+ </xsl:template>
+
+ <xsl:template match="node()|@*" />
+
+
+</xsl:stylesheet>
diff --git a/freeplane/pom.xml b/freeplane/pom.xml
new file mode 100644
index 0000000..a8ced8f
--- /dev/null
+++ b/freeplane/pom.xml
@@ -0,0 +1,54 @@
+<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/flash/flashobject.js b/freeplane/resources/flash/flashobject.js
new file mode 100644
index 0000000..3c0a901
--- /dev/null
+++ b/freeplane/resources/flash/flashobject.js
@@ -0,0 +1,153 @@
+/*
+ * FlashObject embed
+ * by Geoff Stearns (geoff at deconcept.com, http://www.deconcept.com/)
+ *
+ * v1.1.1 - 05-17-2005
+ *
+ * writes the embed code for a flash movie, includes plugin detection
+ *
+ * Usage:
+ *
+ * myFlash = new FlashObject("path/to/swf.swf", "swfid", "width", "height", flashversion, "backgroundcolor");
+ * myFlash.write("objId");
+ *
+ * for best practices, see:
+ * http://blog.deconcept.com/2005/03/31/proper-flash-embedding-flashobject-best-practices/
+ *
+ */
+
+var FlashObject = function(swf, id, w, h, ver) {
+ this.swf = swf;
+ this.id = id;
+ this.width = w;
+ this.height = h;
+ this.version = ver;
+ this.align = "middle";
+
+ this.params = new Object();
+ this.variables = new Object();
+
+ this.redirect = "";
+ this.sq = document.location.search.split("?")[1] || "";
+ this.bypassTxt = "<p>Already have Macromedia Flash Player? <a href='?detectflash=false&"+ this.sq +"'>Click here if you have Flash Player "+ this.version +" installed</a>.</p>";
+
+ this.addParam('quality', 'high'); // default to high
+ this.doDetect = getQueryParamValue('detectflash');
+}
+
+var FOP = FlashObject.prototype;
+
+FOP.addParam = function(name, value) { this.params[name] = value; }
+
+FOP.getParams = function() { return this.params; }
+
+FOP.getParam = function(name) { return this.params[name]; }
+
+FOP.addVariable = function(name, value) { this.variables[name] = value; }
+
+FOP.getVariable = function(name) { return this.variables[name]; }
+
+FOP.getVariables = function() { return this.variables; }
+
+FOP.getParamTags = function() {
+ var paramTags = "";
+ for (var param in this.getParams()) {
+ paramTags += '<param name="' + param + '" value="' + this.getParam(param) + '" />';
+ }
+ return (paramTags == "") ? false:paramTags;
+}
+
+FOP.getHTML = function() {
+ var flashHTML = "";
+ if (navigator.plugins && navigator.mimeTypes.length) { // netscape plugin architecture
+ flashHTML += '<embed type="application/x-shockwave-flash" src="' + this.swf + '" width="' + this.width + '" height="' + this.height + '" id="' + this.id + '" align="' + this.align + '"';
+ for (var param in this.getParams()) {
+ flashHTML += ' ' + param + '="' + this.getParam(param) + '"';
+ }
+ if (this.getVariablePairs()) {
+ flashHTML += ' flashVars="' + this.getVariablePairs() + '"';
+ }
+ flashHTML += '></embed>';
+ } else { // PC IE
+ flashHTML += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this.width + '" height="' + this.height + '" name="' + this.id + '" align="' + this.align + '">';
+ flashHTML += '<param name="movie" value="' + this.swf + '" />';
+ if (this.getParamTags()) {
+ flashHTML += this.getParamTags();
+ }
+ if (this.getVariablePairs() != null) {
+ flashHTML += '<param name="flashVars" value="' + this.getVariablePairs() + '" />';
+ }
+ flashHTML += '</object>';
+ }
+ return flashHTML;
+}
+
+FOP.getVariablePairs = function() {
+ var variablePairs = new Array();
+ for (var name in this.getVariables()) {
+ variablePairs.push(name + "=" + escape(this.getVariable(name)));
+ }
+ return (variablePairs.length > 0) ? variablePairs.join("&"):false;
+}
+
+FOP.write = function(elementId) {
+ if(detectFlash(this.version) || this.doDetect=='false') {
+ if (elementId) {
+ document.getElementById(elementId).innerHTML = this.getHTML();
+ } else {
+ document.write(this.getHTML());
+ }
+ } else {
+ if (this.redirect != "") {
+ document.location.replace(this.redirect);
+ } else if (this.altTxt) {
+ if (elementId) {
+ document.getElementById(elementId).innerHTML = this.altTxt +""+ this.bypassTxt;
+ } else {
+ document.write(this.altTxt +""+ this.bypassTxt);
+ }
+ }
+ }
+}
+
+/* ---- detection functions ---- */
+function getFlashVersion() {
+ var flashversion = 0;
+ if (navigator.plugins && navigator.mimeTypes.length) {
+ var x = navigator.plugins["Shockwave Flash"];
+ if(x && x.description) {
+ var y = x.description;
+ flashversion = y.charAt(y.indexOf('.')-1);
+ var aux= y.charAt(y.indexOf('.')-2);
+ if("0123456789".indexOf(aux)!=-1) flashversion=aux+flashversion;
+ }
+ } else {
+ result = false;
+ for(var i = 15; i >= 3 && result != true; i--){
+ execScript('on error resume next: result = IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.'+i+'"))','VBScript');
+ flashversion = i;
+ }
+ }
+ return flashversion;
+}
+
+function detectFlash(ver) { return (getFlashVersion() >= ver) ? true:false; }
+
+// get value of query string param
+function getQueryParamValue(param) {
+ var q = document.location.search || document.location.href.split("#")[1];
+ if (q) {
+ var detectIndex = q.indexOf(param +"=");
+ var endIndex = (q.indexOf("&", detectIndex) > -1) ? q.indexOf("&", detectIndex) : q.length;
+ if (q.length > 1 && detectIndex > -1) {
+ return q.substring(q.indexOf("=", detectIndex)+1, endIndex);
+ } else {
+ return "";
+ }
+ }
+}
+
+/* add Array.push if needed */
+if(Array.prototype.push == null){
+ Array.prototype.push = function(item) { this[this.length] = item; return this.length; }
+}
diff --git a/freeplane/resources/flash/visorFreeplane.swf b/freeplane/resources/flash/visorFreeplane.swf
new file mode 100644
index 0000000..175faa1
Binary files /dev/null and b/freeplane/resources/flash/visorFreeplane.swf differ
diff --git a/freeplane/resources/fonts/BPreplay Open Font License.txt b/freeplane/resources/fonts/BPreplay Open Font License.txt
new file mode 100644
index 0000000..c5d0603
--- /dev/null
+++ b/freeplane/resources/fonts/BPreplay Open Font License.txt
@@ -0,0 +1,95 @@
+Copyright (c) 2004, George Triantafyllakos (http://www.backpacker.gr),
+with BPreplay.
+Copyright (c) 2004, Magenta (http://www.magenta.gr).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
\ No newline at end of file
diff --git a/freeplane/resources/fonts/BPreplay.ttf b/freeplane/resources/fonts/BPreplay.ttf
new file mode 100644
index 0000000..91758db
Binary files /dev/null and b/freeplane/resources/fonts/BPreplay.ttf differ
diff --git a/freeplane/resources/freeplane_mac.properties b/freeplane/resources/freeplane_mac.properties
new file mode 100644
index 0000000..4da1ac1
--- /dev/null
+++ b/freeplane/resources/freeplane_mac.properties
@@ -0,0 +1,4 @@
+acceleratorForMindMap/$NewChildAction$0=TAB
+acceleratorForMindMap/$SelectNoteAction$0=meta PERIOD
+acceleratorForMindMap/main_menu_most_recent_files/OpenLastOpenedAction_1=meta 1
+
diff --git a/freeplane/resources/html/freeplane2html.css b/freeplane/resources/html/freeplane2html.css
new file mode 100644
index 0000000..77f1d35
--- /dev/null
+++ b/freeplane/resources/html/freeplane2html.css
@@ -0,0 +1,65 @@
+body {
+ background-color: #FFFFFF;
+}
+
+div.node {
+ padding-bottom: 1ex;
+ padding-left: 2em;
+}
+
+div.cloud {
+ padding-bottom: 1ex;
+ padding-left: 2em;
+ background-color: #C0C0FF;
+ border-width: 2px;
+ border-style: solid;
+ border-color: #A0A0FF;
+}
+
+div.content {
+ border-width: 1px;
+ border-style: dashed;
+ border-color: #C0C0C0;
+}
+
+img.hideshow {
+ padding-right: 1ex;
+}
+
+img.ilink {
+ border-width: 0px;
+ padding-left: 1ex;
+}
+
+/* for notes and image export, fc, 18.7.2005. */
+.images {
+ max-width:50%;
+}
+
+.nodecontent {display:inline;}
+
+.note-and-attributes {
+ margin-left:10%;
+ color:#0000FF;
+}
+
+table.attributes {
+ border-collapse:collapse;
+ empty-cells:show;
+ border:thin black solid;
+}
+table.attributes td,th {
+ border:thin black solid;
+ padding-top:2px;
+ padding-bottom:2px;
+ padding-left:3px;
+ padding-right:3px;
+}
+table.attributes th {
+ text-align:center;
+}
+table.attributes caption {
+ margin-top:1em;
+ font-style:italic;
+ text-align:center;
+}
diff --git a/freeplane/resources/html/freeplanebrowser.html b/freeplane/resources/html/freeplanebrowser.html
new file mode 100644
index 0000000..19a9c69
--- /dev/null
+++ b/freeplane/resources/html/freeplanebrowser.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<!-- Launcher tested with Mozilla 1.6 under Linux -->
+<!-- Launcher tested with Konqueror 3.1.1 under Linux -->
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org">
+<title>Mind Map</title>
+<!-- ^ Put the name of your mind map here -->
+<style type="text/css">
+body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px }
+</style>
+</head>
+<body>
+<applet code="freeplane.main.FreeplaneApplet.class"
+ archive="freeplaneviewer.jar" width="100%" height="100%">
+ <param name="type" value="application/x-java-applet;version=1.4">
+ <param name="scriptable" value="false">
+ <param name="modes" value="freeplane.modes.browsemode.BrowseMode">
+ <param name="browsemode_initial_map"
+ value="./freeplane.mm">
+ <!-- ^ Put the path to your map here, if it starts with a dot,
+ the file is searched in the filesystem from the path, the html resides in. . -->
+ <param name="initial_mode" value="Browse">
+ <param name="selection_method" value="selection_method_direct">
+</applet>
+
+</body>
+</html>
diff --git a/freeplane/resources/html/freeplanebrowser.xhtml b/freeplane/resources/html/freeplanebrowser.xhtml
new file mode 100644
index 0000000..22bc9a3
--- /dev/null
+++ b/freeplane/resources/html/freeplanebrowser.xhtml
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<!-- Launcher tested with Mozilla 1.6 under Linux -->
+<!-- Launcher tested with Konqueror 3.1.1 under Linux -->
+
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+
+ <title>Mind Map</title>
+ <!-- ^ Put the name of your mind map here -->
+
+<style type="text/css">
+/*<![CDATA[*/
+body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px; height:100% }
+html { height:100% }
+/*]]>*/
+</style>
+</head>
+
+<body>
+ <applet code="freemind.main.FreeMindApplet.class" archive=
+ "freemindbrowser.jar" width="100%" height="100%">
+ <param name="type" value=
+ "application/x-java-applet;version=1.4" />
+ <param name="scriptable" value="false" />
+ <param name="modes" value=
+ "freemind.modes.browsemode.BrowseMode" />
+ <param name="browsemode_initial_map" value=
+ "./freemind.mm" />
+ <!-- ^ Put the path to your map here -->
+ <param name="initial_mode" value="Browse" />
+ <param name="selection_method" value=
+ "selection_method_direct" />
+ </applet>
+</body>
+</html>
diff --git a/freeplane/resources/html/hide.png b/freeplane/resources/html/hide.png
new file mode 100644
index 0000000..067acdb
Binary files /dev/null and b/freeplane/resources/html/hide.png differ
diff --git a/freeplane/resources/html/ilink.png b/freeplane/resources/html/ilink.png
new file mode 100644
index 0000000..3e7f928
Binary files /dev/null and b/freeplane/resources/html/ilink.png differ
diff --git a/freeplane/resources/html/leaf.png b/freeplane/resources/html/leaf.png
new file mode 100644
index 0000000..a864906
Binary files /dev/null and b/freeplane/resources/html/leaf.png differ
diff --git a/freeplane/resources/html/marktree.js b/freeplane/resources/html/marktree.js
new file mode 100644
index 0000000..259cd11
--- /dev/null
+++ b/freeplane/resources/html/marktree.js
@@ -0,0 +1,475 @@
+/* MarkTree JavaScript code
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Miika Nurminen, 12.7.2004.
+ */
+
+/* cross-browser (tested with ie5, mozilla 1 and opera 5) keypress detection */
+function get_keycode(evt) {
+ // IE
+ code = document.layers ? evt.which
+ : document.all ? event.keyCode // event.keyCode!=evt.keyCode!
+ : evt.keyCode;
+
+ if (code==0)
+ code=evt.which; // for NS
+ return code;
+}
+
+var lastnode=null;
+var listnodes = null;
+var list_index=1;
+var lastnodetype=''; // determines if node is a link, input or text;
+
+// up, left, down, right, keypress codes
+//ijkl
+//var keys = new Array(105,106,107,108);
+//num arrows
+//var keys = new Array(56,52,50,54);
+//wasd
+// var press2 = new Array(119,97,115,100);
+ var press = new Array(47,45,42,43);
+
+// keydown codes
+ // var keys2=new Array(87,65,83,68);
+ var keys= new Array(38,37,40,39);
+
+ // keyset 1 = keydown, otherwise press
+function checkup(keyset,n) {
+ if (keyset==1) return (n==keys[0]);
+ return ((n==press[0]) /*|| (n==press2[0])*/)
+}
+
+function checkdn(keyset,n) {
+ if (keyset==1) return (n==keys[2]);
+ return ((n==press[2]) /*|| (n==press2[2])*/)
+}
+
+function checkl(keyset,n) {
+ if (keyset==1) return (n==keys[1]);
+ return ((n==press[1]) /*|| (n==press2[1])*/)
+}
+
+function checkr(keyset,n) {
+ if (keyset==1) return (n==keys[3]);
+ return ((n==press[3]) /*|| (n==press2[3])*/)
+}
+
+
+
+
+
+function is_exp(n) {
+ if (n==null) return false;
+ return ((n.className=='exp') || (n.className=='exp_active'));
+}
+
+function is_col(n) {
+ if (n==null) return false;
+ return ((n.className=='col') || (n.className=='col_active'));
+}
+
+function is_basic(n) {
+ if (n==null) return false;
+ return ((n.className=='basic') || (n.className=='basic_active'));
+}
+
+
+
+/* returns i>=0 if true */
+function is_active(node) {
+ if (node.className==null) return false
+ return node.className.indexOf('_active');
+}
+
+function toggle_class(node) {
+ if ((node==null) || (node.className==null)) return;
+ str=node.className;
+ result="";
+ i = str.indexOf('_active');
+ if (i>0)
+ result= str.substr(0,i);
+ else
+ result= str+"_active";
+ node.className=result;
+ return node;
+}
+
+function activate(node) {
+ node.style.backgroundColor='#eeeeff';
+}
+
+function deactivate(node) {
+ node.style.backgroundColor='#ffffff';
+}
+
+function is_list_node(n) {
+ if (n==null) return false;
+ if (n.className==null) return false;
+ if ( (is_exp(n)) ||
+ (is_col(n)) ||
+ (is_basic(n)) )
+ return true; else return false;
+}
+
+
+function get_href(n) {
+ alist=n.attributes;
+ if (alist!=null) {
+ hr = alist.getNamedItem('href');
+ if (hr!=null) return hr.nodeValue;
+ }
+ if (n.childNodes.length==0) return '';
+ for (var i=0; i<n.childNodes.length; i++) {
+ s = get_href(n.childNodes[i]);
+ if (s!='') return s;
+ }
+ return '';
+}
+
+function get_link(n) {
+ if (n==null) return null;
+ if (n.style==null) return null;
+
+ // disabling uncontrolled recursion to prevent error messages on IE
+ // when trying to focus to invisible links (readonly mode)
+// alert(n.nodeName+' '+n.className);
+ if ((n.nodeName=='UL') && (n.className=='sub')) return null;
+
+ if (n.nodeName=='A') return n;
+ if (n.childNodes.length==0) return null;
+ for (var i=0; i<n.childNodes.length; i++) {
+ s = get_link(n.childNodes[i]);
+ if (s!=null) return s;
+ }
+ return null;
+}
+
+function set_lastnode(n) {
+/*var d = new Date();
+var t_mil = d.getMilliseconds();*/
+// testattu nopeuksia explorerilla, ei merkittäviä eroja
+ if (lastnode==n) return;
+/* deactivate(lastnode)
+ lastnode=n;
+ activate(lastnode);*/
+
+ if (is_active(lastnode)>=0)
+ toggle_class(lastnode);
+ lastnode=n;
+ if (!(is_active(lastnode)>=0))
+ toggle_class(lastnode);
+
+
+/*var d2 = new Date();
+var t_mil2 = d2.getMilliseconds();
+ window.alert(t_mil2-t_mil);*/
+}
+
+function next_list_node() {
+ tempIndex = list_index;
+ while (tempIndex<listnodes.length-1) {
+ tempIndex++;
+ var x = listnodes[tempIndex];
+ if (is_list_node(x)) {
+ list_index=tempIndex;
+ return;
+ }
+ }
+}
+
+function prev_list_node() {
+ tempIndex = list_index;
+ while (tempIndex>0) {
+ tempIndex--;
+ var x = listnodes[tempIndex];
+ if (is_list_node(x)) {
+ list_index=tempIndex;
+ return;
+ }
+ }
+}
+
+
+
+function getsub (li) {
+ if (li.childNodes.length==0) return null;
+ for (var c = 0; c < li.childNodes.length; c++)
+ if ( (li.childNodes[c].className == 'sub') || (li.childNodes[c].className == 'subexp') )
+ return li.childNodes[c];
+}
+
+function find_listnode_recursive (li) {
+ if (is_list_node(li)) return li;
+ if (li.childNodes.length==0) return null;
+ result=null;
+ for (var c = 0; c < li.childNodes.length; c++) {
+ result=find_listnode_recursive(li.childNodes[c]);
+ if (result!=null) return result;
+ }
+ return null;
+}
+
+function next_child_listnode(li) {
+ var result=null;
+ for (var i=0; i<li.childNodes.length; i++) {
+ result=find_listnode_recursive(li.childNodes[i]);
+ if (result!=null) return result;
+ }
+ return null;
+}
+
+function next_actual_sibling_listnode(li) {
+ if (li==null) return null;
+ var temp=li;
+ while (1) {
+ var n = temp.nextSibling;
+ if (n==null) {
+ n=parent_listnode(temp);
+ return next_actual_sibling_listnode(n);
+ }
+ if (is_list_node(n)) return n;
+ temp=n;
+ }
+}
+
+function next_sibling_listnode(li) {
+if (li==null) return null;
+ var result=null;
+ var temp=li;
+ if (is_col(temp)) return next_child_listnode(temp);
+ while (1) {
+ var n = temp.nextSibling;
+ if (n==null) {
+ n=parent_listnode(temp);
+ return next_actual_sibling_listnode(n);
+ }
+ if (is_list_node(n)) return n;
+ temp=n;
+ }
+}
+
+function last_sibling_listnode(li) {
+ if (li==null) return null;
+ var temp=li;
+ var last=null;
+ while(1) {
+ var n = temp.nextSibling;
+ if (is_list_node(temp))
+ last = temp;
+ if (n==null) {
+ if (is_col(last)) return last_sibling_listnode(next_child_listnode(last));
+ else return last;
+ }
+ temp = n;
+ }
+}
+
+function prev_sibling_listnode(li) {
+ if (li==null) return null;
+ var temp=li;
+ var n = null;
+ while (1) {
+ n = temp.previousSibling;
+ if (n==null) {
+ return parent_listnode(li);
+ }
+ if (is_list_node(n)) {
+ if (is_col(n)) {
+ return last_sibling_listnode(next_child_listnode(n));
+ }
+ else {
+ return n;
+ }
+ }
+ temp=n;
+ }
+}
+
+
+function parent_listnode(li) {
+ // added 12.7.2004 to prevent IE error when readonly mode==true
+ if (li==null) return null;
+ n=li;
+ while (1) {
+ n=n.parentNode;
+ if (n==null) return null;
+ if (is_list_node(n)) return n;
+ }
+}
+
+function getVisibleParents(id) {
+ var n = document.getElementById(id);
+ while(1) {
+ expand(n);
+ n = parent_listnode(n);
+ if (n==null) return;
+ }
+}
+
+function onClickHandler (evt) {
+if (lastnode==null)
+{
+listnodes = document.getElementsByTagName('li');
+lastnode=listnodes[1];
+temp=listnodes[1];
+}
+
+
+ var target = evt ? evt.target : event.srcElement;
+ if (!is_list_node(target)) return;
+ toggle(target);
+ set_lastnode(target);
+}
+
+
+function expand(node) {
+ if (!is_exp(node)) return;
+ if (node.className=='exp_active')
+ node.className='col_active';
+ else
+ node.className='col';
+ setSubClass(node,'subexp');
+ // getsub(node).className='subexp';
+}
+
+function collapse(node) {
+ if (!is_col(node)) return;
+
+if (node.className=='col_active')
+ node.className='exp_active'
+ else
+ node.className='exp';
+
+ setSubClass(node,'sub');
+// getsub(node).className='sub';
+
+}
+
+function setSubClass(node,name) {
+ sub = getsub(node);
+ if (sub==null) return;
+ sub.className=name;
+}
+
+function toggle(target) {
+ if (!is_list_node(target)) return;
+ if (is_col(target)) {
+ target.className='exp';
+ setSubClass(target,'sub');
+ // getsub(target).className='sub';
+ }
+ else if (is_exp(target)) {
+ target.className='col';
+ setSubClass(target,'subexp');
+ // getsub(target).className='subexp';
+ }
+
+}
+
+function expandAll(node) {
+ if (node.className=='exp') {
+ node.className='col';
+ setSubClass(node,'subexp');
+// getsub(node).className='subexp';
+ }
+ var i;
+ if (node.childNodes!=null)
+// if (node.hasChildNodes())
+ for ( i = 0; i<node.childNodes.length; i++)
+ expandAll(node.childNodes[i]);
+}
+
+function collapseAll(node) {
+ if (node.className=='col') {
+ node.className='exp';
+ setSubClass(node,'sub');
+// getsub(node).className='sub';
+ }
+ var i;
+ if (node.childNodes!=null)
+// for opera if (node.hasChildNodes())
+ for ( i = 0; i<node.childNodes.length; i++)
+ collapseAll(node.childNodes[i]);
+}
+
+
+
+function unFocus(node) {
+ // unfocuses potential link that is to be hidden (if a==null there is no link so it should not be blurred).
+ // tested with mozilla 1.7, 12.7.2004. /mn (
+ intemp=parent_listnode(node);
+ a = get_link(intemp); // added 6.4. to get keyboard working with
+ // moved before collapse to prevent an error message with IE when readonly==true
+ if (a!=null) a.blur(); // netscape after collapsing a focused node
+ return intemp;
+}
+
+// mode: 0==keypress, 1==keyup
+function keyfunc(evt,mode) {
+ var c = get_keycode(evt);
+ var temp = null;
+ var a = null;
+
+ if (lastnode==null) {
+ listnodes = document.getElementsByTagName('li');
+ lastnode=listnodes[1];
+ temp=listnodes[1];
+ }
+
+ //window.alert(c);
+ if (checkup(mode,c)) { // i
+ temp=prev_sibling_listnode(lastnode);
+ }
+ else if (checkdn(mode,c)) { // k
+ temp=next_sibling_listnode(lastnode);
+ }
+ else if (checkr(mode,c)) { // l
+ expand(lastnode);
+ // temp=next_child_listnode(lastnode);
+ // if (temp==null) {
+ a = get_link(lastnode);
+ if (a!=null) a.focus(); else self.focus();
+ //}
+ }
+ else if (checkl(mode,c)) { // j
+ if (is_col(lastnode)) {
+ unFocus(lastnode);
+ collapse(lastnode);
+ }
+ else {
+ temp=unFocus(lastnode);
+ collapse(temp);
+ }
+ // if (temp==null) lastnode.focus(); // forces focus to correct div (try mozilla typesearch) (doesn't seem to work -mn/6.4.2004)
+ }
+ else return;
+ if (temp!=null) set_lastnode(temp);
+
+ // alert('pressed ' + String.fromCharCode(c) + '(' + c + ')');
+ return true;
+}
+
+
+function keytest (evt) {
+ return keyfunc(evt,1);
+};
+
+
+function presstest (evt) {
+ return keyfunc(evt,0);
+};
+
+
+ document.onclick = onClickHandler;
+ document.onkeypress = presstest;
+ document.onkeyup = keytest;
diff --git a/freeplane/resources/html/minus.png b/freeplane/resources/html/minus.png
new file mode 100644
index 0000000..4956850
Binary files /dev/null and b/freeplane/resources/html/minus.png differ
diff --git a/freeplane/resources/html/plus.png b/freeplane/resources/html/plus.png
new file mode 100644
index 0000000..e09ee95
Binary files /dev/null and b/freeplane/resources/html/plus.png differ
diff --git a/freeplane/resources/html/show.png b/freeplane/resources/html/show.png
new file mode 100644
index 0000000..2a1252a
Binary files /dev/null and b/freeplane/resources/html/show.png differ
diff --git a/freeplane/resources/html/treestyles.css b/freeplane/resources/html/treestyles.css
new file mode 100644
index 0000000..e813500
--- /dev/null
+++ b/freeplane/resources/html/treestyles.css
@@ -0,0 +1,206 @@
+
+body {
+ background-color: #eeeeee;
+ color: #000000;
+ font-family:sans-serif;
+}
+
+:link { color: #0000ff; text-decoration:none;}
+:visited { color: #6666ff; text-decoration:none; }
+a:active { color: #0000ff; text-decoration:none;}
+a:hover {color: #0000ff; text-decoration:underline; }
+
+div.basetext {
+ background-color:#ffffff;
+ margin-top:11px;
+ margin-bottom:11px;
+ margin-left:1%;
+ margin-right:1%;
+ padding-top:11px;
+ padding-left:11px;
+ padding-right:11px;
+ padding-bottom:11px;
+ text-align:left;
+ font-weight:normal;
+ border-width:thin;
+ border-style:solid;
+ border-color:#dddddd;
+}
+
+div.basetop {
+ position: fixed;
+ width:auto;
+ height:auto;
+ right:0em;
+ top:0em;
+ left:auto;
+ top:0;
+ background-color:#ffffff;
+ margin-top:0;
+ margin-bottom:0;
+ margin-left:1%;
+ margin-right:1%;
+ padding-top:2px;
+ padding-left:11px;
+ padding-right:11px;
+ padding-bottom:2px;
+ text-align:left;
+ font-weight:normal;
+text-align:right;
+ border-width:thin;
+ border-style:solid;
+ border-color:#dddddd;
+}
+
+h1 {
+ text-align:center;
+}
+
+span.h2 {
+ font-family:sans-serif;
+ font-weight:bold;
+}
+
+div.year {
+ margin-right:2%;
+ background-color:#eeeeee;
+}
+
+div.form {
+}
+
+span.cpt {
+ color:#005500;
+ font-weight:bold;
+}
+
+span.cm {
+ color:#666666;
+}
+
+.fl {
+ color:#0000FF;
+ font-style:italic;
+}
+
+ul {
+ margin-top:1px;
+ margin-bottom:1px;
+ margin-left:0px;
+ padding-left:3%;
+}
+
+li {
+ list-style:outside;
+ margin-top:10px;
+ margin-bottom:10px;
+}
+
+ul li {
+ list-style:square;
+ font-family:sans-serif;
+ font-weight:normal;
+}
+
+li.basic {
+ list-style:square;
+ list-style-image:none;
+ margin-top:2px;
+ margin-bottom:2px;
+}
+
+span.links {
+}
+
+
+
+
+.sub { display: none; }
+.subexp {display: block; }
+.sub { display: none; }
+
+.subexp {display: block; }
+
+li.exp {
+ list-style-image:url("plus.png");
+ margin-top:10px;
+ margin-bottom:10px;
+ cursor:pointer;
+}
+
+li.col {
+ list-style-image:url("minus.png");
+ margin-top:10px;
+ margin-bottom:10px;
+ cursor:pointer;
+}
+
+li.exp_active {
+ list-style-image:url("plus.png");
+ margin-top:10px;
+ margin-bottom:10px;
+ background-color:#eeeeff;
+ cursor:pointer;
+}
+
+li.col_active {
+ list-style-image:url("minus.png");
+ margin-top:10px;
+ margin-bottom:10px;
+ background-color:#eeeeff;
+ cursor:pointer; /* if not included, bullets are not shown right in moz*/
+}
+
+
+li.basic_active {
+ list-style:square;
+ list-style-image:none;
+ background-color:#eeeeff;
+ margin-top:2px;
+ margin-bottom:2px;
+}
+
+/* the 'boxed' and 'attributes' styles are used to display notes and attributes
+*/
+
+.boxed,.nodecontent {display:inline;}
+.boxed .note-and-attributes {display:none;}
+
+.boxed:hover .note-and-attributes {
+ position:fixed; top:2em;right:10px;z-index:3;
+ display:block;
+ min-width:33%;
+ max-width:60%;
+ max-height:95%;
+ color:black;
+ background:#ffffff;
+ font:normal 16px courier, sans-serif;
+ border:1px solid black;
+ padding:10px;
+}
+
+.note:before {
+ content:"NOTE: ";
+ font-weight:bold;
+}
+
+table.attributes {
+ border-collapse:collapse;
+ empty-cells:show;
+ border:thin black solid;
+}
+table.attributes td,th {
+ border:thin black solid;
+ padding-top:2px;
+ padding-bottom:2px;
+ padding-left:3px;
+ padding-right:3px;
+}
+table.attributes th {
+ text-align:center;
+}
+table.attributes caption {
+ margin-top:1em;
+ font-style:italic;
+ text-align:center;
+}
diff --git a/freeplane/resources/images/1leftarrow.png b/freeplane/resources/images/1leftarrow.png
new file mode 100644
index 0000000..18c00d6
Binary files /dev/null and b/freeplane/resources/images/1leftarrow.png differ
diff --git a/freeplane/resources/images/1rightarrow.png b/freeplane/resources/images/1rightarrow.png
new file mode 100644
index 0000000..b406d0a
Binary files /dev/null and b/freeplane/resources/images/1rightarrow.png differ
diff --git a/freeplane/resources/images/AutomaticEdgeColorHookAction.png b/freeplane/resources/images/AutomaticEdgeColorHookAction.png
new file mode 100644
index 0000000..99cc4b0
Binary files /dev/null and b/freeplane/resources/images/AutomaticEdgeColorHookAction.png differ
diff --git a/freeplane/resources/images/Back24.gif b/freeplane/resources/images/Back24.gif
new file mode 100644
index 0000000..787518c
Binary files /dev/null and b/freeplane/resources/images/Back24.gif differ
diff --git a/freeplane/resources/images/Bold16.gif b/freeplane/resources/images/Bold16.gif
new file mode 100644
index 0000000..541f053
Binary files /dev/null and b/freeplane/resources/images/Bold16.gif differ
diff --git a/freeplane/resources/images/Bold16.png b/freeplane/resources/images/Bold16.png
new file mode 100644
index 0000000..bb2db32
Binary files /dev/null and b/freeplane/resources/images/Bold16.png differ
diff --git a/freeplane/resources/images/Bold24.gif b/freeplane/resources/images/Bold24.gif
new file mode 100644
index 0000000..ef0aa1a
Binary files /dev/null and b/freeplane/resources/images/Bold24.gif differ
diff --git a/freeplane/resources/images/Bold_on16.png b/freeplane/resources/images/Bold_on16.png
new file mode 100644
index 0000000..8570a88
Binary files /dev/null and b/freeplane/resources/images/Bold_on16.png differ
diff --git a/freeplane/resources/images/Cloud24.gif b/freeplane/resources/images/Cloud24.gif
new file mode 100644
index 0000000..48dc9e6
Binary files /dev/null and b/freeplane/resources/images/Cloud24.gif differ
diff --git a/freeplane/resources/images/Cloud24.png b/freeplane/resources/images/Cloud24.png
new file mode 100644
index 0000000..62619a2
Binary files /dev/null and b/freeplane/resources/images/Cloud24.png differ
diff --git a/freeplane/resources/images/Colors24.png b/freeplane/resources/images/Colors24.png
new file mode 100644
index 0000000..bb21fef
Binary files /dev/null and b/freeplane/resources/images/Colors24.png differ
diff --git a/freeplane/resources/images/Copy24.gif b/freeplane/resources/images/Copy24.gif
new file mode 100644
index 0000000..c665d07
Binary files /dev/null and b/freeplane/resources/images/Copy24.gif differ
diff --git a/freeplane/resources/images/Cut24.gif b/freeplane/resources/images/Cut24.gif
new file mode 100644
index 0000000..5c37d3a
Binary files /dev/null and b/freeplane/resources/images/Cut24.gif differ
diff --git a/freeplane/resources/images/DecreaseNodeFontAction.png b/freeplane/resources/images/DecreaseNodeFontAction.png
new file mode 100644
index 0000000..f891789
Binary files /dev/null and b/freeplane/resources/images/DecreaseNodeFontAction.png differ
diff --git a/freeplane/resources/images/DeleteDetailsAction.png b/freeplane/resources/images/DeleteDetailsAction.png
new file mode 100644
index 0000000..8c7e373
Binary files /dev/null and b/freeplane/resources/images/DeleteDetailsAction.png differ
diff --git a/freeplane/resources/images/EditAttributesAction.png b/freeplane/resources/images/EditAttributesAction.png
new file mode 100644
index 0000000..161b383
Binary files /dev/null and b/freeplane/resources/images/EditAttributesAction.png differ
diff --git a/freeplane/resources/images/EditDetailsInDialogAction.png b/freeplane/resources/images/EditDetailsInDialogAction.png
new file mode 100644
index 0000000..0f19275
Binary files /dev/null and b/freeplane/resources/images/EditDetailsInDialogAction.png differ
diff --git a/freeplane/resources/images/EditNoteInDialogAction.png b/freeplane/resources/images/EditNoteInDialogAction.png
new file mode 100644
index 0000000..d42c175
Binary files /dev/null and b/freeplane/resources/images/EditNoteInDialogAction.png differ
diff --git a/freeplane/resources/images/ExecuteScriptForAllNodes.png b/freeplane/resources/images/ExecuteScriptForAllNodes.png
new file mode 100644
index 0000000..a22350c
Binary files /dev/null and b/freeplane/resources/images/ExecuteScriptForAllNodes.png differ
diff --git a/freeplane/resources/images/ExecuteScriptForSelectionAction.png b/freeplane/resources/images/ExecuteScriptForSelectionAction.png
new file mode 100644
index 0000000..0bdf171
Binary files /dev/null and b/freeplane/resources/images/ExecuteScriptForSelectionAction.png differ
diff --git a/freeplane/resources/images/ExecuteScripts.png b/freeplane/resources/images/ExecuteScripts.png
new file mode 100644
index 0000000..bec1957
Binary files /dev/null and b/freeplane/resources/images/ExecuteScripts.png differ
diff --git a/freeplane/resources/images/ExternalImageAddAction.png b/freeplane/resources/images/ExternalImageAddAction.png
new file mode 100644
index 0000000..f39ee5f
Binary files /dev/null and b/freeplane/resources/images/ExternalImageAddAction.png differ
diff --git a/freeplane/resources/images/ExtractLinkFromTextAction.png b/freeplane/resources/images/ExtractLinkFromTextAction.png
new file mode 100644
index 0000000..8f31a2b
Binary files /dev/null and b/freeplane/resources/images/ExtractLinkFromTextAction.png differ
diff --git a/freeplane/resources/images/Find16.gif b/freeplane/resources/images/Find16.gif
new file mode 100644
index 0000000..abafbe2
Binary files /dev/null and b/freeplane/resources/images/Find16.gif differ
diff --git a/freeplane/resources/images/FitToPage.png b/freeplane/resources/images/FitToPage.png
new file mode 100644
index 0000000..cda0dd0
Binary files /dev/null and b/freeplane/resources/images/FitToPage.png differ
diff --git a/freeplane/resources/images/Folded.png b/freeplane/resources/images/Folded.png
new file mode 100644
index 0000000..621fb7f
Binary files /dev/null and b/freeplane/resources/images/Folded.png differ
diff --git a/freeplane/resources/images/Forward24.gif b/freeplane/resources/images/Forward24.gif
new file mode 100644
index 0000000..1936fd4
Binary files /dev/null and b/freeplane/resources/images/Forward24.gif differ
diff --git a/freeplane/resources/images/Freeplane_frame_icon.png b/freeplane/resources/images/Freeplane_frame_icon.png
new file mode 100644
index 0000000..87d1b9b
Binary files /dev/null and b/freeplane/resources/images/Freeplane_frame_icon.png differ
diff --git a/freeplane/resources/images/Freeplane_frame_icon_32x32.png b/freeplane/resources/images/Freeplane_frame_icon_32x32.png
new file mode 100644
index 0000000..f25d915
Binary files /dev/null and b/freeplane/resources/images/Freeplane_frame_icon_32x32.png differ
diff --git a/freeplane/resources/images/Freeplane_splash.png b/freeplane/resources/images/Freeplane_splash.png
new file mode 100644
index 0000000..0b1d70a
Binary files /dev/null and b/freeplane/resources/images/Freeplane_splash.png differ
diff --git a/freeplane/resources/images/HierarchicalIconsAction.png b/freeplane/resources/images/HierarchicalIconsAction.png
new file mode 100644
index 0000000..e17b965
Binary files /dev/null and b/freeplane/resources/images/HierarchicalIconsAction.png differ
diff --git a/freeplane/resources/images/IncreaseNodeFontAction.png b/freeplane/resources/images/IncreaseNodeFontAction.png
new file mode 100644
index 0000000..9cfff8f
Binary files /dev/null and b/freeplane/resources/images/IncreaseNodeFontAction.png differ
diff --git a/freeplane/resources/images/Italic16.gif b/freeplane/resources/images/Italic16.gif
new file mode 100644
index 0000000..a896944
Binary files /dev/null and b/freeplane/resources/images/Italic16.gif differ
diff --git a/freeplane/resources/images/Italic16.png b/freeplane/resources/images/Italic16.png
new file mode 100644
index 0000000..b03be66
Binary files /dev/null and b/freeplane/resources/images/Italic16.png differ
diff --git a/freeplane/resources/images/Italic24.gif b/freeplane/resources/images/Italic24.gif
new file mode 100644
index 0000000..069c6b9
Binary files /dev/null and b/freeplane/resources/images/Italic24.gif differ
diff --git a/freeplane/resources/images/Italic_on16.png b/freeplane/resources/images/Italic_on16.png
new file mode 100644
index 0000000..0a3b305
Binary files /dev/null and b/freeplane/resources/images/Italic_on16.png differ
diff --git a/freeplane/resources/images/JoinNodesAction.png b/freeplane/resources/images/JoinNodesAction.png
new file mode 100644
index 0000000..674e8f9
Binary files /dev/null and b/freeplane/resources/images/JoinNodesAction.png differ
diff --git a/freeplane/resources/images/MapBackgroundColorAction.png b/freeplane/resources/images/MapBackgroundColorAction.png
new file mode 100644
index 0000000..7f52f0b
Binary files /dev/null and b/freeplane/resources/images/MapBackgroundColorAction.png differ
diff --git a/freeplane/resources/images/MoveTo_NextMM.png b/freeplane/resources/images/MoveTo_NextMM.png
new file mode 100644
index 0000000..e3db705
Binary files /dev/null and b/freeplane/resources/images/MoveTo_NextMM.png differ
diff --git a/freeplane/resources/images/MoveTo_NextNode.png b/freeplane/resources/images/MoveTo_NextNode.png
new file mode 100644
index 0000000..45b2b2c
Binary files /dev/null and b/freeplane/resources/images/MoveTo_NextNode.png differ
diff --git a/freeplane/resources/images/MoveTo_PrevMM.png b/freeplane/resources/images/MoveTo_PrevMM.png
new file mode 100644
index 0000000..3fdc707
Binary files /dev/null and b/freeplane/resources/images/MoveTo_PrevMM.png differ
diff --git a/freeplane/resources/images/MoveTo_PrevNode.png b/freeplane/resources/images/MoveTo_PrevNode.png
new file mode 100644
index 0000000..bb5c4f9
Binary files /dev/null and b/freeplane/resources/images/MoveTo_PrevNode.png differ
diff --git a/freeplane/resources/images/New24.gif b/freeplane/resources/images/New24.gif
new file mode 100644
index 0000000..1cc488d
Binary files /dev/null and b/freeplane/resources/images/New24.gif differ
diff --git a/freeplane/resources/images/NewSiblingAction.png b/freeplane/resources/images/NewSiblingAction.png
new file mode 100644
index 0000000..cea2fa0
Binary files /dev/null and b/freeplane/resources/images/NewSiblingAction.png differ
diff --git a/freeplane/resources/images/NodeBackgroundColorAction.png b/freeplane/resources/images/NodeBackgroundColorAction.png
new file mode 100644
index 0000000..8fde8e2
Binary files /dev/null and b/freeplane/resources/images/NodeBackgroundColorAction.png differ
diff --git a/freeplane/resources/images/NodeColorAction.png b/freeplane/resources/images/NodeColorAction.png
new file mode 100644
index 0000000..5e74ce8
Binary files /dev/null and b/freeplane/resources/images/NodeColorAction.png differ
diff --git a/freeplane/resources/images/NodeColorBlendAction.png b/freeplane/resources/images/NodeColorBlendAction.png
new file mode 100644
index 0000000..f0e2b4a
Binary files /dev/null and b/freeplane/resources/images/NodeColorBlendAction.png differ
diff --git a/freeplane/resources/images/NodeListAction.png b/freeplane/resources/images/NodeListAction.png
new file mode 100644
index 0000000..6fd4f51
Binary files /dev/null and b/freeplane/resources/images/NodeListAction.png differ
diff --git a/freeplane/resources/images/Normal24.gif b/freeplane/resources/images/Normal24.gif
new file mode 100644
index 0000000..7764baa
Binary files /dev/null and b/freeplane/resources/images/Normal24.gif differ
diff --git a/freeplane/resources/images/Open24.gif b/freeplane/resources/images/Open24.gif
new file mode 100644
index 0000000..2086bc2
Binary files /dev/null and b/freeplane/resources/images/Open24.gif differ
diff --git a/freeplane/resources/images/OpenUserDirAction.png b/freeplane/resources/images/OpenUserDirAction.png
new file mode 100644
index 0000000..e5101eb
Binary files /dev/null and b/freeplane/resources/images/OpenUserDirAction.png differ
diff --git a/freeplane/resources/images/Paste24.gif b/freeplane/resources/images/Paste24.gif
new file mode 100644
index 0000000..26cc4c5
Binary files /dev/null and b/freeplane/resources/images/Paste24.gif differ
diff --git a/freeplane/resources/images/Print24.gif b/freeplane/resources/images/Print24.gif
new file mode 100644
index 0000000..e6b4fb1
Binary files /dev/null and b/freeplane/resources/images/Print24.gif differ
diff --git a/freeplane/resources/images/PropertyAction.png b/freeplane/resources/images/PropertyAction.png
new file mode 100644
index 0000000..8dccd66
Binary files /dev/null and b/freeplane/resources/images/PropertyAction.png differ
diff --git a/freeplane/resources/images/ReminderHookAction.png b/freeplane/resources/images/ReminderHookAction.png
new file mode 100644
index 0000000..e03e315
Binary files /dev/null and b/freeplane/resources/images/ReminderHookAction.png differ
diff --git a/freeplane/resources/images/RemoveEncryption.png b/freeplane/resources/images/RemoveEncryption.png
new file mode 100644
index 0000000..d1ec1f6
Binary files /dev/null and b/freeplane/resources/images/RemoveEncryption.png differ
diff --git a/freeplane/resources/images/RemoveNoteAction.png b/freeplane/resources/images/RemoveNoteAction.png
new file mode 100644
index 0000000..a649cb9
Binary files /dev/null and b/freeplane/resources/images/RemoveNoteAction.png differ
diff --git a/freeplane/resources/images/RevisionPluginAction.png b/freeplane/resources/images/RevisionPluginAction.png
new file mode 100644
index 0000000..8f992d2
Binary files /dev/null and b/freeplane/resources/images/RevisionPluginAction.png differ
diff --git a/freeplane/resources/images/Save24.gif b/freeplane/resources/images/Save24.gif
new file mode 100644
index 0000000..bfa98a8
Binary files /dev/null and b/freeplane/resources/images/Save24.gif differ
diff --git a/freeplane/resources/images/SaveAs24.gif b/freeplane/resources/images/SaveAs24.gif
new file mode 100644
index 0000000..97eb6fa
Binary files /dev/null and b/freeplane/resources/images/SaveAs24.gif differ
diff --git a/freeplane/resources/images/ScriptEditor.png b/freeplane/resources/images/ScriptEditor.png
new file mode 100644
index 0000000..606fb91
Binary files /dev/null and b/freeplane/resources/images/ScriptEditor.png differ
diff --git a/freeplane/resources/images/SetAcceleratorOnNextClickAction.png b/freeplane/resources/images/SetAcceleratorOnNextClickAction.png
new file mode 100644
index 0000000..df816aa
Binary files /dev/null and b/freeplane/resources/images/SetAcceleratorOnNextClickAction.png differ
diff --git a/freeplane/resources/images/SetLinkByFileChooserAction.png b/freeplane/resources/images/SetLinkByFileChooserAction.png
new file mode 100644
index 0000000..8376950
Binary files /dev/null and b/freeplane/resources/images/SetLinkByFileChooserAction.png differ
diff --git a/freeplane/resources/images/SetLinkByTextFieldAction.png b/freeplane/resources/images/SetLinkByTextFieldAction.png
new file mode 100644
index 0000000..1a46593
Binary files /dev/null and b/freeplane/resources/images/SetLinkByTextFieldAction.png differ
diff --git a/freeplane/resources/images/SetShortenerStateAction.png b/freeplane/resources/images/SetShortenerStateAction.png
new file mode 100644
index 0000000..203e192
Binary files /dev/null and b/freeplane/resources/images/SetShortenerStateAction.png differ
diff --git a/freeplane/resources/images/SortNodes.png b/freeplane/resources/images/SortNodes.png
new file mode 100644
index 0000000..d709100
Binary files /dev/null and b/freeplane/resources/images/SortNodes.png differ
diff --git a/freeplane/resources/images/TimeListAction.png b/freeplane/resources/images/TimeListAction.png
new file mode 100644
index 0000000..122f59a
Binary files /dev/null and b/freeplane/resources/images/TimeListAction.png differ
diff --git a/freeplane/resources/images/TimeManagementAction.png b/freeplane/resources/images/TimeManagementAction.png
new file mode 100644
index 0000000..e3a593a
Binary files /dev/null and b/freeplane/resources/images/TimeManagementAction.png differ
diff --git a/freeplane/resources/images/Underline24.gif b/freeplane/resources/images/Underline24.gif
new file mode 100644
index 0000000..93e20be
Binary files /dev/null and b/freeplane/resources/images/Underline24.gif differ
diff --git a/freeplane/resources/images/acceleratorPresets.png b/freeplane/resources/images/acceleratorPresets.png
new file mode 100644
index 0000000..3b84586
Binary files /dev/null and b/freeplane/resources/images/acceleratorPresets.png differ
diff --git a/freeplane/resources/images/addons.png b/freeplane/resources/images/addons.png
new file mode 100644
index 0000000..b321b16
Binary files /dev/null and b/freeplane/resources/images/addons.png differ
diff --git a/freeplane/resources/images/arrow-mode-backward.png b/freeplane/resources/images/arrow-mode-backward.png
new file mode 100644
index 0000000..8fd171b
Binary files /dev/null and b/freeplane/resources/images/arrow-mode-backward.png differ
diff --git a/freeplane/resources/images/arrow-mode-both.png b/freeplane/resources/images/arrow-mode-both.png
new file mode 100644
index 0000000..b692f0a
Binary files /dev/null and b/freeplane/resources/images/arrow-mode-both.png differ
diff --git a/freeplane/resources/images/arrow-mode-forward.png b/freeplane/resources/images/arrow-mode-forward.png
new file mode 100644
index 0000000..dda8ccd
Binary files /dev/null and b/freeplane/resources/images/arrow-mode-forward.png differ
diff --git a/freeplane/resources/images/arrow-mode-none.png b/freeplane/resources/images/arrow-mode-none.png
new file mode 100644
index 0000000..6b24671
Binary files /dev/null and b/freeplane/resources/images/arrow-mode-none.png differ
diff --git a/freeplane/resources/images/bell.png b/freeplane/resources/images/bell.png
new file mode 100644
index 0000000..5d2ecaa
Binary files /dev/null and b/freeplane/resources/images/bell.png differ
diff --git a/freeplane/resources/images/cancel_button.png b/freeplane/resources/images/cancel_button.png
new file mode 100644
index 0000000..63eaa44
Binary files /dev/null and b/freeplane/resources/images/cancel_button.png differ
diff --git a/freeplane/resources/images/checkbox12.png b/freeplane/resources/images/checkbox12.png
new file mode 100644
index 0000000..93e929f
Binary files /dev/null and b/freeplane/resources/images/checkbox12.png differ
diff --git a/freeplane/resources/images/clearFormat.png b/freeplane/resources/images/clearFormat.png
new file mode 100644
index 0000000..0695cb9
Binary files /dev/null and b/freeplane/resources/images/clearFormat.png differ
diff --git a/freeplane/resources/images/clock.png b/freeplane/resources/images/clock.png
new file mode 100644
index 0000000..7dba5a2
Binary files /dev/null and b/freeplane/resources/images/clock.png differ
diff --git a/freeplane/resources/images/color_fill.png b/freeplane/resources/images/color_fill.png
new file mode 100644
index 0000000..97515e2
Binary files /dev/null and b/freeplane/resources/images/color_fill.png differ
diff --git a/freeplane/resources/images/colorpicker.png b/freeplane/resources/images/colorpicker.png
new file mode 100644
index 0000000..2795c57
Binary files /dev/null and b/freeplane/resources/images/colorpicker.png differ
diff --git a/freeplane/resources/images/connector_color.png b/freeplane/resources/images/connector_color.png
new file mode 100644
index 0000000..037f4d1
Binary files /dev/null and b/freeplane/resources/images/connector_color.png differ
diff --git a/freeplane/resources/images/copy_id.png b/freeplane/resources/images/copy_id.png
new file mode 100644
index 0000000..918ea88
Binary files /dev/null and b/freeplane/resources/images/copy_id.png differ
diff --git a/freeplane/resources/images/designer.png b/freeplane/resources/images/designer.png
new file mode 100644
index 0000000..da8ee79
Binary files /dev/null and b/freeplane/resources/images/designer.png differ
diff --git a/freeplane/resources/images/edit12.png b/freeplane/resources/images/edit12.png
new file mode 100644
index 0000000..d9e9287
Binary files /dev/null and b/freeplane/resources/images/edit12.png differ
diff --git a/freeplane/resources/images/edit_add.png b/freeplane/resources/images/edit_add.png
new file mode 100644
index 0000000..8c026a4
Binary files /dev/null and b/freeplane/resources/images/edit_add.png differ
diff --git a/freeplane/resources/images/edit_details.png b/freeplane/resources/images/edit_details.png
new file mode 100644
index 0000000..1afe3ca
Binary files /dev/null and b/freeplane/resources/images/edit_details.png differ
diff --git a/freeplane/resources/images/edit_long_node.png b/freeplane/resources/images/edit_long_node.png
new file mode 100644
index 0000000..ee05049
Binary files /dev/null and b/freeplane/resources/images/edit_long_node.png differ
diff --git a/freeplane/resources/images/edit_node.png b/freeplane/resources/images/edit_node.png
new file mode 100644
index 0000000..12f8013
Binary files /dev/null and b/freeplane/resources/images/edit_node.png differ
diff --git a/freeplane/resources/images/edit_remove.png b/freeplane/resources/images/edit_remove.png
new file mode 100644
index 0000000..e2cb9df
Binary files /dev/null and b/freeplane/resources/images/edit_remove.png differ
diff --git a/freeplane/resources/images/editcut.png b/freeplane/resources/images/editcut.png
new file mode 100644
index 0000000..cd9df52
Binary files /dev/null and b/freeplane/resources/images/editcut.png differ
diff --git a/freeplane/resources/images/editdelete.png b/freeplane/resources/images/editdelete.png
new file mode 100644
index 0000000..7279e24
Binary files /dev/null and b/freeplane/resources/images/editdelete.png differ
diff --git a/freeplane/resources/images/editpaste.png b/freeplane/resources/images/editpaste.png
new file mode 100644
index 0000000..352361d
Binary files /dev/null and b/freeplane/resources/images/editpaste.png differ
diff --git a/freeplane/resources/images/edittrash.png b/freeplane/resources/images/edittrash.png
new file mode 100644
index 0000000..d3849b8
Binary files /dev/null and b/freeplane/resources/images/edittrash.png differ
diff --git a/freeplane/resources/images/export.png b/freeplane/resources/images/export.png
new file mode 100644
index 0000000..e20b8be
Binary files /dev/null and b/freeplane/resources/images/export.png differ
diff --git a/freeplane/resources/images/f1.png b/freeplane/resources/images/f1.png
new file mode 100644
index 0000000..f3971fc
Binary files /dev/null and b/freeplane/resources/images/f1.png differ
diff --git a/freeplane/resources/images/f10.png b/freeplane/resources/images/f10.png
new file mode 100644
index 0000000..3cbb01f
Binary files /dev/null and b/freeplane/resources/images/f10.png differ
diff --git a/freeplane/resources/images/f11.png b/freeplane/resources/images/f11.png
new file mode 100644
index 0000000..5aa781e
Binary files /dev/null and b/freeplane/resources/images/f11.png differ
diff --git a/freeplane/resources/images/f12.png b/freeplane/resources/images/f12.png
new file mode 100644
index 0000000..ca0cf51
Binary files /dev/null and b/freeplane/resources/images/f12.png differ
diff --git a/freeplane/resources/images/f2.png b/freeplane/resources/images/f2.png
new file mode 100644
index 0000000..a350174
Binary files /dev/null and b/freeplane/resources/images/f2.png differ
diff --git a/freeplane/resources/images/f3.png b/freeplane/resources/images/f3.png
new file mode 100644
index 0000000..97d707c
Binary files /dev/null and b/freeplane/resources/images/f3.png differ
diff --git a/freeplane/resources/images/f4.png b/freeplane/resources/images/f4.png
new file mode 100644
index 0000000..f72a99d
Binary files /dev/null and b/freeplane/resources/images/f4.png differ
diff --git a/freeplane/resources/images/f5.png b/freeplane/resources/images/f5.png
new file mode 100644
index 0000000..9c860ac
Binary files /dev/null and b/freeplane/resources/images/f5.png differ
diff --git a/freeplane/resources/images/f6.png b/freeplane/resources/images/f6.png
new file mode 100644
index 0000000..18d699f
Binary files /dev/null and b/freeplane/resources/images/f6.png differ
diff --git a/freeplane/resources/images/f7.png b/freeplane/resources/images/f7.png
new file mode 100644
index 0000000..dc9591a
Binary files /dev/null and b/freeplane/resources/images/f7.png differ
diff --git a/freeplane/resources/images/f8.png b/freeplane/resources/images/f8.png
new file mode 100644
index 0000000..3959128
Binary files /dev/null and b/freeplane/resources/images/f8.png differ
diff --git a/freeplane/resources/images/f9.png b/freeplane/resources/images/f9.png
new file mode 100644
index 0000000..dbeab27
Binary files /dev/null and b/freeplane/resources/images/f9.png differ
diff --git a/freeplane/resources/images/fileclose.png b/freeplane/resources/images/fileclose.png
new file mode 100644
index 0000000..edf5f76
Binary files /dev/null and b/freeplane/resources/images/fileclose.png differ
diff --git a/freeplane/resources/images/fileopen.png b/freeplane/resources/images/fileopen.png
new file mode 100644
index 0000000..150113a
Binary files /dev/null and b/freeplane/resources/images/fileopen.png differ
diff --git a/freeplane/resources/images/filesave.png b/freeplane/resources/images/filesave.png
new file mode 100644
index 0000000..91bde86
Binary files /dev/null and b/freeplane/resources/images/filesave.png differ
diff --git a/freeplane/resources/images/filesaveas.png b/freeplane/resources/images/filesaveas.png
new file mode 100644
index 0000000..f9c380d
Binary files /dev/null and b/freeplane/resources/images/filesaveas.png differ
diff --git a/freeplane/resources/images/flag.png b/freeplane/resources/images/flag.png
new file mode 100644
index 0000000..49d4c66
Binary files /dev/null and b/freeplane/resources/images/flag.png differ
diff --git a/freeplane/resources/images/formula.png b/freeplane/resources/images/formula.png
new file mode 100644
index 0000000..706dcac
Binary files /dev/null and b/freeplane/resources/images/formula.png differ
diff --git a/freeplane/resources/images/freeplane_app_128x128.png b/freeplane/resources/images/freeplane_app_128x128.png
new file mode 100644
index 0000000..9c269c4
Binary files /dev/null and b/freeplane/resources/images/freeplane_app_128x128.png differ
diff --git a/freeplane/resources/images/hotlistadd.png b/freeplane/resources/images/hotlistadd.png
new file mode 100644
index 0000000..0347b30
Binary files /dev/null and b/freeplane/resources/images/hotlistadd.png differ
diff --git a/freeplane/resources/images/hotlistdel.png b/freeplane/resources/images/hotlistdel.png
new file mode 100644
index 0000000..2ada18e
Binary files /dev/null and b/freeplane/resources/images/hotlistdel.png differ
diff --git a/freeplane/resources/images/icon_trash.png b/freeplane/resources/images/icon_trash.png
new file mode 100644
index 0000000..3aa7cab
Binary files /dev/null and b/freeplane/resources/images/icon_trash.png differ
diff --git a/freeplane/resources/images/idea.png b/freeplane/resources/images/idea.png
new file mode 100644
index 0000000..4ed0823
Binary files /dev/null and b/freeplane/resources/images/idea.png differ
diff --git a/freeplane/resources/images/import.png b/freeplane/resources/images/import.png
new file mode 100644
index 0000000..238dc6c
Binary files /dev/null and b/freeplane/resources/images/import.png differ
diff --git a/freeplane/resources/images/install_addons.png b/freeplane/resources/images/install_addons.png
new file mode 100644
index 0000000..4102d16
Binary files /dev/null and b/freeplane/resources/images/install_addons.png differ
diff --git a/freeplane/resources/images/kalzium.png b/freeplane/resources/images/kalzium.png
new file mode 100644
index 0000000..353b9db
Binary files /dev/null and b/freeplane/resources/images/kalzium.png differ
diff --git a/freeplane/resources/images/kcmsystem.png b/freeplane/resources/images/kcmsystem.png
new file mode 100644
index 0000000..43eab76
Binary files /dev/null and b/freeplane/resources/images/kcmsystem.png differ
diff --git a/freeplane/resources/images/kword.png b/freeplane/resources/images/kword.png
new file mode 100644
index 0000000..6f0da0e
Binary files /dev/null and b/freeplane/resources/images/kword.png differ
diff --git a/freeplane/resources/images/manage_addons.png b/freeplane/resources/images/manage_addons.png
new file mode 100644
index 0000000..6a38abe
Binary files /dev/null and b/freeplane/resources/images/manage_addons.png differ
diff --git a/freeplane/resources/images/manage_themes.png b/freeplane/resources/images/manage_themes.png
new file mode 100644
index 0000000..defbe7c
Binary files /dev/null and b/freeplane/resources/images/manage_themes.png differ
diff --git a/freeplane/resources/images/max_text_width.png b/freeplane/resources/images/max_text_width.png
new file mode 100644
index 0000000..43d1495
Binary files /dev/null and b/freeplane/resources/images/max_text_width.png differ
diff --git a/freeplane/resources/images/min_node_width.png b/freeplane/resources/images/min_node_width.png
new file mode 100644
index 0000000..fd6ed4c
Binary files /dev/null and b/freeplane/resources/images/min_node_width.png differ
diff --git a/freeplane/resources/images/newNode.png b/freeplane/resources/images/newNode.png
new file mode 100644
index 0000000..031e7ad
Binary files /dev/null and b/freeplane/resources/images/newNode.png differ
diff --git a/freeplane/resources/images/new_map_.png b/freeplane/resources/images/new_map_.png
new file mode 100644
index 0000000..1b8f1ff
Binary files /dev/null and b/freeplane/resources/images/new_map_.png differ
diff --git a/freeplane/resources/images/ok_button.png b/freeplane/resources/images/ok_button.png
new file mode 100644
index 0000000..c3d8720
Binary files /dev/null and b/freeplane/resources/images/ok_button.png differ
diff --git a/freeplane/resources/images/redo.png b/freeplane/resources/images/redo.png
new file mode 100644
index 0000000..e8f8445
Binary files /dev/null and b/freeplane/resources/images/redo.png differ
diff --git a/freeplane/resources/images/remove.png b/freeplane/resources/images/remove.png
new file mode 100644
index 0000000..5ef7f99
Binary files /dev/null and b/freeplane/resources/images/remove.png differ
diff --git a/freeplane/resources/images/remove_connector.png b/freeplane/resources/images/remove_connector.png
new file mode 100644
index 0000000..b4a564d
Binary files /dev/null and b/freeplane/resources/images/remove_connector.png differ
diff --git a/freeplane/resources/images/remove_first_icon.png b/freeplane/resources/images/remove_first_icon.png
new file mode 100644
index 0000000..9027eeb
Binary files /dev/null and b/freeplane/resources/images/remove_first_icon.png differ
diff --git a/freeplane/resources/images/remove_last_icon.png b/freeplane/resources/images/remove_last_icon.png
new file mode 100644
index 0000000..562cad0
Binary files /dev/null and b/freeplane/resources/images/remove_last_icon.png differ
diff --git a/freeplane/resources/images/split_node.png b/freeplane/resources/images/split_node.png
new file mode 100644
index 0000000..6ad5a73
Binary files /dev/null and b/freeplane/resources/images/split_node.png differ
diff --git a/freeplane/resources/images/stock_text_indent.png b/freeplane/resources/images/stock_text_indent.png
new file mode 100644
index 0000000..11b7af3
Binary files /dev/null and b/freeplane/resources/images/stock_text_indent.png differ
diff --git a/freeplane/resources/images/svg/Progress_quarter_00.svg b/freeplane/resources/images/svg/Progress_quarter_00.svg
new file mode 100644
index 0000000..e612836
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_quarter_00.svg
@@ -0,0 +1,248 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_100_10.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.499068,30.5461 a 15.090909,16 0 0 1 0.03179,3.38e-4 l -0.167221,15.999018 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.7213635"
+ sodipodi:end="4.7234701" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="19.545898"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="19.545898"
+ y="36.732178">0 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_quarter_01.svg b/freeplane/resources/images/svg/Progress_quarter_01.svg
new file mode 100644
index 0000000..54a3c20
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_quarter_01.svg
@@ -0,0 +1,249 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_quarter_02.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.363636,30.545456 a 15.090909,16 0 0 1 15.090909,16 l -15.090909,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="6.2831853" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.334229"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.334229"
+ y="36.732178">25 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_quarter_02.svg b/freeplane/resources/images/svg/Progress_quarter_02.svg
new file mode 100644
index 0000000..954b55e
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_quarter_02.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_40_04.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.363636,30.545456 a 15.090909,16 0 0 1 10e-7,32 l -10e-7,-16 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="7.8539816" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.334229"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.334229"
+ y="36.732178">50 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_quarter_03.svg b/freeplane/resources/images/svg/Progress_quarter_03.svg
new file mode 100644
index 0000000..e36c056
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_quarter_03.svg
@@ -0,0 +1,249 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_quarter_01.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="24.23356"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 1 1 31.272727,46.545455 l 15.090909,1e-6 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="9.424778" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.30249"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.30249"
+ y="36.732178">75 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_quarter_04.svg b/freeplane/resources/images/svg/Progress_quarter_04.svg
new file mode 100644
index 0000000..570f2c9
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_quarter_04.svg
@@ -0,0 +1,189 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="New document 2">
+ <defs
+ id="defs4101">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4885"
+ id="radialGradient6397"
+ cx="39.115246"
+ cy="44.287762"
+ fx="39.115246"
+ fy="44.287762"
+ r="15.090909"
+ gradientTransform="matrix(0.36220465,0.52594631,-0.80762604,0.62521886,60.715471,-4.1103057)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="10.98291"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="10.98291"
+ y="36.732178">100 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_00.svg b/freeplane/resources/images/svg/Progress_tenth_00.svg
new file mode 100644
index 0000000..e612836
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_00.svg
@@ -0,0 +1,248 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_100_10.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.499068,30.5461 a 15.090909,16 0 0 1 0.03179,3.38e-4 l -0.167221,15.999018 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.7213635"
+ sodipodi:end="4.7234701" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="19.545898"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="19.545898"
+ y="36.732178">0 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_01.svg b/freeplane/resources/images/svg/Progress_tenth_01.svg
new file mode 100644
index 0000000..5d9680a
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_01.svg
@@ -0,0 +1,248 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_0_00.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.363636,30.545456 a 15.090909,16 0 0 1 8.870214,3.055728 l -8.870214,12.944272 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="5.3407075" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.121582"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.121582"
+ y="36.732178">10 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_02.svg b/freeplane/resources/images/svg/Progress_tenth_02.svg
new file mode 100644
index 0000000..9159899
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_02.svg
@@ -0,0 +1,248 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_10_01.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 0 1 60.715943,41.601183 L 46.363636,46.545456 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="5.969026" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.359619"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.359619"
+ y="36.732178">20 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_03.svg b/freeplane/resources/images/svg/Progress_tenth_03.svg
new file mode 100644
index 0000000..bfd6a56
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_03.svg
@@ -0,0 +1,248 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_20_02.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 0 1 60.715943,51.489728 L 46.363636,46.545456 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="6.5973446" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.340576"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.340576"
+ y="36.732178">30 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_04.svg b/freeplane/resources/images/svg/Progress_tenth_04.svg
new file mode 100644
index 0000000..6edd632
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_04.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_30_03.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 0 1 55.23385,59.489728 L 46.363636,46.545456 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="7.2256631" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.518311"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.518311"
+ y="36.732178">40 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_05.svg b/freeplane/resources/images/svg/Progress_tenth_05.svg
new file mode 100644
index 0000000..954b55e
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_05.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_40_04.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.363636,30.545456 a 15.090909,16 0 0 1 10e-7,32 l -10e-7,-16 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="7.8539816" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.334229"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.334229"
+ y="36.732178">50 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_06.svg b/freeplane/resources/images/svg/Progress_tenth_06.svg
new file mode 100644
index 0000000..c2ae5cb
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_06.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_50_05.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 1 1 37.493422,59.489728 L 46.363636,46.545456 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="8.4823002" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.381836"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.381836"
+ y="36.732178">60 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_07.svg b/freeplane/resources/images/svg/Progress_tenth_07.svg
new file mode 100644
index 0000000..75feaee
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_07.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_60_06.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 1 1 32.011329,51.489728 l 14.352307,-4.944272 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="9.1106187" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.30249"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.30249"
+ y="36.732178">70 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_08.svg b/freeplane/resources/images/svg/Progress_tenth_08.svg
new file mode 100644
index 0000000..b4b7f98
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_08.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_70_07.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="M 46.363636,30.545456 A 15.090909,16 0 1 1 32.011329,41.601184 l 14.352307,4.944272 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="9.7389372" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.394531"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.394531"
+ y="36.732178">80 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_09.svg b/freeplane/resources/images/svg/Progress_tenth_09.svg
new file mode 100644
index 0000000..994719f
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_09.svg
@@ -0,0 +1,250 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Progress_80_08.svg">
+ <defs
+ id="defs4101">
+ <linearGradient
+ id="linearGradient6503"
+ inkscape:collect="always">
+ <stop
+ id="stop6505"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0.95095879"
+ id="stop6511" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="0.99891293"
+ id="stop6507" />
+ <stop
+ id="stop6509"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429-0"
+ id="radialGradient6435-8"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429-0">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431-7" />
+ <stop
+ id="stop6437-7"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433-3" />
+ </linearGradient>
+ <radialGradient
+ r="15.090909"
+ fy="43.321198"
+ fx="38.93148"
+ cy="43.321198"
+ cx="38.93148"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6482"
+ xlink:href="#linearGradient6503"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6482);fill-opacity:1;stroke:none"
+ id="path4107-7"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 46.363636,30.545456 a 15.090909,16 0 1 1 -8.870211,3.055726 l 8.870211,12.944274 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)"
+ sodipodi:start="4.712389"
+ sodipodi:end="10.367256" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="15.42627"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="15.42627"
+ y="36.732178">90 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/Progress_tenth_10.svg b/freeplane/resources/images/svg/Progress_tenth_10.svg
new file mode 100644
index 0000000..570f2c9
--- /dev/null
+++ b/freeplane/resources/images/svg/Progress_tenth_10.svg
@@ -0,0 +1,189 @@
+<?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="64px"
+ height="64px"
+ id="svg4099"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="New document 2">
+ <defs
+ id="defs4101">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6429">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6431" />
+ <stop
+ id="stop6437"
+ offset="0.99891293"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6433" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#800080;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.23327851"
+ id="stop6409" />
+ <stop
+ style="stop-color:#ff00ff;stop-opacity:1"
+ offset="1"
+ id="stop6411" />
+ <stop
+ id="stop6413"
+ offset="1"
+ style="stop-color:#800080;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6369">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6371" />
+ <stop
+ id="stop6387"
+ offset="1"
+ style="stop-color:#f7f7f7;stop-opacity:0.96862745;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6335">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop6337" />
+ <stop
+ id="stop6349"
+ offset="0.25"
+ style="stop-color:#800080;stop-opacity:0.74901961;" />
+ <stop
+ id="stop6347"
+ offset="0.5"
+ style="stop-color:#800080;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop6339" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4885"
+ osb:paint="gradient">
+ <stop
+ style="stop-color:#800080;stop-opacity:1;"
+ offset="0"
+ id="stop4887" />
+ <stop
+ id="stop6401"
+ offset="0.23327851"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop6399"
+ offset="0.67576009"
+ style="stop-color:#ff00ff;stop-opacity:1" />
+ <stop
+ style="stop-color:#800080;stop-opacity:0;"
+ offset="1"
+ id="stop4889" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4885"
+ id="radialGradient6397"
+ cx="39.115246"
+ cy="44.287762"
+ fx="39.115246"
+ fy="44.287762"
+ r="15.090909"
+ gradientTransform="matrix(0.36220465,0.52594631,-0.80762604,0.62521886,60.715471,-4.1103057)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6429"
+ id="radialGradient6435"
+ cx="38.93148"
+ cy="43.321198"
+ fx="38.93148"
+ fy="43.321198"
+ r="15.090909"
+ gradientTransform="matrix(0.98881461,1.48232,-1.2392904,0.92929832,53.784006,-56.118238)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="46.595812"
+ inkscape:cy="38.125"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1304"
+ inkscape:window-height="713"
+ inkscape:window-x="60"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4104">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient6435);fill-opacity:1;stroke:none"
+ id="path4107"
+ sodipodi:cx="46.363636"
+ sodipodi:cy="46.545456"
+ sodipodi:rx="15.090909"
+ sodipodi:ry="16"
+ d="m 61.454545,46.545456 a 15.090909,16 0 1 1 -30.181818,0 15.090909,16 0 1 1 30.181818,0 z"
+ transform="matrix(2.1204819,0,0,2,-66.313252,-61.090912)" />
+ <text
+ xml:space="preserve"
+ style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="10.98291"
+ y="36.732178"
+ id="text6443"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6445"
+ x="10.98291"
+ y="36.732178">100 %</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/resources/images/uline.png b/freeplane/resources/images/uline.png
new file mode 100644
index 0000000..c3c9e10
Binary files /dev/null and b/freeplane/resources/images/uline.png differ
diff --git a/freeplane/resources/images/uline_on.png b/freeplane/resources/images/uline_on.png
new file mode 100644
index 0000000..c35e146
Binary files /dev/null and b/freeplane/resources/images/uline_on.png differ
diff --git a/freeplane/resources/images/undo.png b/freeplane/resources/images/undo.png
new file mode 100644
index 0000000..824841b
Binary files /dev/null and b/freeplane/resources/images/undo.png differ
diff --git a/freeplane/resources/images/update.png b/freeplane/resources/images/update.png
new file mode 100644
index 0000000..1897a5c
Binary files /dev/null and b/freeplane/resources/images/update.png differ
diff --git a/freeplane/resources/images/xeyes.png b/freeplane/resources/images/xeyes.png
new file mode 100644
index 0000000..0e2bf9f
Binary files /dev/null and b/freeplane/resources/images/xeyes.png differ
diff --git a/freeplane/resources/license.txt b/freeplane/resources/license.txt
new file mode 100644
index 0000000..f89b4fa
--- /dev/null
+++ b/freeplane/resources/license.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ 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) 19yy <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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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) 19yy 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 Library General
+Public License instead of this License.
diff --git a/freeplane/resources/readme.txt b/freeplane/resources/readme.txt
new file mode 100644
index 0000000..a4fc887
--- /dev/null
+++ b/freeplane/resources/readme.txt
@@ -0,0 +1,35 @@
+/*Freeplane - A Program for creating and viewing Mindmaps
+ *Copyright (C) 2005 Christian Foltin.
+ *
+ *See COPYING for Details
+ *
+ *This program is free software; you can redistribute it and/or
+ *modify it under the terms of the GNU General Public License
+ *as published by the Free Software Foundation; either version 2
+ *of the License, or (at your option) any later version.
+ *
+ *This program is distributed in the hope that it will be useful,
+ *but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *GNU 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 12.06.2005
+ */
+
+To build Freeplane from the sources you need ant from
+http://ant.apache.org/
+
+After having installed ant, try some of the instructions:
+
+ant dist
+ - to compile the sources
+ant post
+ - to create a new delivery version
+ant run
+ - to start Freeplane from the sources.
+
+
diff --git a/freeplane/resources/translations/Resources_ar.properties b/freeplane/resources/translations/Resources_ar.properties
new file mode 100644
index 0000000..870c11b
--- /dev/null
+++ b/freeplane/resources/translations/Resources_ar.properties
@@ -0,0 +1,414 @@
+AboutAction.text = \u062D\u0648\u0644
+accessories/plugins/EncryptNode.properties_7 = \u0625\u0644\u063A\u0627\u0621
+accessories/plugins/ExportWithXSLT.tooltip = This is an uniform export method using XSLT scripts.
+antialias_all = Antialias All
+antialias_edges = Antialias Edges
+antialias_none = Antialias None
+attributes_deselect_all = \u0628\u062F\u0648\u0646
+AutomaticLayoutAction.tooltip = <html>Fixes the layout of the map. <br>The first level is black, the second blue, etc.</html>
+BackAction.text = \u062E\u0644\u0641
+background = \u0627\u0644\u062E\u0644\u0641\u064A\u0629
+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 = \u0639\u0631\u064A\u0636
+boldify_branch = Boldify
+branch = \u0641\u0631\u0639
+cancel = \u0625\u0644\u063A\u0627\u0621
+CancelAction.text = \u0625\u0644\u063A\u0627\u0621
+cannot_join_nodes_with_children = \u0644\u0627 \u064A\u0645\u0643\u0646 \u0631\u0628\u0637 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0645\u0639 \u0627\u0644\u0627\u0628\u0646\u0627\u0621
+CenterAction.text = \u0648\u0633\u0637
+ChangeConnectorArrowsAction.backward.text = \u062E\u0644\u0641
+ChangeConnectorArrowsAction.forward.text = \u0627\u0645\u0627\u0645
+CloseAction.text = \u0625\u063A\u0644\u0627\u0642
+CloudAction.text = \u0633\u062D\u0627\u0628\u0629
+CloudColorAction.text = \u0644\u0648\u0646 \u0627\u0644\u0633\u062D\u0627\u0628\u0629
+ColorProperty.ResetColor = \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0627\u0644\u0644\u0648\u0646
+combined = \u0645\u0648\u062D\u062F
+CopyAction.text = \u0646\u0633\u062E
+CopySingleAction.text = \u0646\u0633\u062E \u0641\u0631\u062F\u064A
+CreationModificationPluginAction.tooltip = <html>This function keeps track of node creation and modification times.</html>
+CutAction.text = \u0642\u0635
+decrease_branch_font_size = \u062E\u0637 \u0635\u063A\u064A\u0631
+DecreaseNodeFontAction.text = \u062E\u0637 \u0635\u063A\u064A\u0631
+DeleteAction.text = \u062D\u0630\u0641 \u0639\u0646\u0635\u0631
+DocumentationAction.text = \u0627\u0644\u0648\u062B\u0627\u0626\u0642
+edge = \u0627\u0644\u062D\u062F\u0648\u062F
+EdgeColorAction.text = \u0644\u0648\u0646 \u0627\u0644\u062D\u062F\u0648\u062F
+EdgeStyleAction.bezier.text = \u0645\u0646\u062D\u0646\u0649
+EdgeStyleAction.linear.text = \u062E\u0637\u064A
+EdgeStyleAction.sharp_bezier.text = \u0645\u0646\u062D\u0646\u0649 \u062D\u0627\u062F
+EdgeStyleAction.sharp_linear.text = \u062E\u0637\u064A \u062D\u0627\u062F
+EdgeWidthAction_width_parent.text = \u0627\u0644\u0627\u0628
+EdgeWidthAction_width_thin.text = \u0631\u0642\u064A\u0642
+edit = \u062A\u062D\u0631\u064A\u0631
+edit_link_manually = \u062A\u062D\u0631\u064A\u0631 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u062A\u0634\u0639\u0628\u064A \u064A\u062F\u0648\u064A\u0627\u064B
+EditAction.text = \u062A\u062D\u0631\u064A\u0631 \u0627\u0644\u0639\u0646\u0635\u0631
+EditLongAction.text = \u062A\u062D\u0631\u064A\u0631 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0637\u0648\u064A\u0644\u0629
+EncryptedMap.tooltip = \u0625\u0646\u0634\u0627\u0621 \u062E\u0631\u064A\u0637\u0629 \u062C\u062F\u064A\u062F\u0629 \u0645\u0634\u0641\u0631\u0629
+enter_base_url = \u0633\u064A\u062A\u0645 \u0644\u0635\u0642 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0646\u0633\u0628\u064A. \u0627\u062F\u062E\u0644 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+enter_confirms = \u062A\u0623\u0643\u064A\u062F \u0627\u0644\u0625\u062F\u062E\u0627\u0644
+ExportBranchToHTMLAction.text = \u0641\u0631\u0639 \u0628\u062A\u0646\u0633\u064A\u0642 HTML
+ExportToHTMLAction.text = \u0628\u062A\u0646\u0633\u064A\u0642 HTML
+ExportToOoWriter.text = \u0628\u062A\u0646\u0633\u064A\u0642 \u0648\u062B\u064A\u0642\u0629 Open Office
+ExportToOoWriter.tooltip = Unfolded nodes form the structure, folded nodes the content of the document.
+extension_menu = \u0627\u0644\u0646\u0645\u0637 \u0627\u0644\u0645\u0627\u062F\u064A
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = \u0627\u0644\u0627\u0633\u0626\u0644\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629
+file = \u0645\u0644\u0641
+file_not_found = File {0} not found
+FindAction.text = \u0628\u062D\u062B
+fit_map_to_page = \u0645\u0644\u0621 \u0627\u0644\u0635\u0641\u062D\u0629
+FitToPage.tooltip = \u0636\u0628\u0637 \u0627\u0644\u062A\u0643\u0628\u064A\u0631 \u062D\u062A\u0649 \u062A\u0645\u0644\u0621 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629
+fold = \u0637\u064A
+FoldAllAction.text = \u0637\u064A \u0627\u0644\u062C\u0645\u064A\u0639
+FoldAllAction.tooltip = <html>Folds the selected nodes and all their children.</html>
+FoldOneLevelAction.tooltip = <html>Folds the selected nodes by one level.</html>
+FollowLinkAction.text = \u0641\u062A\u062D \u0631\u0627\u0628\u0637
+font = \u062E\u0637
+FontSizeAction.text = \u062D\u062C\u0645 \u0627\u0644\u062E\u0637
+format_menu_edge_styles = \u0646\u0645\u0637 \u0627\u0644\u062D\u062F\u0648\u062F
+format_menu_edge_widths = \u0639\u0631\u0636 \u0627\u0644\u062D\u062F\u0648\u062F
+FormatCopy.tooltip = <html>Copies the format of a node.</html>
+FormatPaste.tooltip = <html>Pastes the format of a node.</html>
+ForwardAction.text = \u0627\u0645\u0627\u0645
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.tooltip = Freeplane Extended Help
+GrabKeyDialog.common.cancel = \u0625\u0644\u063A\u0627\u0621
+GrabKeyDialog.grab-key.assigned-to = \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649
+GrabKeyDialog.grab-key.assigned-to.none = \u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u062A\u0639\u064A\u064A\u0646
+GrabKeyDialog.grab-key.clear = \u0645\u0633\u062D
+GrabKeyDialog.grab-key.remove = \u062D\u0630\u0641
+GrabKeyDialog.grab-key.remove-ask = \u0647\u0644 \u062A\u0631\u064A\u062F \u062D\u0630\u0641 \u0627\u0644\u0627\u062E\u062A\u0635\u0627\u0631\u061F
+GrabKeyDialog.grab-key.title = \u0625\u062F\u062E\u0627\u0644 \u0645\u0641\u062A\u0627\u062D \u062C\u062F\u064A\u062F
+help = \u0645\u0633\u0627\u0639\u062F\u0629
+HierarchicalIconsAction.text = \u0639\u0631\u0636 \u0627\u0644\u0631\u0645\u0648\u0632 \u0628\u0634\u0643\u0644 \u0647\u0631\u0645\u064A
+HierarchicalIconsAction.tooltip = If one of the (grand)children of me has an icon, I will show this icon in little format, too.
+html_export_based_on_headings = \u062A\u0635\u062F\u064A\u0631 HTML - \u0628\u0646\u0627\u0621 \u0639\u0644\u0649 \u0627\u0644\u0639\u0646\u0627\u0648\u064A\u0646
+html_export_fold_all = \u062A\u0635\u062F\u064A\u0631 HTML - \u0637\u064A \u0627\u0644\u062C\u0645\u064A\u0639
+html_export_fold_currently_folded = \u062A\u0635\u062F\u064A\u0631 HTML - \u0637\u064A \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u062D\u0627\u0644\u064A
+html_export_no_folding = \u062A\u0635\u062F\u064A\u0631 HTML - \u0628\u062F\u0648\u0646 \u0637\u064A
+icon_attach = \u0627\u0646\u0638\u0631 \u0647\u0646\u0627
+icon_back = \u062E\u0644\u0641
+icon_bee = Freeplane[translate me]
+icon_bell = \u062A\u0630\u0643\u0631
+icon_bookmark = \u0645\u0645\u062A\u0627\u0632
+icon_button_cancel = \u063A\u064A\u0631 \u0645\u0648\u0627\u0641\u0642
+icon_calendar = \u0627\u0644\u062A\u0627\u0631\u064A\u062E
+icon_clanbomber = \u062E\u0637\u0631
+icon_desktop_new = \u0644\u0627 \u062A\u0646\u0633\u0649
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = \u0639\u0644\u0645
+icon_forward = \u0627\u0645\u0627\u0645
+icon_freemind_butterfly = FreeMind[translate me]
+icon_gohome = \u0628\u064A\u062A
+icon_help = \u0633\u0624\u0627\u0644
+icon_kaddressbook = \u0647\u0627\u062A\u0641
+icon_knotify = \u0645\u0648\u0633\u064A\u0642\u0649
+icon_ksmiletris = \u0623\u0646\u0627 \u0633\u0639\u064A\u062F
+icon_licq = \u0644\u0637\u064A\u0641
+icon_Mail = \u0628\u0631\u064A\u062F
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = \u0631\u0645\u0648\u0632
+icon_messagebox_warning = \u0645\u0647\u0645
+icon_password = \u0645\u0642\u062A\u0627\u062D
+icon_pencil = \u0644\u0644\u062A\u062F\u0642\u064A\u0642
+icon_penguin = Linux
+icon_stop = \u0648\u0642\u0648\u0641
+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...
+ImportLinkedBranchAction.text = \u0641\u0631\u0639 \u0645\u0631\u062A\u0628\u0637
+ImportMindmanagerFiles.text = MindManager X5 Map...
+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.
+long_node_changed_cancel = \u0644\u0642\u062F \u0642\u0645\u062A \u0628\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0639\u0646\u0635\u0631. \u0647\u0644 \u062A\u0631\u064A\u062F \u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u061F
+lots_of_links_warning = \u0633\u064A\u062A\u0645 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0644\u0646\u0641\u0633 \u0627\u0644\u0639\u0646\u0635\u0631. \u0647\u0644 \u062A\u0631\u064A\u062F \u0627\u0644\u0642\u064A\u0627\u0645 \u0628\u0630\u0644\u0643\u061F
+map_already_exists = \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0645\u0648\u062C\u0648\u062F\u0629 \u0645\u0633\u0628\u0642\u0627\u064B. \u0647\u0644 \u062A\u0631\u064A\u062F \u0625\u0633\u062A\u0628\u062F\u0627\u0644\u0647\u0627\u061F
+map_corrupted = \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0645\u0639\u0637\u0648\u0628\u0629. \u0647\u0644 \u062A\u0631\u064A\u062F \u0631\u0624\u064A\u0629 \u0627\u0644\u062A\u0641\u0627\u0635\u064A\u0644\u061F
+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.
+mindmap = \u062E\u0631\u064A\u0637\u0629
+mindmaps = \u062E\u0631\u0627\u0626\u0637
+mindmaps_desc = Maps (*.mm)
+mode_na = \u0646\u0645\u0637 \u063A\u064A\u0631 \u0645\u0648\u062C\u0648\u062F
+mode_title = Freeplane - {0} Mode
+modes = \u0623\u0646\u0645\u0627\u0637
+MoveToRootAction.text = \u0627\u0644\u0627\u0646\u062A\u0642\u0627\u0644 \u0625\u0644\u0649 \u0642\u0645\u0647 \u0627\u0644\u0634\u062C\u0631\u0629
+NavigationNextMapAction.text = \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629
+NavigationPreviousMapAction.text = \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629
+new_mindmap = \u062E\u0631\u064A\u0637\u0629 \u062C\u062F\u064A\u062F\u0629
+new_node = \u0639\u0646\u0635\u0631 \u062C\u062F\u064A\u062F
+NewChildAction.text = \u0627\u0628\u0646 \u062C\u062F\u064A\u062F
+NewMapAction.text = \u062C\u062F\u064A\u062F
+NewParentNode.tooltip = <html>All selected are sent to a new parent.</html>
+NewPreviousSiblingAction.text = \u0627\u062E \u062C\u062F\u064A\u062F \u0628\u0639\u062F\u0647
+NewSiblingAction.text = \u0627\u062E \u062C\u062F\u064A\u062F \u0642\u0628\u0644\u0647
+no = \u0644\u0627
+no_found_from = No "{0}" found from "{1}".
+no_more_found_from = No more "{0}" found from "{1}".
+no_previous_find = \u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0641\u064A \u0627\u0644\u0633\u0627\u0628\u0642
+node = \u0639\u0646\u0635\u0631
+node_changed_discard_changes = \u0644\u0642\u062F \u0642\u0645\u062A \u0628\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0639\u0646\u0635\u0631. \u0647\u0644 \u062A\u0631\u064A\u062F \u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u061F
+NodeBackgroundColorAction.text = \u0644\u0648\u0646 \u062E\u0644\u0641\u064A\u0629 \u0627\u0644\u0639\u0646\u0635\u0631
+NodeColorAction.text = \u0644\u0648\u0646 \u0627\u0644\u0639\u0646\u0635\u0631
+NodeColorBlendAction.text = \u0644\u0648\u0646 \u0634\u0641\u0627\u0641
+NodeDownAction.text = \u0627\u0644\u0639\u0646\u0635\u0631 \u0644\u0627\u0633\u0641\u0644
+NodeListAction.text = \u0639\u0631\u0636 \u0645\u062D\u0641\u0648\u0638\u0627\u062A \u0627\u0644\u062E\u0631\u064A\u0637\u0629
+NodeListAction.tooltip = \u0639\u0631\u0636 \u062C\u0645\u064A\u0639 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0645\u0639 \u062A\u0627\u0631\u064A\u062E \u0627\u0644\u0625\u0646\u0634\u0627\u0621 \u0648 \u0627\u0644\u062A\u0639\u062F\u064A\u0644
+NodeShapeAction.bubble.text = \u0641\u0642\u0627\u0639\u0629
+NodeShapeAction.fork.text = Fork
+NodeUpAction.text = \u0627\u0644\u0639\u0646\u0635\u0631 \u0644\u0627\u0639\u0644\u0649
+nonboldify_branch = Unboldify
+nonitalicise_branch = Unitalicise
+normal = \u0639\u0627\u062F\u064A
+not_saved_for_link_error = \u064A\u062C\u0628 \u062D\u0641\u0638 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0642\u0628\u0644 \u062A\u0639\u064A\u064A\u0646 \u0631\u0627\u0628\u0637
+ok = \u0645\u0648\u0627\u0641\u0642
+OKAction.text = \u0645\u0648\u0627\u0641\u0642
+OpenAction.text = ...\u0641\u062A\u062D
+option_changes_may_require_restart = \u0642\u0645 \u0628\u0625\u0639\u0627\u062F\u0629 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062C \u0644\u062A\u0641\u0639\u064A\u0644 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A.
+OptionPanel.absolute = \u0645\u0637\u0644\u0642
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Determines the quality of the map. More antialias needs more time.</html>
+OptionPanel.antialias_all = Antialias All
+OptionPanel.antialias_edges = Antialias Edges
+OptionPanel.antialias_none = No Antialias
+OptionPanel.Appearance = \u0627\u0644\u0645\u0638\u0647\u0631
+OptionPanel.as_parent = \u0643\u0623\u0628
+OptionPanel.automatic = \u062A\u0644\u0642\u0627\u0626\u064A
+OptionPanel.Behaviour = \u0627\u0644\u0633\u0644\u0648\u0643
+OptionPanel.bezier = \u0645\u0646\u062D\u0646\u0649
+OptionPanel.bubble = \u0641\u0642\u0627\u0639\u0629
+OptionPanel.Cancel = \u0625\u0644\u063A\u0627\u0621
+OptionPanel.combined = \u0645\u0648\u062D\u062F
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = \u0625\u0641\u062A\u0631\u0627\u0636\u064A
+OptionPanel.default_browser_command_mac = \u0623\u0645\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0625\u0641\u062A\u0631\u0627\u0636\u064A \u0641\u064A Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_other_os = \u0623\u0645\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0625\u0641\u062A\u0631\u0627\u0636\u064A \u0641\u064A \u0623\u0646\u0638\u0645\u0629 \u0623\u062E\u0631\u0649
+OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
+OptionPanel.default_browser_command_windows_9x = \u0623\u0645\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0625\u0641\u062A\u0631\u0627\u0636\u064A \u0641\u064A Windows 9x
+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_nt = \u0623\u0645\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0625\u0641\u062A\u0631\u0627\u0636\u064A \u0641\u064A 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.Defaults = \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0627\u062A
+OptionPanel.delete_automatic_saves_at_exit = \u062D\u0630\u0641 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0627\u062A \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A\u0629 \u0639\u0646\u062F \u0627\u0644\u062E\u0631\u0648\u062C
+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.disable_cursor_move_paper = \u062A\u0639\u0637\u064A\u0644 \u0627\u0644\u0645\u0624\u0634\u0631 \u0645\u0646 \u062A\u062D\u0631\u064A\u0643 \u0627\u0644\u0635\u0641\u062D\u0629
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Don't display 'move' cursor during paper dragging</html>
+OptionPanel.el__enter_confirms_by_default = \u0625\u062F\u062E\u0627\u0644 \u0627\u0644\u062A\u0623\u0643\u064A\u062F \u0628\u0634\u0643\u0644 \u0625\u0641\u062A\u0631\u0627\u0636\u064A
+OptionPanel.el__max_default_window_height = \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629 \u0644\u0627\u0642\u0635\u0649 \u0627\u0631\u062A\u0641\u0627\u0639 \u0644\u0644\u0646\u0627\u0641\u0630\u0629
+OptionPanel.el__max_default_window_width = \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629 \u0644\u0627\u0642\u0635\u0649 \u0639\u0631\u0636 \u0644\u0644\u0646\u0627\u0641\u0630\u0629
+OptionPanel.el__min_default_window_height = \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629 \u0644\u0627\u0642\u0644 \u0627\u0631\u062A\u0641\u0627\u0639 \u0644\u0644\u0646\u0627\u0641\u0630\u0629
+OptionPanel.el__min_default_window_width = \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629 \u0644\u0627\u0642\u0644 \u0639\u0631\u0636 \u0644\u0644\u0646\u0627\u0641\u0630\u0629
+OptionPanel.el__position_window_below_node = \u0648\u0636\u0639 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u062A\u062D\u062A \u0627\u0644\u0639\u0646\u0635\u0631
+OptionPanel.en = En
+OptionPanel.Environment = \u0627\u0644\u0628\u064A\u0626\u0629
+OptionPanel.es = Es
+OptionPanel.experimental_file_locking_on = \u0625\u0642\u0641\u0627\u0644 \u0645\u0644\u0641 \u0627\u0644\u062A\u062C\u0627\u0631\u0628
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experimental feature</html>
+OptionPanel.export_icons_in_html = \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0631\u0645\u0648\u0632 \u0628\u062A\u0646\u0633\u064A\u0642 HTML
+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.Files = \u0627\u0644\u0645\u0644\u0641\u0627\u062A
+OptionPanel.first = \u0627\u0644\u0627\u0648\u0644
+OptionPanel.foldingsymbolwidth = Folding Symbol Width
+OptionPanel.foldingsymbolwidth.tooltip = <html>Width of the folding marking circle</html>
+OptionPanel.fork = Fork
+OptionPanel.fr = Fr
+OptionPanel.gtk = Gtk
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = \u0628\u0646\u0627\u0621 \u0639\u0644\u0649 \u0627\u0644\u0639\u0646\u0627\u0648\u064A\u0646
+OptionPanel.html_export_fold_all = \u0637\u064A \u0627\u0644\u062C\u0645\u064A\u0639
+OptionPanel.html_export_fold_currently_folded = \u0637\u064A \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u062D\u0627\u0644\u064A
+OptionPanel.html_export_folding = Html Export Folding
+OptionPanel.html_export_no_folding = \u0628\u062F\u0648\u0646 \u0637\u064A
+OptionPanel.hu = Hu
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = \u0627\u062E\u062A\u0635\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D
+OptionPanel.ko = Kr
+OptionPanel.language = \u0627\u0644\u0644\u063A\u0629
+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.last = \u0627\u0644\u0623\u062E\u064A\u0631
+OptionPanel.last_opened_list_length = \u0639\u062F\u062F \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0641\u064A \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0623\u062E\u064A\u0631\u0629
+OptionPanel.linear = \u062E\u0637\u064A
+OptionPanel.links = \u0631\u0648\u0627\u0628\u0637
+OptionPanel.links.tooltip = <html>Set Links either relative or absolute </html>
+OptionPanel.lookandfeel = \u0627\u0644\u0645\u0638\u0647\u0631
+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 work for applets</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = \u0623\u0642\u0635\u0649 \u0639\u0631\u0636 \u0644\u0644\u0639\u0646\u0635\u0631
+OptionPanel.max_node_width.tooltip = <html>The default maximal node width in pixels</html>
+OptionPanel.metal = \u0645\u0639\u062F\u0646\u064A
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nothing = \u0628\u062F\u0648\u0646
+OptionPanel.number_of_different_files_for_automatic_save = \u0639\u062F\u062F \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0645\u062E\u062A\u0644\u0641\u0629 \u0644\u0644\u062D\u0641\u0638 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A
+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.OK = \u062D\u0641\u0638
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = \u0648\u0636\u0639 \u0641\u0631\u0648\u0639 \u062C\u062F\u064A\u062F\u0629
+OptionPanel.placenewbranches.tooltip = <html>Where to place new branches. Valid values are 'first' and 'last' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = \u0646\u0633\u0628\u064A
+OptionPanel.ru = Ru
+OptionPanel.selection_method = \u0637\u0631\u064A\u0642\u0629 \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631
+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 = \u0639\u0646\u062F \u0627\u0644\u0646\u0642\u0631
+OptionPanel.selection_method_delayed = \u0627\u0644\u062A\u0623\u062E\u064A\u0631
+OptionPanel.selection_method_direct = \u0645\u0628\u0627\u0634\u0631
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u0627\u0644\u0627\u0646\u0645\u0627\u0637
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.automatic_save = \u062D\u0641\u0638 \u062A\u0644\u0642\u0627\u0626\u064A
+OptionPanel.separator.behaviour = \u0627\u0644\u0633\u0644\u0648\u0643
+OptionPanel.separator.browser = \u0627\u0644\u0645\u0633\u062A\u0639\u0631\u0636
+OptionPanel.separator.commands_for_the_program = \u0627\u0644\u0627\u0648\u0627\u0645\u0631 \u0644\u0644\u0628\u0631\u0646\u0627\u0645\u062C
+OptionPanel.separator.default_colors = \u0627\u0644\u0627\u0644\u0648\u0627\u0646 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629
+OptionPanel.separator.default_fonts = \u0627\u0644\u062E\u0637\u0648\u0637 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629
+OptionPanel.separator.default_styles = \u0627\u0644\u0627\u0646\u0645\u0627\u0637 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629
+OptionPanel.separator.edit_long_node_window = \u0646\u0627\u0641\u0630\u0629 \u062A\u062D\u0631\u064A\u0631 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0637\u0648\u064A\u0644\u0629
+OptionPanel.separator.files = \u0627\u0644\u0645\u0644\u0641\u0627\u062A
+OptionPanel.separator.html_export = \u062A\u0635\u062F\u064A\u0631 HTML
+OptionPanel.separator.hyperlink_types = \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u062A\u0634\u0639\u0628\u064A\u0629
+OptionPanel.separator.icon_properties = \u0627\u0644\u0631\u0645\u0648\u0632
+OptionPanel.separator.initial_map_size = \u062D\u062C\u0645 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0627\u0644\u0623\u0648\u0644\u064A
+OptionPanel.separator.key_typing = \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0637\u0628\u0627\u0639\u0629
+OptionPanel.separator.language = \u0627\u0644\u0644\u063A\u0629
+OptionPanel.separator.look_and_feel = \u0627\u0644\u0645\u0638\u0647\u0631
+OptionPanel.separator.new_node_commands = \u0627\u0648\u0627\u0645\u0631 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u062C\u062F\u064A\u062F
+OptionPanel.separator.node_editing_commands = \u0627\u0648\u0627\u0645\u0631 \u062A\u062D\u0631\u064A\u0631 \u0627\u0644\u0639\u0646\u0635\u0631
+OptionPanel.separator.node_navigation_commands = \u0627\u0648\u0627\u0645\u0631 \u0627\u0633\u0643\u0634\u0627\u0641 \u0627\u0644\u0639\u0646\u0635\u0631
+OptionPanel.separator.other_defaults = \u0627\u062E\u0631\u0649
+OptionPanel.separator.patterns = \u0627\u0644\u0627\u0646\u0645\u0627\u0637
+OptionPanel.separator.save = \u062D\u0641\u0638
+OptionPanel.separator.selection_method = \u0637\u0631\u064A\u0642\u0629 \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631
+OptionPanel.separator.undo = \u062A\u0631\u0627\u062C\u0639
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = \u0644\u0648\u0646 \u0627\u0644\u062E\u0644\u0641\u064A\u0629 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardbackgroundcolor.tooltip = <html>The standard background color in html notation </html>
+OptionPanel.standardcloudcolor = \u0644\u0648\u0646 \u0627\u0644\u0633\u062D\u0627\u0628\u0629 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardcloudcolor.tooltip = <html>The standard cloud color in html notation </html>
+OptionPanel.standardcloudestyle = \u0646\u0645\u0637 \u0627\u0644\u0633\u062D\u0627\u0628\u0629 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardcloudestyle.tooltip = <html>The standard cloud style. currently, only 'bezier' is supported</html>
+OptionPanel.standardlinkcolor = \u0644\u0648\u0646 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardlinkcolor.tooltip = <html>The standard link color in html notation </html>
+OptionPanel.standardlinkestyle = \u0646\u0645\u0637 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardlinkestyle.tooltip = <html>The standard link style. currently, only 'bezier' is supported</html>
+OptionPanel.standardselectednodecolor = \u0644\u0648\u0646 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u062D\u062F\u062F \u0627\u0644\u0627\u0633\u0627\u0633\u064A
+OptionPanel.standardselectednodecolor.tooltip = <html>The standard node color if selected. In html notation (#RRGGBB in hex values) </html>
+OptionPanel.time_for_automatic_save = \u0627\u0644\u0648\u0642\u062A \u0644\u0644\u062D\u0641\u0638 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A
+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 = \u0648\u0642\u062A \u062A\u0623\u062E\u064A\u0631 \u0627\u0644\u0623\u062E\u062A\u064A\u0627\u0631
+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.undo_levels = \u0645\u0633\u062A\u0648\u064A\u0627\u062A \u0627\u0644\u062A\u0631\u0627\u062C\u0639
+OptionPanel.undo_levels.tooltip = <html>Determines how many steps are stored that can be undone via "Undo".</html>
+OptionPanel.windows = \u0627\u0644\u0646\u0648\u0627\u0641\u0630
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = ...\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0635\u0641\u062D\u0629
+PasteAction.text = \u0644\u0635\u0642
+PatternToString.FontBold = \u0639\u0631\u064A\u0636
+plugins/TimeList.xml_Created = \u062A\u0645 \u0625\u0646\u0634\u0627\u0621\u0629
+plugins/TimeList.xml_Date = \u0627\u0644\u062A\u0627\u0631\u064A\u062E
+plugins/TimeList.xml_Icons = \u0627\u0644\u0631\u0645\u0648\u0632
+plugins/TimeList.xml_Modified = \u062A\u0645 \u0627\u0644\u062A\u0639\u062F\u064A\u0644
+plugins/TimeList.xml_Text = \u0627\u0644\u0646\u0635
+plugins/TimeManagement.xml_appendButton = \u0625\u062F\u0631\u0627\u062C \u0627\u0644\u0648\u0642\u062A \u0625\u0644\u0649 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u062D\u062F\u062F
+plugins/TimeManagement.xml_Cancel = \u0625\u0644\u063A\u0627\u0621
+plugins/TimeManagement.xml_cancelButton = \u0625\u0644\u063A\u0627\u0621
+plugins/TimeManagement.xml_hour = Hour:
+plugins/TimeManagement.xml_minute = Minute:
+plugins/TimeManagement.xml_reminderButton = \u0627\u0644\u062A\u0630\u0643\u064A\u0631 \u0639\u0646\u062F \u0647\u0630\u0627 \u0627\u0644\u0648\u0642\u062A
+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 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>
+plugins/TimeManagement.xml_reminderNode_tooltip = Reminder scheduled at {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Remove Reminder
+plugins/TimeManagement.xml_todayButton = \u0627\u0644\u064A\u0648\u0645
+plugins/TimeManagement.xml_WindowTitle = \u0625\u062F\u0627\u0631\u0629 \u0627\u0644\u0648\u0642\u062A
+preferences = \u062A\u0641\u0636\u064A\u0644\u0627\u062A
+PrintAction.text = ...\u0637\u0628\u0627\u0639\u0629
+PrintDirectAction.text = \u0637\u0628\u0627\u0639\u0629
+printing_settings = \u0645\u0642\u064A\u0627\u0633 \u0627\u0644\u0637\u0628\u0627\u0639\u0629
+PropertyAction.text = \u0627\u0644\u062A\u0641\u0636\u064A\u0644\u0627\u062A...
+QuitAction.text = \u062E\u0631\u0648\u062C
+read_only = \u0644\u0644\u0642\u0631\u0627\u0621\u0629 \u0641\u0642\u0637
+ReminderHookAction.text = Remove Reminder
+ReminderHookAction.tooltip = Removes a reminder from a node.
+RemoveAllIconsAction.text = \u062D\u0630\u0641 \u062C\u0645\u064A\u0639 \u0627\u0644\u0631\u0645\u0648\u0632
+RemoveIconAction.text = \u062D\u0630\u0641 \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0627\u062E\u064A\u0631
+repair_link = \u0625\u0635\u0644\u0627\u062D \u0631\u0627\u0628\u0637
+repair_link_question = \u0644\u0627\u064A\u0645\u0643\u0646 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629. \u0647\u0644 \u062A\u0631\u064A\u062F \u0627\u0635\u0644\u0627\u062D\u0647\u0627 \u064A\u062F\u0648\u064A\u0627\u064B\u061F
+ResetNodeLocationAction.text = \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0627\u0644\u0645\u0643\u0627\u0646
+save_failed = Attempt to save the map {0} failed.
+save_unsaved = \u0647\u0644 \u062A\u0631\u064A\u062F \u062D\u0641\u0638 \u0627\u0644\u062E\u0631\u064A\u0637\u0629\u061F
+SaveAction.text = \u062D\u0641\u0638
+SaveAsAction.text = ...\u062D\u0641\u0638 \u0628\u0627\u0633\u0645
+saved = \u062A\u0645 \u0627\u0644\u062D\u0641\u0638
+scheme_evaluate = \u062A\u0642\u064A\u064A\u0645
+select_favorites_folder = \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u064A\u062D\u0648\u064A \u0627\u0644\u0645\u0641\u0636\u0644\u0629
+select_folder_for_importing = \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0645\u062C\u0644\u062F \u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F\u0647
+SelectAllAction.text = \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u062C\u0645\u064A\u0639 ( \u0627\u0644\u0645\u0631\u0626\u064A )
+SelectBranchAction.text = \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0641\u0631\u0639 \u0627\u0644\u0645\u0631\u0626\u064A
+selection_method_by_click = \u0646\u0642\u0631\u0647 \u0645\u0641\u0631\u062F \u0644\u0644\u062A\u062D\u062F\u064A\u062F
+selection_method_direct = \u0646\u0642\u0637\u0629 \u0644\u0644\u062A\u062D\u062F\u064A\u062F
+SetImageByFileChooserAction.text = \u0635\u0648\u0631\u0629 ( \u0645\u062D\u062F\u062F \u0645\u0644\u0641 \u0623\u0648 \u0631\u0627\u0628\u0637 )
+SetLinkByFileChooserAction.text = \u0631\u0627\u0628\u0637 \u062A\u0634\u0639\u0628\u064A ( \u0645\u062D\u062F\u062F \u0645\u0644\u0641 )
+SetLinkByTextFieldAction.text = \u0631\u0627\u0628\u0637 \u062A\u0634\u0639\u0628\u064A ( \u062D\u0642\u0644 \u0646\u0635\u064A )
+simplyhtml.borderWidthLabel = \u0627\u0644\u0639\u0631\u0636
+simplyhtml.cancelBtnName = \u0625\u0644\u063A\u0627\u0621
+simplyhtml.copyLabel = \u0646\u0633\u062E
+simplyhtml.cutLabel = \u0642\u0635
+simplyhtml.fontBoldLabel = \u0639\u0631\u064A\u0636
+simplyhtml.fontItalicLabel = \u0645\u0627\u0626\u0644
+simplyhtml.fontTabLabel = \u062E\u0637
+simplyhtml.fontUnderlineLabel = \u062A\u062D\u062A\u0647 \u062E\u0637
+simplyhtml.helpLabel = \u0645\u0633\u0627\u0639\u062F\u0629
+simplyhtml.insertTableTitle = insertTable[translate me]
+simplyhtml.pasteLabel = \u0644\u0635\u0642
+simplyhtml.replaceNo = \u0644\u0627
+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
+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
+TimeListAction.tooltip = \u0639\u0631\u0636 \u0627\u0644\u0623\u0648\u0642\u0627\u062A \u0627\u0644\u0645\u062C\u062F\u0648\u0644\u0629 \u0648 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u062C\u062F\u0648\u0644\u0629
+TimeManagementAction.text = \u0639\u0631\u0636 \u0627\u0644\u062A\u0642\u0648\u064A\u0645
+TimeManagementAction.tooltip = <html>Shows the calendar module by Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = \u0637\u064A \u0641\u0631\u062F \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0627\u0628\u0646
+ToggleFoldedAction.text = \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0637\u0648\u064A
+ToggleLeftToolbarAction.text = \u062A\u0628\u062F\u064A\u0644 \u0634\u0631\u064A\u0637 \u0627\u0644\u0627\u062F\u0648\u0627\u062A \u0641\u064A \u0627\u0644\u064A\u0633\u0627\u0631
+ToggleMenubarAction.text = \u062A\u0628\u062F\u064A\u0644 \u0634\u0631\u064A\u0637 \u0627\u0644\u0642\u0627\u0626\u0645\u0629
+ToggleToolbarAction.text = \u062A\u0628\u062F\u064A\u0644 \u0634\u0631\u064A\u0637 \u0627\u0644\u0627\u062F\u0648\u0627\u062A
+underline = \u062A\u062D\u062A\u0647 \u062E\u0637
+UndoAction.text = \u062A\u0631\u0627\u062C\u0639
+UndoFilterAction.text = \u062A\u0631\u0627\u062C\u0639
+unfold = \u0628\u0633\u0637
+UnfoldAllAction.tooltip = <html>Unfolds the selected nodes and all their children.</html>
+UnfoldOneLevelAction.tooltip = <html>Unfolds the selected nodes by one level.</html>
+url_error = \u0639\u0646\u0648\u0627\u0646 URL \u063A\u064A\u0631 \u0635\u0627\u0644\u062D
+url_load_error = \u0644\u0627 \u064A\u0645\u0643\u0646 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u062E\u0631\u064A\u0637\u0629 \u0645\u0646 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 URL
+user_defined_zoom = \u0645\u0639\u0631\u0641 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645
+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):
+width = \u0627\u0644\u0639\u0631\u0636
+yes = \u0646\u0639\u0645
+ZoomInAction.text = \u062A\u0643\u0628\u064A\u0631
+ZoomOutAction.text = \u062A\u0635\u063A\u064A\u0631
diff --git a/freeplane/resources/translations/Resources_ca.properties b/freeplane/resources/translations/Resources_ca.properties
new file mode 100644
index 0000000..ce0ae6f
--- /dev/null
+++ b/freeplane/resources/translations/Resources_ca.properties
@@ -0,0 +1,549 @@
+AboutAction.text = Quant a
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/EncryptNode.properties_0 = Trieu una paraula de pas pel node xifrat
+accessories/plugins/EncryptNode.properties_1 = Les paraules de pas no s\u00F3n iguals o s\u00F3n massa curtes.
+accessories/plugins/EncryptNode.properties_2 = Introdu\u00EFu la paraula de pas:
+accessories/plugins/EncryptNode.properties_3 = Torneu a introdu\u00EFr-la:
+accessories/plugins/EncryptNode.properties_4 = Introdu\u00EFu la paraula de pas.
+accessories/plugins/EncryptNode.properties_5 = <html>Recordeu que la profunditat de xifratge<br> dep\u00E8n quasi en la seva totalitat de la qualitat de la paraula de pas que trieu.
+accessories/plugins/EncryptNode.properties_6 = D'acord
+accessories/plugins/EncryptNode.properties_7 = Cancel\u00B7la
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Nom\u00E9s \u00E9s possible alternar entre l'estat de xifratge pels nodes que es trobin xifrats. Si us plau inseriu un node d'aquest tipus mitjan\u00E7ant el men\u00FA d'eines.
+accessories/plugins/EncryptNode.properties_select_me = Trieu-me per continuar!
+accessories/plugins/EncryptNode.properties_wrong_password = La paraula de pas no \u00E9s correcta.
+accessories/plugins/ExportWithXSLT.tooltip = Aquest \u00E9s un m\u00E8tode d'exportaci\u00F3 utilitzant comandes XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Com un Applet Java...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporta el mapa com un applet java pel navegador.
+accessories/plugins/ExportWithXSLT_Flash.text = Com a Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporta com una aplicaci\u00F3 Flash.
+accessories/plugins/ExportWithXSLT_HTML.text = Com a XHTML (versi\u00F3 JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Com a XHTML (Mapa amb imatge)...
+AddLocalLinkAction.text = Afegeix un hiperenlla\u00E7 local
+antialias_all = Anti\u00E0lies a Tots
+antialias_edges = Anti\u00E0lies als Cantells
+antialias_none = Sense anti\u00E0lies
+as_parent = Com a parent
+attributes_deselect_all = Res
+attributes_dialog_title = Attribute Manager[translate me]
+AutomaticLayoutAction.text = Disseny autom\u00E0tic
+AutomaticLayoutAction.tooltip = <html>Repara el disseny del mapa. <br>El primer nivell \u00E9s negre, el segon blau, etc.</html>
+BackAction.text = Enrera
+background = Fons
+BlinkingNodeHookAction.text = Node que pampallugui
+BlinkingNodeHookAction.tooltip = <html>Aix\u00F2 fa que el node pampallugui. Si et plau, tingues cura. No ho associ\u00EFs a massa nodes, i <strong> mai amb altres formatatges autom\u00E0tics pel mateix node</strong></html>
+BoldAction.text = Negreta
+boldify_branch = Ennegreix
+branch = Branca
+cancel = Cancel\u00B7la
+CancelAction.text = Cancel\u00B7la
+cannot_add_parent_diff_parents = Tots els nodes cal que tinguin el mateix node pare per a utilitzar aquesta funci\u00F3.
+cannot_add_parent_to_root = El node arrel no pot afegir-se com un node pare.
+cannot_join_nodes_with_children = No es poden unir els nodes amb els fills
+cannot_move_to_child = No es pot moure un node a un dels seus fills.
+CenterAction.text = Centre
+ChangeConnectorArrowsAction.backward.text = Enrera
+ChangeConnectorArrowsAction.forward.text = Endavant
+ChangeNodeLevelLeftsAction.text = Node esquerra
+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 dret
+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 = Trieu el color de fons:
+choose_cloud_color = Trieu el color del n\u00FAvol:
+choose_edge_color = Tria el color del cantell
+choose_node_background_color = Trieu el color de fons del node:
+choose_node_color = Trieu el color del node:
+CloseAction.text = Tanca
+CloudAction.text = N\u00FAvol
+CloudColorAction.text = Color del n\u00FAvol...
+ColorProperty.ResetColor = Reestableix el color
+combined = Combinat
+connector = Connector[translate me]
+CopyAction.text = Copia
+CopySingleAction.text = C\u00F2pia simple
+CreationModificationPluginAction.text = Mostra la cronologia de modificacions
+CreationModificationPluginAction.tooltip = <html>Aquesta funci\u00F3 realitza el seguiment de la creaci\u00F3 i modificaci\u00F3 dels nodes.</html>
+CutAction.text = Retalla
+decrease_branch_font_size = Lletra m\u00E9s petita
+DecreaseNodeFontAction.text = Lletra m\u00E9s petita
+delete_child = Esborra el node
+DeleteAction.text = Elimina el Node
+DocumentationAction.text = Documentaci\u00F3
+edge = Cantells
+edge_style = Estil del Cantell
+edge_width = Ample del Cantell
+EdgeColorAction.text = Color del Cantell...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = Linial
+EdgeStyleAction.sharp_bezier.text = Sharp Bezier
+EdgeStyleAction.sharp_linear.text = Sharp Linear
+EdgeStyleAsParentAction.text = Com a parent
+EdgeWidthAction_width_parent.text = Pare
+EdgeWidthAction_width_thin.text = Prim
+edit = Edici\u00F3
+edit_link_manually = Edita l'hiperenlla\u00E7 manualment...
+EditAction.text = Edita el node
+EditLongAction.text = Edita el node llarg...
+EncryptedMap.text = Crea un mapa xifrat ...
+EncryptedMap.tooltip = Crea un nou mapa xifrat
+enter_base_url = Enganxar\u00E9 enlla\u00E7os relatius. Si et plau, introdueix l'adre\u00E7a base.
+enter_confirms = La tecla Retorn ho confirma
+EnterPassword.text = Alterna entre Xifrat / Desxifrat
+error = Error[translate me]
+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
+ExportBranchToHTMLAction.text = Branca com HTML
+ExportPdf.text = Com a PDF...
+ExportSvg.text = Com a SVG...
+ExportToHTMLAction.text = Com HTML
+ExportToImage.jpg.text = Com a JPEG...
+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
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = PMF
+file = Fitxer
+file_already_exists = El fixter {0} ja existeix. Voleu sobreescriure''l?
+file_not_found = Fitxer {0} no trobat
+find_what = Qu\u00E8 vols cercar
+FindAction.text = Cerca...
+fit_map_to_page = Imprimeix-lo en Una P\u00E0gina
+FitToPage.text = Amplia o redueix per a cabre en la p\u00E0gina
+FitToPage.tooltip = Ajusta l'ampliaci\u00F3 de forma que tot el mapa sigui visible en la finestra actual.
+fold = Contreu
+FoldAllAction.text = Contreu-los tots
+FoldAllAction.tooltip = <html>Contreu els nodes selecionats i tots els seus fills.</html>
+FoldOneLevelAction.text = Contreu-lo un nivell
+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_menu_edge_styles = Estils dels cantells
+format_menu_edge_widths = Gruix dels cantells
+FormatCopy.text = Copia el format
+FormatCopy.tooltip = <html>C\u00F2pia el format d'un node.</html>
+FormatPaste.text = Enganxa el format
+FormatPaste.tooltip = <html>Enganxa el format d'un node.</html>
+ForwardAction.text = Endavant
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = Ajuda...
+FreeplaneHelpStarter.tooltip = Ajuda estesa del Freeplane
+GotoLinkNodeAction.text = V\u00E9s a l'enlla\u00E7
+GrabKeyDialog.common.cancel = Cancel\u00B7la
+GrabKeyDialog.common.ok = D'acord
+GrabKeyDialog.grab-key.assigned-to = Assignat a
+GrabKeyDialog.grab-key.assigned-to.none = Sense assignar
+GrabKeyDialog.grab-key.clear = Neteja
+GrabKeyDialog.grab-key.remove = Suprimeix
+GrabKeyDialog.grab-key.remove-ask = Esteu segurs de voler suprimir aquest text?
+GrabKeyDialog.grab-key.title = Introdu\u00EFu una nova clau
+help = Ajuda
+HierarchicalIconsAction.text = Mostra les icones jer\u00E0rquicament
+HierarchicalIconsAction.tooltip = Si un dels fills tenen una icona, tamb\u00E9 mostrar\u00E9 aquella icona en format petit.
+html_export_based_on_headings = Exporta a HTML - Basant-se en les cap\u00E7aleres
+html_export_fold_all = Exporta a HTML - Contreu-los tots
+html_export_fold_currently_folded = Exporta a HTML - Contreu els que es troben contrets
+html_export_no_folding = Exporta a HTML - Sense contreure
+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]
+icon_attach = Mira aqu\u00ED
+icon_back = Enrera
+icon_bee = Freeplane[translate me]
+icon_bell = Recorda
+icon_bookmark = Excel\u00B7lent
+icon_broken-line = Broken[translate me]
+icon_button_cancel = No est\u00E0 b\u00E9
+icon_button_ok = D'acord
+icon_calendar = Data
+icon_clanbomber = Perill\u00F3s
+icon_desktop_new = No ho oblidis
+icon_female2 = Female2[translate me]
+icon_flag = Seguiment
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_forward = Endavant
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioritat 1
+icon_full-2 = Prioritat 2
+icon_full-3 = Prioritat 3
+icon_full-4 = Prioritat 4
+icon_full-5 = Prioritat 5
+icon_full-6 = Prioritat 6
+icon_full-7 = Prioritat 7
+icon_gohome = Inici
+icon_help = Pregunta
+icon_idea = Idea
+icon_kaddressbook = Tel\u00E8fon
+icon_knotify = M\u00FAsica
+icon_korn = B\u00FAstia de correu
+icon_ksmiletris = Estic content
+icon_licq = Maco
+icon_Mail = Correu
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Icones
+icon_messagebox_warning = Important
+icon_password = Clau
+icon_pencil = Per a ser definit
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = No em diverteixo
+icon_stop = Atura
+icon_stop-sign = Stop[translate me]
+icon_wizard = M\u00E0gia
+icon_xmag = Per a ser discutit
+icon_yes = Important
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Trieu una icona...
+IconSelectionPlugin.tooltip = <html>Aqu\u00ED podeu triar una icona mitjan\u00E7ant la finestra addicional.</html>
+import = Importa
+import_linked_branch_no_link = El node que heu triat no t\u00E9 enlla\u00E7os per importar.
+ImportBranchAction.text = Branca...
+ImportExplorerFavoritesAction.text = Explora els preferits...
+ImportFolderStructureAction.text = Estructura de carpetes...
+ImportLinkedBranchAction.text = Branca enlla\u00E7ada
+ImportLinkedBranchWithoutRootAction.text = (Branca enlla\u00E7ada) Sense Arrel...
+ImportMindmanagerFiles.text = Mapa del MindManager X5...
+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.
+locking_failed_by_open = No ha estat possible blocar el mapa {0}. Obrint-lo com a nom\u00E9s lectura.
+locking_failed_by_save_as = No ha estat possible blocar el mapa {0}. No s''ha pogut Desar com.
+locking_old_lock_removed = El mapa {0} est\u00E0 blocat en aquest moment per l''usuari {1}. El bloqueig s''ha eliminat perqu\u00E8 \u00E9s massa antic.
+long_node_changed_cancel = Heu canviat el node. Voleu descartar-ne els canvis?
+lots_of_links_warning = Esteu a punt de crear molts enlla\u00E7os pel mateix node. Esteu segurs que voleu crear tots aquests enlla\u00E7os?
+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)
+mode_na = Modalitat no disponible
+mode_status = Modalitat canviada a {0} Mode
+mode_title = Freeplane - {0} Mode
+modes = Modalitats
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Fitxers m\u00E9s recents
+MoveToRootAction.text = Mou-re a l'Arrel
+NavigationNextMapAction.text = Mapa Seg\u00FCent
+NavigationPreviousMapAction.text = Mapa anterior
+new_mindmap = Crea un Mindmap
+new_node = Crea un Node Nou
+new_node_as_sibling_not_possible_for_the_root = No \u00E9s possible crear un node germ\u00E0 si us trobeu a l'arrel
+NewChildAction.text = Crea un Node Fill
+NewMapAction.text = Nou
+NewParentNode.text = Crea un node pare
+NewParentNode.tooltip = <html>Tots els seleccionats s'enviaran al pare.</html>
+NewPreviousSiblingAction.text = Crea un Node Germ\u00E0 Anterior
+NewSiblingAction.text = Crea un Node Germ\u00E0
+no = No
+no_format_copy_before_format_paste = No podeu enganxar un format sense haver-ne copiat pr\u00E8viament un.
+no_found_from = No s''ha trobat "{0}" a "{1}".
+no_more_found_from = No s''han trobat m\u00E9s "{0}" a "{1}".
+no_previous_find = No hi ha res a cercar pr\u00E8viament.
+node = Node
+node_changed_discard_changes = Heu canviat el node. Voleu descartar-ne els canvis?
+NodeBackgroundColorAction.text = Color de fons del node...
+NodeColorAction.text = Color del node...
+NodeColorBlendAction.text = Color de la barreja
+NodeDownAction.text = Node Avall
+NodeListAction.text = Mostra l'historial del mapa...
+NodeListAction.tooltip = Mostra tots els nodes amb la data de creaci\u00F3/modificaci\u00F3.
+NodeShapeAction.bubble.text = Globus
+NodeShapeAction.fork.text = Forca
+NodeUpAction.text = Node Amunt
+nonboldify_branch = Elimina les negretes
+nonitalicise_branch = Elimina les it\u00E0liques
+normal = Normal
+not_saved_for_link_error = Cal que deseu el mapa abans de qu\u00E8 pugueu establir un enlla\u00E7 en el quadre de di\u00E0leg de fitxers
+ok = D'acord
+OKAction.text = D'acord
+OpenAction.text = Obre...
+option_changes_may_require_restart = Per a veure els efectes d'alguns d'aquests canvis, cal que reinicieu el Freeplane.
+OptionalDontShowMeAgainDialog.cancel = No[translate me]
+OptionPanel.absolute = Absolut
+OptionPanel.antialias = Anti-\u00C0lies
+OptionPanel.antialias.tooltip = <html>Determina la qualitat del mapa. Com m\u00E9s anti-\u00E0lies m\u00E9s temps de processament.</html>
+OptionPanel.antialias_all = Anti\u00E0lies a Tots
+OptionPanel.antialias_edges = Anti\u00E0lies als Cantells
+OptionPanel.antialias_none = Sense Anti-\u00E0lies
+OptionPanel.Appearance = Aparen\u00E7a
+OptionPanel.ar = Ar[translate me]
+OptionPanel.as_parent = Com a pare
+OptionPanel.automatic = Autom\u00E0tic
+OptionPanel.Behaviour = Comportament
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Globus
+OptionPanel.Cancel = Cancel\u00B7la
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Combinat
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Per omissi\u00F3
+OptionPanel.default_browser_command_mac = Default Browser Command Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_other_os = Default Browser Command Other Os
+OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Default Browser Command Windows 9x
+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_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[translate me]
+OptionPanel.Defaults = Per omissi\u00F3
+OptionPanel.delete_automatic_saves_at_exit = Esborra els documents autodesats en sortir
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Si voleu que Freeplane esborri els fitxers autodesats autom\u00E0ticament en sortir indiqueu-ho afirmativament</html>
+OptionPanel.disable_cursor_move_paper = Desactiva el moviment del cursor en el paper
+OptionPanel.disable_cursor_move_paper.tooltip = <html>No mostris el cursor 'arrossega' en el paper mentre s'arrossega</html>
+OptionPanel.el__enter_confirms_by_default = La tecla Retorn confirma els valors per omissi\u00F3
+OptionPanel.el__max_default_window_height = Al\u00E7ada m\u00E0xima de les finestres
+OptionPanel.el__max_default_window_width = Amplada m\u00E0xima de les finestres
+OptionPanel.el__min_default_window_height = Al\u00E7ada m\u00EDnima de les finestres
+OptionPanel.el__min_default_window_width = Amplada m\u00EDnima de les finestres
+OptionPanel.el__position_window_below_node = Posici\u00F3 de la finestra sota el node
+OptionPanel.en = En
+OptionPanel.Environment = Entorn
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Bloqueig de fitxers experimental
+OptionPanel.experimental_file_locking_on.tooltip = <html> Funci\u00F3 en experimentaci\u00F3</html>
+OptionPanel.export_icons_in_html = Exporta les icones en Html
+OptionPanel.export_icons_in_html.tooltip = <html> Indica si l'HTML s'exporta des del Freeplane amb les icones. El problema que es presenta amb les icones \u00E9s que sovint els enlla\u00E7os cap a aquestes no es poden resoldre en exportar l'HTML.</html>
+OptionPanel.Files = Fitxers
+OptionPanel.first = Primer
+OptionPanel.foldingsymbolwidth = Amplada del s\u00EDmbol de contreu
+OptionPanel.foldingsymbolwidth.tooltip = <html>Amplada del marcador circular de contreure</html>
+OptionPanel.fork = Forca
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Basat en les cap\u00E7aleres
+OptionPanel.html_export_fold_all = Contreu-los tots
+OptionPanel.html_export_fold_currently_folded = Contreu els que estiguin contrets
+OptionPanel.html_export_folding = Html Export Folding
+OptionPanel.html_export_no_folding = Sense contreure
+OptionPanel.hu = Hu
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Combinaci\u00F3 de tecles
+OptionPanel.ko = Kr
+OptionPanel.language = Idioma
+OptionPanel.language.tooltip = <html>Aquest \u00E9s l'idioma que caldria utilitzar en el programa. Amb 'autom\u00E0tic' intenta carregar l'idioma actual de l'usuari. </html>
+OptionPanel.last = \u00DAltim
+OptionPanel.last_opened_list_length = Llargada del darrer fitxer obert a la llista
+OptionPanel.linear = Linial
+OptionPanel.links = Enlla\u00E7os
+OptionPanel.links.tooltip = <html>Estableix enlla\u00E7os, ja siguin relatius o absoluts </html>
+OptionPanel.lookandfeel = Estils visuals
+OptionPanel.lookandfeel.tooltip = <html>L'aparen\u00E7a que voleu utilitzar. Es troben disponibles 'met\u00E0l\u00B7lic','windows','motiu', 'gtk', 'mac' nom\u00E9s pels equips amb MacOS. Per defecte vol dir que s'utilitzar\u00E0 una aparen\u00E7a est\u00E0ndard. Si voleu afegir els vostres temes visuals, introdu\u00EFu el n\u00FAmero de classe aqu\u00ED i assegureu-vos que es correspon al fitxer jar carregat. Si experimenteu problemes amb els temes visuals, trieu 'cap'</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Ample m\u00E0xim del node
+OptionPanel.max_node_width.tooltip = <html>L'amplada m\u00E0xima del node en pixels</html>
+OptionPanel.metal = Metall
+OptionPanel.motif = Motiu
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nothing = Res
+OptionPanel.number_of_different_files_for_automatic_save = Nombre de fitxers diferents per autodesar
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Nombre n de fitxers diferents per desar els mapes. La primera desada es fa en el primer fitxer, i aix\u00ED successivament fins a n+1-desa que es torna a desar com al primer fitxer (c\u00EDclicament)</html>
+OptionPanel.OK = Desa
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Situa noves branques
+OptionPanel.placenewbranches.tooltip = <html>Indica on voleu situar noves branques. Els valors v\u00E0lids s\u00F3n 'primer' i '\u00FAltim' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relatiu
+OptionPanel.ru = Ru
+OptionPanel.selection_method = M\u00E8tode de selecci\u00F3
+OptionPanel.selection_method.tooltip = <html> amb aquest par\u00E0metre podeu activar/desactivar el retard en la selecci\u00F3. No es recomana que ho modifiqueu.</html>
+OptionPanel.selection_method_by_click = Per clic
+OptionPanel.selection_method_delayed = Retardat
+OptionPanel.selection_method_direct = Directe
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Patrons
+OptionPanel.separator.anti_alias = Anti-\u00C0lies
+OptionPanel.separator.automatic_save = Desament autom\u00E0tic
+OptionPanel.separator.behaviour = Comportament
+OptionPanel.separator.browser = Navegador
+OptionPanel.separator.commands_for_the_program = Ordres pel programa
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Colors per defecte
+OptionPanel.separator.default_fonts = Lletres per defecte
+OptionPanel.separator.default_styles = Estils per defecte
+OptionPanel.separator.edit_long_node_window = Edita la longitud de la finestra d'un node
+OptionPanel.separator.files = Fitxers
+OptionPanel.separator.General = General[translate me]
+OptionPanel.separator.html_export = Exporta a l'HTML
+OptionPanel.separator.hyperlink_types = Tipus d'hiperenlla\u00E7os
+OptionPanel.separator.icon_properties = Icones
+OptionPanel.separator.initial_map_size = Mida inicial del mapa
+OptionPanel.separator.key_typing = Teclat
+OptionPanel.separator.language = Idioma
+OptionPanel.separator.look_and_feel = Estils visuals
+OptionPanel.separator.new_node_commands = Ordres pels nous nodes
+OptionPanel.separator.node_editing_commands = Ordres per l'edici\u00F3 de nodes
+OptionPanel.separator.node_navigation_commands = Ordres per a la navegaci\u00F3
+OptionPanel.separator.NodeFont = Node Font[translate me]
+OptionPanel.separator.other_defaults = Altres prefer\u00E8ncies
+OptionPanel.separator.patterns = Patrons
+OptionPanel.separator.save = Desa
+OptionPanel.separator.selection_method = M\u00E8tode de selecci\u00F3
+OptionPanel.separator.undo = Desf\u00E9s
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = Color est\u00E0ndard del fons
+OptionPanel.standardbackgroundcolor.tooltip = <html>El color est\u00E0ndard del fons en format html </html>
+OptionPanel.standardcloudcolor = Color est\u00E0ndard del n\u00FAvol
+OptionPanel.standardcloudcolor.tooltip = <html>El color est\u00E0ndard del n\u00FAvol en format html </html>
+OptionPanel.standardcloudestyle = Estil est\u00E0ndard del n\u00FAvol
+OptionPanel.standardcloudestyle.tooltip = <html>L'estil est\u00E0ndard del n\u00FAvol. Actualment nom\u00E9s es troba disponible l'estil 'bezier' </html>
+OptionPanel.standardlinkcolor = Color est\u00E0ndar dels enlla\u00E7os
+OptionPanel.standardlinkcolor.tooltip = <html>El color est\u00E0ndard dels enlla\u00E7os en format html </html>
+OptionPanel.standardlinkestyle = Estil est\u00E0ndard dels enlla\u00E7os
+OptionPanel.standardlinkestyle.tooltip = <html>L'estil est\u00E0ndard dels enlla\u00E7os. Actualment nom\u00E9s es troba disponible l'estil 'bezier' </html>
+OptionPanel.standardselectednodecolor = Color est\u00E0ndard del node seleccionat
+OptionPanel.standardselectednodecolor.tooltip = <html>El color est\u00E0ndard del node seleccionat. Cal que l'indiqueu en format HTML (#RRGGBB en valor hexagesimals) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Autodesar cada
+OptionPanel.time_for_automatic_save.tooltip = <html> temps entre dues desades autom\u00E0tiques consecutives (en mseg): Per a desactivar l'autodesada introdu\u00EFu aquesta xifra 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Retard per la selecci\u00F3 retardada
+OptionPanel.time_for_delayed_selection.tooltip = <html> \u00C9s el temps de retard que es triga per a seleccionar un node quan s'hi situa a sobre el ratol\u00ED (en mseg). Canvieu el valor a 1 si voleu una selecci\u00F3 directa en situar-hi a sobre el ratol\u00ED.</html>
+OptionPanel.tr = Tr[translate me]
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undo_levels = Desf\u00E9s nivells
+OptionPanel.undo_levels.tooltip = <html>Determina quants passos cal que es puguin desfer mitjan\u00E7ant "Desf\u00E9s".</html>
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Prefer\u00E8ncies de la p\u00E0gina...
+PasteAction.text = Enganxa
+PatternToString.color = Color[translate me]
+PatternToString.EdgeStyle = Estil del Cantell
+PatternToString.EdgeWidth = Ample del Cantell
+PatternToString.FontBold = Negreta
+plugins/TimeList.xml_Created = Creat
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = Icones
+plugins/TimeList.xml_Modified = Modificat
+plugins/TimeList.xml_Notes = Notes[translate me]
+plugins/TimeList.xml_Text = Text
+plugins/TimeManagement.xml_appendButton = Afegeix la data als nodes seleccionats
+plugins/TimeManagement.xml_Cancel = Cancel\u00B7la
+plugins/TimeManagement.xml_cancelButton = Cancel\u00B7la
+plugins/TimeManagement.xml_hour = Hores:
+plugins/TimeManagement.xml_minute = Minuts:
+plugins/TimeManagement.xml_reminderButton = Recorda-m'ho aquesta data
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>En pr\u00E9mer el temporalitzador es programa a la data indicada. Llavors, les icones pampalluguen requerint la vostra atenci\u00F3.<br> Si tanqueu el mapa, els temporitzadors es reactiven la propera vegada que obriu el mapa.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>En aquest moment nom\u00E9s \u00E9s possible disposar d'un recordatori per node.<br>El recordatori actual est\u00E0 programat pel {0,date} a les {0,time}, el que vas triar anteriorment era pel {1,date} a les {1,time}. <br><br>Voleu modificar el recordatori del node (S\u00CD) <br>o voleu mantenir l'antic (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Recordatori programat el {0,date} a les {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Elimina el recordatori
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Elimina tots els recordatoris dels nodes seleccionats.
+plugins/TimeManagement.xml_todayButton = Avui
+plugins/TimeManagement.xml_WindowTitle = Administraci\u00F3 del temps
+preferences = Prefer\u00E8ncies
+PrintAction.text = Imprimeix...
+PrintDirectAction.text = Imprimeix
+printing_settings = Escala d'impressi\u00F3
+PropertyAction.text = Prefer\u00E8ncies ...
+QuitAction.text = Surt
+read_only = Nom\u00E9s de Lectura
+RedoAction.text = Refer
+RedoFilterAction.text = Refer
+ReminderHookAction.text = Elimina el recordatori
+ReminderHookAction.tooltip = Elimina el recordatori d'un node.
+RemoveAllIconsAction.text = Elimina totes les icones
+RemoveIconAction.text = Elimina l'\u00FAltima icona
+repair_link = Repara l'enlla\u00E7
+repair_link_question = No ha estat possible carregar el mapa enlla\u00E7at. Voleu reparar-lo manualment?
+ResetNodeLocationAction.text = Restaura la posici\u00F3
+save_failed = Hi ha hagut un error en intentar desar el mapa {0}.
+save_unsaved = Voleu desar el mapa seg\u00FCent? :
+SaveAction.text = Desa
+SaveAsAction.text = Desa com...
+saved = Desat
+scheme_evaluate = Evalua!
+select_favorites_folder = Trieu una carpeta en la que resideixin els vostres preferits
+select_folder_for_importing = Trieu la carpeta a importar
+SelectAllAction.text = Selecciona totes les visibles
+SelectBranchAction.text = Selecciona la branca visible
+selection_method_by_click = Un clic senzill per a seleccionar
+selection_method_delayed = Selecci\u00F3 Autom\u00E0tica Retardada
+selection_method_direct = Puntejar per a seleccionar
+SetImageByFileChooserAction.text = Imatge (Trieu un fitxer o enlla\u00E7)...
+SetLinkByFileChooserAction.text = Hiperenlla\u00E7 (Trieu un fitxer)...
+SetLinkByTextFieldAction.text = Hipernella\u00E7 (Quadre de text)...
+simplyhtml.borderColorLabel = Color\:[translate me]
+simplyhtml.borderWidthLabel = Amplada
+simplyhtml.cancelBtnName = Cancel\u00B7la
+simplyhtml.cellGenTabLabel = General[translate me]
+simplyhtml.colorLabel = Color[translate me]
+simplyhtml.copyLabel = Copia
+simplyhtml.cutLabel = Retalla
+simplyhtml.fontBoldLabel = Negreta
+simplyhtml.fontItalicLabel = It\u00E0liques
+simplyhtml.fontTabLabel = Lletra
+simplyhtml.fontUnderlineLabel = Subratllat
+simplyhtml.formatLabel = Format[translate me]
+simplyhtml.helpLabel = Ajuda
+simplyhtml.okBtnName = D'acord
+simplyhtml.pasteLabel = Enganxa
+simplyhtml.redoLabel = Refer
+simplyhtml.replaceNo = No
+simplyhtml.replaceYes = S\u00ED
+simplyhtml.styleLabel = Estil
+simplyhtml.uLineLabel = Subratllat
+simplyhtml.undoLabel = Desf\u00E9s
+split = Divideix
+SplitNode.text = Split Node[translate me]
+style = Estil
+svg = SVG[translate me]
+TimeListAction.text = Mostra la llista de tasques programades...
+TimeListAction.tooltip = Mostra totes les tasques programades amb els nodes corresponents.
+TimeManagementAction.text = Mostra el calendari...
+TimeManagementAction.tooltip = <html>Mostra el m\u00F2dul del calendari d'en Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = (Des)contreu els fills
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Alterna els contrets
+ToggleLeftToolbarAction.text = Alterna la barra d'eines esquerra
+ToggleMenubarAction.text = Alterna la barra de men\u00FA
+ToggleToolbarAction.text = Alterna de barra d'eines
+undefined_error = S'ha produ\u00EFt un error no previst. Si us plau, proveu de reportar l'error per tal que puguem corregir-lo.
+underline = Subratllat
+underlined = Subratllat
+UndoAction.text = Desf\u00E9s
+UndoFilterAction.text = Desf\u00E9s
+unfold = Descontreu
+UnfoldAllAction.text = Descontreu-los tots
+UnfoldAllAction.tooltip = <html>Descontreu els nodes seleccionats i tots els seus fills.</html>
+UnfoldOneLevelAction.text = Descontreu-lo un nivell
+UnfoldOneLevelAction.tooltip = <html>Descontreu un nivell dels nodes seleccionats.</html>
+url_error = Aquesta adre\u00E7a no est\u00E0 ben escrita!
+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):
+width = Amplada
+yes = S\u00ED
+ZoomInAction.text = Apropa't
+ZoomOutAction.text = Allunya't
diff --git a/freeplane/resources/translations/Resources_cs.properties b/freeplane/resources/translations/Resources_cs.properties
new file mode 100644
index 0000000..d798e4b
--- /dev/null
+++ b/freeplane/resources/translations/Resources_cs.properties
@@ -0,0 +1,882 @@
+AboutAction.text = O programu
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Zm\u011Bna form\u00E1tu uzl\u016F
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Zm\u011Bnit vzor
+accessories/plugins/EncryptNode.properties_0 = Vyberte heslo pro zak\u00F3dovan\u00FD uzel
+accessories/plugins/EncryptNode.properties_1 = Hesla nejsou stejn\u00E1, nebo jsou p\u0159\u00EDli\u0161 kr\u00E1tk\u00E1.
+accessories/plugins/EncryptNode.properties_2 = Vlo\u017Ete heslo:
+accessories/plugins/EncryptNode.properties_3 = Znovu vlo\u017Ete heslo:
+accessories/plugins/EncryptNode.properties_4 = Vlo\u017Ete Va\u0161e heslo.
+accessories/plugins/EncryptNode.properties_5 = <html>Pamatujte, \u017Ee s\u00EDla zak\u00F3dov\u00E1n\u00ED<br> z\u00E1vis\u00ED p\u0159edev\u0161\u00EDm na kvalit\u011B Va\u0161eho hesla.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Storno
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = M\u016F\u017Eete p\u0159epnout zak\u00F3dov\u00E1n\u00ED pouze u zak\u00F3dovan\u00E9ho uzlu. Takov\u00FD uzel m\u016F\u017Eete vlo\u017Eit pomoc\u00ED menu N\u00E1stroje.
+accessories/plugins/EncryptNode.properties_select_me = Vybrat pro pokra\u010Dov\u00E1n\u00ED!
+accessories/plugins/EncryptNode.properties_wrong_password = Heslo nen\u00ED spr\u00E1vn\u00E9.
+accessories/plugins/ExportWithXSLT.tooltip = Export s pou\u017Eit\u00EDm XSLT skript\u016F.
+accessories/plugins/ExportWithXSLT_Applet.text = Jako Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exportuje mapu jako java browser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Jako Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exportuje mapu jako flash aplikaci.
+accessories/plugins/ExportWithXSLT_HTML.text = Jako XHTML (JavaScript verze)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Jako XHTML (verze s klikac\u00ED mapou)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Zdroje z uzlu RESOURCES do souboru Taskjuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exportuje zdroje z uzlu RESOURCES do modulu Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = \u00DAkoly z uzlu TASKS do Taskjuggler souboru...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exportuje \u00FAkoly z uzlu TASKS do modulu Taskjuggler. </html>
+add = P\u0159idat
+AddLocalLinkAction.text = P\u0159idat lok\u00E1ln\u00ED hyperlink
+antialias_all = Vyhlazovat v\u0161e
+antialias_edges = Vyhlazovat hrany
+antialias_none = Nevyhlazovat nic
+apply = Pou\u017E\u00EDt
+ApplyAction.text = Pou\u017E\u00EDt
+ApplyFormatPlugin.text = Zm\u011Bna form\u00E1tu ...
+ApplyFormatPlugin.tooltip = Dialog, kde atributy uzl\u016F a hran mohou b\u00FDt m\u011Bn\u011Bn\u00E9 najednou.
+as_parent = Jako nad\u0159azen\u00FD
+AskForHelp.text = Ask for Help[translate me]
+AssignAttributesAction.text = P\u0159i\u0159adit atributy...
+attribute_delete = Smazat v\u0161echny hodnoty
+attribute_delete_value = Smazat tuto hodnotu
+attribute_font_size_tooltip = Velikost p\u00EDsma atributu
+attribute_list_box_label_text = Existuj\u00EDc\u00ED hodnoty
+attribute_replace = Nahradit s
+attribute_top = V\u0161echny zn\u00E1m\u00E9 atributy pro nahran\u00E9 mapy
+attributes_adding_empty_attribute_error = Nelze pou\u017E\u00EDt pr\u00E1zdn\u00FD \u0159et\u011Bzec jako n\u00E1zev atributu
+attributes_all = V\u0161ehny atributy
+attributes_attribute = Atributy
+attributes_close = Zav\u0159\u00EDt
+attributes_deselect_all = Nic
+attributes_edit = Upravit
+attributes_edit_tooltip = Upravit mno\u017Einu
+attributes_for_selected = Vybran\u00E9 uzly
+attributes_for_visible = V\u0161echny viditeln\u00E9 uzly
+attributes_import = Import
+attributes_import_tooltip = Naimportuje atributy z jin\u00FDch nahran\u00FDch map
+attributes_no_import_candidates_found = \u017D\u00E1dn\u00E9 nov\u00E9 atributy nenalezeny
+attributes_popup_delete = Smazat
+attributes_popup_down = Dol\u016F
+attributes_popup_edit = Upravit
+attributes_popup_hide = Skr\u00FDt
+attributes_popup_new = Nov\u00FD atribut
+attributes_popup_optimal_width = Optim\u00E1ln\u00ED \u0161\u00ED\u0159ka
+attributes_popup_up = Nahoru
+attributes_refresh = Obnovit
+attributes_restricted_attributes_tooltip = Omezit mno\u017Einu atribut\u016F
+attributes_restricted_values_tooltip = Omezit mno\u017Einu hodnot pro aktu\u00E1ln\u00ED atribut
+attributes_restriction = Omezen\u00E1 mno\u017Eina
+attributes_select_all = V\u0161e
+attributes_select_all_tooltip = Vybrat / zru\u0161it ozna\u010Den\u00ED v\u0161eho
+attributes_show = Uk\u00E1zat
+attributes_skip_root = P\u0159esko\u010Dit ko\u0159enov\u00FD uzel
+attributes_visible = Vybrat viditeln\u00E9
+attributes_visible_tooltip = Vybrat viditeln\u00E9
+automatically_save_message = Mapa byla automaticky ulo\u017Eena (se jm\u00E9nem souboru {0}) ...
+AutomaticLayoutAction.text = 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>
+BackAction.text = Zp\u011Bt
+background = Pozad\u00ED
+BlinkingNodeHookAction.text = Blikaj\u00EDc\u00ED uzel
+BlinkingNodeHookAction.tooltip = <html>Zapne blik\u00E1n\u00ED uzlu. Pou\u017Eijte opatrn\u011B. Neaplikujte to na mnoho uzl\u016F a <strong> spole\u010Dn\u011B s jin\u00FDm automatick\u00FDm form\u00E1tov\u00E1n\u00EDm na stejn\u00E9m uzlu</strong></html>
+BoldAction.text = Tu\u010Dn\u011B
+boldify_branch = Stu\u010Dnit
+branch = V\u011Btev
+cancel = Storno
+CancelAction.text = Storno
+cannot_add_parent_diff_parents = V\u0161echny uzly mus\u00ED m\u00EDt stejn\u00FD nad\u0159azen\u00FD uzel, aby tato funkce mohla b\u00FDt pou\u017Eita.
+cannot_add_parent_to_root = The root node can't be added to a new parent.
+cannot_join_nodes_with_children = Nelze spojit uzly, kter\u00E9 maj\u00ED poduzly
+cannot_move_to_child = Nelze p\u0159esunout uzel do jednoho ze sv\u00FDch pod\u0159\u00EDzen\u00FDch uzl\u016F.
+CenterAction.text = St\u0159ed
+ChangeConnectorArrowsAction.backward.text = Zp\u011Bt
+ChangeConnectorArrowsAction.forward.text = Vp\u0159ed
+ChangeNodeLevelLeftsAction.text = Uzel doleva
+ChangeNodeLevelLeftsAction.tooltip = Nalevo od ko\u0159enov\u00E9ho uzlu jsou uzly posunut\u00E9 dol\u016F. Stanou se d\u011Btmi uzl\u016F na stejn\u00E9 \u00FArovni. Na prav\u00E9 stran\u011B jsou posunut\u00E9 nahoru. P\u0159\u00EDmo u ko\u0159enov\u00E9ho uzlu si uzly vym\u011Bn\u00ED strany.
+ChangeNodeLevelRightsAction.text = Uzel doprava
+ChangeNodeLevelRightsAction.tooltip = Napravo od ko\u0159enov\u00E9ho uzlu jsou uzly posunut\u00E9 dol\u016F. Stanou se d\u011Btmi uzl\u016F na stejn\u00E9 \u00FArovni. Na lev\u00E9 stran\u011B jsou posunut\u00E9 nahoru. P\u0159\u00EDmo u ko\u0159enov\u00E9ho uzlu si uzly vym\u011Bn\u00ED strany.
+choose_background_color = Vyberte barvu pozad\u00ED:
+choose_cloud_color = Vyberte barvu oblaku:
+choose_edge_color = Vyberte barvu hrany
+choose_node_background_color = Vyberte barvu pozad\u00ED uzlu:
+choose_node_color = Vyberte barvu uzlu:
+CloseAction.text = Zav\u0159\u00EDt
+CloudAction.text = Oblak
+CloudColorAction.text = Barva oblaku...
+ColorProperty.ResetColor = Vyresetovat barvu
+combined = Kombinovan\u00E9
+CopyAction.text = Kop\u00EDrovat
+CopySingleAction.text = Kop\u00EDrovat samostatn\u011B
+CreationModificationPluginAction.text = Ukazovat \u010Das zm\u011Bny
+CreationModificationPluginAction.tooltip = <html>Tato funkce ukazuje \u010Das vytvo\u0159en\u00ED a zm\u011Bny uzlu.</html>
+CutAction.text = Vyjmout
+decrease_branch_font_size = Men\u0161\u00ED p\u00EDsmo
+DecreaseNodeFontAction.text = Men\u0161\u00ED p\u00EDsmo
+delete = Smazat
+delete_child = Smazat uzel
+DeleteAction.text = Odebrat uzel
+DeleteConditionAction.text = Smazat
+DocumentationAction.text = Dokumentace
+edge = Hrana
+edge_style = Styl hrany
+edge_width = Tlou\u0161\u0165ka hrany
+EdgeColorAction.text = Barva hrany...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = Line\u00E1rn\u00ED
+EdgeStyleAction.sharp_bezier.text = Ostr\u00E9 Bezierovy
+EdgeStyleAction.sharp_linear.text = Ostr\u00E9 line\u00E1rn\u00ED
+EdgeStyleAsParentAction.text = Jako nad\u0159azen\u00FD
+EdgeWidthAction_width_parent.text = Nad\u0159azen\u00FD
+EdgeWidthAction_width_thin.text = Tenk\u00FD
+edit = Upravit
+edit_link_manually = Upravit odkaz manu\u00E1ln\u011B...
+edit_middle_label = Edit Middle Label[translate me]
+EditAction.text = Upravit uzel
+EditAttributesAction.text = Upravit atributy
+EditFilterAction.text = Upravit
+EditLongAction.text = Upravit dlouh\u00FD uzel...
+EncryptedMap.text = Vytvo\u0159it zak\u00F3dovanou mapu ...
+EncryptedMap.tooltip = Vytvo\u0159\u00ED novou zak\u00F3dovanou mapu
+enter_base_url = Budu vkl\u00E1dat relativn\u00ED odkazy. Pros\u00EDm, vlo\u017Ete z\u00E1kladn\u00ED URL.
+enter_confirms = Potvrdit vlo\u017Een\u00ED
+EnterPassword.text = Od/zak\u00F3dov\u00E1n\u00ED
+error = Chyba
+error_applying_template = Chyba p\u0159i aplikov\u00E1n\u00ED XSL \u0161ablony.
+error_creating_directory = Nelze vytvo\u0159it adres\u00E1\u0159 pro export.
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Exportovat
+ExportBranchToHTMLAction.text = Exportovat v\u011Btev do HTML
+ExportPdf.text = Jako PDF...
+ExportSvg.text = Jako SVG...
+ExportToHTMLAction.text = Exportovat do HTML
+ExportToImage.jpg.text = Jako JPEG...
+ExportToImage.png.text = Jako PNG...
+ExportToOoWriter.text = Jako dokument Open Office Writer...
+ExportToOoWriter.tooltip = Rozbalen\u00E9 uzly tvo\u0159\u00ED strukturu, sbalen\u00E9 uzly tvo\u0159\u00ED obsah dokumentu.
+extension_menu = Fyzick\u00FD styl
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = FAQ
+file = Soubor
+file_already_exists = Soubor {0} ji\u017E existuje. Chcete ho p\u0159epsat?
+file_not_found = Soubor {0} nenalezen
+filter = Filtr
+filter_add = P\u0159idat
+filter_and = A
+filter_conditions = Podm\u00EDnky filtru
+filter_contains = Obsahuje
+filter_delete = Smazat
+filter_dialog = Kompozice filtru
+filter_does_not_exist = Neexistuje
+filter_edit_description = Upravit seznam filtr\u016F
+filter_enter_value = Vlo\u017Eit hodnotu
+filter_exist = Existuje
+filter_icon = Ikona
+filter_is_equal_to = je rovno
+filter_is_not_equal_to = nen\u00ED rovno
+filter_link = Hyperlink[translate me]
+filter_node = Text uzlu
+filter_not = Ne
+filter_or = Nebo
+filter_select = Vybrat
+filter_selected_node_view = Aktu\u00E1ln\u011B vybran\u00E9 uzly
+find_what = Naj\u00EDt co
+FindAction.text = Naj\u00EDt...
+fit_map_to_page = Na jednu str\u00E1nku
+FitToPage.text = P\u0159ibl\u00ED\u017Eit na celou mapu
+FitToPage.tooltip = Uprav\u00ED p\u0159ibl\u00ED\u017Een\u00ED tak, \u017Ee se do okna vejde cel\u00E1 mapa.
+fold = Slo\u017Eit
+FoldAllAction.text = Slo\u017Eit v\u0161e
+FoldAllAction.tooltip = <html>Slo\u017Eit vybran\u00E9 uzly a v\u0161echny jejich poduzly.</html>
+FoldOneLevelAction.text = Slo\u017Eit jednu \u00FArove\u0148
+FoldOneLevelAction.tooltip = <html>Slo\u017E\u00ED vybran\u00E9 uzly o jednu \u00FArove\u0148.</html>
+font = p\u00EDsmo
+FontFamilyAction.text = P\u00EDsmo
+FontSizeAction.text = Velikost p\u00EDsma
+format_menu_edge_styles = Styly hran
+format_menu_edge_widths = \u0160\u00ED\u0159ky hran
+FormatCopy.text = Kop\u00EDrovat form\u00E1t
+FormatCopy.tooltip = <html>Zkop\u00EDruje form\u00E1t uzlu.</html>
+FormatPaste.text = Vlo\u017Eit form\u00E1t
+FormatPaste.tooltip = <html>Aplikuje form\u00E1t na uzel.</html>
+ForwardAction.text = Vp\u0159ed
+Freeplane.progress.buildScreen = Vytv\u00E1\u0159\u00EDm obrazovku...
+Freeplane.progress.createController = Vytv\u00E1\u0159\u00EDm kontroler...
+Freeplane.progress.createInitialMode = Vytv\u00E1\u0159\u00EDm \u00FAvodn\u00ED m\u00F3d...
+Freeplane.progress.endStartup = Start ukon\u010Den.
+Freeplane.progress.gettingPreferenceDirectories = Z\u00EDsk\u00E1v\u00E1m slo\u017Eky nastaven\u00ED...
+Freeplane.progress.gettingPreferences = Z\u00EDsk\u00E1v\u00E1m nastaven\u00ED...
+Freeplane.progress.loadMaps = Nahr\u00E1v\u00E1m mapy...
+Freeplane.progress.propagateLookAndFeel = Propaguji vzhled a t\u00E9ma...
+Freeplane.progress.settingPreferences = Nastavuji mo\u017Enosti...
+Freeplane.progress.startCreateController = Startuji kontroler...
+Freeplane.progress.updateLookAndFeel = Aktualizuji vzhled a t\u00E9ma...
+freeplane_reverted = Freeplane_Vraceno_
+FreeplaneHelpStarter.text = Online n\u00E1pov\u011Bda...
+FreeplaneHelpStarter.tooltip = Freeplane roz\u0161\u00ED\u0159en\u00E1 n\u00E1pov\u011Bda
+GotoLinkNodeAction.text = N\u00E1sledovat odkaz
+GrabKeyDialog.common.cancel = Storno
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = P\u0159i\u0159azeno k
+GrabKeyDialog.grab-key.assigned-to.none = Aktu\u00E1ln\u011B nep\u0159i\u0159azeno
+GrabKeyDialog.grab-key.clear = Smazat
+GrabKeyDialog.grab-key.remove = Odstranit
+GrabKeyDialog.grab-key.remove-ask = Jste si jist odstranen\u00EDm t\u00E9to kl\u00E1vesov\u00E9 zkratky?
+GrabKeyDialog.grab-key.title = Zadejte novou kl\u00E1vesu
+help = N\u00E1pov\u011Bda
+HideAllAttributesAction.text = Skr\u00FDt v\u0161echny atributy
+HierarchicalIconsAction.text = Uk\u00E1zat ikony hierarchicky
+HierarchicalIconsAction.tooltip = Pokud jeden z poduzl\u016F m\u00E1 ikonu, uk\u00E1\u017Ee se ta ikona tak\u00E9 v mal\u00E9m form\u00E1tu.
+HotKeyInfoAction.text = Key Reference[translate me]
+html_export_based_on_headings = HTML Export - Zalo\u017Eeno na nadpisech
+html_export_fold_all = HTML Export - Slo\u017Eit v\u0161e
+html_export_fold_currently_folded = HTML Export - Skl\u00E1dat moment\u00E1ln\u011B slo\u017Een\u00E9
+html_export_no_folding = HTML Export - Bez skl\u00E1d\u00E1n\u00ED
+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]
+icon_attach = P\u0159\u00EDloha
+icon_back = Zp\u011Bt
+icon_bee = Freeplane[translate me]
+icon_bell = Nezapome\u0148
+icon_bookmark = Obl\u00EDben\u00E9
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Zru\u0161it
+icon_button_ok = OK
+icon_calendar = Datum
+icon_clanbomber = Riziko
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Nezapome\u0148
+icon_down = Dol\u016F
+icon_family = Rodina
+icon_fema = Females[translate me]
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_females = Females[translate me]
+icon_flag = Vlajka
+icon_flag-black = Black Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_forward = Vp\u0159ed
+icon_freemind_butterfly = FreeMind[translate me]
+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_gohome = Dom\u016F
+icon_help = Ot\u00E1zka
+icon_idea = Idea
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_kmail = E-Mail[translate me]
+icon_knotify = Hudba
+icon_korn = Schr\u00E1nka
+icon_ksmiletris = Jsem happy
+icon_licq = Hezk\u00E9
+icon_Mail = Dopis
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = Ikony
+icon_messagebox_warning = D\u016Fle\u017Eit\u00E9
+icon_password = Heslo
+icon_pencil = K up\u0159esn\u011Bn\u00ED
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = V\u016Fbec se nebav\u00EDm
+icon_stop = Stop
+icon_stop-sign = Stop[translate me]
+icon_up = Nahoru
+icon_wizard = Magie
+icon_xmag = K diskusi
+icon_yes = D\u016Fle\u017Eit\u00E9
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.docs_folders.text = Docs & Folders[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = V\u00FDb\u011Br ikony...
+IconSelectionPlugin.tooltip = <html>Pomoc\u00ED n\u00E1sleduj\u00EDc\u00EDho okna m\u016F\u017Eete vybrat ikonu.</html>
+import = Import
+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...
+ImportExplorerFavoritesAction.text = Importovat obl\u00EDben\u00E9 IExploreru...
+ImportFolderStructureAction.text = Importovat strukturu slo\u017Eky...
+ImportLinkedBranchAction.text = Importovat odkazovanou v\u011Btev
+ImportLinkedBranchWithoutRootAction.text = Importovat bez ko\u0159ene...
+ImportMindmanagerFiles.text = MindManager X5 Mapa...
+increase_branch_font_size = V\u011Bt\u0161\u00ED p\u00EDsmo
+IncreaseNodeFontAction.text = V\u011Bt\u0161\u00ED p\u00EDsmo
+ItalicAction.text = Kurz\u00EDva
+italicise_branch = Nastavit kurz\u00EDvu
+JoinNodesAction.text = Spojit uzly
+less_than_two_selected_nodes = Mus\u00EDte vybrat alespo\u0148 dva uzly, aby se mohly vytvo\u0159it odkazy.
+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.
+LoadAcceleratorPresetsAction.textPatterns.text = Text Patterns[translate me]
+locking_failed_by_open = Uzam\u010Den\u00ED mapy {0} se nezda\u0159ilo. Soubor otev\u0159en pouze ke \u010Dten\u00ED.
+locking_failed_by_save_as = Uzam\u010Den\u00ED mapy {0} se nezda\u0159ilo. Akce Ulo\u017Eit je zru\u0161ena.
+locking_old_lock_removed = Mapa {0} byla uzam\u010Dena u\u017Eivatelem {1}. Z\u00E1mek byl odstran\u011Bn, proto\u017Ee byl p\u0159\u00EDli\u0161 star\u00FD.
+long_node_changed_cancel = Zm\u011Bnil(a) jste uzel. Chcete zahodit zm\u011Bny?
+long_node_changed_submit = Zm\u011Bnil(a) jste uzel. Chcete ulo\u017Eit zm\u011Bny?
+lots_of_links_warning = K tomuto uzlu se te\u010F vytvo\u0159\u00ED spousta odkaz\u016F. Opravdu to chcete?
+map_already_exists = Soubor mapy u\u017E existuje. Chcete ho p\u0159epsat?
+map_corrupted = Mapa je poni\u010Den\u00E1. Chcete zobrazit detaily?
+map_locked_by_open = Mapa {0} je moment\u00E1ln\u011B editovan\u00E1 u\u017Eivatelem {1}. Otev\u0159ena je pouze ke \u010Dten\u00ED.
+map_locked_by_save_as = Mapa {0} je moment\u00E1ln\u011B editovan\u00E1 u\u017Eivatelem {1}. Akce Ulo\u017Eit jako zru\u0161ena.
+map_not_saved = Mapa nebyla d\u0159\u00EDve ulo\u017Eena.
+menu_attributes = Atributy
+menu_extras = N\u00E1stroje
+menu_file_import = Importovat
+menu_format = Form\u00E1t
+menu_insert = Vlo\u017Eit
+menu_navigate = Navigovat
+menu_view = Zobrazit
+mindmap = Mapa
+mindmaps = Mapy
+mindmaps_desc = Mapa (*.mm)
+mode_na = M\u00F3d nedostupn\u00FD
+mode_status = M\u00F3d zm\u011Bn\u011Bn na {0} M\u00F3d
+mode_title = Freeplane - {0} M\u00F3d
+modes = M\u00F3dy
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Posledn\u00ED soubory
+MoveToRootAction.text = P\u0159esunout do ko\u0159ene
+NavigationNextMapAction.text = Dal\u0161\u00ED mapa
+NavigationPreviousMapAction.text = P\u0159ede\u0161l\u00E1 mapa
+new_mindmap = Nov\u00E1 mapa
+new_node = Nov\u00FD uzel
+new_node_as_sibling_not_possible_for_the_root = Nem\u016F\u017Eete vlo\u017Eit nov\u00FD uzel na stejnou \u00FArove\u0148 jako je ko\u0159en.
+NewChildAction.text = Nov\u00FD poduzel
+NewMapAction.text = Nov\u00FD
+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>
+NewPreviousSiblingAction.text = Nov\u00FD uzel na stejn\u00E9 \u00FArovni nad
+NewSiblingAction.text = Nov\u00FD uzel na stejn\u00E9 \u00FArovni pod
+no = Ne
+no_format_copy_before_format_paste = Nem\u016F\u017Eete aplikovat form\u00E1t, dokud ho nezkop\u00EDrujete.
+no_found_from = \u017D\u00E1dn\u00FD v\u00FDraz "{0}" nebyl nalezen v "{1}".
+no_more_found_from = Dal\u0161\u00ED v\u00FDraz "{0}" nebyl nalezen v "{1}".
+no_previous_find = P\u0159edchoz\u00ED nenalezen.
+node = Uzel
+node_changed_discard_changes = Zm\u011Bnil(a) jste uzel. Chcete zahodit zm\u011Bny?
+NodeBackgroundColorAction.text = Barva pozad\u00ED uzlu...
+NodeColorAction.text = Barva uzlu...
+NodeColorBlendAction.text = M\u00EDsit barvu
+NodeDownAction.text = Uzel dol\u016F
+NodeListAction.text = Naj\u00EDt a nahradit...
+NodeListAction.tooltip = Uk\u00E1\u017Ee v\u0161echny uzly jako prohledateln\u00FD seznam s filtrem vlastnost\u00ED.
+NodeShapeAction.bubble.text = Bublina
+NodeShapeAction.fork.text = Rozdvojen\u00ED
+NodeUpAction.text = Uzel nahoru
+nonboldify_branch = Zru\u0161it tu\u010Dn\u00E9
+nonitalicise_branch = Zru\u0161it kurz\u00EDvu
+normal = Norm\u00E1ln\u00ED
+not_saved_for_link_error = Mapa mus\u00ED b\u00FDt ulo\u017Eena, ne\u017E m\u016F\u017Eete nastavit odkaz pomoc\u00ED v\u00FDb\u011Bru souboru.
+ok = OK
+OKAction.text = OK
+OpenAction.text = Otev\u0159\u00EDt...
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Pro projeven\u00ED zm\u011Bn budete pravd\u011Bpodobn\u011B muset restartovat Freeplane.
+OptionPanel.absolute = Absolutn\u00ED
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatick\u00E9 rozvr\u017Een\u00ED vzor\u016F
+OptionPanel.antialias = Vyhlazov\u00E1n\u00ED
+OptionPanel.antialias.tooltip = <html>Stanovuje kvalitu mapy. V\u00EDce vyhlazov\u00E1n\u00ED pot\u0159ebuje v\u00EDce \u010Dasu.</html>
+OptionPanel.antialias_all = Vyhlazovat v\u0161e
+OptionPanel.antialias_edges = Vyhlazovat hrany
+OptionPanel.antialias_none = \u017D\u00E1dn\u00E9 vyhlazov\u00E1n\u00ED
+OptionPanel.Appearance = Vzhled
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Jako rodi\u010D
+OptionPanel.automatic = Automaticky
+OptionPanel.automaticFormat_level = Styly automatick\u00E9ho rozvr\u017Een\u00ED
+OptionPanel.automaticFormat_level1 = Form\u00E1t ko\u0159enov\u00E9ho uzlu
+OptionPanel.automaticFormat_level2 = Form\u00E1t uzlu 1. \u00FArovn\u011B
+OptionPanel.Behaviour = Chov\u00E1n\u00ED
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Storno
+OptionPanel.childpattern = Vzor potomka
+OptionPanel.childpattern.tooltip = Vybran\u00FD vzor je aplikov\u00E1n na v\u0161echny potomky.
+OptionPanel.clear_all_setters = P\u0159epnout v\u0161e
+OptionPanel.clear_all_setters.tooltip = Zapne, nebo vypne ve\u0161ker\u00E9 indikace zm\u011Bn.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Kombinovan\u00E9
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Defaultn\u00ED
+OptionPanel.default_browser_command_mac = P\u0159\u00EDkaz pro defaultn\u00ED prohl\u00ED\u017Ee\u010D pro Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> a MAC:</html>
+OptionPanel.default_browser_command_other_os = P\u0159\u00EDkaz pro defaultn\u00ED prohl\u00ED\u017Ee\u010D u ostatn\u00EDch OS
+OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
+OptionPanel.default_browser_command_windows_9x = P\u0159\u00EDkaz pro defaultn\u00ED prohl\u00ED\u017Ee\u010D u Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Pro Windows (znaky "" jsou nutn\u00E9 kv\u016Fli odkaz\u016Fm, kter\u00E9 maj\u00ED "=" v URL).</html>
+OptionPanel.default_browser_command_windows_nt = P\u0159\u00EDkaz pro defaultn\u00ED prohl\u00ED\u017Ee\u010D u Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Pro Windows (znaky "" jsou nutn\u00E9 kv\u016Fli odkaz\u016Fm, kter\u00E9 maj\u00ED "=" v URL).</html>
+OptionPanel.Defaults = P\u0159ednastaven\u00ED
+OptionPanel.delete_automatic_saves_at_exit = Smazat automatick\u00E9 ulo\u017Een\u00ED p\u0159i ukon\u010Den\u00ED
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Zda maj\u00ED b\u00FDt soubory smazan\u00E9 automaticky p\u0159i norm\u00E1ln\u00EDm ukon\u010Den\u00ED Freeplaneu.</html>
+OptionPanel.disable_cursor_move_paper = Zak\u00E1zat kurzoru v pohybu pap\u00EDru
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Neukazovat 'move' kurzor p\u0159i tah\u00E1n\u00ED pap\u00EDru.</html>
+OptionPanel.edgecolor = Barva hrany
+OptionPanel.edgecolor.tooltip = Vlastnost hrany na rodi\u010Dovsk\u00FD uzel (je tak\u00E9 aplikovan\u00E9 na v\u0161echny potomky)
+OptionPanel.edgestyle = Styl hrany
+OptionPanel.edgestyle.tooltip = Vlastnost hrany na rodi\u010Dovsk\u00FD uzel (je tak\u00E9 aplikovan\u00E9 na v\u0161echny potomky)
+OptionPanel.edgewidth = \u0160\u00ED\u0159ka hrany
+OptionPanel.edgewidth.tooltip = Vlastnost hrany na rodi\u010Dovsk\u00FD uzel (je tak\u00E9 aplikovan\u00E9 na v\u0161echny potomky)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Enter defaultn\u011B potvrzuje
+OptionPanel.el__max_default_window_height = Maxim\u00E1ln\u00ED defaultn\u00ED v\u00FD\u0161ka okna
+OptionPanel.el__max_default_window_width = Maxim\u00E1ln\u00ED defaultn\u00ED \u0161\u00ED\u0159ka okna
+OptionPanel.el__min_default_window_height = Minim\u00E1ln\u00ED defaultn\u00ED v\u00FD\u0161ka okna
+OptionPanel.el__min_default_window_width = Minim\u00E1ln\u00ED defaultn\u00ED \u0161\u00ED\u0159ka okna
+OptionPanel.el__position_window_below_node = Pozice okna pod uzlem
+OptionPanel.en = En
+OptionPanel.Environment = Prost\u0159ed\u00ED
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Experiment\u00E1ln\u00ED zamyk\u00E1n\u00ED souboru
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experiment\u00E1ln\u00ED vlastnost</html>
+OptionPanel.export_icons_in_html = Exportovat ikony do HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Zda HTML exportovan\u00E9 z Freeplaneu m\u00E1 obsahovat ikony. Probl\u00E9m s ikonami je, \u017Ee docela \u010Dasto odkazy na ikony nebudou nalezeny v exportovan\u00E9m HTML.</html>
+OptionPanel.Files = Soubory
+OptionPanel.first = Prvn\u00ED
+OptionPanel.foldingsymbolwidth = \u0160\u00ED\u0159ka symbolu pro skl\u00E1d\u00E1n\u00ED
+OptionPanel.foldingsymbolwidth.tooltip = <html>\u0160\u00ED\u0159ka kruhu ozna\u010Duj\u00EDc\u00EDho skl\u00E1d\u00E1n\u00ED</html>
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Na z\u00E1klad\u011B nadpis\u016F
+OptionPanel.html_export_fold_all = Slo\u017Eit v\u0161e
+OptionPanel.html_export_fold_currently_folded = Slo\u017Eit aktu\u00E1ln\u011B slo\u017Een\u00E9
+OptionPanel.html_export_folding = Skl\u00E1d\u00E1n\u00ED p\u0159i exportu do HTML
+OptionPanel.html_export_no_folding = Bez skl\u00E1d\u00E1n\u00ED
+OptionPanel.hu = Hu
+OptionPanel.icon = Ikona
+OptionPanel.icon.tooltip = Pokud se aplikuje, dan\u00FD uzel bude m\u00EDt p\u0159esn\u011B tuto ikonu.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Kl\u00E1vesov\u00E9 zkratky
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Velikost p\u00EDsma
+OptionPanel.language = Jazyk
+OptionPanel.language.tooltip = <html>Toto je jazyk, kter\u00FD by m\u011Bl b\u00FDt pou\u017Eit\u00FD v programu. P\u0159i nastaven\u00ED na 'Automaticky' se vybere aktu\u00E1ln\u00ED jazyk u\u017Eivatele. </html>
+OptionPanel.last = Posledn\u00ED
+OptionPanel.last_opened_list_length = D\u00E9lka seznamu naposledy otev\u0159en\u00FDch map
+OptionPanel.links = Odkazy
+OptionPanel.links.tooltip = <html>Nastavte odkazy bu\u010Fto relativn\u00ED, nebo absolutn\u00ED</html>
+OptionPanel.load_folding = On Load[translate me]
+OptionPanel.load_last_map = Automaticky otev\u0159e posledn\u00ED mapu
+OptionPanel.load_last_map.tooltip = <html>P\u0159i startu Freeplaneu se automaticky otev\u0159e naposledy otev\u0159en\u00E1 mapa.</html>
+OptionPanel.lookandfeel = Vzhled a t\u00E9ma
+OptionPanel.lookandfeel.tooltip = <html>'metal','windows','motif', 'gtk' jsou podporovan\u00E9, 'mac' je dostupn\u00FD pouze na MacOS. default znamen\u00E1, \u017Ee je pou\u017Eit\u00FD vzhled dan\u00E9 platformy. Pokud chcete dt sv\u016Fj vlastn\u00ED vzhled, vlo\u017Ete n\u00E1zev t\u0159\u00EDdy a zajist\u011Bte, \u017Ee odpov\u00EDdaj\u00EDc\u00ED jar soubor(y) jsou nahran\u00E9. Kdy\u017E nastanou n\u011Bjak\u00E9 probl\u00E9my se vzhledem, vyberte 'nothing'. To funguje pro aplety.</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Maxim\u00E1ln\u00ED \u0161\u00ED\u0159ka uzlu
+OptionPanel.max_node_width.tooltip = <html>Defaultn\u00ED maxim\u00E1ln\u00ED \u0161\u00ED\u0159ka uzlu v pixelech</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb[translate me]
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Barva pozad\u00ED uzlu
+OptionPanel.nodebackgroundcolor.tooltip = Barva pozad\u00ED uzlu
+OptionPanel.nodecolor = Barva uzlu
+OptionPanel.nodecolor.tooltip = Barva uzlu
+OptionPanel.nodefontbold = Tlust\u00E9 p\u00EDsmo uzlu
+OptionPanel.nodefontitalic = Kurz\u00EDva
+OptionPanel.nodefontname = P\u00EDsmo uzlu
+OptionPanel.nodefontsize = Velikost p\u00EDsma uzlu
+OptionPanel.nodeshape = Style uzlu
+OptionPanel.nodeshape.tooltip = Style uzlu
+OptionPanel.nodetext = Text uzlu
+OptionPanel.nodetext.tooltip = Text uzlu
+OptionPanel.nothing = Nic
+OptionPanel.number_of_different_files_for_automatic_save = Po\u010Det rozd\u00EDlov\u00FDch soubor\u016F pro automatick\u00E9 ukl\u00E1d\u00E1n\u00ED
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Po\u010Det r\u016Fzn\u00FDch soubor\u016F, mezi kter\u00FDmi se cykluje p\u0159i automatick\u00E9m ukl\u00E1d\u00E1n\u00ED.</html>
+OptionPanel.OK = Ulo\u017Eit
+OptionPanel.patternname = N\u00E1zev
+OptionPanel.patternname.tooltip = Unik\u00E1tn\u00ED jm\u00E9no vzoru
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Um\u00EDstit nov\u00E9 v\u011Btve
+OptionPanel.placenewbranches.tooltip = <html>Kde um\u00EDstit nov\u00E9 v\u011Btve. Platn\u00E9 hodnoty jsou 'first' a 'last'. </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relativn\u00ED
+OptionPanel.ru = Ru
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = Metoda v\u00FDb\u011Bru
+OptionPanel.selection_method.tooltip = <html> n\u00E1sleduj\u00EDc\u00EDm p\u0159ep\u00EDna\u010Dem m\u016F\u017Eete zapnout/vypnout opo\u017Ed\u011Bn\u00E9 schema v\u00FDb\u011Bru. Automatick\u00E9 nastaven\u00ED. Nemodifikujte, proto\u017Ee stejn\u011B bude ulo\u017Eeno do auto.properties.</html>
+OptionPanel.selection_method_by_click = Na kliknut\u00ED
+OptionPanel.selection_method_delayed = Za chv\u00EDli
+OptionPanel.selection_method_direct = P\u0159\u00EDmo
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Vzory
+OptionPanel.separator.anti_alias = Vyhlazov\u00E1n\u00ED
+OptionPanel.separator.attributes = Atributy
+OptionPanel.separator.automatic_save = Automatick\u00E9 ukl\u00E1d\u00E1n\u00ED
+OptionPanel.separator.behaviour = Chov\u00E1n\u00ED
+OptionPanel.separator.browser = Prohl\u00ED\u017Ee\u010D
+OptionPanel.separator.commands_for_the_program = P\u0159\u00EDkazy pro program
+OptionPanel.separator.default_colors = Defaultn\u00ED barvy
+OptionPanel.separator.default_fonts = Defaultn\u00ED p\u00EDsma
+OptionPanel.separator.default_styles = Defaultn\u00ED styly
+OptionPanel.separator.EdgeControls = Hrany
+OptionPanel.separator.edit_long_node_window = Okno \u00FAprav dlouh\u00E9ho uzlu
+OptionPanel.separator.files = Soubory
+OptionPanel.separator.General = V\u0161eobecn\u00E9
+OptionPanel.separator.html_export = Html Export
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Typy hyperlink\u016F
+OptionPanel.separator.icon_properties = Ikony
+OptionPanel.separator.initial_map_size = \u00DAvodn\u00ED velikost mapy
+OptionPanel.separator.key_typing = Key Typing TODO: translate
+OptionPanel.separator.language = Jazyk
+OptionPanel.separator.look_and_feel = Vzhled a t\u00E9ma
+OptionPanel.separator.new_node_commands = P\u0159\u00EDkazy nov\u00E9ho uzlu
+OptionPanel.separator.node_editing_commands = P\u0159\u00EDkazy pro \u00FApravu uzl\u016F
+OptionPanel.separator.node_navigation_commands = P\u0159\u00EDkazy pro navigaci
+OptionPanel.separator.NodeColors = Barvy uzlu
+OptionPanel.separator.NodeFont = P\u00EDsmo uzlu
+OptionPanel.separator.other_defaults = Ostatn\u00ED defaultn\u00ED nastaven\u00ED
+OptionPanel.separator.others = Jin\u00E1 nav\u00E1z\u00E1n\u00ED kl\u00E1ves
+OptionPanel.separator.patterns = Vzory
+OptionPanel.separator.save = Ulo\u017Eit
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = Metoda v\u00FDb\u011Bru
+OptionPanel.separator.undo = Zp\u011Bt
+OptionPanel.set_property_text = Zm\u011Bna
+OptionPanel.set_property_text.tooltip = Empty: Nedot\u00FDkat se; Minus=Odstranit vlastnost (nastav\u00ED defaultn\u00ED hodnoty); Plus=Zm\u011Bnit vlastnost
+OptionPanel.sharp_bezier = ostr\u00FD bezier
+OptionPanel.sharp_linear = ostr\u00FD line\u00E1rn\u00ED
+OptionPanel.show_icon_for_attributes = Ukazovat ikonu atribut\u016F
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = Standardn\u00ED barva pozad\u00ED
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standardn\u00ED barva pozad\u00ED v html notaci </html>
+OptionPanel.standardcloudcolor = Standardn\u00ED barva oblaku
+OptionPanel.standardcloudcolor.tooltip = <html>Standardn\u00ED barva oblaku v html notaci </html>
+OptionPanel.standardcloudestyle = Standardn\u00ED styl oblaku
+OptionPanel.standardcloudestyle.tooltip = <html>Standardn\u00ED styl oblaku. Aktu\u00E1ln\u011B je podporov\u00E1n jen 'bezier'.</html>
+OptionPanel.standardlinkcolor = Standardn\u00ED barva odkazu
+OptionPanel.standardlinkcolor.tooltip = <html>Standardn\u00ED barva odkazu v html notaci </html>
+OptionPanel.standardlinkestyle = Standard styl odkazu
+OptionPanel.standardlinkestyle.tooltip = <html>Standardn\u00ED styl odkazu. Aktu\u00E1ln\u011B je podporov\u00E1n jen 'bezier'.</html>
+OptionPanel.standardselectednodecolor = Standardn\u00ED barva vybran\u00E9ho uzlu
+OptionPanel.standardselectednodecolor.tooltip = <html>Standardn\u00ED barva vybran\u00E9ho uzlu v notaci HTML (#RRGGBB v hexa hodnot\u00E1ch) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Interval automatick\u00E9ho ukl\u00E1d\u00E1n\u00ED
+OptionPanel.time_for_automatic_save.tooltip = <html> Interval mezi dv\u011Bma n\u00E1sleduj\u00EDc\u00EDmi automatick\u00FDmi akcemi ulo\u017Een\u00ED (v msec): Pro vypnut\u00ED automatick\u00E9ho ukl\u00E1d\u00E1n\u00ED zadejte \u010D\u00EDslo 2000000000.</html>
+OptionPanel.time_for_delayed_selection = \u010Cas pro opo\u017Ed\u011Bn\u00FD v\u00FDb\u011Br
+OptionPanel.time_for_delayed_selection.tooltip = <html> \u010Casov\u00E9 zpo\u017Ed\u011Bn\u00ED v\u00FDb\u011Bru uzlu p\u0159i najet\u00ED my\u0161i (v msec). Zm\u011B\u0148te hodnotu na 1, pokud chcete p\u0159\u00EDm\u00FD v\u00FDb\u011Br p\u0159i najet\u00ED my\u0161i.</html>
+OptionPanel.toolTipManager.max_tooltip_width = \u0160\u00ED\u0159ka tooltipu #FIXME
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Defaultn\u00ED \u0161\u00ED\u0159ka tooltipu v pixelech.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Nedefinovan\u00E9 p\u00EDsmo
+OptionPanel.undo_levels = \u00DArovn\u011B zp\u011Bt
+OptionPanel.undo_levels.tooltip = <html>Ur\u010Duje kolik krok\u016F zp\u011Bt je ulo\u017Eeno a m\u016F\u017Ee b\u00FDt vr\u00E1ceno pomoc\u00ED "Zp\u011Bt".</html>
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Speed[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Nastaven\u00ED tisku...
+PasteAction.text = Vlo\u017Eit
+PatternNewNameProperty = Nov\u00FD vzor
+PatternToString.backgroundColor = Barva pozad\u00ED
+PatternToString.color = Barva
+PatternToString.EdgeStyle = Styl hrany
+PatternToString.EdgeWidth = Tlou\u0161\u0165ka hrany
+PatternToString.FontBold = Tu\u010Dn\u011B
+PatternToString.FontName = Font Name[translate me]
+PatternToString.Icon = Ikona
+PatternToString.NodeFontSize = Velikost p\u00EDsma
+plugins/ScriptEditor.exit = Konec
+plugins/ScriptEditor.menu_actions = Akce
+plugins/ScriptEditor.new_script = New Script[translate me]
+plugins/ScriptEditor.run = Spustit
+plugins/ScriptEditor/window.Result = V\u00FDsledek:
+plugins/ScriptEditor/window.title = Editor skriptu
+plugins/TimeList.xml_Created = Vytvo\u0159eno
+plugins/TimeList.xml_Date = Datum
+plugins/TimeList.xml_Icons = Ikony
+plugins/TimeList.xml_Modified = Zm\u011Bn\u011Bno
+plugins/TimeList.xml_Notes = Pozn\u00E1mky
+plugins/TimeList.xml_Text = Text
+plugins/TimeManagement.xml_appendButton = P\u0159idat datum vybran\u00FDm uzl\u016Fm
+plugins/TimeManagement.xml_Cancel = Storno
+plugins/TimeManagement.xml_cancelButton = Storno
+plugins/TimeManagement.xml_closeButton = Zav\u0159\u00EDt
+plugins/TimeManagement.xml_Export = Exportovat vybran\u00E9 uzly
+plugins/TimeManagement.xml_Find = Naj\u00EDt
+plugins/TimeManagement.xml_Goto = J\u00EDt na
+plugins/TimeManagement.xml_hour = Hodina:
+plugins/TimeManagement.xml_menu_actions = Akce
+plugins/TimeManagement.xml_minute = Minuta:
+plugins/TimeManagement.xml_reminderButton = Upozornit ve vybran\u00E9 datum
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Moment\u00E1ln\u011B m\u016F\u017Ee b\u00FDt nastaven pouze jeden \u010Dasova\u010D na uzel. <br>Aktu\u00E1ln\u00ED \u010Dasova\u010D je nastaven na {0,date} {0,time}, Va\u0161e volba byla {1,date} {1,time}. <br><br>P\u0159ejete si zm\u011Bnit \u010Dasova\u010D uzlu (ANO), <br>nebo si p\u0159ejete pou\u017E\u00EDt st\u00E1vaj\u00EDc\u00ED (NE)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Upozorn\u011Bn\u00ED napl\u00E1nov\u00E1no na {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Odstranit \u010Dasova\u010D
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Odstran\u00ED \u010Dasova\u010De p\u0159i\u0159azen\u00E9 vybran\u00FDm uzl\u016Fm.
+plugins/TimeManagement.xml_Replace = Nahradit
+plugins/TimeManagement.xml_Replace_All = Nahradit v\u0161e
+plugins/TimeManagement.xml_Replace_Selected = Nahradit vybran\u00E9
+plugins/TimeManagement.xml_Select = Vybrat
+plugins/TimeManagement.xml_todayButton = Dnes
+plugins/TimeManagement.xml_WindowTitle = Time Management
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Naj\u00EDt a nahradit
+preferences = Nastaven\u00ED
+PrintDirectAction.text = Tisk...
+printing_settings = Nastaven\u00ED tisku
+PrintPreviewAction.text = N\u00E1hled tisku...
+PropertyAction.text = Mo\u017Enosti ...
+QuitAction.text = Konec
+read_only = Pouze ke \u010Dten\u00ED
+RedoAction.text = Znovu
+RedoFilterAction.text = Znovu
+ReminderHookAction.text = Odstranit \u010Dasova\u010D
+ReminderHookAction.tooltip = Odstran\u00ED p\u0159ipomenut\u00ED z uzlu.
+RemoveAllIconsAction.text = Odebrat v\u0161echny ikony
+RemoveIconAction.text = Odebrat posledn\u00ED ikonu
+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_failed = Pokus ulo\u017Eit soubor mapy {0} selhal.
+save_unsaved = Ulo\u017Eit n\u00E1sleduj\u00EDc\u00ED mapu? :
+SaveAction.text = Ulo\u017Eit
+SaveAll.text = Ulo\u017Eit v\u0161e
+SaveAll.tooltip = Ulo\u017Eit v\u0161echny otev\u0159en\u00E9 mapy.
+SaveAsAction.text = Ulo\u017Eit jako...
+saved = Ulo\u017Eeno
+scheme_evaluate = Vyhodnotit!
+ScriptEditor.text = Editor skriptu...
+ScriptEditor.tooltip = Umo\u017En\u00ED ps\u00E1t v\u011Bt\u0161\u00ED skripty uvnit\u0159 Freeplaneu.
+ScriptEditorPanel.changed_cancel = Skripty byly zm\u011Bn\u011Bny. Opravdu chcete zahodit zm\u011Bny?
+select_favorites_folder = Vyberte slo\u017Eku, kde m\u00E1te sv\u00E9 obl\u00EDben\u00E9 z\u00E1lo\u017Eky.
+select_folder_for_importing = Vyberte slo\u017Eku pro import.
+SelectAllAction.text = Vybrat v\u0161e viditeln\u00E9
+SelectBranchAction.text = Vybrat viditelnou v\u011Btev
+selection_method_by_click = V\u00FDb\u011Br kliknut\u00EDm
+selection_method_delayed = Opo\u017Ed\u011Bn\u00FD automatick\u00FD v\u00FDb\u011Br
+selection_method_direct = V\u00FDb\u011Br uk\u00E1z\u00E1n\u00EDm
+SelectNoteAction.text = P\u0159epnout editor pozn\u00E1mek
+SelectNoteAction.tooltip = P\u0159epnout se z/do okna s pozn\u00E1mkou
+SetImageByFileChooserAction.text = Nastavit obr\u00E1zek (V\u00FDb\u011Br souboru k nav\u00E1z\u00E1n\u00ED)...
+SetLinkByFileChooserAction.text = Nastavit odkaz (V\u00FDb\u011Brem souboru)...
+SetLinkByTextFieldAction.text = Nastavit odkaz (Zad\u00E1n\u00EDm)...
+ShowAllAttributesAction.text = Uk\u00E1zat v\u0161echny atributy
+ShowAncestorsAction.text = Uk\u00E1zat p\u0159edch\u016Fdce
+ShowAttributeDialogAction.text = Mana\u017Eer atribut\u016F
+ShowDescendantsAction.text = Uk\u00E1zat n\u00E1sledovn\u00EDky
+ShowHideNoteAction.text = Uk\u00E1zat/schovat okno s pozn\u00E1mkou
+ShowHideNoteAction.tooltip = Menu zkratka pro mal\u00E9 \u0161ipky na rozd\u011Blen\u00E9 \u0159\u00E1dce.
+ShowSelectedAttributesAction.text = Uk\u00E1zat vybran\u00E9 atributy
+simplyhtml.aboutFrameTitle = O aplikaci
+simplyhtml.alignCenter = na st\u0159ed
+simplyhtml.alignLabel = Zarovn\u00E1n\u00ED:
+simplyhtml.alignLeft = vlevo
+simplyhtml.alignRight = doprava
+simplyhtml.allCellsRangeLabel = v\u0161echny sloupce
+simplyhtml.allOccurrencesReplaced = V\u0161echny v\u00FDskyty nahrazeny
+simplyhtml.appendTableColLabel = P\u0159idat sloupec
+simplyhtml.appendTableRowLabel = P\u0159idat \u0159\u00E1dek
+simplyhtml.applyCellAttrLabel = Aplikovat na
+simplyhtml.backgroundLabel = Pozad\u00ED:
+simplyhtml.boldItalicName = tu\u010Dn\u00E1 kurz\u00EDva
+simplyhtml.boldName = tu\u010Dn\u011B
+simplyhtml.borderColorLabel = Barva:
+simplyhtml.borderWidthLabel = \u0160\u00ED\u0159ka
+simplyhtml.bottomLabel = dole:
+simplyhtml.cancelBtnName = Storno
+simplyhtml.cellBorderTabLabel = Okraje
+simplyhtml.cellGenTabLabel = V\u0161eobecn\u00E9
+simplyhtml.cellMarginTabLabel = Odstup
+simplyhtml.cellPanelTitle = Form\u00E1t bu\u0148ky
+simplyhtml.clearFormatLabel = Odstranit form\u00E1tov\u00E1n\u00ED
+simplyhtml.clearFormatTip = Odstranit form\u00E1tov\u00E1n\u00ED
+simplyhtml.close = Zav\u0159\u00EDt
+simplyhtml.closeBtnName = Zav\u0159\u00EDt
+simplyhtml.colorLabel = Barva
+simplyhtml.copyLabel = Kop\u00EDrovat
+simplyhtml.copyTip = Kop\u00EDrovat
+simplyhtml.cTagNameHead1 = Nadpis 1
+simplyhtml.cTagNameHead2 = Nadpis 2
+simplyhtml.cTagNameHead3 = Nadpis 3
+simplyhtml.cTagNameHead4 = Nadpis 4
+simplyhtml.cTagNameHead5 = Nadpis 5
+simplyhtml.cTagNameHead6 = Nadpis 6
+simplyhtml.cTagNameLink = Odkaz
+simplyhtml.cTagNameOL = Set\u0159\u00EDd\u011Bn\u00FD seznam
+simplyhtml.cTagNamePara = Odstavec
+simplyhtml.cTagNameUL = Neset\u0159\u00EDd\u011Bn\u00FD seznam
+simplyhtml.cutLabel = Vyjmout
+simplyhtml.cutTip = Vyjmout
+simplyhtml.defaultDocName = Bez_n\u00E1zvu
+simplyhtml.deleteTableColLabel = Smazat sloupec
+simplyhtml.deleteTableRowLabel = Smazat \u0159\u00E1dek
+simplyhtml.docTitleQuery = Nastavit nadpis na:
+simplyhtml.docTitleTitle = Upravit nadpis dokumentu
+simplyhtml.editLabel = Upravit
+simplyhtml.effectLabel = Efekt
+simplyhtml.familyLabel = Rodina
+simplyhtml.findNext = Naj\u00EDt dal\u0161\u00ED...
+simplyhtml.findReplaceDialogTitle = Naj\u00EDt a nahradit
+simplyhtml.findReplaceLabel = Naj\u00EDt a nahradit
+simplyhtml.findReplaceTip = Naj\u00EDt a nahradit
+simplyhtml.fontBoldLabel = Tu\u010Dn\u011B
+simplyhtml.fontBoldTip = P\u0159epnout tu\u010Dn\u00E9
+simplyhtml.fontDialogTitle = Form\u00E1t p\u00EDsma
+simplyhtml.fontItalicLabel = Kurz\u00EDva
+simplyhtml.fontItalicTip = P\u0159epnout kurz\u00EDvu
+simplyhtml.fontLabel = P\u00EDsmo...
+simplyhtml.fontTabLabel = p\u00EDsmo
+simplyhtml.fontTip = Form\u00E1t p\u00EDsma...
+simplyhtml.fontUnderlineLabel = Podtr\u017Een\u00ED
+simplyhtml.fontUnderlineTip = P\u0159epnout podtr\u017Een\u00ED
+simplyhtml.foregroundLabel = Pop\u0159ed\u00ED:
+simplyhtml.formatLabel = Form\u00E1t
+simplyhtml.formatListLabel = Seznam...
+simplyhtml.formatListTip = Zm\u011Bnit form\u00E1t seznamu
+simplyhtml.formatParaLabel = Odstavec...
+simplyhtml.formatParaTip = Zm\u011Bnit form\u00E1t odstavce
+simplyhtml.formatTableLabel = Tabulka...
+simplyhtml.formatTableTip = Form\u00E1t tabulky
+simplyhtml.helpLabel = N\u00E1pov\u011Bda
+simplyhtml.htmlTabTitle = HTML k\u00F3d
+simplyhtml.imageFileDesc = Soubory s ob\u00E1zkem
+simplyhtml.insertTableColLabel = Vlo\u017Eit sloupec
+simplyhtml.insertTableLabel = Tabulka...
+simplyhtml.insertTableMsg = Kolik sloupc\u016F?
+simplyhtml.insertTableRowLabel = Vlo\u017Eit \u0159\u00E1dek
+simplyhtml.insertTableTitle = Vlo\u017Eit tabulku
+simplyhtml.italicName = kurz\u00EDva
+simplyhtml.layoutTabTitle = Norm\u00E1ln\u00ED pohled
+simplyhtml.leftLabel = vlevo:
+simplyhtml.listDialogTitle = Form\u00E1t seznamu
+simplyhtml.listIndentTitle = Odsazen\u00ED:
+simplyhtml.listPosInside = uvnit\u0159
+simplyhtml.listPositionLabel = Pozice:
+simplyhtml.listPosOutside = vn\u011B
+simplyhtml.listTypeCircle = kulat\u00E1 odr\u00E1\u017Eka
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = symbol souboru jako odr\u00E1\u017Eka
+simplyhtml.listTypeLabel = Typ:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = nic
+simplyhtml.listTypeSquare = \u010Dtvercov\u00E1 odr\u00E1\u017Eka
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Vn\u011Bj\u0161\u00ED
+simplyhtml.matchCase = P\u0159esn\u00E1 velikost p\u00EDsmen
+simplyhtml.newStyleDefaultName = nov\u00FD_styl
+simplyhtml.nextTableCellLabel = Dal\u0161\u00ED bu\u0148ka
+simplyhtml.noLineLabel = nic
+simplyhtml.noMoreOccurrencesFound = \u017E\u00E1dn\u00E9 dal\u0161\u00ED v\u00FDskyty nenalezeny
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Vnit\u0159n\u00ED
+simplyhtml.paraAlignCenterLabel = Zarovnat na st\u0159ed
+simplyhtml.paraAlignCenterTip = Nastavit zarovn\u00E1n\u00ED odstavce na st\u0159ed
+simplyhtml.paraAlignLeftLabel = Zarovnat vlevo
+simplyhtml.paraAlignLeftTip = Nastavit lev\u00E9 zarovn\u00E1n\u00ED odstavce
+simplyhtml.paraAlignRightLabel = Zarovnat vpravo
+simplyhtml.paraAlignRightTip = Nastavit prav\u00E9 zarovn\u00E1n\u00ED odstavce
+simplyhtml.paraStyleDialogTitle = Styl odstavce
+simplyhtml.paraTabLabel = Odstavec
+simplyhtml.pasteLabel = Vlo\u017Eit
+simplyhtml.pasteTip = Vlo\u017Eit
+simplyhtml.plainName = b\u011B\u017En\u011B
+simplyhtml.previewLabel = N\u00E1hled
+simplyhtml.previewText = N\u00E1hledu textu
+simplyhtml.prevTableCellLabel = P\u0159edchoz\u00ED bu\u0148ka
+simplyhtml.redoLabel = Znovu
+simplyhtml.redoTip = Vp\u0159ed
+simplyhtml.replace = Nahradit...
+simplyhtml.replaceAll = V\u0161e
+simplyhtml.replaceDone = Hotovo
+simplyhtml.replaceNo = Ne
+simplyhtml.replaceThisQuery = nahradit tento v\u00FDskyt
+simplyhtml.replaceWith = Nahradit s:
+simplyhtml.replaceYes = Ano
+simplyhtml.rightLabel = vpravo:
+simplyhtml.searchDown = Hledat d\u00E1le
+simplyhtml.searchFromStart = Naj\u00EDt od za\u010D\u00E1tku
+simplyhtml.searchUp = Hledat zp\u011Bt
+simplyhtml.selectAllLabel = Vybrat v\u0161e
+simplyhtml.sizeLabel = Velikost
+simplyhtml.standardStyleName = Standard
+simplyhtml.strikeLabel = P\u0159e\u0161krtnut\u00ED
+simplyhtml.styleLabel = Styl
+simplyhtml.styleNameInputText = N\u00E1zev nov\u00E9ho stylu?
+simplyhtml.styleNameInputTitle = Ulo\u017Eit styl
+simplyhtml.tableBgColLabel = Barva pozad\u00ED:
+simplyhtml.tableDialogTitle = Form\u00E1t tabulky
+simplyhtml.tableLabel = Tabulka
+simplyhtml.tablePanelTitle = Form\u00E1t tabulky
+simplyhtml.tableWidthLabel = \u0160\u00ED\u0159ka:
+simplyhtml.textIndentLabel = Odsazen\u00ED:
+simplyhtml.textToFind = Text k nalezen\u00ED:
+simplyhtml.thisCellRangeLabel = tato bu\u0148ka
+simplyhtml.thisColRangeLabel = tento sloupec
+simplyhtml.thisRowRangeLabel = tato \u0159\u00E1dka
+simplyhtml.toggleBulletsLabel = Seznam s odr\u00E1\u017Ekou
+simplyhtml.toggleBulletsTip = Seznam s odr\u00E1\u017Ekou
+simplyhtml.toggleNumbersLabel = \u010C\u00EDslovan\u00FD seznam
+simplyhtml.toggleNumbersTip = \u010C\u00EDslovan\u00FD seznam
+simplyhtml.topLabel = naho\u0159e:
+simplyhtml.uLineLabel = Podtr\u017Een\u00ED
+simplyhtml.unableToOpenFileError = Soubor nem\u016F\u017Ee b\u00FDt otev\u0159en
+simplyhtml.unableToRedoError = Nelze vp\u0159ed:
+simplyhtml.unableToUndoError = Nelze zp\u011Bt:
+simplyhtml.undoLabel = Zp\u011Bt
+simplyhtml.undoTip = Zp\u011Bt
+simplyhtml.valignBaseline = na linku
+simplyhtml.valignBottom = dol\u016F
+simplyhtml.valignLabel = Vertik\u00E1ln\u00ED zarovn\u00E1n\u00ED:
+simplyhtml.valignMiddle = na st\u0159ed
+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
+SplitNode.text = Rozd\u011Blen\u00ED uzlu
+SplitNode.tooltip = <html>Uzel je rozd\u011Blen</html>
+style = Styl
+svg = SVG[translate me]
+TimeListAction.text = Uk\u00E1zat seznam napl\u00E1novan\u00FDch \u010Das\u016F ...
+TimeListAction.tooltip = Uk\u00E1zat v\u0161echny napl\u00E1novan\u00E9 datumy a odpov\u00EDdaj\u00EDc\u00ED uzly.
+TimeManagementAction.text = Uk\u00E1zat kalend\u00E1\u0159 ...
+TimeManagementAction.tooltip = <html>Uk\u00E1\u017Ee modul kalend\u00E1\u0159 od Kaie Toedtera.</html>
+ToggleChildrenFoldedAction.text = (Roz)slo\u017Eit poduzly
+ToggleFBarAction.text = F-Bar[translate me]
+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
+undefined_error = Nastala neo\u010Dek\u00E1van\u00E1 chyba. Pros\u00EDme, pokuste se zaslat report o chyb\u011B.
+underline = Podtr\u017Een\u00ED
+underlined = Podtrhnut\u00E9
+UndoAction.text = Zp\u011Bt
+UndoFilterAction.text = Zp\u011Bt
+unfold = Rozlo\u017Eit
+UnfoldAllAction.text = Rozlo\u017Eit v\u0161e
+UnfoldAllAction.tooltip = <html>Rozlo\u017Eit vybran\u00E9 uzly a v\u0161echny jejich poduzly.</html>
+UnfoldOneLevelAction.text = Rozlo\u017Eit jednu \u00FArove\u0148
+UnfoldOneLevelAction.tooltip = <html>Rozlo\u017E\u00ED vybran\u00E9 uzly o jednu \u00FArove\u0148.</html>
+url_error = Toto URL nen\u00ED v po\u0159\u00E1dku!
+url_load_error = Nemohl jsem na\u010D\u00EDst mapu z URL:
+UsePlainTextAction.text = Pou\u017E\u00EDt neform\u00E1tovan\u00FD text
+user_defined_zoom = Voln\u011B definov\u00E1n.
+user_defined_zoom_status_bar = M\u011Bn\u00EDm p\u0159ibl\u00ED\u017Een\u00ED lupou na hodnotu {0}%.
+user_zoom = Faktor lupy p\u0159i tisku (0.0 - 2.0):
+WebDocuAction.text = Webov\u00E1 dokumentace
+width = \u0160\u00ED\u0159ka
+yes = Ano
+ZoomInAction.text = P\u0159ibl\u00ED\u017Eit
+ZoomOutAction.text = Odd\u00E1lit
diff --git a/freeplane/resources/translations/Resources_da.properties b/freeplane/resources/translations/Resources_da.properties
new file mode 100644
index 0000000..0973c73
--- /dev/null
+++ b/freeplane/resources/translations/Resources_da.properties
@@ -0,0 +1,777 @@
+AboutAction.text = Om
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = \u00C6ndr nodernes format
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = \u00C6ndr m\u00F8nster
+accessories/plugins/EncryptNode.properties_0 = V\u00E6lg password for krypteret Node
+accessories/plugins/EncryptNode.properties_1 = Passwords er ikke ens eller for korte.
+accessories/plugins/EncryptNode.properties_2 = Indtast Password:
+accessories/plugins/EncryptNode.properties_3 = Gentag Password:
+accessories/plugins/EncryptNode.properties_4 = Indtast dit password.
+accessories/plugins/EncryptNode.properties_5 = <html>Husk, at styrken af krypteringen<br>stort set afh\u00E6nger af kvaliteten p\u00E5 passworded.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Annuller
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Du kan kun skifte krypteringsstatus p\u00E5 en krypteret Node. Inds\u00E6t venligst s\u00E5dan en Node ved brug af v\u00E6rkt\u00F8jsmenuen.
+accessories/plugins/EncryptNode.properties_select_me = V\u00E6lg mig for at forts\u00E6tte!
+accessories/plugins/EncryptNode.properties_wrong_password = Passwordet er ikke korrekt.
+accessories/plugins/ExportWithXSLT.tooltip = Dette er en uniform eksportmetode der bruger XSLT scripts.
+accessories/plugins/ExportWithXSLT_Applet.text = Som Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Eksporterer MindMappen som en java browser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Som Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Eksporerer MindMappen som en Flash aplikation.
+accessories/plugins/ExportWithXSLT_HTML.text = Som XHTML (JavaScript version)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Som XHTML (Klikbar kort image version)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Resourser fra RESOURSER node til OpgaveJuggler filen...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Eksporterer resourser fra RESOURSER node til OpgaveJuggler modulet.</html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Opgaver fra OPGAVE node til OpgaveJuggler filen...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Eksporterer opgaver fra OPGAVE node til Opgavejuggler modulet.</html>
+add = Tilf\u00F8j
+AddLocalLinkAction.text = Tilf\u00F8j lokalt Hyperlink
+antialias_all = Antialias alt
+antialias_edges = Antialias kanter
+antialias_none = Antialias None[translate me]
+apply = Anvend
+ApplyAction.text = Anvend
+ApplyFormatPlugin.text = \u00C6ndr format...
+ApplyFormatPlugin.tooltip = Pr\u00E6senterer en dialogboks i hvilken node og kant attributter kan \u00E6ndres med det samme.
+ApplyNoFilteringAction.text = Ingen filtrering
+as_parent = Som for\u00E6ldre
+AssignAttributesAction.text = Tildel attributter...
+attribute_delete = Slet alle v\u00E6rdier
+attribute_delete_value = Slet denne v\u00E6rdi
+attribute_font_size_tooltip = Attribut skriftst\u00F8rrelse
+attribute_list_box_label_text = Eksisterende v\u00E6rdier
+attribute_replace = Erstat med
+attribute_top = Alle kendt attributter for de loadede MindMaps
+attributes_all = Alle atributter
+attributes_attribute = Atributter
+attributes_close = Luk
+attributes_deselect_all = Ingenting
+attributes_dialog_title = Attribute Manager[translate me]
+attributes_edit = Rediger
+attributes_edit_tooltip = Rediger s\u00E6t
+attributes_for_selected = Valgte noder
+attributes_for_visible = Alle synlige noder
+attributes_import = Import
+attributes_import_tooltip = Importer attributter fra de andre loadede maps
+attributes_popup_delete = Slet
+attributes_popup_down = Ned
+attributes_popup_edit = Rediger
+attributes_popup_hide = Skjul
+attributes_popup_new = Ny Atribut
+attributes_popup_optimal_width = Optimal brede
+attributes_popup_up = Op
+attributes_refresh = Opdater
+attributes_restricted_attributes_tooltip = Begr\u00E6ns s\u00E6ttet af atributter
+attributes_restricted_values_tooltip = Begr\u00E6ns s\u00E6ttet af v\u00E6rdier for nuv\u00E6rene atribut
+attributes_restriction = Begr\u00E6nset set
+attributes_select_all = Alt
+attributes_select_all_tooltip = V\u00E6lg/frav\u00E6lg alle
+attributes_show = Vis
+attributes_skip_root = Skip Rod Node
+attributes_visible = Valgte synlige
+attributes_visible_tooltip = Valgte synlige
+automatically_save_message = Mindmap blev automatisk gemt(under filnavnet {0}) ...
+AutomaticLayoutAction.text = Automatisk Layout
+AutomaticLayoutAction.tooltip = <html>Fikser layoutet af mindmappen. <br>Det f\u00F8rste level er sort, det andet bl\u00E5, osv.</html>
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = Blinkende Node
+BlinkingNodeHookAction.tooltip = <html>Dette f\u00E5r Noden til at blinke. Men v\u00E6r forsigtig. Brug det ikke p\u00E5 for mange Noder, og <strong>ikke med andre automatiske formateringer p\u00E5 den samme Node </strong></html>
+BoldAction.text = Fed
+boldify_branch = Boldify[translate me]
+cannot_add_parent_diff_parents = Alle noder skal have samme for\u00E6ldre for at buge denne funktion.
+cannot_add_parent_to_root = RodNoden kan ikke tilf\u00F8jes til en ny for\u00E6ldre.
+cannot_move_to_child = Kan ikke flytte en Node til en af dens b\u00F8rn.
+CenterAction.text = Center[translate me]
+ChangeNodeLevelLeftsAction.text = Node venstre
+ChangeNodeLevelLeftsAction.tooltip = Til venstre fra roden skiftes noderne nedad. Den/de bliver barn/b\u00F8rn af dens s\u00F8skende ovenover. Til h\u00F8jre for roden skiftes noden opad. Direkte ved roden, skifter noden(erne) side.
+ChangeNodeLevelRightsAction.text = Node H\u00F8jre
+ChangeNodeLevelRightsAction.tooltip = Til venstre fra roden skiftes noderne nedad. Den/de bliver barn/b\u00F8rn af dens s\u00F8skende ovenover. Til h\u00F8jre for roden skiftes noden opad. Direkte ved roden, skifter noden(erne) side.
+choose_background_color = V\u00E6lg baggrundsfarve
+choose_cloud_color = V\u00E6lg sky farve:
+choose_edge_color = V\u00E6lg kantfarve
+choose_node_background_color = V\u00E6lg Node baggrundsfarve
+choose_node_color = V\u00E6lg node farve:
+ColorProperty.ResetColor = Reset farve
+combined = Kombineret
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Kopier
+CreationModificationPluginAction.text = Vis modifikations tidspunkter
+CreationModificationPluginAction.tooltip = <html>Denne funktion holder track p\u00E5 Node oprettelse og modifikations tidspunkter.</html>
+CutAction.text = Klip
+delete = Slet
+delete_child = Slet barn
+DeleteConditionAction.text = Slet
+edge_style = Kant stil
+edge_width = Kantbredde
+EdgeStyleAction.bezier.text = Bezier[translate me]
+EdgeStyleAction.sharp_bezier.text = Sharp Bezier[translate me]
+EdgeStyleAction.sharp_linear.text = Sharp Linear[translate me]
+EdgeStyleAsParentAction.text = Som for\u00E6ldre
+EdgeWidthAction_width_parent.text = Parent[translate me]
+edit_long_node = Edit Long Node[translate me]
+edit_middle_label = Edit Middle Label[translate me]
+edit_source_label = Edit Source Label[translate me]
+EditAction.text = Rediger node
+EditAttributesAction.text = Rediger Atributter
+EditFilterAction.text = Rediger
+EncryptedMap.text = Opret krypteret mindmap
+EncryptedMap.tooltip = Opretter et nyt krypteret mindmap
+EnterPassword.text = Skift Krypteret / Ukrypteret
+error = Fejl
+error_applying_template = Fejl ved anvendelse af XSL template.
+error_creating_directory = Kan ikke oprette skuffen til eksport.
+ExecuteScripts.text = Scripts[translate me]
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Eksport
+ExportPdf.text = Som PDF
+ExportSvg.text = Som SVG
+ExportToImage.jpg.text = Som JPG
+ExportToImage.png.text = Som PNG
+ExportToOoWriter.text = Som Open Office dokument...
+ExportToOoWriter.tooltip = [Overs\u00E6t mig]-Unfolded nodes form the structure, folded nodes the conent of the dokument.
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = FAQ[translate me]
+file_already_exists = Filen {0} eksisterer allerede. \u00D8nsker du at overskrive den?
+filter = Filter
+filter_add = Tilf\u00F8j
+filter_and = AND
+filter_conditions = Filtre
+filter_contains = Indeholder
+filter_delete = Slet
+filter_dialog = Filter Foraftter
+filter_does_not_exist = Eksisterer ikke
+filter_edit_description = Rediger filter liste
+filter_enter_value = Indtast v\u00E6rdi
+filter_exist = Eksisterer
+filter_icon = Ikon
+filter_is_equal_to = Er lig med
+filter_is_not_equal_to = Er forskellig fra
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Ingen filtrering
+filter_node = Node tekst
+filter_not = NOT
+filter_or = OR
+filter_select = V\u00E6lg
+filter_selected_node_view = For nuv\u00E6rende valgte noder
+find_what = Find hvad
+FitToPage.text = Zoom til passer til siden
+FitToPage.tooltip = Justerer zoomen s\u00E5 hele mindmappen kan v\u00E6re i det nuv\u00E6rende vindue.
+fold = Fold[translate me]
+FoldAllAction.text = Fold alt
+FoldAllAction.tooltip = <html>Folder den valgte Node og alle dens b\u00F8rn.</html>
+FoldOneLevelAction.text = Fold et niveau
+FoldOneLevelAction.tooltip = <html>Folder den valgte node med et niveau.</html>
+font = Skrifttype
+FontFamilyAction.text = Skrifttype familie
+FontSizeAction.text = Skriftst\u00F8rrelse
+format_menu_edge_styles = Kant stil
+format_menu_edge_widths = Kant bredde
+FormatCopy.text = Kopier format
+FormatCopy.tooltip = <htnl>Kopierer formatet af en Node</html>
+FormatPaste.text = Inds\u00E6t format
+FormatPaste.tooltip = <html>Inds\u00E6tter formatet af en Node.</html>
+Freeplane.progress.buildScreen = Opbygger sk\u00E6rm...
+Freeplane.progress.createController = Opretter Kontroler...
+Freeplane.progress.createInitialMode = Opretter initial mode...
+Freeplane.progress.endStartup = Slut p\u00E5 opstart.
+Freeplane.progress.gettingPreferenceDirectories = Henter preference skuffer...
+Freeplane.progress.gettingPreferences = Henter preferencer...
+Freeplane.progress.loadMaps = Indl\u00E6s Minsmaps...
+Freeplane.progress.propagateLookAndFeel = Udbred Look And Feel...
+Freeplane.progress.settingPreferences = S\u00E6tter preferencer...
+Freeplane.progress.startCreateController = Start skab Controller...
+Freeplane.progress.updateLookAndFeel = Opdater Look and Feel...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = Hj\u00E6lp...
+FreeplaneHelpStarter.tooltip = Freeplane udviddet hj\u00E6lp
+GotoLinkNodeAction.text = G\u00E5 til Link
+GrabKeyDialog.common.cancel = Annuller
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Tildelt til
+GrabKeyDialog.grab-key.assigned-to.none = Er for nuv\u00E6rende ikke tildelt til noget
+GrabKeyDialog.grab-key.clear = Ryd(clear)
+GrabKeyDialog.grab-key.remove = Fjern
+GrabKeyDialog.grab-key.remove-ask = Er du sikker p\u00E5 at du vil fjerne denne tastatur tast
+GrabKeyDialog.grab-key.title = Indtast ny tast
+HideAllAttributesAction.text = Skjul alle atributter
+HierarchicalIconsAction.text = Vis ikoner hirakisk
+HierarchicalIconsAction.tooltip = Hvis en af mine (b\u00F8rne)b\u00F8rn har en ikon, s\u00E5 vil jeg ogs\u00E5 vise den ikon i lille format.
+HotKeyInfoAction.text = Key Reference[translate me]
+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]
+icon_bee = Freeplane[translate me]
+icon_bookmark = Excellent[translate me]
+icon_broken-line = Broken[translate me]
+icon_button_ok = OK
+icon_calendar = Dato
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_down = Ned
+icon_family = Familie
+icon_fema = Females[translate me]
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_females = Females[translate me]
+icon_flag = Red Flag[translate me]
+icon_flag-black = Black Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioitet 1
+icon_full-2 = Prioitet 2
+icon_full-3 = Prioitet 3
+icon_full-4 = Prioitet 4
+icon_full-5 = Prioitet 5
+icon_full-6 = Prioitet 6
+icon_full-7 = Prioitet 7
+icon_go = Green Traffic Light[translate me]
+icon_idea = Ide
+icon_info = Info[translate me]
+icon_kmail = E-Mail[translate me]
+icon_korn = Mailbox
+icon_list = List[translate me]
+icon_Mail = Mail[translate me]
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_penguin = Linux[translate me]
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = Jeg finder det ikke morsomt
+icon_stop-sign = Stop[translate me]
+icon_up = Op
+icon_wizard = Magic[translate me]
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.flags.text = Flags[translate me]
+IconGroupPopupAction.numbers.text = Numbers[translate me]
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = V\u00E6lg icon...
+IconSelectionPlugin.tooltip = <html>Her kan du v\u00E6lge en icon via et undervindue.</html>
+import = Import[translate me]
+import_linked_branch_no_link = Den valgte Node har ingen link at importere fra.
+ImportAction.text = Import
+ImportLinkedBranchAction.text = Linked Branch[translate me]
+ImportLinkedBranchWithoutRootAction.text = Import uden rod
+ImportMindmanagerFiles.text = MindManager X5 Map...
+ItalicAction.text = Kursiv
+italicise_branch = Italicise[translate me]
+JoinNodesAction.text = Join Nodes[translate me]
+less_than_two_selected_nodes = Du skal v\u00E6lge mindst to Noder fo at f\u00E5 links.
+license = License[translate me]
+link_not_available_any_more = Linket er ikke gyldigt mere. Noden er blevet slettet.
+link_not_found = Link {0} ikke fundet
+long_node_changed_cancel = Du har \u00E6ndret denne node. \u00D8nsker du at forkaste disse \u00E6ndringer?
+long_node_changed_submit = Du har \u00E6ndret denne node. \u00D8nsker du at gemme disse \u00E6ndringer?
+map_not_saved = Dette MindMap var ikke gemt f\u00F8r.
+menu_attributes = Atributter
+menu_extras = V\u00E6rkt\u00F8jer
+menu_file_import = Import
+menu_filter = Filter[translate me]
+menu_format = Formater
+menu_insert = Inds\u00E6t
+menu_navigate = Naviger
+menu_view = Vis
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_status = Visning skiftet {0} Visning
+mode_title = Freeplane - {0} Visning
+modes = Modes[translate me]
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Nyeste filer
+new_node_as_sibling_not_possible_for_the_root = Du kan ikke inds\u00E6tte node parallelt med roden
+NewChildAction.text = New Child Node[translate me]
+NewMapAction.text = Ny
+NewParentNode.text = Ny for\u00E6ldre Node
+NewParentNode.tooltip = <html>Alt valgt bliver sendt til en ny for\u00E6ldre.</html>
+NewPreviousSiblingAction.text = Ny Node h\u00F8jere niveau
+NewSiblingAction.text = Ny Node samme niveau
+no = Nej
+no_format_copy_before_format_paste = Du kan ikke inds\u00E6tte et format f\u00F8r du har kopieret et.
+node = Node[translate me]
+node_changed_discard_changes = Du har \u00E6ndret denne node. \u00D8nsker du at forkaste disse \u00E6ndringer?
+NodeBackgroundColorAction.text = Node baggrundsfarve
+NodeColorBlendAction.text = Blend Color[translate me]
+NodeDownAction.text = Node Down[translate me]
+NodeListAction.text = Vis mindmap historik...
+NodeListAction.tooltip = Vis alle Noder med deres oprettelses/redigerings datoer.
+NodeShapeAction.fork.text = Fork[translate me]
+NodeUpAction.text = Node Up[translate me]
+nonboldify_branch = Unboldify[translate me]
+nonitalicise_branch = Unitalicise[translate me]
+normal = Normal[translate me]
+ok = OK[translate me]
+OKAction.text = OK[translate me]
+OpenFreeplaneSiteAction.text = Freeplane's Homepage[translate me]
+option_changes_may_require_restart = For at se effekten af de \u00E6ndrede indstillinger, er du sandsynligvis n\u00F8dt til at restarte Freeplane.
+OptionPanel.absolute = Absolut
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatiske layout m\u00F8nstre
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Bestemmer kvaliteten p\u00E5 mindMappen. Mere antialias kr\u00E6ver mere tid.</html>
+OptionPanel.antialias_all = Antialias alt
+OptionPanel.antialias_edges = Antialias kanter
+OptionPanel.antialias_none = Ingen Antialias
+OptionPanel.Appearance = Udseende
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Som for\u00E6ldre
+OptionPanel.automatic = Automatisk
+OptionPanel.automaticFormat_level = Automatisk layout stil
+OptionPanel.automaticFormat_level1 = Rod Node format
+OptionPanel.automaticFormat_level2 = 1. Niveau Node format
+OptionPanel.Behaviour = Opf\u00F8rsel
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.Cancel = Annuller
+OptionPanel.childpattern = Barne M\u00F8nster
+OptionPanel.childpattern.tooltip = Det valgte m\u00F8nster bliver anvendt p\u00E5 alle b\u00F8rn.
+OptionPanel.clear_all_setters = Skift alt
+OptionPanel.clear_all_setters.tooltip = enabler eller disabler alle \u00E6ndrings indikationer.
+OptionPanel.combined = Kombineret
+OptionPanel.cs = Cs
+OptionPanel.da = Da
+OptionPanel.de = De
+OptionPanel.default = Standard
+OptionPanel.default_browser_command_mac = Standard Browser kommando MAC
+OptionPanel.default_browser_command_mac.tooltip = <html>og MAC: (tak til Nick!)</html>
+OptionPanel.default_browser_command_other_os = Standard Browser kommando andre OS
+OptionPanel.default_browser_command_other_os.tooltip = <html>Dette er typisk LINUX:</html>
+OptionPanel.default_browser_command_windows_9x = Standard Browser kommando Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>For Windows ( "" tegnene er n\u00F8dvendige p\u00E5 grund af links der har "=" i deres URL).</html>
+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.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>
+OptionPanel.disable_cursor_move_paper = [Overs\u00E6t mig]-Disable Cursor Move Paper
+OptionPanel.disable_cursor_move_paper.tooltip = <html>[Overs\u00E6t mig]Don't display 'move' cursor during paper dragging</html>
+OptionPanel.display_node_id = Display node ID[translate me]
+OptionPanel.edgecolor = Kant Farve
+OptionPanel.edgecolor.tooltip = Egenskab af kanten til forrige node (tilf\u00F8jes ogs\u00E5 til alle b\u00F8rne noder)
+OptionPanel.edgestyle = Kant stil
+OptionPanel.edgestyle.tooltip = Egenskab af kanten til forrige node (tilf\u00F8jes ogs\u00E5 til alle b\u00F8rne noder)
+OptionPanel.edgewidth = Kanttykkelse
+OptionPanel.edgewidth.tooltip = Egenskab af kanten til forrige node (tilf\u00F8jes ogs\u00E5 til alle b\u00F8rne noder)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Enter bekr\u00E6fter som standard
+OptionPanel.el__max_default_window_height = Max standard Windows H\u00F8jde
+OptionPanel.el__max_default_window_width = Max standard Windows Bredde
+OptionPanel.el__min_default_window_height = Min. standard Windows H\u00F8jde
+OptionPanel.el__min_default_window_width = Min. standard Window Bredde
+OptionPanel.el__position_window_below_node = Positioner Vindue under Node
+OptionPanel.en = En
+OptionPanel.Environment = Omgivelser
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Eksperimental fill\u00E5sning
+OptionPanel.experimental_file_locking_on.tooltip = <html>Eksperimental funktion</html>
+OptionPanel.export_icons_in_html = Eksporterer Ikoner i HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Fort\u00E6l om HTML eksporteret fra Freeplane skal indeholde ikoner. Problemet med ikoner er, at ganske ofte vil linket til ikonerne ikke blive fundet i den eksporterede HTML.</html>
+OptionPanel.Files = Filer
+OptionPanel.first = F\u00F8rst
+OptionPanel.foldingsymbolwidth = Foldesymbolets bredde
+OptionPanel.foldingsymbolwidth.tooltip = <html>Bredde p\u00E5 foldings markerings cirklen</html>
+OptionPanel.fork = Fork[translate me]
+OptionPanel.fr = Fr
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Baseret p\u00E5 overskrifter
+OptionPanel.html_export_fold_all = Fold alt
+OptionPanel.html_export_fold_currently_folded = Fold Nuv\u00E6rende foldede
+OptionPanel.html_export_folding = HTML eksport foldning
+OptionPanel.html_export_no_folding = Ingen foldning
+OptionPanel.hu = Hu
+OptionPanel.icon = Ikon
+OptionPanel.icon.tooltip = Hvis anvendt vil noden have pr\u00E6sis denne ikon.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Genvejstaster
+OptionPanel.ko = Kr
+OptionPanel.label_font_family = Font Family[translate me]
+OptionPanel.label_font_size = Skriftst\u00F8rrelse
+OptionPanel.language = Sprog
+OptionPanel.language.tooltip = <html>Dette er det sprog som skal bruges i programmet. 'Automatisk' pr\u00F8ver at loade nuv\u00E6rende brugers sprog. </html>
+OptionPanel.last = Sidste
+OptionPanel.last_opened_list_length = Sidst \u00E5bnet liste l\u00E6ngde
+OptionPanel.links = Links
+OptionPanel.links.tooltip = <html>S\u00E6t links enten relativt eller absolut</html>
+OptionPanel.load_last_map = \u00C5ben automatisk sidste mindmap
+OptionPanel.load_last_map.tooltip = <html>N\u00E5r Freeplane startes, hentes den sidst \u00E5bnede mindmap, hvis afkrydset.</html>
+OptionPanel.lookandfeel = Look and Feel
+OptionPanel.lookandfeel.tooltip = <htm>Look&Feel til brug. 'metal','windows','motif', 'gtk' er underst\u00F8ttede, 'mac' er kun valgbar p\u00E5 MacOS. default betyder, at default look and feel bliver brugt. Hvis du \u00F8nsker at inds\u00E6tte din egen L&F, s\u00E5 indskriv class name her og sikre dig at den tilh\u00F8rende jar fil(er) er loaded. Hvis der er problemer med look and feel, s\u00E5 v\u00E6lg 'ingenting' her. Det virker p\u00E5 applets</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Max Node bredde
+OptionPanel.max_node_width.tooltip = <html>Maximum default Node bredde i pixels</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Node baggrundsfarve
+OptionPanel.nodebackgroundcolor.tooltip = nodebaggrundsfarve.tooltip
+OptionPanel.nodecolor = Node farve
+OptionPanel.nodecolor.tooltip = nodefarve.tooltip
+OptionPanel.nodefontbold = Fed skrift
+OptionPanel.nodefontitalic = Kursiv skrifttype
+OptionPanel.nodefontname = Node skrifttype
+OptionPanel.nodefontsize = Node skrifttype
+OptionPanel.nodeshape = Node stil
+OptionPanel.nodeshape.tooltip = nodestil.tooltip
+OptionPanel.nodetext = Node tekst
+OptionPanel.nodetext.tooltip = nodetekst.tooltip
+OptionPanel.nothing = Ingenting
+OptionPanel.number_of_different_files_for_automatic_save = Antal af forskellige filer til automatisk gem
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> [Ovrs\u00E6t mig]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.OK = Gem
+OptionPanel.patternname = Navn
+OptionPanel.patternname.tooltip = Unik m\u00F8nster navn
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Placer nye grene
+OptionPanel.placenewbranches.tooltip = <html>Hvor nye grene skal placeres. Gyldige v\u00E6rdier er 'f\u00F8rst' og 'sidst'</html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relativ
+OptionPanel.revision_color = Revision Color[translate me]
+OptionPanel.ru = Ru
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = Curser Valg metode
+OptionPanel.selection_method.tooltip = <html> med den f\u00F8lgende kontakt kan du enable/disable det forsinkede skemavalg. Auto options. rediger dem ikke da de vil blive gemt i auto.properties under alle omst\u00E6ndigheder.</html>
+OptionPanel.selection_method_by_click = Ved klik
+OptionPanel.selection_method_delayed = Forsinket
+OptionPanel.selection_method_direct = Direkte
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = M\u00F8nstre
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Atributter
+OptionPanel.separator.automatic_save = Automatisk gem
+OptionPanel.separator.behaviour = Opf\u00F8rsel
+OptionPanel.separator.browser = Browser
+OptionPanel.separator.commands_for_the_program = Kommandoer for programmet
+OptionPanel.separator.default_colors = Standard farver
+OptionPanel.separator.default_fonts = Standard skrifttyper
+OptionPanel.separator.default_styles = Standard Stil
+OptionPanel.separator.EdgeControls = Kanter
+OptionPanel.separator.edit_long_node_window = Rediger lang node Vindue
+OptionPanel.separator.files = Filer
+OptionPanel.separator.General = Generelt
+OptionPanel.separator.html_export = HTML eksport
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Hyperlink typer
+OptionPanel.separator.icon_properties = Ikoner
+OptionPanel.separator.initial_map_size = Initial mindMap st\u00F8rrelse
+OptionPanel.separator.key_typing = _Key Typing
+OptionPanel.separator.language = Sprog
+OptionPanel.separator.look_and_feel = Look and Feel
+OptionPanel.separator.new_node_commands = Ny node kommandoer
+OptionPanel.separator.node_editing_commands = Node redigerings kommandoer
+OptionPanel.separator.node_navigation_commands = Node navigations kommandoer
+OptionPanel.separator.NodeColors = Node farver
+OptionPanel.separator.NodeFont = Node skrifttype
+OptionPanel.separator.other_defaults = Andre standarter
+OptionPanel.separator.others = Andre n\u00F8gle bindinger
+OptionPanel.separator.patterns = M\u00F8nstre
+OptionPanel.separator.save = Gem
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = Curser Valg metode
+OptionPanel.separator.undo = Fortryd
+OptionPanel.separator.updates = Program Updates[translate me]
+OptionPanel.set_property_text = \u00C6ndr
+OptionPanel.set_property_text.tooltip = Tom: R\u00F8r ikke, minus=Fjern egenskab(s\u00E6t default v\u00E6rdier);Plus=\u00C6ndre egenskab
+OptionPanel.sharp_bezier = skarp bezier
+OptionPanel.sharp_linear = skarp linear
+OptionPanel.show_icon_for_attributes = Vis ikon for atributter
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = Standard baggrundsfarve
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standard baggrundsfarve i HTML notation </html>
+OptionPanel.standardcloudcolor = Standard sky farve
+OptionPanel.standardcloudcolor.tooltip = <html>Standard skyfave i HTML notation</html>
+OptionPanel.standardcloudestyle = Standard sky stil
+OptionPanel.standardcloudestyle.tooltip = <html>Standard sky stil. For nuv\u00E6rende er kun 'bezier' underst\u00F8ttet</html>
+OptionPanel.standardlinkcolor = Standard Link farve
+OptionPanel.standardlinkcolor.tooltip = <html>Standard link farve i HTML notation </html>
+OptionPanel.standardlinkestyle = Stndard Link stil
+OptionPanel.standardlinkestyle.tooltip = <html>Standard Link stil. Nuv\u00E6rende underst\u00F8tter kun 'bezier'</html>
+OptionPanel.standardselectednodecolor = Standard valgt Node farve
+OptionPanel.standardselectednodecolor.tooltip = <html>Standard Node farve er valgt. I HTML notation (#RRGGBB i hex v\u00E6rdier) </html>
+OptionPanel.sv = Se
+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 (n 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 noder n\u00E5r musen er over (i msek). \u00C6ndr denne v\u00E6rdi til 1, hvis du \u00F8nsker direkte selektion ved mus over.</html>
+OptionPanel.toolTipManager.max_tooltip_width = V\u00E6rkt\u00F8jstip bredde
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Standard tooltip bredde i pixels.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Udefineret skrifttype
+OptionPanel.undo_levels = Fortryd Levels
+OptionPanel.undo_levels.tooltip = <html>Bestemmer hvor mange trin der gemmes der kan fortrydes via "Fortryd".</html>
+OptionPanel.wheel_velocity = Speed[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh_CN
+OptionPanel.zh_TW = Zh
+PasteAction.text = S\u00E6t ind
+PatternNewNameProperty = Nyt m\u00F8nster
+PatternToString.backgroundColor = Baggrundsfarve
+PatternToString.Child = Child Node Style[translate me]
+PatternToString.color = Farve
+PatternToString.EdgeStyle = Kant stil
+PatternToString.EdgeWidth = Kantbredde
+PatternToString.FontBold = Fed
+PatternToString.Icon = Ikon
+PatternToString.NodeFontSize = Skriftst\u00F8rrelse
+plugins/ScriptEditor.exit = Exit
+plugins/ScriptEditor.menu_actions = Handlinger
+plugins/ScriptEditor.run = K\u00F8r
+plugins/ScriptEditor/window.Result = Resultat:
+plugins/ScriptEditor/window.title = Script Editor
+plugins/TimeList.xml_Created = Oprettet
+plugins/TimeList.xml_Date = Dato
+plugins/TimeList.xml_Icons = Ikoner
+plugins/TimeList.xml_Modified = Redigeret
+plugins/TimeList.xml_Notes = Noter
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Tilf\u00F8j dato til valgte Noder
+plugins/TimeManagement.xml_Cancel = Annuller
+plugins/TimeManagement.xml_cancelButton = Annuller
+plugins/TimeManagement.xml_closeButton = Luk
+plugins/TimeManagement.xml_Export = Eksporter valgte noder
+plugins/TimeManagement.xml_Find = Find
+plugins/TimeManagement.xml_Goto = G\u00E5 til
+plugins/TimeManagement.xml_hour = Time:
+plugins/TimeManagement.xml_menu_actions = Handlinger
+plugins/TimeManagement.xml_minute = Minut:
+plugins/TimeManagement.xml_reminderButton = P\u00E5mind mig p\u00E5 denne dato
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>N\u00E5r p\u00E5virket, s\u00E6ttes en timer i gang til den angivne dato. P\u00E5 datoen vil blinkende ikoner tiltr\u00E6kke din opm\u00E6rksomhed.<br> Hvis du lukker mindMappen, reaktiveres timerne n\u00E6ste gang, mindMappen \u00E5bnes.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>For nuv\u00E6rende m\u00E5 der kun v\u00E6re en p\u00E5mindelse per Node. <br>Den nuv\u00E6rende p\u00E5mindelse er sat til {date} {0,time}, dit valg var {1,date} {1,time}. <br><br>\u00D8nsker du at \u00E6ndre Noden's p\u00E5mindelsestidspunkt (JA) <br>eller \u00F8nsker du at beholde den gamle (NEJ)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = P\u00E5minder skemalagt den {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Fjern p\u00E5mindelse
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Fjern alle p\u00E5mindelser assosieret med de valgte Noder.
+plugins/TimeManagement.xml_Replace = Erstat
+plugins/TimeManagement.xml_Replace_All = Erstat alle
+plugins/TimeManagement.xml_Replace_Selected = Ersat valgte
+plugins/TimeManagement.xml_Select = V\u00E6lg
+plugins/TimeManagement.xml_todayButton = I dag
+plugins/TimeManagement.xml_WindowTitle = Time Management
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = S\u00F8g & Erstat
+preferences = Preferences[translate me]
+print_preview_title = Print Preview[translate me]
+PrintDirectAction.text = Print[translate me]
+PrintPreviewAction.text = Vis udskrift...
+PropertyAction.text = Indstillinger...
+RedoAction.text = Gendan
+RedoFilterAction.text = Gendan
+ReminderHookAction.text = Fjern p\u00E5mindelse
+ReminderHookAction.tooltip = Fjerner en p\u00E5mindelse fra en Node.
+replace = Erstat
+ResetNodeLocationAction.text = Reset position
+SaveAll.text = Gem alt
+SaveAll.tooltip = Gemmer aller \u00E5bne mindmaps.
+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?
+SelectAllAction.text = V\u00E6lg alt synligt
+SelectBranchAction.text = V\u00E6lg synlig gren
+selection_method_delayed = Forsinket automatisk valg
+SelectNoteAction.text = Note redigerings Switch
+SelectNoteAction.tooltip = Skift til resp. fra note vindue
+SetNoteWindowPosition.top.text = Top[translate me]
+ShowAllAttributesAction.text = Vis alle atributter
+ShowAncestorsAction.text = Vis Forf\u00E6dre
+ShowAttributeDialogAction.text = Attribut administrator
+ShowDescendantsAction.text = Vis efterkommere
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+ShowHideNoteAction.text = Vis/Skjul Note vindue
+ShowHideNoteAction.tooltip = Er en menu genvej for de sm\u00E5 pile i opdelingslinien.
+ShowSelectedAttributesAction.text = Vis valgte atributter
+simplyhtml.aboutFrameTitle = Om denne applikation
+simplyhtml.alignCenter = center
+simplyhtml.alignLabel = Justering:
+simplyhtml.alignLeft = venstre
+simplyhtml.alignRight = h\u00F8jre
+simplyhtml.allCellsRangeLabel = alle celler
+simplyhtml.allOccurrencesReplaced = Alle forekomster erstattet
+simplyhtml.appendTableColLabel = Tilf\u00F8j kolonne
+simplyhtml.appendTableRowLabel = Tilf\u00F8j r\u00E6kke
+simplyhtml.applyCellAttrLabel = Anvend p\u00E5
+simplyhtml.backgroundLabel = Baggrund:
+simplyhtml.boldItalicName = fed kursiv
+simplyhtml.boldName = fed
+simplyhtml.borderColorLabel = Farve:
+simplyhtml.borderWidthLabel = Bredde
+simplyhtml.bottomLabel = bund:
+simplyhtml.cancelBtnName = Annuller
+simplyhtml.cellBorderTabLabel = Kantlinier
+simplyhtml.cellGenTabLabel = Generelt
+simplyhtml.cellMarginTabLabel = Margin
+simplyhtml.cellPanelTitle = Celle format
+simplyhtml.clearFormatLabel = Fjern formatering
+simplyhtml.clearFormatTip = Fjern formatering
+simplyhtml.close = Luk
+simplyhtml.closeBtnName = Luk
+simplyhtml.colorLabel = Farve
+simplyhtml.copyLabel = Kopier
+simplyhtml.copyTip = kopier
+simplyhtml.cTagNameHead1 = Overskrift 1
+simplyhtml.cTagNameHead2 = Overskrift 2
+simplyhtml.cTagNameHead3 = Overskrift 3
+simplyhtml.cTagNameHead4 = Overskrift 4
+simplyhtml.cTagNameHead5 = Overskrift 5
+simplyhtml.cTagNameHead6 = Overskrift 6
+simplyhtml.cTagNameLink = Link
+simplyhtml.cTagNameOL = Sorteret liste
+simplyhtml.cTagNamePara = Afsnit
+simplyhtml.cTagNameUL = Usorteret liste
+simplyhtml.cutLabel = Klip
+simplyhtml.cutTip = klip
+simplyhtml.defaultDocName = Unavngivet
+simplyhtml.deleteTableColLabel = Slet kolonne
+simplyhtml.deleteTableRowLabel = Slet r\u00E6kke
+simplyhtml.docTitleQuery = S\u00E6t titel til:
+simplyhtml.docTitleTitle = Rediger Dokument Titel
+simplyhtml.editLabel = Rediger
+simplyhtml.effectLabel = Effekt
+simplyhtml.familyLabel = Familie
+simplyhtml.findNext = Find n\u00E6ste...
+simplyhtml.findReplaceDialogTitle = S\u00F8g & find
+simplyhtml.findReplaceLabel = S\u00F8g & find
+simplyhtml.findReplaceTip = s\u00F8g & erstat
+simplyhtml.fontBoldLabel = Fed
+simplyhtml.fontBoldTip = skift fed til/fra
+simplyhtml.fontDialogTitle = Format skrifttype
+simplyhtml.fontItalicLabel = Kursiv
+simplyhtml.fontItalicTip = skift kursiv til/fra
+simplyhtml.fontLabel = Skrifttype...
+simplyhtml.fontTabLabel = Skrifttype
+simplyhtml.fontTip = Format skrifttype
+simplyhtml.fontUnderlineTip = skift underlinieret til/fra
+simplyhtml.foregroundLabel = Forgrund:
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = Liste...
+simplyhtml.formatListTip = \u00C6ndre liste format
+simplyhtml.formatParaLabel = Afsnit...
+simplyhtml.formatParaTip = \u00C6ndre afsnits format
+simplyhtml.formatTableLabel = Tabel...
+simplyhtml.formatTableTip = Format tabel
+simplyhtml.htmlTabTitle = HTML kode visning
+simplyhtml.imageFileDesc = Billed filer
+simplyhtml.insertTableColLabel = Inds\u00E6t kolonne
+simplyhtml.insertTableLabel = Tabel...
+simplyhtml.insertTableMsg = Hvor mange kolonner?
+simplyhtml.insertTableRowLabel = Inds\u00E6t r\u00E6kke
+simplyhtml.insertTableTitle = inds\u00E6tTabel
+simplyhtml.italicName = kursiv
+simplyhtml.layoutTabTitle = Layout visning
+simplyhtml.leftLabel = venstre:
+simplyhtml.listDialogTitle = Formater liste
+simplyhtml.listIndentTitle = Indryk:
+simplyhtml.listPosInside = indenfor
+simplyhtml.listPositionLabel = Position:
+simplyhtml.listPosOutside = udenfor
+simplyhtml.listTypeCircle = Rundt punkttegn
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = filsymbol som punkttegn
+simplyhtml.listTypeLabel = Type:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = ingen
+simplyhtml.listTypeSquare = Firkantet punkttegn
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Ydre
+simplyhtml.matchCase = STORE og sm\u00E5 bogstaver
+simplyhtml.newStyleDefaultName = ny stil
+simplyhtml.nextTableCellLabel = N\u00E6ste celle
+simplyhtml.noLineLabel = ingen
+simplyhtml.noMoreOccurrencesFound = ingen (flere) forekomster fundet
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Indre
+simplyhtml.paraAlignCenterLabel = Juster centreret
+simplyhtml.paraAlignCenterTip = S\u00E6t afsnits centreret justering
+simplyhtml.paraAlignLeftLabel = Juster venstre
+simplyhtml.paraAlignLeftTip = S\u00E6t afsnits venstre justering
+simplyhtml.paraAlignRightLabel = Juster h\u00F8jre
+simplyhtml.paraAlignRightTip = S\u00E6t afsnits h\u00F8jre justering
+simplyhtml.paraStyleDialogTitle = Afsnit stil
+simplyhtml.paraTabLabel = Afsnit
+simplyhtml.pasteLabel = S\u00E6t ind
+simplyhtml.pasteTip = s\u00E6t ind
+simplyhtml.plainName = simpel
+simplyhtml.previewLabel = Forh\u00E5ndsvisning
+simplyhtml.previewText = Forh\u00E5ndsvis tekst
+simplyhtml.prevTableCellLabel = Forrige celle
+simplyhtml.redoLabel = Gendan
+simplyhtml.redoTip = gendan
+simplyhtml.replace = Erstat...
+simplyhtml.replaceAll = Alt
+simplyhtml.replaceDone = F\u00E6rdig
+simplyhtml.replaceNo = Nej
+simplyhtml.replaceThisQuery = ertat denne forkomst af
+simplyhtml.replaceWith = Erstat med:
+simplyhtml.replaceYes = Ja
+simplyhtml.rightLabel = h\u00F8jre:
+simplyhtml.searchDown = S\u00F8g nedad
+simplyhtml.searchFromStart = S\u00F8g fra starten
+simplyhtml.searchUp = S\u00F8g opefter
+simplyhtml.selectAllLabel = V\u00E6lg alt
+simplyhtml.sizeLabel = St\u00F8rrelse
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Gennemstreg
+simplyhtml.styleLabel = Stil
+simplyhtml.styleNameInputText = Navn p\u00E5 ny stil?
+simplyhtml.styleNameInputTitle = Gem stil
+simplyhtml.tableBgColLabel = Baggrundsfarve:
+simplyhtml.tableDialogTitle = Format tabel
+simplyhtml.tableLabel = Tabel
+simplyhtml.tablePanelTitle = Tabel format
+simplyhtml.tableWidthLabel = Bredde:
+simplyhtml.textIndentLabel = Indryk:
+simplyhtml.textToFind = Tekst at finde:
+simplyhtml.thisCellRangeLabel = denne celle
+simplyhtml.thisColRangeLabel = denne kolonne
+simplyhtml.thisRowRangeLabel = denne r\u00E6kke
+simplyhtml.toggleBulletsLabel = Punkttegns liste til/fra
+simplyhtml.toggleBulletsTip = punkttegns liste til/fra
+simplyhtml.toggleNumbersLabel = Nummereret liste til/fra
+simplyhtml.toggleNumbersTip = nummereret liste til/fra
+simplyhtml.topLabel = top:
+simplyhtml.unableToOpenFileError = Filen kan ikke \u00E5bnes
+simplyhtml.unableToRedoError = Kan ikke gendanne:
+simplyhtml.unableToUndoError = Kan ikke gendanne:
+simplyhtml.undoLabel = Fortryd
+simplyhtml.undoTip = fortryd
+simplyhtml.valignBaseline = Grundlinie
+simplyhtml.valignBottom = bund
+simplyhtml.valignLabel = Vert. justering:
+simplyhtml.valignMiddle = midte
+simplyhtml.valignTop = top
+simplyhtml.wholeWordsOnly = Kun hele ord
+SortNodes.text = Sorter b\u00F8rn
+SortNodes.tooltip = Sorter alle b\u00F8rn af en node alfabetisk.
+SplitNode.text = Opdel Node
+SplitNode.tooltip = <html>Node er opdelt</html>
+style = Stil
+svg = SVG[translate me]
+TimeListAction.text = Vis tidsskema listen...
+TimeListAction.tooltip = Vis alle skemalagte tider og de tilh\u00F8rende Noder.
+TimeManagementAction.text = Vis kalender...
+TimeManagementAction.tooltip = <html>Viser kalendermodulet af Kai Toedter.</html>
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleMenubarAction.text = Menubar[translate me]
+ToggleToolbarAction.text = Toolbar[translate me]
+undefined_error = En uventet fejl opstod. Pr\u00F8v venligt at lave en fejlrapport.
+underlined = Understreget
+UndoAction.text = Fortryd
+UndoFilterAction.text = Fortryd
+UnfoldAllAction.text = Udfold alt
+UnfoldAllAction.tooltip = <html>Udfolder de valgte Noder og alle deres b\u00F8rn.</html>
+UnfoldOneLevelAction.text = Udfold et niveau
+UnfoldOneLevelAction.tooltip = <html>Udfolder den valgte Node med et niveau.</html>
+updatecheckdialog = Update Check Dialog[translate me]
+UsePlainTextAction.text = Brug klar tekst
+WebDocuAction.text = Web Dokumentation
+width = Bredde
+yes = Ja
diff --git a/freeplane/resources/translations/Resources_de.properties b/freeplane/resources/translations/Resources_de.properties
new file mode 100644
index 0000000..b946283
--- /dev/null
+++ b/freeplane/resources/translations/Resources_de.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane - freie Software f\u00fcr Mindmaps und Wissensaufbau
+AboutAction.text = \u00dcber Freeplane...
+acceleratorPresets = &HotKey
+accelerators_loading_error = Fehler beim Laden der Tastaturk\u00fcrzel in {0}.
+accessories/plugins/ApplyFormatPlugin.dialog.title = Format der Knoten \u00e4ndern
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Stil \u00e4ndern
+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, dass die St\u00e4rke der Verschl\u00fcsselung<br> fast vollst\u00e4ndig von der Qualit\u00e4t Ihres Passwortes abh\u00e4ngt.</html>
+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.</html>
+accessories/plugins/EncryptNode.properties_select_me = Zum weitermachen hier klicken
+accessories/plugins/EncryptNode.properties_wrong_password = Das Passwort ist falsch.
+accessories/plugins/ExportWithTWiki.text = Als TWiki
+accessories/plugins/ExportWithTWiki.tooltip = Exportiert die ganze 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 ganze Mindmap als Java Browser Applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Als Flash
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exportiert die ganze 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>
+action_keystroke_in_use_error = Tastaturk\u00fcrzel {0} f\u00fcr {1} wird bereits f\u00fcr {2} verwendet.
+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 = Konnekto&r hinzuf\u00fcgen
+AddElementaryConditionAction.text = &Hinzuf\u00fcgen
+AddLocalLinkAction.text = Link von Knoten zu Knoten
+AddMenuItemLinkAction.text = Link auf Men\u00fceintrag...
+AddOnDetailsPanel.authored.by = Von {0}
+AddOnDetailsPanel.header.function = Funktion
+AddOnDetailsPanel.header.menu = Men\u00fceintrag
+AddOnDetailsPanel.header.shortcut = Tastaturk\u00fcrzel
+AddOnDetailsPanel.homepage = Homepage:
+addons.installer.canceled = Installation abgebrochen
+addons.installer.confirm.licence = <html><body><h1>Lizenz:</h1>{0}<p><p><em>Akzeptieren Sie die Lizenzbedingungen?</em></p></body></html>
+addons.installer.failed = Installation fehlgeschlagen: {0}
+addons.installer.freeplaneversion.format.error = Formatfehler in {0} (Wert: {1})
+addons.installer.groovy.script.name = Der Skript-Name {0} endet nicht auf ".groovy"
+addons.installer.html.script = Skripttext darf nicht HTML-formatiert sein
+addons.installer.install = Installieren
+addons.installer.invalid.keyboard.shortcut = Ung\u00fcltiger Shortcut {0}
+addons.installer.licence.unchanged = Lizenz ist unver\u00e4ndert
+addons.installer.map.structure = Fehlerhafte Mindmap-Struktur: {0}
+addons.installer.missing.child.nodes = Fehlende Unterknoten: {0}
+addons.installer.missing.permission.attribute = Skript {0}: fehlende Berechtigungsattribute {1}
+addons.installer.missing.properties = Fehlende "properties"-Attribute: {0}
+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}.\u000aSollen diese zu den Standardberechtigungen hinzugef\u00fcgt werden?
+addons.installer.one.child.expected = erwartet wurde nur EIN Unterknoten {0}, allerdings existiert {1}
+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
+addons.installer.script.no.menutitle = f\u00fcr {0} ist das Attribut "menuTitleKey" nicht definiert
+addons.installer.script.no.permissions = Keine Berechtigungen definiert f\u00fcr {0}
+addons.installer.success = Installation erfolgreich.\u000aDas 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.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}
+addons.installer.update = Update von Version {0}
+addons.installer.warning = <html><body><em>die Installation von AddOns sollte nur von vertrauensw\u00fcrdigen Quellen erfolgen. Schadsoftware k\u00f6nnte sonst einen Datenverlust hervorrufen oder zur Verletzung der Privatsph\u00e4re f\u00fchren.</em></body></html>
+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)...
+always = Immer
+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...
+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
+as_parent = Wie Oberknoten
+AskForHelp.text = &Hilfe anfordern...
+AssignAttributesAction.text = Attribute &zuweisen...
+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_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_adding_empty_attribute_error = Der Attributname darf nicht leer sein!
+attributes_all = Alle Attribute
+attributes_assign_dialog = Attribute zuweisen
+attributes_attribute = Attribute
+attributes_close = Schlie\u00dfen
+attributes_deselect_all = Nichts
+attributes_dialog_title = Attribute verwalten
+attributes_edit = Editieren
+attributes_edit_tooltip = Attribute editieren
+attributes_for_selected = A&usgew\u00e4hlte Knoten
+attributes_for_visible = Alle &sichtbaren Knoten
+attributes_import = &Importieren
+attributes_import_tooltip = Attribute aus anderen geladenen Mindmaps 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_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
+attributes_select_all = Alles
+attributes_select_all_tooltip = Alle ausw\u00e4hlen bzw. Auswahl l\u00f6schen
+attributes_show = Zeigen
+attributes_skip_root = &Ohne Wurzelknoten
+attributes_visible = Auswahl f\u00fcr Ansicht->Attribute->Ausgew\u00e4hlte Attribute Anzeigen
+attributes_visible_tooltip = Auswahl f\u00fcr Ansicht->Attribute->Ausgew\u00e4hlte Attribute anzeigen
+automatic_layout = Hierarchiebezogener Knotenstil
+automatic_layout_disabled = (deaktiviert)
+automatically_save_message = Mindmap wurde automatisch unter dem Dateinamen {0} gespeichert...
+AutomaticEdgeColorHookAction.text = Automatische Linienfarbe
+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.tooltip = <html>Formatiert die Knoten entsprechend Extras->Einstellungen...->Automatisches Layout</html>
+AutomaticLayoutControllerAction.ALL.text = f\u00fcr alle Knoten
+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
+bitmaps = Bitmaps
+black = Schwarz
+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
+boldify_branch = Zweig Fett
+branch = Zweig
+browse = Browse...
+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_save_key_set = Kann HotKeys nicht speichern
+cancel = &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_move_to_child = Ein Knoten kann nicht auf seine Unterknoten verschoben werden.
+CenterAction.text = 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 des Konnektors
+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
+ClearLinkAnchorAction.tooltip = <html>l\u00f6schen des Hyperlink-Bezugspunktes</html>
+close_btn = S&chlie\u00dfen
+CloseAction.text = Mindmap s&chlie\u00dfen
+CloudAction.text = &Wolke um Knotenauswahl
+CloudColorAction.text = &Wolkenfarbe...
+CloudShapeAction.ARC.text = Bogen
+CloudShapeAction.RECT.text = Rechteck
+CloudShapeAction.ROUND_RECT.text = Abgerundetes Rechteck
+CloudShapeAction.STAR.text = Stern
+ColorProperty.ResetColor = Farbe zur\u00fccksetzen
+combined = Kombiniert
+condition = Bedingung
+confirmation = Sicherheitsbest\u00e4tigung
+connector = Konnektor
+connector_arrows = Konnektor &Pfeile
+connector_label = Beschriftung des Konnektors
+connector_lines = Konnektor &Linien
+connector_shapes = Konnektor &Formen
+ConnectorColorAction.text = Farbe des Konnektors
+CopyAction.text = &Selektion
+CopyAction.tooltip = Kopiert den markierten Knoten und seine Nachfolger
+CopyAttributes.text = Attribute kopieren
+CopyIDAction.text = Knoten-I&D
+CopyMapStylesAction.text = Knotenstile importieren...
+CopyNodeURIAction.text = Knoten-&URI
+copyright = Copyright \u00a9 2000-2012 Freeplane Entwicklungsteam und andere
+CopySingleAction.text = Knoten-&Inhalt
+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
+CreationModificationPluginAction.tooltip = <html>Diese Funktion speichert Erzeugungs- und \u00c4nderungsdatum jedes Knotens.</html>
+current_dir = Mindmaps
+CutAction.text = &Ausschneiden
+decrease_branch_font_size = S&chrift des Zweiges verkleinern
+DecreaseNodeFontAction.text = &Kleinere Schrift
+default = Standard
+DefaultColorAction.text = Standardfarbe
+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
+DeleteDetailsAction.text = Knotendetails l\u00f6schen
+DeleteLevelStyleAction.text = Entferne Ebene vom automatischen Knotenstil
+DeleteStyleAction.text = Entferne Knotenstil
+DeleteUserStyleAction.text = Entferne benutzerdefinierten Knotenstil
+dialect_info.app = die Mindmap-Datei {0} wurde mit dem Programm {1} 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
+DirectHtmlFlavorHandler = HTML als einzelnen Knoten
+DocumentationAction.text = &Dokumentation (Erste Schritte)...
+down = Ab
+download = Download
+dropped_file_error = Konnte fallen gelassene Datei(en) nicht \u00f6ffnen. Grund: {0}
+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...
+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)
+EdgeStyleAction.hide_edge.tooltip = <html>Wenn der Knoten selektiert ist, wird die<br>Verbindung zum Oberknoten gepunktet dargestellt.<br>Ist er nicht selektiert, so wird die Linie ausgeblendet.</html>
+EdgeStyleAction.horizontal.text = horizontal
+EdgeStyleAction.horizontal.tooltip = <html>Stellt die Verbindung zwischen den Knoten<br>als horizontale und vertikale Linien dar.</html>
+EdgeStyleAction.linear.text = gerade
+EdgeStyleAction.linear.tooltip = <html>Stellt die Verbindung zwischen den Knoten<br>als gerade Linie dar.</html>
+EdgeStyleAction.sharp_bezier.text = spitz und geschwungen
+EdgeStyleAction.sharp_bezier.tooltip = <html>Stellt die Verbindung zwischen den Knoten<br>als geschwungene, spitz zulaufende Linie dar.</html>
+EdgeStyleAction.sharp_linear.text = gerade und spitz
+EdgeStyleAction.sharp_linear.tooltip = <html>Stellt die Verbindung zwischen den Knoten<br>als gerade, spitz zulaufende Linie dar.</html>
+EdgeStyleAsParentAction.text = geerbt
+EdgeStyleAsParentAction.tooltip = <html>\u00dcbernimmt die Darstellung des Linientyps von seinem Oberknoten.</html>
+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_details = Knotendetails bearbeiten...
+edit_end_label = <html>Konnektor<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_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 editieren...
+EditDetailsAction.text = Details &bearbeiten...
+EditDetailsInDialogAction.text = Details im Editor bearbeiten...
+EditFilterAction.text = &Editieren...
+EditLongAction.text = Text im &Editor bearbeiten...
+EditNoteInDialogAction.text = Notiz &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.
+enter_base_url = Freeplane wird realtive Links einf\u00fcgen. Bitte geben sie die Basis-URL an.
+enter_condition_name = Name f\u00fcr neue Bedingung zuweisen
+enter_confirms = &Eingabetaste Schlie\u00dft das Fenster.
+enter_keyset_name = Bitte geben sie einen Namen f\u00fcr das Hot-Key-Set 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...
+error = Fehler
+error_applying_template = Beim Anwenden des XSL-Template ist ein Fehler aufgetreten
+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.\u000aF\u00fcr Details siehe Logfile.
+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
+ExecuteScriptSecurityError.text = Beim Ausf\u00fchren des Skripts ist ein Fehler aufgetreten:\u000a{0}
+export_failed = Export ist 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...
+ExportBranchToHTMLAction.text = Zweig als HTML
+exported_file = {0} Datei
+ExportPdf.text = Als PDF
+ExportSvg.text = Als SVG
+ExportToHTMLAction.text = Als HTML
+ExportToImage.jpg.text = Als JPEG
+ExportToImage.png.text = Als PNG
+ExportToOoWriter.text = Als Open Office Writer Dokument
+extension_menu = &Stile
+ExternalImage_popupMenu_Change = Tauschen...
+ExternalImage_popupMenu_Open = In Bildbetrachter \u00f6ffnen
+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
+ExtractLinkFromTextAction.tooltip = <html>Erzeugt aus einem Knotentext, der eine g\u00fcltige URL einth\u00e4lt <br> (z.B. http://www.google.de) einen Hyperlink </html>
+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.
+FileListFlavorHandler = Links zu Dateien
+FileProperties_BranchLeafCount = Anzahl der Blatt-Knoten in selektieren Zweig(en):
+FileProperties_BranchNodeCount = Anzahl der Knoten in selektierten Zweig(en):
+FileProperties_ChangesSinceLastSave = \u00c4nderungen seit letztem Speichern:
+FileProperties_FileName = Dateiname:
+FileProperties_FileSaved = Datei gespeichert:
+FileProperties_FileSize = Dateigr\u00f6\u00dfe:
+FileProperties_MainBranchCount = Anzahl der Hauptzweige:
+FileProperties_NeverSaved = Nicht gespeichert
+FileProperties_NodeChildCount = Anzahl der Unterknoten der selektierten Knoten:
+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...
+FileRevisionsDialog.cancel = Abbru&ch
+FileRevisionsDialog.file_last_modified = Zeitstempel
+FileRevisionsDialog.file_name = Dateiname
+FileRevisionsDialog.file_size = Dateigr\u00f6\u00dfe
+FileRevisionsDialog.open = &Oeffnen
+FileRevisionsDialog.open.tooltip = Datei \u00f6ffnen, selbst wenn diese veraltet ist
+FileRevisionsDialog.question = Revisionen von {0} gefunden
+FileRevisionsDialog.restore = Wiederherstellen
+FileRevisionsDialog.restore.tooltip = {0} durch {1} ersetzen
+FileRevisionsDialog.title = Dateirevisionen
+filter = Filter aktivieren
+filter_add = &Hinzuf\u00fcgen
+filter_and = &Und
+filter_any_text = Text, Details oder Notiz
+filter_conditions = Filter
+filter_contains = beinhaltet
+filter_created_after = Erzeugt nach dem
+filter_created_before = Erzeugt vor dem
+filter_delete = &Entfernen
+filter_details = Details
+filter_dialog = Filter definieren
+filter_does_not_exist = Fehlt
+filter_edit_description = Filterliste editieren
+filter_enter_value = Einen Wert eingeben
+filter_even_level = Knoten einer geraden Ebene
+filter_exist = existiert
+filter_icon = Icon
+filter_is_equal_to = ist gleich
+filter_is_not_equal_to = ist ungleich
+filter_leaf = Blatt Knoten
+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_modified_after = ver\u00e4ndert nach dem
+filter_modified_before = ver\u00e4ndert vor dem
+filter_no_filtering = Kein Filter
+filter_node = Text
+filter_node_level = Knoten Ebene
+filter_not = &Nicht
+filter_note = Notiz
+filter_odd_level = Knoten einer ungeraden Ebene
+filter_or = Ode&r
+filter_parent = Text des Oberknotens
+filter_periodic_level = Periodisch
+filter_priority = Priorit\u00e4t
+filter_regexp_matches = passt auf RegExp
+filter_reminder = Erinnerung
+filter_reminder_after = f\u00e4llig nach
+filter_reminder_before = f\u00e4llig vor
+filter_reminder_executed = bereits ausgef\u00fchrt
+filter_reminder_later = noch nicht f\u00e4llig
+filter_root = Wurzelknoten
+filter_script = Script-Filter
+filter_select = &Selektieren
+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.
+find_what = Suchbegriff
+FindAction.text = &Suchen...
+FirstGroupNodeAction.text = Knoten als Gruppierungs&beginn setzen
+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.tooltip = Stellt die Vergr\u00f6\u00dferung so ein, dass die gesamte Mindmap in das aktuellen Fenster passt.
+fold = Falten
+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
+font = Schriftart
+FontFamilyAction.text = Schriftart
+FontSizeAction.text = Schriftgr\u00f6\u00dfe
+format_invalid_pattern = kein g\u00fcltiges Format
+format_menu_cloud_shapes = Wolken
+format_menu_edge_styles = Linienf&ormen
+format_menu_edge_widths = &Linienbreite
+format_panel = Format
+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.
+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.tooltip = Wertet alle Formeln der aktuellen Mindmap aus
+formula.menuname = &Formeln
+formula_editor = Formel bearbeiten
+ForwardAction.text = Sprung zum Nachfolger-Knoten
+ForwardAction.tooltip = <html>Springt zum n\u00e4chstfolgenden Knoten der<br/>Selektions-Historie der aktuellen Mindmap</html>
+FreeNodeAction.text = &Freie Knotenpositionierung
+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 = Mindmaps laden...
+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_
+FreeplaneHelpStarter.text = Hilfeseiten...
+FreeplaneHelpStarter.tooltip = Freeplane Hilfe
+GettingStartedAction.text = Funktions&referenz...
+GotoLinkNodeAction.text = Folge Link
+GotoNodeAction.text = Gehe zu Knoten mit &ID...
+GrabKeyDialog.common.cancel = Abbrechen
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Zugewiesen zu
+GrabKeyDialog.grab-key.assigned-to.none = Nicht zugewiesen
+GrabKeyDialog.grab-key.clear = L\u00f6schen
+GrabKeyDialog.grab-key.remove = Entfernen
+GrabKeyDialog.grab-key.remove-ask = Sind Sie sicher, dass Sie diese Tastenzuweisung entfernen m\u00f6chten?
+GrabKeyDialog.grab-key.title = Neuen ShortCut zuweisen
+green = Gr\u00fcn
+help = &Hilfe
+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>
+hot_keys = HotKeys
+hot_keys_table = Tabelle der HotKeys
+HotKeyInfoAction.text = &HotKey-\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
+html_export_no_folding = HTML-Export Ohne Faltung
+html_problem = <html>kann HTML nicht verarbeiten<br><br>{0}
+icon_0% = &0%
+icon_100% = &100%
+icon_25% = &25%
+icon_50% = &50%
+icon_75% = &75%
+icon_addition = Addition
+icon_attach = &Hier hin sehen
+icon_audio = Audio
+icon_back = &Zur\u00fcck
+icon_bee = &Freeplane
+icon_bell = &Erinnerung
+icon_bookmark = &Hervorragend
+icon_broken-line = &Unterbrochen
+icon_button_cancel = &Nicht OK
+icon_button_ok = &OK
+icon_calendar = &Termin
+icon_checked = Markiert
+icon_clanbomber = &Gef\u00e4hrlich
+icon_clock = &Zeit
+icon_clock2 = &Erinnerung
+icon_closed = &Kein Eingang
+icon_decrypted = N&icht verschlossen
+icon_desktop_new = &Nicht vergessen
+icon_division = Division
+icon_down = Nach &Unten
+icon_edit = &Verfeinern
+icon_encrypted = &Verschlossen
+icon_executable = Ausf\u00fchrbar
+icon_family = &Familie
+icon_fema = Mann&/ Frau
+icon_female1 = &Frau1
+icon_female2 = &Frau2
+icon_females = Fraue&n
+icon_flag = &Rote Flagge
+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 = G&elbe Flagge
+icon_folder = &Ordner
+icon_forward = &Vorw\u00e4rts
+icon_freemind_butterfly = Free&Mind
+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 = Gru&ppe
+icon_help = &Frage
+icon_hourglass = &Warten
+icon_icon_not_found = Das Icon wurde nicht gefunden
+icon_idea = &Idee
+icon_image = Bild
+icon_info = I&nfo
+icon_internet = Internet
+icon_internet_warning = Internet Warnung
+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_males = M\u00e4nne&r
+icon_menu = I&cons
+icon_messagebox_warning = &Wichtig
+icon_mindmap = Mindmap
+icon_multiplication = Multiplikation
+icon_narrative = Erz\u00e4hlung
+icon_negative = &Negativ
+icon_neutral = N&eutral
+icon_password = &Passwort
+icon_pencil = Noch zu &verfeinern
+icon_penguin = &Linux
+icon_positive = &Positiv
+icon_prepare = G&elbe Ampel
+icon_revision = Revision
+icon_smiley-angry = &W\u00fctend
+icon_smiley-neutral = &Keine Meinung
+icon_smiley-oh = \u00fc&beraschung
+icon_smily_bad = &Nicht gut
+icon_stop = &Rote Ampel
+icon_stop-sign = &Stopp
+icon_subtraction = Subtraktion
+icon_unchecked = Nicht markiert
+icon_up = Nach &Oben
+icon_user_icon = &Benutzerdefinierte Icons
+icon_very_negative = &Sehr Negativ
+icon_very_positive = Se&hr Positiv
+icon_video = &Video
+icon_wizard = &Magisch
+icon_xmag = Noch zu &diskutieren
+icon_yes = &Wichtig
+IconGroupPopupAction.arrows.text = Pfeile
+IconGroupPopupAction.docs_folders.text = Dokumente und Ordner
+IconGroupPopupAction.flags.text = Flaggen
+IconGroupPopupAction.math.text = Mathematisch
+IconGroupPopupAction.media.text = Medien
+IconGroupPopupAction.miscellaneous.text = Verschiedenes
+IconGroupPopupAction.nature.text = Natur
+IconGroupPopupAction.numbers.text = Nummern
+IconGroupPopupAction.office.text = B\u00fcro
+IconGroupPopupAction.people.text = Personen
+IconGroupPopupAction.rating.text = Bewertung
+IconGroupPopupAction.signs.text = Zeichen
+IconGroupPopupAction.smiley.text = Smiley
+IconGroupPopupAction.time.text = Zeit
+IconGroupPopupAction.user.text = Benutzerdefinierte Icons
+IconProgressExtended10Action.text = Erweiterte Fortschrittsanzeige (10%)
+IconProgressExtended10Action.tooltip = <html>F\u00fcgt eine Fortschrittsanzeige als Bild ein, die bei einem Doppelklick darauf um 10% erh\u00f6ht wird. <br> Strg + Doppelklick reduziert den Wert, bzw entfernt bei 0% die Anzeige.</html>
+IconProgressExtended25Action.text = Erweiterte Fortschrittsanzeige (25%)
+IconProgressExtended25Action.tooltip = <html>F\u00fcgt eine Fortschrittsanzeige als Bild ein, die bei einem Doppelklick darauf um 25% erh\u00f6ht wird. <br> Strg + Doppelklick reduziert den Wert, bzw entfernt bei 0% die Anzeige.</html>
+IconProgressIconDownAction.text = Fortschritt reduzieren
+IconProgressIconDownAction.tooltip = Reduziert/ F\u00fcgt ein/ Entfernt Fortschritts-Icon (100% -> 75% -> 50% -> 25% -> 0% -> entfernen).
+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...
+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
+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...
+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}
+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
+italicise_branch = Zweig kursiv
+java_version = Java-Version: {0}
+JoinNodesAction.text = Text &verbinden
+LatexDeleteLatexAction.text = LaTe&X Formel entfernen
+LatexEditLatexAction.text = LaTeX-&Formel bearbeiten...
+LatexInsertLatexAction.text = &LaTeX-Formel einf\u00fcgen...
+less_than_two_selected_nodes = Bitte mindestens zwei Knoten ausw\u00e4hlen, zwischen denen Verbindungen gezeichnet werden sollen.
+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 implizite Garantie der TAUGLICHKEIT ODER EIGNUNG ZU EINEM<br>PARTIKUL\u00c4REN ZWECK. Weitere Details sind in der GNU General<br>Public License zu finden.<br><br>Eine Kopie der GNU General Public License sollte diesem Programm<br>beiliegen; falls nicht, wird um entsprechende R\u00fcckmeldung an die Free<br>Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,<br>MA 02111-1307, USA, gebeten.
+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.
+load = &Laden
+load_accelerator_presets = Laden
+LoadAcceleratorPresetsAction.textPatterns.text = Text Muster
+locking_failed_by_open = Die Mindmap {0} ist in Benutzung. Daher wird sie schreibgesch\u00fctzt ge\u00f6ffnet.
+locking_failed_by_save_as = Die Mindmap {0} ist in Benutzung. Daher wurde die Aktion "Speichern unter..." abgebrochen.
+locking_old_lock_removed = Die Mindmap {0} war in Benutzung durch den Benutzer {1}. Die Dateisperrung wurde aufgehoben, da sie veraltet war.
+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_resource_directory = Installationsverzeichnis: {0}
+MainView.errorUpdateText = Fehler beim Zuweisen des Textes f\u00fcr folgende Eingabe:{0}.\u000aFehlerdetail: {1}
+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.tooltip = <html>erstellt einen lokalen bzw. globalen Hyperlink<br/>vom selektierten Knoten zum Bezugsknoten</html>
+ManageAddOnsAction.text = Add-Ons...
+ManageAddOnsDialog.activate = Aktivieren
+ManageAddOnsDialog.activation.success = {0} wird bei einem Neustart aktiviert.
+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.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.install = &Install
+ManageAddOnsDialog.install.from.known.location = Add-On von einem bekannten Ort installieren
+ManageAddOnsDialog.install.tooltip = Hier 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.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.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.visit.addon.page = Add-On Seite besuchen...
+ManageConditionalStylesAction.text = &Bedingte Formatierung (allgemein)...
+ManageNodeConditionalStylesAction.text = Bedingte Formatierung (f\u00fcr Knoten)...
+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_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
+menu_applyStyle = Knotenstil anwenden
+menu_attributes = &Attribute
+menu_clouds = Wolken
+menu_copy = &Kopieren
+menu_coreFormat = &Knoten
+menu_details = Details
+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_iconView = Icons
+menu_image = Bild
+menu_insert = &Einf\u00fcgen
+menu_latex_formula = LaTeX Formel
+menu_links = Hyper&link
+menu_manageStyles = Knotenstil &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_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
+mindmap = Mindmap
+MindMapNodesFlavorHandler = Knoten-Hierarchie
+mindmaps = &Mindmaps
+mindmaps_desc = Mindmaps (*.mm)
+mindmaps_filter_desc = Filter (*.mmfilter)
+MinNodeWidth.text = Festlegung der minimalen Breite eines Knotens
+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
+ModesMenuAction.Browse.text = &Browser-Ansicht
+ModesMenuAction.File.text = Datei-E&xplorer-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
+new = &Neu
+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)
+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.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
+NewLevelStyleAction.text = Neue Automatisches Layout Ebene
+newmap.install.addon.question = {0} scheint ein Add-On zu sein.\u000aM\u00f6chten sie es installieren?\u000a("Nein" bei normalem \u00d6ffnen).
+newmap.install.addon.title = Add-On installieren?
+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...
+NextNodeAction.BACK.text = Zum vorherigen Knoten
+NextNodeAction.BACK_N_FOLD.text = Zum vorherigen Knoten (Unterknoten falten)
+NextNodeAction.FORWARD.text = Zum n\u00e4chsten Knoten
+NextNodeAction.FORWARD_N_FOLD.text = Zum n\u00e4chsten Knoten (Unterknoten falten)
+NextPresentationItemAction.text = N\u00e4chsten Presentationsknoten aufklappen
+no = Nein
+no_copy_attributes_before_paste_attributes = Attribute m\u00fcssen erst kopiert werden, bevor man sie einf\u00fcgt!
+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_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_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_styles = Knotenstile
+NodeBackgroundColorAction.text = &Hintergrundfarbe...
+NodeColorAction.text = Schriftfarbe...
+NodeColorBlendAction.text = Schriftfarbe &aufhellen
+NodeDownAction.text = Nach &unten tauschen
+NodeExtensions.EditNodeExtensions = Bearbeite Knotenerweiterungen
+NodeExtensions.RemoveNodeExtensions = Entferne Knotenerweiterungen
+NodeListAction.text = Suchen und erse&tzen...
+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...
+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.
+note_window_location = Editor-&Position
+ok = &OK
+OKAction.text = &OK
+OnlineReference.text = Online-Dokumentation...
+open_asMindMap = Mindmap
+OpenAction.text = \u00d6&ffnen...
+OpenFreeplaneSiteAction.text = Freeplane-&Webseite \u00f6ffnen...
+OpenPathAction.text = Datei \u00f6ffnen
+OpenURLMapAction.text = \u00d6ffnen aus URL...
+OpenUserDirAction.text = Benutzereinstellungsverzeichnis \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.
+OptionalDontShowMeAgainDialog.ok = &Ja
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Entscheidung merken.
+OptionPanel.absolute = Absolut
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatisches Layout
+OptionPanel.ADD_CHILD = Unterknoten hinzuf\u00fcgen
+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_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_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>
+OptionPanel.antialias_all = Kantengl\u00e4ttung auf alles anwenden
+OptionPanel.antialias_edges = Kantengl\u00e4ttung nur auf die Verbindungslinien der Knoten anwenden
+OptionPanel.antialias_none = Keine Kantengl\u00e4ttung anwenden
+OptionPanel.Appearance = Aussehen
+OptionPanel.apply_system_screen_resolution = System-Bildschirmaufl\u00f6sung anwenden
+OptionPanel.approximate_search_threshold = Schwelle f\u00fcr \u00c4hnlichkeitsvergleich
+OptionPanel.approximate_search_threshold.tooltip = <html>Schwelle f\u00fcr \u00c4hnlichkeitserkennung beim Vergleichen festlegen.<br/><font size="2">siehe http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(je gr\u00f6\u00dfer der Wert desto enger die zul\u00e4ssige<br/>Variationsbreite f\u00fcr das Suchergebnis)</html>
+OptionPanel.ar = Arabisch / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ARC = Bogen
+OptionPanel.as_parent = wie der Oberknoten
+OptionPanel.ask = Nachfragen
+OptionPanel.automatic = Automatisch
+OptionPanel.automaticFormat_level = Automatisches Layout
+OptionPanel.automaticFormat_level1 = Format des Wurzelknotens
+OptionPanel.automaticFormat_level2 = Format der 1. Ebene
+OptionPanel.backup_file_number = Anzahl der Backup-Dateien
+OptionPanel.Behaviour = Verhalten
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Blase
+OptionPanel.ca = Katalan, Valencian / Catal\u00e0
+OptionPanel.Cancel = Abbrechen
+OptionPanel.center_selected_node = Selektierte Knoten 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.clear_all_setters = Alle ver\u00e4ndern
+OptionPanel.clear_all_setters.tooltip = <html>Ver\u00e4ndert alle Eigenschaften auf einmal.</html>
+OptionPanel.cloud = Wolke
+OptionPanel.cloudcolor = Wolke und Farbe
+OptionPanel.cloudshape = Wolkenformen
+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.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.da = D\u00e4nisch / dansk
+OptionPanel.date_format = Standard Datumsformat
+OptionPanel.date_format.tooltip = <html>M\u00f6gliche Werte sind: Entweder "SHORT" (kurzes Format), "MEDIUM" (mittellanges Format), "FULL" (alles) oder ein Muster wie "MM/dd/yyy".</html>
+OptionPanel.datetime_format = Standard Datums- und Zeitformat
+OptionPanel.datetime_format.tooltip = <html>Eingabe von <Datum>,<Zeit>.</br>M\u00f6gliche Werte sind: Entweder "SHORT" (kurzes Format), "MEDIUM" (mittellanges Format), "FULL" (alles) oder ein Muster wie "MM/dd/yyy hh:mm".</html>
+OptionPanel.de = Deutsch / Deutsch
+OptionPanel.default = Standard
+OptionPanel.default_attribute_key_column_width = Voreingestellte Breite der Schl\u00fcssel-Spalte eines Attributs
+OptionPanel.default_attribute_value_column_width = Voreingestellte Breite der Werte-Spalte eines Attributs
+OptionPanel.default_browser_command_mac = Standard Browser Befehl Mac
+OptionPanel.default_browser_command_mac.tooltip = <html>und MAC: (Danke an Nick!)</html>
+OptionPanel.default_browser_command_other_os = Standard Browser Befehl f\u00fcr andere Betriebssysteme
+OptionPanel.default_browser_command_other_os.tooltip = <html> Das ist typischerweise Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Standard Browser Befehl Windows 9x
+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_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.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.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.display_inline_editor_for_all_new_nodes = Eingebetteter Editor f\u00fcr neue Knoten
+OptionPanel.display_node_id = Knoten ID anzeigen
+OptionPanel.edgecolor = Linienfarbe
+OptionPanel.edgecolor.tooltip = Linieneigenschaft der Verbindung zum Oberknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.edgestyle = Linientyp
+OptionPanel.edgestyle.tooltip = Linieneigenschaft der Verbindung zum Oberknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.edgewidth = Linienbreite
+OptionPanel.edgewidth.tooltip = Linieneigenschaft der Verbindung zum Oberknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.EDIT_CURRENT = Inhalt \u00fcberschreiben
+OptionPanel.edit_on_double_click = Text bei &Doppel-Klick bearbeiten
+OptionPanel.editor_extra_width = Vergr\u00f6\u00dferungsschritte des Knotens bei Texteingabe [px]
+OptionPanel.editor_extra_width.tooltip = <html>Legt fest, um wie viele Pixel der Knoten verbreitert wird, wenn bei der Texteingabe der Rand erreicht wird.</html>
+OptionPanel.el = Griechisch / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__buttons_above = Kn\u00f6pfe oben anzeigen
+OptionPanel.el__enter_confirms_by_default = <ENTER> beendet den Dialog
+OptionPanel.el__max_default_window_height = Maximale Fensterh\u00f6he
+OptionPanel.el__max_default_window_width = Maximale Fensterbreite
+OptionPanel.el__min_default_window_height = Minimale Fensterh\u00f6he
+OptionPanel.el__min_default_window_width = Minimale Fensterbreite
+OptionPanel.el__position_window_below_node = Position Fenster unter dem Knoten
+OptionPanel.en = Englisch / english
+OptionPanel.Environment = Allgemein
+OptionPanel.es = Spanisch (Kastilien)/ espa\u00f1ol, castellano
+OptionPanel.et = Estnisch / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking = Skripte ohne Nachfragen ausf\u00fchren?
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Skripte sind in Freeplane nicht beschr\u00e4nkt und k\u00f6nnen daher auf alle Resourcen des Rechners zugreifen.<br>Sie sollten daher nur dann ausgef\u00fchrt werden, wenn eine zuverlässige Quelle sichergestellt ist.</html>
+OptionPanel.execute_scripts_without_exec_restriction = Ausf\u00fchren anderer Applikationen erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html>Diese Option ist dann zu aktivieren, wenn Groovy-Skripte auch andere Anwendungen<br>(wie z.B. den Browser) ohne Nachfrage ausf\u00fchren k\u00f6nnen sollen.<br><b>VORSICHT: b\u00f6sartige Skripte k\u00f6nnen dann den Computer besch\u00e4digen!</b></html>
+OptionPanel.execute_scripts_without_file_restriction = Lesenden Zugriff auf Dateien erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html>Diese Option ist dann zu aktivieren, falls Groovy-Skripte lesenden Zugriff auf Dateien ben\u00f6tigen.<br><b>VORSICHT: auch b\u00f6sartige Skripte haben dann lesenden Zugriff auf Daten!</b></html>
+OptionPanel.execute_scripts_without_network_restriction = Netzwerkoperationen erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html>Diese Option ist dann zu aktivieren, falls Groovy-Skripte auf das Netzwerk zugreifen k\u00f6nnen sollen.<br><b>VORSICHT: b\u00f6sartige Skripte k\u00f6nnen dann pers\u00f6nliche Daten \u00fcber das Netz verschicken!</b></html>
+OptionPanel.execute_scripts_without_write_restriction = Schreibenden Zugriff auf Dateien erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html>Diese Option ist dann zu aktivieren, falls Groovy-Skripte schreibenden/l\u00f6schenden Zugriff auf Dateien ben\u00f6tigen.<br><b>VORSICHT: b\u00f6sartige Skripte k\u00f6nnen dann Dateien modifizieren bzw. Datentr\u00e4ger besch\u00e4digen!</b></html>
+OptionPanel.experimental_file_locking_on = Experimentelles Sperren der ge\u00f6ffneten Dateien
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experimentelles Feature</html>
+OptionPanel.export_icons_in_html = Icons nach HTML exportieren
+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.Files = Dateien
+OptionPanel.first = Am Anfang
+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>
+OptionPanel.fork = Linie
+OptionPanel.format_locale = Lokal \u00fcbliche Formatierung
+OptionPanel.format_locale.tooltip = Lokalisierungsabh\u00e4ngiges Zahlen- und Datumsformat w\u00e4hlen
+OptionPanel.formula_disable_caching = Cache-Speicher f\u00fcr die Auswertung von Formeln deaktivieren
+OptionPanel.formula_disable_plugin = Formelauswertung deaktivieren
+OptionPanel.fr = Franz\u00f6sisch / Fran\u00e7ais
+OptionPanel.gl = Gallizisch / Galego
+OptionPanel.goto_note_end_on_edit = Bewegt den Cursor ans Ende
+OptionPanel.grid_size = Punktabstand f\u00f6r Platzierungsraster
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Linie verstecken
+OptionPanel.highlight_formulas = Formeln hervorheben
+OptionPanel.horizontal = Horizontal
+OptionPanel.hr = Kroatisch / hrvatski
+OptionPanel.HTML = HTML
+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 des Faltungszustands
+OptionPanel.html_export_no_folding = Ohne Faltung
+OptionPanel.hu = Ungarisch / Magyar
+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.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.id = Indonesisch / Bahasa Indonesia
+OptionPanel.IGNORE = Nichts tun
+OptionPanel.il__enter_confirms_by_default = <ENTER> beendet die Texteingabe im Knoten
+OptionPanel.image_cache = f\u00fcr Bilder
+OptionPanel.it = Italienisch / italiano
+OptionPanel.ja = Japanisch / \u65e5\u672c\u8a9e
+OptionPanel.key_type_action = Bei Tastendruck
+OptionPanel.Keystrokes = Tasten
+OptionPanel.ko = Koreanisch / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.label_font_family = Zeichensatz
+OptionPanel.label_font_size = Schriftgr\u00f6\u00dfe
+OptionPanel.language = Sprache
+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.last = Am Ende
+OptionPanel.last_opened_list_length = Anzahl der zuletzt ge\u00f6ffneten Dateien unter Datei -> Zuletzt ge\u00f6ffnete Dateien
+OptionPanel.layout_map_on_text_change = Mindmap w\u00e4hrend des editierens aktualisieren
+OptionPanel.layout_map_on_text_change.tooltip = F\u00fcr h\u00f6here Geschwindigkeit ausschalten
+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_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.tooltip = <html>Bei Problemen bitte einfach 'Standard' w\u00e4hlen.</html>
+OptionPanel.lt = Litauisch / kalba
+OptionPanel.max_displayed_node_count = Maximale Anzahl angezeigter Knoten
+OptionPanel.max_image_width = Maximale Anzeigebreite f\u00fcr Abbildungen
+OptionPanel.max_image_width.tooltip = Neu eingef\u00fcgte Abbildungen werden entsprechend herunterskaliert
+OptionPanel.max_menu_item_count = Maximale Anzahl an Men\u00fc-Eintr\u00e4gen
+OptionPanel.max_menu_item_count.tooltip = Limitiert die Anzahl von Elementen des Untermen\u00fcs (mindestens 10)
+OptionPanel.max_node_width = Maximale Knotenbreite
+OptionPanel.max_shortened_text_length = Maximale L\u00e4nge des gek\u00fcrzten Knotentexts
+OptionPanel.metal = Metall
+OptionPanel.min_node_width = Minimale Knotenbreite
+OptionPanel.motif = Motif
+OptionPanel.nb = Norwegisch Bokm\u00e5l / Norsk bokm\u00e5l
+OptionPanel.never_save_folding = nie
+OptionPanel.nl = Niederl\u00e4ndisch, Fl\u00e4misch / Nederlands, Vlaams
+OptionPanel.nn = Norwegisch Nynorsk / Norsk nynorsk
+OptionPanel.nodebackgroundcolor = Knotenhintergrundfarbe
+OptionPanel.nodebackgroundcolor.tooltip = Hier wird die Knotenhintergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
+OptionPanel.nodecolor = Knotenfarbe
+OptionPanel.nodecolor.tooltip = Hier wird die Knotenvordergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
+OptionPanel.nodefontbold = Fett
+OptionPanel.nodefonthyperlink = Hyperlink
+OptionPanel.nodefontitalic = Kursiv
+OptionPanel.nodefontname = Knotenschrift
+OptionPanel.nodefontsize = Schriftgr\u00f6\u00dfe
+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.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"
+OptionPanel.number_of_different_files_for_automatic_save = Speichertiefe bei automatischen Speicherungen
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html>Legt fest, wie viele Versionen einer Datei aufbewahrt werden. \u00c4ltere Dateien werden gel\u00f6scht. </html>
+OptionPanel.OK = Speichern
+OptionPanel.org.freeplane.plugin.bugreport = Fehlerberichte senden
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Immer senden
+OptionPanel.org.freeplane.plugin.bugreport.ask = Report Dialog zeigen
+OptionPanel.org.freeplane.plugin.bugreport.denied = Nie senden
+OptionPanel.org.freeplane.plugin.bugreport.userid = Optional \u00fcbertragbare ID
+OptionPanel.outline_hgap = Horizontaler Abstand
+OptionPanel.outline_vgap = Vertikaler Abstand
+OptionPanel.paint_connectors_behind = Konnektoren bei Knoten verstecken
+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.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.
+OptionPanel.patternname = Name
+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.plugins = Plugins
+OptionPanel.presentation_dimmer_transparency = Transparenz f\u00fcr Presentation
+OptionPanel.presentation_mode = Pr\u00e4sentations-Modus
+OptionPanel.printonwhitebackground = Wei\u00dfen Hintergrund zum Drucken verwenden
+OptionPanel.printonwhitebackground.tooltip = <html>Legt fest, dass immer weiss als Hintergrund beim Drucken verwendet wird.</html>
+OptionPanel.pt_BR = Protugiesisch (Brasilien)/ Portugu\u00eas (Brasil)
+OptionPanel.pt_PT = Portugiesisch (Portugal) / Portugu\u00eas (Portugal)
+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.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
+OptionPanel.revision_color.tooltip = Hintergrundfarbe f\u00fcr ge\u00e4nderte Knoten.
+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_modification_times = \u00c4nderungszeiten speichern
+OptionPanel.script_classpath = Skripte Klassenpfad: Verzeichnisse, die Klassen und/oder JARs enthalten (siehe Tooltip)
+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_directories = Suchpfad f\u00fcr Skripte (s. Tooltip)
+OptionPanel.script_directories.tooltip = <html>Eine Liste von Verzeichnissen.<br>Verwende ";"(Windows) oder ":" (Linux, Mac) um die Eintr\u00e4ge voneinander zu trennen.<br>Relative Pfadangaben beziehen sich auf das Freeplane Benutzerverzeichnis.</html>
+OptionPanel.script_user_key_name_for_signing = Optionaler Aliasname eines private Schl\u00fcssels, um Skripte zu signieren
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>Wenn Sie Ihre Skripte selbst signieren wollen, dann geben Sie hier einen Alias f\u00fcr den Schl\u00fcssel ein.<br>Es wird erwartet, dass der Schl\u00fcssel im Standard-Schl\u00fcsselspeicher ist.<br>Das geheime Passwort des Schl\u00fcssels muss mit dem Passwort des Schl\u00fcsselspeichers \u00fcbereinstimmen.</html>
+OptionPanel.scrollbar_increment = Geschwindigkeit
+OptionPanel.scrolling_speed = Geschwindigkeit beim Scrollen
+OptionPanel.selection_method = Auswahlmodus
+OptionPanel.selection_method.tooltip = <html>Mit dem folgenden Schalter kann die verz\u00f6gerte Auswahl eines Schemas aktiviert bzw. deaktiviert werden.<br> \u00c4ndern Sie diese Option nicht, da sie ohnehin in auto.properties gespeichert werden.</html>
+OptionPanel.selection_method_by_click = Durch Mausklick
+OptionPanel.selection_method_delayed = Verz\u00f6gert
+OptionPanel.selection_method_direct = Direkt
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Stile
+OptionPanel.separator.anti_alias = Kantengl\u00e4ttung
+OptionPanel.separator.attributes = Attribute
+OptionPanel.separator.automatic_save = Automatisches Speichern
+OptionPanel.separator.behaviour = Verhalten
+OptionPanel.separator.browser = Browser
+OptionPanel.separator.cache = Cache
+OptionPanel.separator.CloudControls = Wolken
+OptionPanel.separator.commands_for_the_program = Programm
+OptionPanel.separator.connectors = Konnektoren
+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.EdgeControls = Linieneigenschaften
+OptionPanel.separator.edit_long_node_window = Externer Editor f\u00fcr gro\u00dfe Knoten
+OptionPanel.separator.editing = Editor-Einstellungen
+OptionPanel.separator.files = Dateien
+OptionPanel.separator.formula = Formeln
+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 = Anf\u00e4ngliche Gr\u00f6\u00dfe der Mindmap
+OptionPanel.separator.inline_editor = Texteingabe im Knoten
+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.NodeFont = Knotenschrift
+OptionPanel.separator.NodeShape = Knotenform
+OptionPanel.separator.NodeStyle = Knotenstil
+OptionPanel.separator.NodeText = Knotentext
+OptionPanel.separator.notifications = Nachfragen
+OptionPanel.separator.org.freeplane.plugin.bugreport = Automatischer Fehler Bericht
+OptionPanel.separator.other_defaults = Andere Standards
+OptionPanel.separator.others = Andere Tastenkombinationen
+OptionPanel.separator.outline_view = Gliederungsansicht
+OptionPanel.separator.patterns = Stile
+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.search = Suchen
+OptionPanel.separator.selection_colors = Selektion Farben
+OptionPanel.separator.selection_method = Auswahlmodus
+OptionPanel.separator.single_instance_mode = Freeplane Instanzen
+OptionPanel.separator.size_limits = Gr\u00f6\u00dfenbeschr\u00e4nkung
+OptionPanel.separator.spelling = Rechtschreibpr\u00fcfung
+OptionPanel.separator.status = Status-Zeile
+OptionPanel.separator.tooltip = Tooltip
+OptionPanel.separator.undo = R\u00fcckg\u00e4ngig
+OptionPanel.separator.updates = Programm Aktualisierungen
+OptionPanel.set_property_text = Ver\u00e4ndern?
+OptionPanel.set_property_text.tooltip = <html><ul><li>Leer=Nicht \u00e4ndern </li><li>Minus=Eigenschaft l\u00f6schen (also auf den Standard zur\u00fccksetzen)</li><li>Plus=Eigenschaft setzen.</li></ul></html>
+OptionPanel.setscript = 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.sharp_bezier = Geschwungen und spitz
+OptionPanel.sharp_linear = Spitze gerade Linie
+OptionPanel.show_icon_for_attributes = Icon f\u00fcr Attribut anzeigen
+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.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>
+OptionPanel.single_backup_directory_path = Backup-Verzeichnis (falls vorherige Option gew\u00e4hlt ist)
+OptionPanel.single_backup_directory_path.tooltip = <html>\u00dcberschreibt den Standardpfad <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance = Dateien in einer aktiven Freeplane Instanz \u00f6ffnen
+OptionPanel.single_instance_force = Eine zweite Instanz von Freeplane in jedem Fall verhindern
+OptionPanel.single_instance_force.tooltip = Vermeidet eine zweite Instanz, selbst wenn keine ladbare Datei existiert
+OptionPanel.sk = Slovakisch / sloven\u010dina
+OptionPanel.sl = Slovenisch / sloven\u0161\u010dina
+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_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
+OptionPanel.spelling_opt_suggestions_limit_menu = Maximale Anzahl der Vorschl\u00e4ge im Men\u00fc
+OptionPanel.sr = Serbisch / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = Standard Vorlage
+OptionPanel.standardbackgroundcolor = Standard Hintergrundfarbe
+OptionPanel.standardbackgroundcolor.tooltip = <html>Legt die Standardfarbe des Hintergrundes fest (in HTML-Notation)</html>
+OptionPanel.standardcloudcolor = Standard Wolkenfarbe
+OptionPanel.standardcloudcolor.tooltip = <html>Legt die Standard Wolkenfarbe fest (in HTML-Notation)</html>
+OptionPanel.standardcloudestyle = Standard Wolkenstil
+OptionPanel.standardcloudestyle.tooltip = <html>Legt den Standard Wolkenstil fest. <br>Im Moment wird nur die geschwungene Form (Bezier)unterst\u00fctzt.</html>
+OptionPanel.standarddrawrectangleforselection = Selektierten Knoten durch Rechteck anzeigen
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Zeigt den selektierten Knoten an, indem ein Rechteck um ihn gezeichnet wird.</html>
+OptionPanel.standardlinkcolor = Standard Konnektor-Farbe
+OptionPanel.standardlinkcolor.tooltip = <html>Legt die Standardfarbe des Konnektors fest (in HTML-Notation). </html>
+OptionPanel.standardlinkestyle = Standard Konnektor-Stil
+OptionPanel.standardlinkestyle.tooltip = <html>Legt den Standardstil f\u00fcr den Konnektor fest. </html>
+OptionPanel.standardselectednodecolor = Standard-Farbe f\u00fcr ausgew\u00e4hlte Knoten
+OptionPanel.standardselectednodecolor.tooltip = <html>Legt die Standardfarbe f\u00fcr selektierte Knoten fest (in HTML-Notation).<br>Gilt nur, wenn die Option "Selektierten Knoten durch Rechteck anzeigen"<br><b>nicht</b> selektiert ist. </html>
+OptionPanel.standardselectednoderectanglecolor = Farbe f\u00fcr das Rechteck zur Anzeige des ausgew\u00e4hlten Knoten
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>Legt die Farbe des Rechtecks fest mit dem der selektierte Knoten angezeigt wird (in HTML-Notation).<br>Gilt nur, wenn die Option "Selektierten Knoten durch Rechteck anzeigen" selektiert ist.</html>
+OptionPanel.STAR = Stern
+OptionPanel.structured_html_import = Import HTML als Knotenhierarchie
+OptionPanel.structured_icon_toolbar = Strukturierte Icon-Toolbar
+OptionPanel.summary = Zusammenfassung
+OptionPanel.sv = Schwedisch / svenska
+OptionPanel.text.use_ctrl_key = <html>Um den Programm-Funktionen einen ShortCut zuzuweisen,<br> verwende die Men\u00fcfunktion "Extras -> ShortCut zuweisen"</html>
+OptionPanel.time_for_automatic_save = Zeitabstand f\u00fcr automatisches Speichern [ms]
+OptionPanel.time_for_automatic_save.tooltip = <html>Legt die Zeit zwischen zwei aufeinanderfolgenden automatischen Speicherungen in Millisekunden fest <br>Wenn Sie diese Funktion deaktivieren wollen, dann setzen Sie die Zeit auf 200.00.00.000.</html>
+OptionPanel.time_for_delayed_selection = Zeit f\u00fcr die verz\u00f6gerte Auswahl [ms]
+OptionPanel.time_for_delayed_selection.tooltip = <html>Legt fest, wie lange die Maus \u00fcber dem Knoten sein muss, bevor er ausgew\u00e4hlt wird.<br>Ein Wert von 1 bedeutet direkte Auswahl mit der Maus (ohne Klick).</html>
+OptionPanel.toolTipManager.dismissDelay = Ausblenden des ToolTips [ms]
+OptionPanel.toolTipManager.initialDelay = Anf\u00e4ngliche Verz\u00f6gerung [ms]
+OptionPanel.toolTipManager.max_tooltip_width = Maximale Anzeigebreite f\u00fcr ToolTips
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Legt die maximale Breite der Tooltips in Pixeln fest.</html>
+OptionPanel.toolTipManager.reshowDelay = Verz\u00f6gerung zur erneuten Anzeige [ms]
+OptionPanel.tr = T\u00fcrkisch / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+OptionPanel.uk_UA = Ukrainisch / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
+OptionPanel.undefined_font = Unbekannte Schriftart
+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_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.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.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
+OptionPanel.wheel_velocity = Geschwindigkeit
+OptionPanel.wheel_velocity.tooltip = Ein gr\u00f6\u00dferer Wert resultiert in schnelleren Bewegungen der Mindmap bei Bet\u00e4tigung des Mausrades.
+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.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.report = Derzeitiger Report
+org.freeplane.plugin.bugreport.wanted_bug = Ein Fehler ist aufgetreten und wurde automatisch weitergemeldet.\u000aWir brauchen aber noch mehr Informationen, um dieses unerwartete Verhalten reproduzieren zu k\u00f6nnen.\u000a\u000aBitte helfen Sie uns dabei, indem Sie einen Fehlerbericht in userem Mantis-Fehlerverfolgungstool eingeben.\u000aErkl\u00e4ren Sie auch, was Sie getan haben, als der Fehler auftrat, so dass wir Ihn reproduzieren k\u00f6nnen.\u000a\u000aWenn Sie OK dr\u00fccken, wird automatisch das Fehlerverfolgunstool in Ihrem Web-Browser ge\u00f6ffnet.\u000a\u000aDanke, dass Sie dabei helfen Freeplane besser zu machen!\u000aIhr Freeplane Team.
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = Der Knoten {0} ist nicht definiert
+out_of_memory = Zu wenig Speicher.
+overwrite_keyset_question = Soll existierendes Keyset \u00fcberschrieben werden?
+PageAction.text = Seite einr&ichten...
+password_is_not_ascii = Passwort ist nicht im ASCII-Format
+PasteAction.text = Einf&\u00fcgen
+PasteAttributes.text = Attribute einf\u00fcgen
+PatternNewNameProperty = Neuer Stil
+PatternToString.backgroundColor = Hintergrundfarbe
+PatternToString.Child = Stil des Unterknotens
+PatternToString.color = Farbe
+PatternToString.EdgeColor = Linienfarbe
+PatternToString.EdgeStyle = Linienform
+PatternToString.EdgeWidth = Linienbreite
+PatternToString.FontBold = Fett
+PatternToString.FontItalic = Kursiv
+PatternToString.FontName = Schrift
+PatternToString.Icon = Icon
+PatternToString.NodeFontSize = Schriftgr\u00f6\u00dfe
+periodic_formula = {0}* n + {1}
+PeriodUnit.DAY = Tage
+PeriodUnit.HOUR = Stunden
+PeriodUnit.MINUTE = Minuten
+PeriodUnit.MONTH = Monate
+PeriodUnit.WEEK = Wochen
+PeriodUnit.YEAR = Jahre
+plugins/latex/LatexNodeHook.editorTitle = Latex bearbeiten
+plugins/script_filter = Skript Filter {0}
+plugins/script_filter_error = {0} soll einen Boolean zur\u00fcckgeben von {1}. Der R\u00fcckgabewert ist aber {2}
+plugins/ScriptEditor.cancel = \u00c4nderungen Verwerfen und &abbrechen
+plugins/ScriptEditor.exit = \u00c4nderungen &speichern und schlie\u00dfen
+plugins/ScriptEditor.FORBIDDEN_ACTION = In Freeplane sind Groovy Skripte eingeschr\u00e4nkt. Die folgenden {0,choice,0#File|1#Network|2#Exec} Operationen sind verboten: {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 Programmeinstellungen \u00e4ndern.
+plugins/ScriptEditor.menu_actions = &Aktionen
+plugins/ScriptEditor.new_script = &Neues Script
+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/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 in Auswahl einf\u00fcgen
+plugins/TimeManagement.xml_Cancel = Abbrechen
+plugins/TimeManagement.xml_cancelButton = Abbrechen
+plugins/TimeManagement.xml_closeButton = Schlie\u00dfen
+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 = Wiedervorlage
+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_reminderNode_onlyOneDate = <html>Zur Zeit kann nur ein Datum pro Knoten gespeichert werden.<br><br>Das aktuell eingestellte Datum ist {0,date} {0,time},<br> 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_remindLaterButton = sp\u00e4tere Erinnerung
+plugins/TimeManagement.xml_remindLaterButton_tooltip = sp\u00e4tere Erinnerung
+plugins/TimeManagement.xml_removeReminderButton = Wiedervorlage &entfernen
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Entfernt alle Wiedervorlagen der ausgew\u00e4hlten Knoten.
+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_todayButton = Heute
+plugins/TimeManagement.xml_WindowTitle = Zeit Management
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Suchen & Ersetzen
+preferences = Einstellungen
+print_preview_title = Vorschau
+PrintAction.text = &Drucken...
+PrintDirectAction.text = Drucken
+printing_settings = Druckskalierung
+PrintPreviewAction.text = &Vorschau...
+PropertyAction.dialog = Einstellungen
+PropertyAction.text = Ein&stellungen...
+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
+read_only = Schreibgesch\u00fctzt
+ReadScriptError.text = Fehler beim Lesen des Skripts.\u000aSiehe Logfile zu Details.
+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
+red = Rot
+RedefineStyleAction.text = Vorlage neu festlegen
+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
+RemoveConnectorAction.text = Konnektor entfernen
+RemoveEncryption.text = Knotenpasswort &entfernen
+RemoveFormatAction.text = Ohne Format
+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_question = Die Mindmap konnte nicht gefunden werden. Link von Hand reparieren?
+replace = Ersetzen
+replace_shortcut_question = <html>Dieser Shortcut ist bereits zugewiesen zu: <br/><b>{0}</b><br/> Soll die Zuweisung ge\u00e4ndert werden?</html>
+replace_shortcut_title = Shortcut ersetzen?
+ReportBugAction.text = &Fehler melden...
+RequestFeatureAction.text = &Verbesserungsvorschlag machen...
+reset_to_default = Default benutzen
+ResetNodeLocationAction.text = &Position zur\u00fccksetzen
+ResetStyleAction.text = Knotenstil zur\u00fccksetzen
+RevertAction.text = Wieder&herstellung aus lokaler Historie...
+RevisionPluginAction.text = &\u00c4nderungen markieren
+save_failed = Der Versuch, {0} zu speichern, ist fehlgeschlagen.
+save_unsaved = Soll die folgende Mindmap gespeichert werden? :
+save_unsaved_styles = Knotenstile speichern?
+SaveAcceleratorPresetsAction.text = Satz speichern...
+SaveAction.text = &Speichern
+SaveAll.text = &Alle speichern...
+SaveAll.tooltip = Speichert alle ge\u00f6ffneten Mindmaps
+SaveAsAction.text = Speichern &unter...
+saved = Mindmap wurde gespeichert.
+saving_canceled = Speicher Vorgang abgebrochen
+scanners_not_loaded = Scanner konnten nicht geladen werden. Datei korrupt.
+scheme_evaluate = Evaluate!
+script_execution_disabled = Ausf\u00fchrung von Skripten ist deaktiviert, s. Extras/Einstellungen/Plugins
+ScriptEditor.text = Skript&editor...
+ScriptEditor.tooltip = Erm\u00f6glicht es Freeplane \u00fcber Skripte zu steuern.
+ScriptEditorPanel.changed_cancel = Die Skripte wurden ver\u00e4ndert. Wollen Sie wirklich abbrechen?
+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.
+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...
+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 Notiz-Editor
+set_accelerator_on_next_click_action = Auf einen Men\u00fceintrag klicken, um ShortCut zuzuweisen
+SetAcceleratorOnNextClickAction.text = ShortCut &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>
+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...
+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
+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 \u00e4ndern...
+ShowFormatPanel.tooltip = Dialog, in dem Knoten- und Kantenformate auf einmal ge\u00e4ndert werden k\u00f6nnen.
+ShowHideNoteAction.text = &Editor einblenden
+ShowHideNoteAction.tooltip = Damit kann man das Notizfenster verbergen bzw. wieder anzeigen.
+ShowNextChildAction.text = N\u00e4chsten Unterknoten anzeigen
+ShowNotesInMapAction.text = permanent &einblenden
+ShowSelectedAttributesAction.text = Nur ausge&w\u00e4hlte anzeigen
+ShowSelectionAsRectangleAction.text = &Rechteck als Auswahlmarkierung
+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 = Schlie\u00dfen
+simplyhtml.closeBtnName = Schlie\u00dfen
+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.matchApproximately = \u00C4hnlichkeitssuche
+simplyhtml.matchApproximately.tooltip = <html>Gibt an, ob approximative Treffer angezeigt werden sollen,<br/>z.B. Suche nach 'files' findet 'flies'.</html>
+simplyhtml.matchCase = Gro\u00df-/Kleinschreibung
+simplyhtml.matchCase.tooltip = Gibt an, ob Gro\u00df/Kleinschreibung bei der Suche beachtet werden soll.
+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.pasteHTMLLabel = Einf\u00fcgen als HTML
+simplyhtml.pasteLabel = Einf\u00fcgen
+simplyhtml.pastePlainTextLabel = Einf\u00fcgen als Text
+simplyhtml.pasteTip = Einf\u00fcgen
+simplyhtml.plainName = Standard
+simplyhtml.previewLabel = &Vorschau
+simplyhtml.previewText = Dies ist ein Test
+simplyhtml.prevTableCellLabel = Vorige Zelle
+simplyhtml.printLabel = Drucken...
+simplyhtml.redoLabel = Wiederherstellen
+simplyhtml.redoTip = Wiederholen
+simplyhtml.replace = Ersetzen...
+simplyhtml.replaceAll = Alles
+simplyhtml.replaceDone = Fertig
+simplyhtml.replaceNo = Nein
+simplyhtml.replaceThisQuery = Ersetzen
+simplyhtml.replaceWith = Ersetzen mit:
+simplyhtml.replaceYes = Ja
+simplyhtml.rightLabel = Rechts:
+simplyhtml.searchDown = Nach unten suchen
+simplyhtml.searchDown.tooltip = Von oben nach unten suchen.
+simplyhtml.searchFromStart = Vom Anfang an suchen
+simplyhtml.searchFromStart.tooltip = Von Anfang an (und nicht ab der Cursorposition) suchen.
+simplyhtml.searchUp = Nach oben suchen
+simplyhtml.searchUp.tooltip = Von unten 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
+simplyhtml.wholeWordsOnly.tooltip = Treffer auf ganze W?rter beschr?nken.
+SortNodes.text = Unterknoten alphabetisch &sortieren
+SortNodes.tooltip = Alle Unterknoten eines Knotens alphabetisch sortieren
+split = &Teilen
+SplitConditionAction.text = Aufteilen
+SplitNode.text = Text &aufteilen
+SplitNode.tooltip = <html>Knoteninhalt wird auf mehrere Knoten verteilt.</html>
+STANDARD_FORMAT = Standard
+stop_processing = Stop
+StringFlavorHandler = Knotenhierarchie als einfacher Text
+StructuredHtmlFlavorHandler = Knotenhierarchie als HTML
+style = Stil
+style_already_exists = Dieser Knotenstil existiert bereits.
+styledialog.cancel.text = Abbrechen
+styledialog.ok.text = OK
+styles = Knoten&stile
+styles.AutomaticLayout = Automatisches Layout
+styles.connection = Verbindung
+styles.date = Datum
+styles.definition = Definition
+styles.description = Beschreibung
+styles.floating_node = Schwebender Knoten
+styles.idea = Idee
+styles.important = Wichtig
+styles.key = Schl\u00fcssel
+styles.list = Liste
+styles.needs_action = Handlungsbedarf
+styles.note = Notiz
+styles.ok = OK
+styles.pending = Unerledigt
+styles.predefined = Standard Knotenstile
+styles.question = Frage
+styles.quotation = Zitat
+styles.root_node = Knotenstile
+styles.subsubtopic = Unterunterbegriff
+styles.subtopic = Unterbegriff
+styles.topic = Oberbegriff
+styles.user-defined = Benutzerdefinierte Knotenstile
+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
+svg = SVG
+template_dir = Standard Vorlagen
+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 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
+ToggleStatusAction.text = Statuszeile anzeigen
+ToggleToolbarAction.text = &Werkzeuge
+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
+unfold = Entfalten
+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>
+up = Auf
+update_failed = Update ist fehlgeschlagen mit der Meldung {0}
+UpdateCheckAction.text = Auf &Updates pr\u00fcfen...
+updatecheckdialog = Updatepr\u00fcfung
+url_error = Fehler: Diese URL ist fehlerhaft.
+url_open_error = Die URL {0} konnte nicht geladen werden.
+used_in_menu = Dieser Shortcut kann nicht gesetzt werden, da er bereits im Men\u00fc verwendet wird.
+UsePlainTextAction.text = Nur reiner &Text
+user_config_folder = Benutzerkonfiguration: {0}
+user_defined_scale = Benutzerdefinierte &Gr\u00f6\u00dfe
+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
+WebDocuAction.text = Web Dokumentation
+width = Breite
+wrong_regexp = Der Regul\u00e4re Ausdruck "{0}" ist fehlerhaft (Fehler {1})
+xslt_export.html = Html Dokument
+xslt_export.latex = LaTex Dokument
+xslt_export.latexbook = LaTex Buch
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 aufw\u00e4rts) XML format
+xslt_export.ms_project = MS Project (2003 aufw\u00e4rts) XML format
+xslt_export.ms_word = Word (2003 aufw\u00e4rts) XML format
+xslt_export.text = Klartext
+xslt_export_not_possible = Freeplane XSLT Export nicht m\u00f6glich
+yes = Ja
+ZoomInAction.text = Zoom &+
+ZoomOutAction.text = Zoom &-
diff --git a/freeplane/resources/translations/Resources_el.properties b/freeplane/resources/translations/Resources_el.properties
new file mode 100644
index 0000000..ab886ba
--- /dev/null
+++ b/freeplane/resources/translations/Resources_el.properties
@@ -0,0 +1,873 @@
+AboutAction.text = \u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = \u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C4\u03C9\u03BD \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = \u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C0\u03C1\u03BF\u03C4\u03CD\u03C0\u03BF\u03C5
+accessories/plugins/EncryptNode.properties_0 = \u0395\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03B3\u03B9\u03B1 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03B7\u03BC\u03AD\u03BD\u03B1
+accessories/plugins/EncryptNode.properties_1 = \u039F\u03B9 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03AF \u03B4\u03B5\u03BD \u03C3\u03C5\u03BC\u03C0\u03AE\u03C0\u03C4\u03BF\u03C5\u03BD \u03AE \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03C5 \u03C3\u03CD\u03BD\u03C4\u03BF\u03BC\u03BF\u03B9.
+accessories/plugins/EncryptNode.properties_2 = \u0394\u03CE\u03C3\u03B5 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF:
+accessories/plugins/EncryptNode.properties_3 = \u0395\u03C0\u03B1\u03BD\u03AD\u03BB\u03BB\u03B1\u03B2\u03B5 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC:
+accessories/plugins/EncryptNode.properties_4 = \u0394\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u039A\u03C9\u03B4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2:
+accessories/plugins/EncryptNode.properties_5 = <html>\u039D\u03B1 \u03B8\u03C5\u03BC\u03AC\u03C3\u03C4\u03B5, \u03B7 \u03B1\u03C3\u03C6\u03AC\u03BB\u03B5\u03B9\u03B1 \u03C4\u03B7\u03C2 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B9\u03C3\u03B7\u03C2<br> \u03B5\u03BE\u03B1\u03C1\u03C4\u03AC\u03C4\u03B1\u03B9 \u03C3\u03C7\u03B5\u03B4\u03CC\u03BD \u03B1\u03C0\u03BF\u03BA\u03BB\u03B5\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC \u03B1\u03C0\u03BF \u03C4\u03B7\u03BD \u03C0\u03BF\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C4\u03BF\u03C5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD.
+accessories/plugins/EncryptNode.properties_6 = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+accessories/plugins/EncryptNode.properties_7 = \u0391\u03BA\u03C5\u03C1\u03BF
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = \u039C\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03BD\u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B9\u03C3\u03B7\u03C2 \u03B5\u03BD\u03CC\u03C2 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5. \u0393\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03C4\u03AD\u03C4\u03BF\u03B9\u03BF\u03C5 \u03BA\u03BF\u03BC\u03B2\u03BF\u03C5, \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 \u03C4\u03BF \u03BC\u03B5\u03BD\u03BF\u03CD \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD.
+accessories/plugins/EncryptNode.properties_select_me = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03AD \u03BC\u03B5 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B5\u03C7\u03AF\u03C3\u03BF\u03C5\u03BC\u03B5!
+accessories/plugins/EncryptNode.properties_wrong_password = \u039F \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C3\u03C9\u03C3\u03C4\u03CC\u03C2.
+accessories/plugins/ExportWithXSLT.tooltip = \u0391\u03C5\u03C4\u03AE \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03AF\u03B1 \u03BF\u03BC\u03BF\u03B9\u03CC\u03BC\u03BF\u03C1\u03C6\u03B7 \u03BC\u03AD\u03B8\u03BF\u03B4\u03BF\u03C2 \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03BC\u03B5 \u03C4\u03B7 \u03C7\u03C1\u03AE\u03C3\u03B7 XSLT scripts.
+accessories/plugins/ExportWithXSLT_Applet.text = \u03C9\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AF\u03B4\u03B9\u03BF java...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = \u0395\u03BE\u03AC\u03B3\u03B5\u03B9 \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C9\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AF\u03B4\u03B9\u03BF java.
+accessories/plugins/ExportWithXSLT_Flash.text = \u03C9\u03C2 Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = \u0395\u03BE\u03AC\u03B3\u03B5\u03B9 \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C9\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE flash.
+accessories/plugins/ExportWithXSLT_HTML.text = \u03A9\u03C2 XHTML (\u03B5\u03BA\u03B4\u03BF\u03C7\u03AE JavaScript )...
+accessories/plugins/ExportWithXSLT_HTML3.text = \u03A9\u03C2 XHTML (Clickable map image version)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = \u03A0\u03CC\u03C1\u03BF\u03B9 \u03B1\u03C0\u03BF \u03C4\u03BF\u03BD RESOURCES \u03C3\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF TaskJuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>\u0395\u03BE\u03AC\u03B3\u03B5\u03B9 \u03C0\u03CC\u03C1\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF RESOURCES \u03C3\u03C4\u03BF Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = \u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B5\u03C2 \u03B1\u03C0\u03BF TASKS \u03C3\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF TaskJuggler ...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>\u0395\u03BE\u03AC\u03B3\u03B5\u03B9 \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B5\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF TASKS \u03C3\u03B5 Taskjuggler. </html>
+add = \u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C3\u03B5
+AddLocalLinkAction.text = \u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C0\u03B9\u03BA\u03AE\u03C2 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\u03C2
+antialias_all = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7: \u039F\u03BB\u03B1
+antialias_edges = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7: \u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+antialias_none = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7: \u0391\u03BD\u03B5\u03BD\u03B5\u03C1\u03B3\u03AE
+apply = \u0395\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE
+ApplyAction.text = \u0395\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE
+ApplyFormatPlugin.text = \u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2...
+ApplyFormatPlugin.tooltip = \u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03B4\u03B9\u03AC\u03BB\u03BF\u03B3\u03BF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C4\u03B1\u03C5\u03C4\u03CC\u03C7\u03C1\u03BF\u03BD\u03B7 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03C9\u03BD \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2.
+ApplyNoFilteringAction.text = \u03A7\u03C9\u03C1\u03AF\u03C2 \u03C6\u03AF\u03BB\u03C4\u03C1\u03BF
+as_parent = \u03A9\u03C2 \u03B3\u03BF\u03BD\u03AD\u03B1\u03C2
+AssignAttributesAction.text = \u0391\u03BD\u03AC\u03B8\u03B5\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD...
+attribute_delete = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C4\u03B9\u03BC\u03CE\u03BD
+attribute_delete_value = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1\u03C2 \u03C4\u03B9\u03BC\u03AE\u03C2
+attribute_font_size_tooltip = \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD
+attribute_list_box_label_text = \u03A5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03C3\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2
+attribute_replace = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BC\u03B5
+attribute_top = \u038C\u03BB\u03B1 \u03C4\u03B1 \u03B3\u03BD\u03C9\u03C3\u03C4\u03AC \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC \u03B3\u03B9\u03B1 \u03C4\u03B1 \u03B1\u03BD\u03BF\u03B9\u03BA\u03C4\u03AC \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1
+attributes_adding_empty_attribute_error = \u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BA\u03B5\u03BD\u03CC
+attributes_all = \u038C\u03BB\u03B1 \u03C4\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+attributes_attribute = \u03A7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+attributes_close = \u039A\u03BB\u03B5\u03AF\u03C3\u03B5
+attributes_deselect_all = \u03A4\u03AF\u03C0\u03BF\u03C4\u03B5
+attributes_dialog_title = Attribute Manager[translate me]
+attributes_edit = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1
+attributes_edit_tooltip = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03C5\u03BD\u03CC\u03BB\u03BF\u03C5
+attributes_for_selected = \u0395\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03B9 \u03BA\u03CC\u03BC\u03B2\u03BF\u03B9
+attributes_for_visible = \u038C\u03BB\u03BF\u03B9 \u03BF\u03B9 \u03BF\u03C1\u03B1\u03C4\u03BF\u03AF \u03BA\u03CC\u03BC\u03B2\u03BF\u03B9
+attributes_import = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
+attributes_import_tooltip = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03B1\u03C0\u03CC \u03AC\u03BB\u03BB\u03B1 \u03B1\u03BD\u03BF\u03B9\u03BA\u03C4\u03AC \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1
+attributes_no_import_candidates_found = \u0392\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD \u03BD\u03AD\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+attributes_popup_delete = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE
+attributes_popup_down = \u039A\u03AC\u03C4\u03C9
+attributes_popup_edit = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1
+attributes_popup_hide = \u039A\u03C1\u03CD\u03C8\u03B5
+attributes_popup_new = \u039D\u03AD\u03BF \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC
+attributes_popup_optimal_width = \u0392\u03AD\u03BB\u03C4\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2
+attributes_popup_up = \u03A0\u03AC\u03BD\u03C9
+attributes_refresh = \u0391\u03BD\u03B1\u03BD\u03AD\u03C9\u03C3\u03B7
+attributes_restricted_attributes_tooltip = \u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD
+attributes_restricted_values_tooltip = \u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF \u03C4\u03B9\u03BC\u03CE\u03BD \u03B3\u03B9\u03B1 \u03C4\u03BF \u03C4\u03C1\u03AD\u03C7\u03C9\u03BD \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC
+attributes_restriction = \u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF
+attributes_select_all = \u038C\u03BB\u03B1
+attributes_select_all_tooltip = \u0395\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03CC\u03BB\u03B1
+attributes_show = \u0394\u03B5\u03AF\u03BE\u03B5
+attributes_skip_root = \u03A0\u03B1\u03C1\u03AC\u03BB\u03B5\u03B9\u03C8\u03B7 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+attributes_visible = \u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF
+attributes_visible_tooltip = \u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF
+automatically_save_message = \u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03C4\u03B7\u03BA\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 (\u03BC\u03B5 \u03C7\u03C1\u03AE\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 {0}) ...
+AutomaticLayoutAction.text = \u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03C4\u03BF\u03C0\u03BF\u03B8\u03AD\u03C4\u03B7\u03C3\u03B7
+AutomaticLayoutAction.tooltip = <html>\u0394\u03B9\u03BF\u03C1\u03B8\u03CE\u03BD\u03B5\u03B9 \u03C4\u03B7\u03BD \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03B5\u03BD\u03CC\u03C2 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2. <br>\u03A4\u03BF \u03C0\u03C1\u03CE\u03C4\u03BF \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03B3\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B1\u03CD\u03C1\u03BF, \u03C4\u03BF \u03B4\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF \u03B3\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03BC\u03C0\u03BB\u03AD, \u03BA.\u03BB.\u03C0.</html>
+BackAction.text = \u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE
+background = \u03A5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = \u0391\u03C0\u03B1\u03C3\u03C4\u03C1\u03AC\u03C0\u03C4\u03C9\u03BD \u039A\u03CC\u03BC\u03B2\u03BF\u03C2
+BlinkingNodeHookAction.tooltip = <html>\u039A\u03AC\u03BD\u03B5\u03B9 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF \u03BD\u03B1 \u03B1\u03BD\u03B1\u03B2\u03BF\u03C3\u03B2\u03AE\u03BD\u03B5\u03B9. \u0391\u03BB\u03BB\u03AC \u03C0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE. \u039C\u03AE \u03C4\u03BF \u03C3\u03C7\u03B5\u03C4\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C0\u03BF\u03BB\u03BB\u03BF\u03CD\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2, \u03BA\u03B1\u03B9 <strong> \u03BF\u03C7\u03B9 \u03BC\u03B5 \u03AC\u03BB\u03BB\u03B5\u03C2 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B5\u03C2 \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9\u03C2 \u03C3\u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF</strong></html>
+BoldAction.text = \u00A8\u0395\u03BD\u03C4\u03BF\u03BD\u03B1
+boldify_branch = \u039A\u03AC\u03BD\u03B5 \u03AD\u03BD\u03C4\u03BF\u03BD\u03B1
+branch = \u0394\u03B9\u03B1\u03BA\u03BB\u03AC\u03B4\u03C9\u03C3\u03B7
+cancel = \u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7
+CancelAction.text = \u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7
+cannot_add_parent_diff_parents = \u0393\u03B9\u03B1 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1, \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BF\u03BB\u03BF\u03B9 \u03BF\u03B9 \u03BA\u03CC\u03BC\u03B2\u03BF\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03B3\u03BF\u03BD\u03AD\u03B1.
+cannot_add_parent_to_root = \u039F \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF \u03C3\u03B5 \u03BD\u03AD\u03BF \u03B3\u03BF\u03BD\u03AD\u03B1.
+cannot_join_nodes_with_children = \u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03BD\u03C9\u03B8\u03B5\u03AF \u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03BC\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2
+cannot_move_to_child = \u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03CE \u03BD\u03B1 \u03BC\u03B5\u03C4\u03B1\u03BA\u03B9\u03BD\u03AE\u03C3\u03C9 \u03AD\u03BD\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03B1\u03C0\u03CC \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5.
+CenterAction.text = \u03A3\u03C4\u03BF \u03BA\u03AD\u03BD\u03C4\u03C1\u03BF
+ChangeConnectorArrowsAction.backward.text = \u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE
+ChangeConnectorArrowsAction.forward.text = \u0395\u03BC\u03C0\u03C1\u03CC\u03C2
+ChangeNodeLevelLeftsAction.text = \u039A\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC
+ChangeNodeLevelRightsAction.text = \u039A\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC
+choose_background_color = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5:
+choose_cloud_color = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C7\u03C1\u03CE\u03BC\u03B1 \u03BD\u03AD\u03C6\u03BF\u03C5\u03C2:
+choose_edge_color = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+choose_node_background_color = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF:
+choose_node_color = \u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5:
+CloseAction.text = \u039A\u03BB\u03B5\u03AF\u03C3\u03B5
+CloudAction.text = \u039D\u03AD\u03C6\u03BF\u03C2
+CloudColorAction.text = \u03A7\u03C1\u03CE\u03BC\u03B1 \u039D\u03AD\u03C6\u03BF\u03C5\u03C2...
+ColorProperty.ResetColor = \u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2
+combined = \u03A3\u03C5\u03BD\u03B4\u03C5\u03B1\u03C3\u03BC\u03CC\u03C2
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = \u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE
+CopySingleAction.text = \u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03BD\u03CC\u03C2
+CreationModificationPluginAction.text = \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03CE\u03C1\u03B1\u03C2 \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2
+CreationModificationPluginAction.tooltip = <html>\u0397 \u03C3\u03C5\u03BD\u03AC\u03C1\u03C4\u03B7\u03C3\u03B7 \u03B1\u03C5\u03C4\u03AE, \u03BA\u03C1\u03B1\u03C4\u03AC \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC \u03B3\u03B9\u03B1 \u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C5\u03C2 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C4\u03C9\u03BD \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD.</html>
+CutAction.text = \u0391\u03C0\u03BF\u03BA\u03BF\u03C0\u03AE
+decrease_branch_font_size = \u039C\u03B9\u03BA\u03C1\u03CC\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+DecreaseNodeFontAction.text = \u039C\u03B9\u03BA\u03C1\u03CC\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+delete = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE
+delete_child = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03BA\u03BF\u03BC\u03B2\u03BF\u03C5
+DeleteAction.text = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+DeleteConditionAction.text = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE
+DocumentationAction.text = \u03A4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7
+edge = \u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+edge_style = \u039C\u03BF\u03C1\u03C6\u03AE \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+edge_width = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+EdgeColorAction.text = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = \u0393\u03C1\u03B1\u03BC\u03BC\u03B9\u03BA\u03AE
+EdgeStyleAction.sharp_bezier.text = \u0391\u03C0\u03CC\u03C4\u03BF\u03BC\u03BF\u03C2 Bezier
+EdgeStyleAction.sharp_linear.text = \u0391\u03C0\u03CC\u03C4\u03BF\u03BC\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B9\u03BA\u03CC\u03C2
+EdgeStyleAsParentAction.text = \u03A9\u03C2 \u03B3\u03BF\u03BD\u03AD\u03B1\u03C2
+EdgeWidthAction_width_parent.text = \u0393\u03BF\u03BD\u03AD\u03B1\u03C2
+EdgeWidthAction_width_thin.text = \u039B\u03B5\u03C0\u03C4\u03CC
+edit = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1
+edit.decision = HTML Editor[translate me]
+edit_link_manually = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD ...
+EditAction.text = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+EditAttributesAction.text = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD
+EditFilterAction.text = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1
+EditLongAction.text = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 ...
+EncryptedMap.text = \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C7\u03AC\u03C1\u03C4\u03B7 ...
+EncryptedMap.tooltip = \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C7\u03AC\u03C1\u03C4\u03B7
+enter_base_url = \u03A0\u03C1\u03CC\u03BA\u03B5\u03B9\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BA\u03BF\u03BB\u03AE\u03C3\u03C9 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AD\u03C2 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03B5\u03B9\u03C2. \u0394\u03CE\u03C3\u03B5 \u03C4\u03BF \u03B2\u03B1\u03C3\u03B9\u03BA\u03CC URL.
+enter_confirms = \u03B5\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03B9\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5 Enter
+EnterPassword.text = \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5
+error = \u039B\u03AC\u03B8\u03BF\u03C2
+error_applying_template = \u039B\u03AC\u03B8\u03BF\u03C2 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03C0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF\u03C5 XSL.
+error_creating_directory = \u0394\u03B5\u03BD \u03B5\u03B9\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03AE \u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BA\u03B1\u03C4\u03B1\u03BB\u03CC\u03B3\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE
+ExportBranchToHTMLAction.text = \u0394\u03B9\u03B1\u03BA\u03BB\u03AC\u03B4\u03C9\u03C3\u03B7 \u03C3\u03B5 HTML
+ExportPdf.text = \u03C9\u03C2 PDF...
+ExportSvg.text = \u03C9\u03C2 SVG...
+ExportToHTMLAction.text = \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE HTML
+ExportToImage.jpg.text = \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE JPEG...
+ExportToImage.png.text = \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE PNG...
+ExportToOoWriter.text = \u03A9\u03C2 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03C4\u03BF\u03C5 Open Office Writer ...
+ExportToOoWriter.tooltip = Unfolded nodes form the structure, folded nodes the content of the document.
+extension_menu = \u03A6\u03C5\u03C3\u03B9\u03BA\u03AE \u039C\u03BF\u03C1\u03C6\u03AE
+f_button_unassigned = <no action>[translate me]
+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
+file_already_exists = \u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF {0} \u03C5\u03C0\u03B1\u03C1\u03C7\u03B5\u03B9. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5?
+file_not_found = \u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF {0} \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5
+filter = \u03A6\u03AF\u03BB\u03C4\u03C1\u03BF
+filter_add = \u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C3\u03B5
+filter_and = \u039A\u03B1\u03B9
+filter_conditions = \u03A6\u03AF\u03BB\u03C4\u03C1\u03B1
+filter_contains = \u03A0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9
+filter_delete = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE
+filter_dialog = \u03A3\u03C5\u03BD\u03B8\u03AD\u03C3\u03B7 \u03C6\u03AF\u03BB\u03C4\u03C1\u03BF\u03C5
+filter_does_not_exist = \u0394\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9
+filter_edit_description = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C6\u03AF\u03BB\u03C4\u03C1\u03C9\u03BD
+filter_enter_value = \u0394\u03CE\u03C3\u03B5 \u03C4\u03B9\u03BC\u03AE
+filter_exist = \u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9
+filter_icon = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF
+filter_is_equal_to = \u0395\u03AF\u03BD\u03B1\u03B9 \u03AF\u03C3\u03BF \u03BC\u03B5
+filter_is_not_equal_to = \u0394\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AF\u03C3\u03BF \u03BC\u03B5
+filter_link = Hyperlink[translate me]
+filter_no_filtering = \u03A7\u03C9\u03C1\u03AF\u03C2 \u03C6\u03AF\u03BB\u03C4\u03C1\u03BF
+filter_node = \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+filter_not = \u039F\u03C7\u03B9
+filter_or = \u0389
+filter_select = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
+filter_selected_node_view = \u0395\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03B9 \u03BA\u03CC\u03BC\u03B2\u03BF\u03B9
+find_what = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C4\u03B9
+FindAction.text = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 ...
+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
+FitToPage.text = \u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03C3\u03C4\u03B1 \u03CC\u03C1\u03B9\u03B1 \u03C4\u03B7\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2
+FitToPage.tooltip = \u03A1\u03C5\u03B8\u03BC\u03AF\u03B6\u03B5\u03B9 \u03C4\u03B7\u03BD \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03AD\u03C4\u03C3\u03B9 \u03CE\u03C3\u03C4\u03B5 \u03BF\u03BB\u03CC\u03BA\u03BB\u03B7\u03C1\u03BF \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03BD\u03B1 \u03C7\u03C9\u03C1\u03AC\u03B5\u03B9 \u03C3\u03C4\u03BF \u03C4\u03C1\u03AD\u03C7\u03C9\u03BD \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF.
+fold = \u0394\u03AF\u03C0\u03BB\u03C9\u03C3\u03B5
+FoldAllAction.text = \u03A3\u03CD\u03BC\u03C0\u03C4\u03C5\u03BE\u03B7/\u03B4\u03AF\u03C0\u03BB\u03C9\u03BC\u03B1 \u03CC\u03BB\u03C9\u03BD
+FoldAllAction.tooltip = <html>\u0394\u03B9\u03C0\u03BB\u03CE\u03BD\u03B5\u03B9/\u03A3\u03C5\u03BC\u03C0\u03C4\u03AF\u03C3\u03B5\u03B9 \u03C4\u03BF\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF \u03BA\u03B1\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5.</html>
+FoldOneLevelAction.text = \u03A3\u03CD\u03BC\u03C0\u03C4\u03C5\u03BE\u03B7 \u03AD\u03BD\u03B1 \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF
+FoldOneLevelAction.tooltip = <html>\u0394\u03B9\u03C0\u03BB\u03CE\u03BD\u03B5\u03B9/\u03A3\u03C5\u03BC\u03C0\u03C4\u03AE\u03C3\u03B5\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2 \u03BA\u03B1\u03C4\u03AC \u03AD\u03BD\u03B1 \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF.</html>
+FollowLinkAction.text = \u0391\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5:
+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_menu_edge_styles = \u039C\u03BF\u03C1\u03C6\u03AE \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+format_menu_edge_widths = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+FormatCopy.text = \u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2
+FormatCopy.tooltip = <html>\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03AC\u03C6\u03B5\u03B9 \u03C4\u03B7 \u03BC\u03BF\u03C1\u03C6\u03AE \u03B5\u03BD\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5.</html>
+FormatPaste.text = \u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03B9\u03C3\u03B7 \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2
+FormatPaste.tooltip = <html>\u0395\u03C0\u03B9\u03BA\u03BF\u03BB\u03AC \u03C4\u03B7\u03BD \u03BC\u03BF\u03C1\u03C6\u03AE \u03B5\u03BD\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5.</html>
+ForwardAction.text = \u0395\u03BC\u03C0\u03C1\u03CC\u03C2
+Freeplane.progress.buildScreen = \u039A\u03B1\u03C4\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE \u03BF\u03B8\u03CC\u03BD\u03B7\u03C2...
+Freeplane.progress.createController = \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B5\u03BB\u03B5\u03B3\u03BA\u03C4\u03AE...
+Freeplane.progress.createInitialMode = \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03C4\u03C1\u03CC\u03C0\u03BF\u03C5...
+Freeplane.progress.endStartup = \u03A4\u03AD\u03BB\u03BF\u03C2 \u03B5\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7\u03C2.
+Freeplane.progress.gettingPreferenceDirectories = \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7 \u03BA\u03B1\u03C4\u03B1\u03BB\u03CC\u03B3\u03BF\u03C5 \u03C0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03C9\u03BD...
+Freeplane.progress.gettingPreferences = \u0391\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7 \u03C0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03C9\u03BD...
+Freeplane.progress.loadMaps = \u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03BC\u03BC\u03AC\u03C4\u03C9\u03BD...
+Freeplane.progress.propagateLookAndFeel = \u039C\u03B5\u03C4\u03AC\u03B4\u03BF\u03C3\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03B1\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7\u03C2...
+Freeplane.progress.settingPreferences = \u03A1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03C9\u03BD...
+Freeplane.progress.startCreateController = \u0395\u03BD\u03B1\u03C1\u03BE\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 \u03B5\u03BB\u03B5\u03B3\u03BA\u03C4\u03AE...
+Freeplane.progress.updateLookAndFeel = \u0391\u03BD\u03B1\u03BD\u03AD\u03C9\u03C3\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03B1\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7\u03C2...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = \u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1...
+FreeplaneHelpStarter.tooltip = \u0395\u03C0\u03B1\u03C5\u03BE\u03B7\u03BC\u03AD\u03BD\u03B7 \u03B2\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 \u03C4\u03BF\u03C5 Freeplane
+GotoLinkNodeAction.text = \u03A0\u03AE\u03B3\u03B1\u03B9\u03BD\u03B5 \u03C3\u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7
+GrabKeyDialog.common.cancel = \u0391\u03BA\u03C5\u03C1\u03BF
+GrabKeyDialog.common.ok = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+GrabKeyDialog.grab-key.assigned-to = \u0391\u03BD\u03B1\u03C4\u03AD\u03B8\u03B7\u03BA\u03B5 \u03C3\u03B5
+GrabKeyDialog.grab-key.assigned-to.none = \u03A7\u03C9\u03C1\u03AF\u03C2 \u03B1\u03BD\u03AC\u03B8\u03B5\u03C3\u03B7 (\u03B1\u03BA\u03CC\u03BC\u03B1!)
+GrabKeyDialog.grab-key.clear = \u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2
+GrabKeyDialog.grab-key.remove = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+GrabKeyDialog.grab-key.remove-ask = \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03C3\u03B5\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03C0\u03BB\u03B7\u03BA\u03C4\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03C3\u03B7?
+GrabKeyDialog.grab-key.title = \u0394\u03CE\u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF
+help = \u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1
+HideAllAttributesAction.text = \u039A\u03C1\u03CD\u03C8\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+HierarchicalIconsAction.text = \u0394\u03B5\u03AF\u03C7\u03BD\u03B5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1 \u03B9\u03B5\u03C1\u03B1\u03C1\u03C7\u03B9\u03BA\u03AC
+HierarchicalIconsAction.tooltip = \u0395\u03AC\u03BD \u03AD\u03BD\u03B1\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2 \u03BC\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF, \u03B8\u03B1 \u03C4\u03BF \u03B4\u03B5\u03AF\u03C7\u03BD\u03C9 \u03C3\u03B5 \u03BC\u03B9\u03BA\u03C1\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1 \u03BA\u03B1\u03B9 \u03B5\u03B3\u03CE.
+html_export_based_on_headings = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE HTML - \u0392\u03B1\u03C3\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03C3\u03C4\u03B9\u03C2 \u03B5\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B5\u03C2
+html_export_fold_all = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE HTML - \u039F\u03BB\u03B1 \u03B4\u03B9\u03C0\u03BB\u03C9\u03BC\u03AD\u03BD\u03B1
+html_export_fold_currently_folded = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE HTML - \u03C3\u03C4\u03B7\u03BD \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03B1\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7\u03C2
+html_export_no_folding = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE HTML - \u03C3\u03B5 \u03C0\u03BB\u03AE\u03C1\u03B7 \u03B1\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7
+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]
+icon_attach = \u039A\u03BF\u03AF\u03C4\u03B1 \u03B5\u03B4\u03CE
+icon_back = \u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE
+icon_bee = Freeplane[translate me]
+icon_bell = \u03A5\u03C0\u03BF\u03BC\u03BD\u03B7\u03C3\u03B7
+icon_bookmark = \u0391\u03C1\u03B9\u03C3\u03C4\u03BF
+icon_broken-line = Broken[translate me]
+icon_button_cancel = \u039F\u03C7\u03B9 \u03B5\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+icon_button_ok = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+icon_calendar = \u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
+icon_clanbomber = \u0395\u03C0\u03B9\u03BA\u03AF\u03BD\u03B4\u03C5\u03BD\u03BF
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = \u039C\u03AE\u03BD \u03BE\u03B5\u03C7\u03AC\u03C3\u03B5\u03B9\u03C2
+icon_down = \u039A\u03AC\u03C4\u03C9
+icon_family = \u039F\u03B9\u03BA\u03BF\u03B3\u03AD\u03BD\u03B5\u03B9\u03B1
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = \u03A3\u03B7\u03BC\u03B1\u03AF\u03B1
+icon_folder = Folder[translate me]
+icon_forward = \u0395\u03BC\u03C0\u03C1\u03CC\u03C2
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 1
+icon_full-2 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 2
+icon_full-3 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 3
+icon_full-4 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 4
+icon_full-5 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 5
+icon_full-6 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 6
+icon_full-7 = \u03A0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 7
+icon_gohome = \u03A3\u03C0\u03AF\u03C4\u03B9
+icon_help = \u0395\u03C1\u03CE\u03C4\u03B7\u03C3\u03B7
+icon_idea = \u0388\u03BC\u03C0\u03BD\u03B5\u03C5\u03C3\u03B7
+icon_kaddressbook = \u03A4\u03B7\u03BB\u03AD\u03C6\u03C9\u03BD\u03BF
+icon_kmail = E-Mail[translate me]
+icon_knotify = \u039C\u03BF\u03C5\u03C3\u03B9\u03BA\u03AE
+icon_korn = \u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03BA\u03B9\u03B2\u03CE\u03C4\u03B9\u03BF
+icon_ksmiletris = \u0395\u03AF\u03BC\u03B1\u03B9 \u03C7\u03B1\u03C1\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF\u03C2
+icon_licq = \u03A9\u03C1\u03B1\u03AF\u03B1
+icon_Mail = \u0391\u03BB\u03BB\u03B7\u03BB\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1
+icon_messagebox_warning = \u03A3\u03B7\u03BC\u03B1\u03BD\u03C4\u03B9\u03BA\u03CC
+icon_password = \u039A\u03BB\u03B5\u03B9\u03B4\u03AF
+icon_pencil = \u03A0\u03C1\u03CC\u03BA\u03B5\u03B9\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03B2\u03B5\u03BB\u03C4\u03B9\u03C9\u03B8\u03B5\u03AF
+icon_penguin = Linux
+icon_smily_bad = \u0394\u03B5\u03BD \u03C0\u03B5\u03C1\u03BD\u03AC\u03C9 \u03BA\u03B1\u03BB\u03AC
+icon_stop = Stop
+icon_up = \u03A0\u03AC\u03BD\u03C9
+icon_wizard = \u039C\u03B1\u03B3\u03B5\u03AF\u03B1
+icon_xmag = \u039D\u03B1 \u03C4\u03BF \u03C3\u03C5\u03B6\u03B7\u03C4\u03AE\u03C3\u03BF\u03C5\u03BC\u03B5
+icon_yes = \u03A3\u03B7\u03BC\u03B1\u03BD\u03C4\u03B9\u03BA\u03CC
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = \u0395\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF...
+IconSelectionPlugin.tooltip = <html>\u0395\u03B4\u03CE \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C2 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03B9\u03C2 \u03BC\u03B9\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03BC\u03B5 \u03C5\u03C0\u03BF\u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF.</html>
+import = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
+import_linked_branch_no_link = \u039F \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03BC\u03BF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B1\u03C0\u03CC \u03B1\u03C5\u03C4\u03CC\u03BD.!
+ImportAction.text = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
+ImportBranchAction.text = \u0394\u03B9\u03B1\u03BA\u03BB\u03AC\u03B4\u03C9\u03C3\u03B7 ...
+ImportExplorerFavoritesAction.text = Explorer Favorites...
+ImportFolderStructureAction.text = \u0394\u03BF\u03BC\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD ...
+ImportLinkedBranchAction.text = \u03A3\u03C5\u03BD\u03B4\u03B5\u03BC\u03AD\u03BD\u03B7 \u03B4\u03B9\u03B1\u03BA\u03BB\u03AC\u03B4\u03C9\u03C3\u03B7
+ImportLinkedBranchWithoutRootAction.text = (\u03A3\u03C5\u03BD\u03B4\u03B5\u03BC\u03AD\u03BD\u03B7 \u03B4\u03B9\u03B1\u03BA\u03BB\u03AC\u03B4\u03C9\u03C3\u03B7) \u03C7\u03C9\u03C1\u03AF\u03C2 \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC...
+ImportMindmanagerFiles.text = \u0394\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 MindManager X5 ...
+increase_branch_font_size = \u039C\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+IncreaseNodeFontAction.text = \u039C\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+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
+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.
+locking_failed_by_open = \u03A4\u03BF \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 {0} \u03B1\u03C0\u03AD\u03C4\u03C5\u03C7\u03B5. \u03A7\u03C1\u03AE\u03C3\u03B7 \u03BC\u03CC\u03BD\u03BF \u03B3\u03B9\u03B1 \u03B1\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7.
+locking_failed_by_save_as = \u03A4\u03BF \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 {0} \u03B1\u03C0\u03AD\u03C4\u03C5\u03C7\u03B5. \u0397 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C9\u03C2 ... \u03B1\u03BA\u03C5\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5.
+locking_old_lock_removed = \u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 {0} \u03BA\u03BB\u03B5\u03B9\u03B4\u03CE\u03B8\u03B7\u03BA\u03B5 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {1}. \u03A4\u03BF \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5 \u03B3\u03B9\u03B1\u03C4\u03AF \u03AE\u03C4\u03B1\u03BD \u03C0\u03B1\u03BB\u03B9\u03CC.
+long_node_changed_cancel = \u0395\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BA\u03C5\u03C1\u03CE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 ?
+long_node_changed_submit = \u0395\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 ?
+lots_of_links_warning = \u0395\u03C7\u03BF\u03C5\u03BD \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03B7\u03B8\u03B5\u03AF \u03C0\u03BF\u03BB\u03BB\u03BF\u03AF \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03BC\u03BF\u03B9 \u03C3\u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03AC \u03CC\u03BB\u03B5\u03C2 \u03B1\u03C5\u03C4\u03AD\u03C2 \u03C4\u03B9\u03C2 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03B5\u03B9\u03C2 ?
+map_already_exists = \u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C4\u03BF \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C8\u03BF\u03C5\u03BC\u03B5 ;
+map_corrupted = \u0394\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03BA\u03B1\u03C4\u03B5\u03C3\u03C4\u03C1\u03B1\u03BC\u03AD\u03BD\u03BF. \u0398\u03AD\u03BB\u03B5\u03B9\u03C2 \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03AD\u03C1\u03B5\u03B9\u03B5\u03C2 ?
+map_locked_by_open = \u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 {0} \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BA\u03B5\u03BB\u03B9\u03B4\u03C9\u03BC\u03AD\u03BD\u03BF \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {1}. \u03A4\u03BF \u03B1\u03BD\u03BF\u03AF\u03B3\u03C9 \u03BC\u03CC\u03BD\u03BF \u03B3\u03B9\u03B1 \u03B1\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7.
+map_locked_by_save_as = \u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 {0} \u03B5\u03B9\u03BD\u03B1\u03B9 \u03BA\u03BB\u03B5\u03B9\u03B4\u03C9\u03BC\u03AD\u03BD\u03BF \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {1}. \u0397 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C9\u03C2 ... \u03B1\u03BA\u03C5\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5.
+map_not_saved = \u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7.
+menu_attributes = \u03A7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+menu_extras = \u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03B1
+menu_file_import = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
+menu_format = \u039C\u03BF\u03C1\u03C6\u03AE
+menu_insert = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
+menu_navigate = \u03A0\u03BB\u03BF\u03AE\u03B3\u03B7\u03C3\u03B7
+menu_view = \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE
+mindmap = \u0394\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+mindmaps = \u0394\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1
+mindmaps_desc = \u0394\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 (*.mm)
+mode_na = \u03A4\u03C1\u03CC\u03C0\u03BF\u03C2 \u03BC\u03AE \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03BF\u03C2
+mode_status = \u039F \u03C4\u03C1\u03CC\u03C0\u03BF\u03C2 \u03AC\u03BB\u03BB\u03B1\u03BE\u03B5 \u03C3\u03C4\u03BF {0}
+mode_title = Freeplane - {0} Mode
+modes = \u03A4\u03C1\u03CC\u03C0\u03BF\u03B9 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+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
+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_mindmap = \u039D\u03AD\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+new_node = \u039D\u03AD\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
+new_node_as_sibling_not_possible_for_the_root = \u039D\u03AD\u03BF\u03C2 \u03C3\u03C5\u03B3\u03B3\u03B5\u03BD\u03AE\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC
+NewChildAction.text = \u039D\u03AD\u03BF\u03C2 \u03B1\u03C0\u03CC\u03B3\u03BF\u03BD\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
+NewMapAction.text = \u039D\u03AD\u03BF
+NewParentNode.text = \u039D\u03AD\u03BF\u03C2 \u03B3\u03BF\u03BD\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
+NewParentNode.tooltip = <html>\u039F\u03BB\u03BF\u03B9 \u03BF\u03B9 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03B9 \u03BA\u03BF\u03BC\u03B2\u03BF\u03B9, \u03C0\u03AC\u03BD\u03B5 \u03C3\u03B5 \u03BD\u03AD\u03BF \u03B3\u03BF\u03BD\u03AD\u03B1.</html>
+NewPreviousSiblingAction.text = \u039D\u03AD\u03BF \u03C0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF\u03C2 \u03B1\u03B4\u03B5\u03C1\u03C6\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
+NewSiblingAction.text = \u039D\u03AD\u03BF\u03C2 \u03B1\u03B4\u03B5\u03C1\u03C6\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
+no = \u039F\u03C7\u03B9
+no_format_copy_before_format_paste = \u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C2 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BA\u03BF\u03BB\u03AE\u03C3\u03B5\u03B9\u03C2 \u03BC\u03AF\u03B1 \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C0\u03C1\u03B9\u03BD \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03AC\u03C8\u03B5\u03B9\u03C2.
+no_found_from = \u0394\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5 \u03C4\u03BF "{0}" \u03B1\u03C0\u03CC \u03C4\u03BF "{1}"
+no_more_found_from = \u0394\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD \u03AC\u03BB\u03BB\u03B1 "{0}" \u03B1\u03C0\u03CC \u03C4\u03BF "{1}".
+no_previous_find = \u0397 \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03AE\u03C4\u03B1\u03BD \u03C7\u03C9\u03C1\u03AF\u03C2 \u03B1\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1.
+node = \u039A\u03CC\u03BC\u03B2\u03BF\u03C2
+node_changed_discard_changes = \u0395\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BA\u03C5\u03C1\u03CE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 ?
+NodeBackgroundColorAction.text = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5...
+NodeColorAction.text = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5...
+NodeColorBlendAction.text = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03BC\u03AF\u03BE\u03B7\u03C2
+NodeDownAction.text = \u039A\u03CC\u03BC\u03B2\u03BF\u03C2 \u03BA\u03AC\u03C4\u03C9
+NodeListAction.text = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BC\u03B5 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7...
+NodeListAction.tooltip = \u0394\u03AF\u03C7\u03BD\u03B5\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2 \u03BC\u03B5 \u03C4\u03B9\u03C2 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B5\u03C2 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2/\u03BC\u03B5\u03C4\u03B1\u03B2\u03BF\u03BB\u03AE\u03C2.
+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
+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_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
+ok = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+OKAction.text = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+OpenAction.text = \u0391\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1...
+option_changes_may_require_restart = \u0393\u03B9\u03B1 \u03BD\u03B1 \u03B4\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2, \u03BC\u03AC\u03BB\u03BB\u03BF\u03BD \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03BE\u03B1\u03BD\u03B1\u03BE\u03B5\u03BA\u03B9\u03BD\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF Freeplane.
+OptionPanel.absolute = \u0391\u03C0\u03CC\u03BB\u03C5\u03C4\u03BF
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = \u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7\u03C2 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7\u03C2
+OptionPanel.antialias = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7
+OptionPanel.antialias.tooltip = <html>\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03B7\u03BD \u03C0\u03BF\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C4\u03BF\u03C5 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2. \u0391\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF \u03CC\u03BC\u03C9\u03C2 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03BF \u03C7\u03C1\u03CC\u03BD\u03BF .</html>
+OptionPanel.antialias_all = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7: \u039F\u03BB\u03B1
+OptionPanel.antialias_edges = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7: \u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+OptionPanel.antialias_none = \u03A7\u03C9\u03C1\u03AF\u03C2 \u03BF\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7
+OptionPanel.Appearance = \u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7
+OptionPanel.ar = Ar
+OptionPanel.as_parent = \u03A9\u03C2 \u03B3\u03BF\u03BD\u03AD\u03B1\u03C2
+OptionPanel.automatic = \u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF
+OptionPanel.automaticFormat_level = \u03A4\u03C1\u03CC\u03C0\u03BF\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7\u03C2 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7\u03C2
+OptionPanel.automaticFormat_level1 = \u039C\u03BF\u03C1\u03C6\u03AE \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.automaticFormat_level2 = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 \u03B5\u03C0\u03B9\u03C0\u03AD\u03B4\u03BF\u03C5 1
+OptionPanel.Behaviour = \u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03B9\u03C6\u03BF\u03C1\u03AC
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = \u0391\u03BA\u03C5\u03C1\u03BF
+OptionPanel.childpattern = \u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF \u03B1\u03C0\u03CC\u03B3\u03BF\u03BD\u03BF\u03C2
+OptionPanel.childpattern.tooltip = \u03A4\u03BF \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF \u03B8\u03B1 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03C3\u03C4\u03B5\u03AF \u03C3\u03B5 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2.
+OptionPanel.clear_all_setters = \u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD
+OptionPanel.clear_all_setters.tooltip = \u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF / \u0391\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF \u03C4\u03B9\u03C2 \u03B5\u03BD\u03B4\u03B5\u03B9\u03BE\u03B5\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD.
+OptionPanel.combined = \u03A3\u03C5\u03BD\u03B4\u03C5\u03B1\u03C3\u03BC\u03CC\u03C2
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
+OptionPanel.default_browser_command_mac = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE\u03C2 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03B3\u03B9\u03B1 Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> \u03BA\u03B1\u03B9 MAC: (\u03C7\u03AC\u03C1\u03B9\u03C2 \u03C3\u03C4\u03BF\u03BD Nick!)</html>
+OptionPanel.default_browser_command_other_os = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE\u03C2 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03B3\u03B9\u03B1 Os
+OptionPanel.default_browser_command_other_os.tooltip = <html> \u03A3\u03C5\u03BD\u03AE\u03B8\u03C9\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 Linux:</html>
+OptionPanel.default_browser_command_windows_9x = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03B3\u03B9\u03B1 Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>\u0393\u03B9\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD Windows (\u03C4\u03B1 \u03C3\u03B7\u03BC\u03B5\u03AF\u03B1 "" \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C0\u03B1\u03C1\u03B1\u03AF\u03C4\u03B7\u03C4\u03B1 \u03C3\u03B5 \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD\u03C2, \u03C0\u03BF\u03C5 \u03AD\u03C7\u03BF\u03C5\u03BD "=" \u03C3\u03C4\u03BF URL).</html>
+OptionPanel.default_browser_command_windows_nt = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03B3\u03B9\u03B1 Windows Nt
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>\u0393\u03B9\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD Windows (\u03C4\u03B1 \u03C3\u03B7\u03BC\u03B5\u03AF\u03B1 "" \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C0\u03B1\u03C1\u03B1\u03AF\u03C4\u03B7\u03C4\u03B1 \u03C3\u03B5 \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD\u03C2, \u03C0\u03BF\u03C5 \u03AD\u03C7\u03BF\u03C5\u03BD "=" \u03C3\u03C4\u03BF URL).</html>
+OptionPanel.default_charset = Charset[translate me]
+OptionPanel.Defaults = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2
+OptionPanel.delete_automatic_saves_at_exit = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03C9\u03BD \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03BC\u03AD\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03AD\u03BE\u03BF\u03B4\u03BF
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html>\u0391\u03BD \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03BF\u03CD\u03BD \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03BC\u03B5\u03C4\u03AC \u03B1\u03C0\u03CC \u03BC\u03AF\u03B1 \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03AE \u03AD\u03BE\u03BF\u03B4\u03BF \u03B1\u03C0\u03CC \u03C4\u03BF Freeplane, \u03B7 \u03B1\u03BA\u03CC\u03BB\u03BF\u03C5\u03B8\u03B7 \u03BC\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AE \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9 \u03C4\u03B9\u03BC\u03AE true</html>
+OptionPanel.disable_cursor_move_paper = \u0391\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7\u03C2 \u03A7\u03B1\u03C1\u03C4\u03B9\u03BF\u03CD \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BA\u03AD\u03C1\u03C3\u03BF\u03C1\u03B1
+OptionPanel.disable_cursor_move_paper.tooltip = <html>\u039C\u03AE\u03BD \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9\u03C2 'move' \u03BA\u03B5\u03C1\u03C3\u03BF\u03C1, \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B4\u03B5\u03B9\u03AC\u03C1\u03BA\u03B5\u03B9\u03B1 \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03C7\u03B1\u03C1\u03C4\u03B9\u03BF\u03CD</html>
+OptionPanel.edgecolor = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+OptionPanel.edgecolor.tooltip = \u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03BF\u03BD \u03C0\u03B1\u03C4\u03C1\u03B9\u03BA\u03CC \u03BA\u03CC\u03BC\u03B2\u03BF (\u03B9\u03C3\u03C7\u03CD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2)
+OptionPanel.edgestyle = \u03A4\u03CD\u03C0\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+OptionPanel.edgestyle.tooltip = \u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03BF\u03BD \u03C0\u03B1\u03C4\u03C1\u03B9\u03BA\u03CC \u03BA\u03CC\u03BC\u03B2\u03BF (\u03B9\u03C3\u03C7\u03CD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2)
+OptionPanel.edgewidth = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+OptionPanel.edgewidth.tooltip = \u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03BF\u03BD \u03C0\u03B1\u03C4\u03C1\u03B9\u03BA\u03CC \u03BA\u03CC\u03BC\u03B2\u03BF (\u03B9\u03C3\u03C7\u03CD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2)
+OptionPanel.el = El
+OptionPanel.el__enter_confirms_by_default = \u03A4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF Enter \u03C3\u03B7\u03BC\u03B1\u03AF\u03BD\u03B5\u03B9 \u03B5\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7
+OptionPanel.el__max_default_window_height = \u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03CD\u03C8\u03BF\u03C2 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5
+OptionPanel.el__max_default_window_width = \u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5
+OptionPanel.el__min_default_window_height = \u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03CD\u03C8\u03BF\u03C2 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5
+OptionPanel.el__min_default_window_width = \u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5
+OptionPanel.el__position_window_below_node = \u03A4\u03BF\u03C0\u03BF\u03B8\u03AD\u03C4\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 \u03BA\u03AC\u03C4\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF.
+OptionPanel.en = En
+OptionPanel.Environment = \u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = \u03A0\u03B5\u03B9\u03C1\u03B1\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5
+OptionPanel.experimental_file_locking_on.tooltip = <html> \u03A0\u03B5\u03B9\u03C1\u03B1\u03BC\u03B1\u03C4\u03B9\u03BA\u03AE \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1</html>
+OptionPanel.export_icons_in_html = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD \u03C9\u03C2 Html
+OptionPanel.export_icons_in_html.tooltip = <html> \u039F\u03C1\u03B9\u03C3\u03B5 \u03B1\u03BD \u03C3\u03C4\u03B1 \u03C0\u03B1\u03C1\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03B1 HTML \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1. \u03A4\u03BF \u03C0\u03C1\u03CC\u03B2\u03BB\u03B7\u03BC\u03B1 \u03BC\u03B5 \u03C4\u03B1 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03CC\u03C4\u03B9 \u03BF\u03B9 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03BC\u03BF\u03B9 \u03B4\u03B5\u03BD \u03B4\u03B5\u03AF\u03C7\u03BD\u03BF\u03C5\u03BD \u03C3\u03C9\u03C3\u03C4\u03AC \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF HTML..</html>
+OptionPanel.Files = \u0391\u03C1\u03C7\u03B5\u03AF\u03B1
+OptionPanel.first = \u03A0\u03C1\u03CE\u03C4\u03BF
+OptionPanel.foldingsymbolwidth = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C3\u03C5\u03BC\u03B2\u03CC\u03BB\u03BF\u03C5 \u03C3\u03CD\u03BC\u03C0\u03C4\u03B9\u03BE\u03B7\u03C2
+OptionPanel.foldingsymbolwidth.tooltip = <html>\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03BA\u03CD\u03BA\u03BB\u03BF\u03C5 \u03B1\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7\u03C2</html>
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = \u0392\u03B1\u03C3\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03C4\u03B9\u03C2 \u03B5\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B5\u03C2
+OptionPanel.html_export_fold_all = \u03A3\u03CD\u03BC\u03C0\u03C4\u03C5\u03BE\u03B7/\u03B4\u03AF\u03C0\u03BB\u03C9\u03BC\u03B1 \u03CC\u03BB\u03C9\u03BD
+OptionPanel.html_export_fold_currently_folded = \u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B1\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7\u03C2 \u03CC\u03C0\u03C9\u03C2 \u03C4\u03CE\u03C1\u03B1
+OptionPanel.html_export_folding = \u0391\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE Html
+OptionPanel.html_export_no_folding = \u03A7\u03C9\u03C1\u03AF\u03C2 \u03B1\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7
+OptionPanel.hu = Hu
+OptionPanel.icon = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF
+OptionPanel.icon.tooltip = \u0391\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03C3\u03C4\u03B5\u03AF, \u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B8\u03B1 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03BA\u03C1\u03B9\u03B2\u03CE\u03C2 \u03B1\u03C5\u03C4\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = \u03A0\u03BB\u03B7\u03BA\u03C4\u03C1\u03BF\u03BB\u03BF\u03B3\u03AE\u03C3\u03B5\u03B9\u03C2
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2
+OptionPanel.language = \u0393\u03BB\u03CE\u03C3\u03C3\u03B1
+OptionPanel.language.tooltip = <html>\u0391\u03C5\u03C4\u03AE \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B7 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1. '\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF' \u03B4\u03BF\u03BA\u03B9\u03BC\u03AC\u03B6\u03B5\u03B9 \u03BD\u03B1 \u03C6\u03BF\u03C1\u03C4\u03CE\u03C3\u03B5\u03B9 \u03C4\u03B7 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1 \u03C4\u03BF\u03C5 \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03BF\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7. </html>
+OptionPanel.last = \u03A4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03BF
+OptionPanel.last_opened_list_length = \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C6\u03AC\u03C4\u03C9\u03BD
+OptionPanel.links = \u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7
+OptionPanel.links.tooltip = <html>\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03B4\u03B5\u03C3\u03BC\u03CC, \u03B5\u03AF\u03C4\u03B5 \u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B1 \u03AE \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC</html>
+OptionPanel.load_last_map = \u0391\u03BD\u03BF\u03AF\u03B3\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03BF \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+OptionPanel.load_last_map.tooltip = <html>\u039F\u03C4\u03B1\u03BD \u03C4\u03BF Freeplane \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC, \u03B1\u03BD\u03BF\u03AF\u03B3\u03B5\u03B9 \u03C4\u03BF \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1, \u03B1\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03B5\u03AF.</html>
+OptionPanel.lookandfeel = \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03BA\u03B1\u03B9 \u03B1\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7
+OptionPanel.lookandfeel.tooltip = <html>\u0397 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03BA\u03B1\u03B9 \u03B1\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7. \u03A5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 'metal','windows','motif', 'gtk', 'mac' \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03BF \u03BC\u03CC\u03BD\u03BF \u03C3\u03B5 MacOS. \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C3\u03B7\u03BC\u03B1\u03AF\u03BD\u03B5\u03B9, \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF!. \u0391\u03BD \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C3\u03B5\u03C4\u03B5 \u03B4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2, \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 class \u03B5\u03B4\u03CE \u03BA\u03B1\u03B9 \u03B2\u03B5\u03B2\u03B1\u03B9\u03C9\u03B8\u03B5\u03AF\u03C4\u03B5 \u03CC\u03C4\u03B9 \u03C4\u03B1 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC jar \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1. \u0391\u03BD \u03C5\u03C0\u03AC\u03C1\u03BE\u03B5\u03B9 \u03BA\u03AC\u03C0\u03BF\u03B9\u03BF \u03C0\u03C1\u03CC\u03B2\u03BB\u03B7\u03BC\u03B1, \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 'nothing' . \u0394\u03BF\u03C5\u03BB\u03B5\u03CD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03BC\u03B5 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AF\u03B4\u03B9\u03B1</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = \u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.max_node_width.tooltip = <html>\u03A4\u03BF \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 (\u03C3\u03B5 pixels) </html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.nodebackgroundcolor.tooltip = \u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.nodecolor = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+OptionPanel.nodefontbold = \u0388\u03BD\u03C4\u03BF\u03BD\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+OptionPanel.nodefontitalic = \u03A0\u03BB\u03AC\u03B3\u03B9\u03B1 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+OptionPanel.nodefontname = \u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.nodefontsize = \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 \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
+OptionPanel.number_of_different_files_for_automatic_save = \u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03CE\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B3\u03B9\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2. \u0397 \u03C0\u03C1\u03CE\u03C4\u03B7 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B3\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C0\u03C1\u03CE\u03C4\u03BF, \u03BA\u03B1\u03B9 \u03BF\u03CD\u03C4\u03C9 \u03BA\u03B1\u03B8\u03B5\u03BE\u03AE\u03C2, \u03B7 n+1-\u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03BE\u03B1\u03BD\u03B1\u03B3\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C0\u03C1\u03CE\u03C4\u03BF (\u03BA\u03C5\u03BA\u03BB\u03B9\u03BA\u03AC)</html>
+OptionPanel.OK = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
+OptionPanel.patternname = \u039F\u03BD\u03BF\u03BC\u03B1
+OptionPanel.patternname.tooltip = \u039C\u03BF\u03BD\u03B1\u03B4\u03B9\u03BA\u03CC \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C0\u03C1\u03BF\u03C4\u03CD\u03C0\u03BF\u03C5
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = \u03A4\u03BF\u03C0\u03BF\u03B8\u03AD\u03C4\u03B7\u03C3\u03B5 \u03BD\u03AD\u03B5\u03C2 \u03B4\u03B9\u03B1\u03BA\u03BB\u03B1\u03B4\u03CE\u03C3\u03B5\u03B9\u03C2
+OptionPanel.placenewbranches.tooltip = <html>\u0395\u03B4\u03CE \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03B5\u03AF\u03C2 \u03BD\u03AD\u03B5\u03C2 \u03B4\u03B9\u03B1\u03BA\u03BB\u03B1\u03B4\u03CE\u03C3\u03B5\u03B9\u03C2. \u0395\u03B3\u03BA\u03C5\u03C1\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 'first' \u03BA\u03B1\u03B9 'last' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = \u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC
+OptionPanel.ru = Ru
+OptionPanel.selection_method = \u039C\u03AD\u03B8\u03BF\u03B4\u03BF\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE\u03C2
+OptionPanel.selection_method.tooltip = <html> \u03BC\u03B5 \u03C4\u03BF\u03BD \u03B4\u03B9\u03B1\u03BA\u03CC\u03C0\u03C4\u03B7 \u03B1\u03C5\u03C4\u03CC\u03BD, \u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9/\u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B7 \u03BA\u03B1\u03B8\u03C5\u03C3\u03C4\u03B5\u03C1\u03B7\u03BC\u03AD\u03BD\u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C3\u03C7\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2. \u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B5\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2. \u039C\u03B7\u03BD \u03C4\u03BF \u03BC\u03B5\u03C4\u03B1\u03B2\u03AC\u03BB\u03B5\u03C4\u03B5 \u03B3\u03B9\u03B1\u03C4\u03AF \u03B8\u03B1 \u03C3\u03C9\u03B8\u03B5\u03AF \u03C3\u03C4\u03BF auto.properties \u03C3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03C0\u03B5\u03C1\u03AF\u03C0\u03C4\u03C9\u03C3\u03B7.</html>
+OptionPanel.selection_method_by_click = \u039C\u03B5 \u03BA\u03BB\u03B9\u03BA
+OptionPanel.selection_method_delayed = \u039A\u03B1\u03B8\u03C5\u03C3\u03C4\u03B5\u03C1\u03B7\u03BC\u03AD\u03BD\u03B7
+OptionPanel.selection_method_direct = \u0391\u03BC\u03B5\u03C3\u03B7
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03B1
+OptionPanel.separator.anti_alias = \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7
+OptionPanel.separator.attributes = \u03A7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+OptionPanel.separator.automatic_save = \u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
+OptionPanel.separator.behaviour = \u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03B9\u03C6\u03BF\u03C1\u03AC
+OptionPanel.separator.browser = \u03A6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2
+OptionPanel.separator.commands_for_the_program = \u0395\u03BD\u03C4\u03BF\u03BB\u03AD\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1
+OptionPanel.separator.default_fonts = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AD\u03C2
+OptionPanel.separator.default_styles = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03A3\u03C4\u03CD\u03BB
+OptionPanel.separator.EdgeControls = \u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+OptionPanel.separator.edit_long_node_window = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5
+OptionPanel.separator.files = \u0391\u03C1\u03C7\u03B5\u03AF\u03B1
+OptionPanel.separator.General = \u0393\u03B5\u03BD\u03B9\u03BA\u03AC
+OptionPanel.separator.html_export = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE Html
+OptionPanel.separator.hyperlink_types = \u0395\u03AF\u03B4\u03B7 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03B5\u03C9\u03BD
+OptionPanel.separator.icon_properties = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1
+OptionPanel.separator.initial_map_size = \u0391\u03C1\u03C7\u03B9\u03BA\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+OptionPanel.separator.key_typing = \u03A3\u03C5\u03BD\u03C4\u03BF\u03BC\u03B5\u03CD\u03C3\u03B5\u03B9\u03C2 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03C9\u03BD
+OptionPanel.separator.language = \u0393\u03BB\u03CE\u03C3\u03C3\u03B1
+OptionPanel.separator.look_and_feel = \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03BA\u03B1\u03B9 \u03B1\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7
+OptionPanel.separator.new_node_commands = \u0395\u03BD\u03C4\u03BF\u03BB\u03AD\u03C2 \u03BD\u03AD\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.separator.node_editing_commands = \u0395\u03BD\u03C4\u03BF\u03BB\u03AD\u03C2 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.separator.node_navigation_commands = \u0395\u03BD\u03C4\u03BF\u03BB\u03AD\u03C2 \u03C0\u03BB\u03BF\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.separator.NodeColors = \u03A7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.separator.NodeFont = \u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.separator.other_defaults = \u0391\u03BB\u03BB\u03B5\u03C2 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2
+OptionPanel.separator.others = \u0386\u03BB\u03BB\u03B5\u03C2 \u03C3\u03C7\u03AD\u03C3\u03B5\u03B9\u03C2 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03C9\u03BD
+OptionPanel.separator.patterns = \u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03B1
+OptionPanel.separator.save = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = \u039C\u03AD\u03B8\u03BF\u03B4\u03BF\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE\u03C2
+OptionPanel.separator.undo = \u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+OptionPanel.set_property_text = \u0391\u03BB\u03BB\u03B1\u03B3\u03AE
+OptionPanel.set_property_text.tooltip = \u039A\u03B5\u03BD\u03CC: \u039C\u03AE\u03BD \u03B1\u03B3\u03B3\u03AF\u03B6\u03B5\u03C4\u03B5, \u039C\u03B5\u03AF\u03BF\u03BD=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 (\u03C3\u03B5 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2), \u03A3\u03CD\u03BD=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2
+OptionPanel.sharp_bezier = \u0391\u03C0\u03CC\u03C4\u03BF\u03BC\u03BF bezier
+OptionPanel.sharp_linear = \u0391\u03C0\u03CC\u03C4\u03BF\u03BC\u03BF \u03B3\u03C1\u03B1\u03BC\u03BC\u03B9\u03BA\u03CC
+OptionPanel.show_icon_for_attributes = \u0394\u03B5\u03AF\u03BE\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B3\u03B9\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5
+OptionPanel.standardbackgroundcolor.tooltip = <html>\u03A4\u03BF \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5 \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE html </html>
+OptionPanel.standardcloudcolor = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03BD\u03AD\u03C6\u03BF\u03C5\u03C2
+OptionPanel.standardcloudcolor.tooltip = <html>\u03A4\u03BF \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03BD\u03AD\u03C6\u03BF\u03C5\u03C2 \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE html</html>
+OptionPanel.standardcloudestyle = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C3\u03C4\u03CD\u03BB \u03BD\u03AD\u03C6\u03BF\u03C5\u03C2
+OptionPanel.standardcloudestyle.tooltip = <html>\u03A4\u03BF \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03BF \u03C3\u03C4\u03CD\u03BB \u03BD\u03AD\u03C6\u03BF\u03C5\u03C2. \u03A0\u03C1\u03CC\u03C2 \u03C4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD \u03C5\u03C0\u03BF\u03C3\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03BF \u03C4\u03CD\u03C0\u03BF\u03C2 'bezier' </html>
+OptionPanel.standardlinkcolor = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5
+OptionPanel.standardlinkcolor.tooltip = <html>\u03A4\u03BF \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE html </html>
+OptionPanel.standardlinkestyle = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C3\u03C4\u03C5\u03BB \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5
+OptionPanel.standardlinkestyle.tooltip = <html>\u039F \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C2 \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD. currently, \u03A0\u03C1\u03CC\u03C2 \u03C4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD \u03C5\u03C0\u03BF\u03C3\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03BF \u03C4\u03CD\u03C0\u03BF\u03C2 'bezier' </html>
+OptionPanel.standardselectednodecolor = \u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+OptionPanel.standardselectednodecolor.tooltip = <html>\u03A4\u03BF \u03BA\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 \u03B1\u03BD \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03BF\u03C5\u03BC\u03B5. \u039C\u03BF\u03C1\u03C6\u03AE html (#RRGGBB \u03BC\u03B5 \u03B4\u03B5\u03BA\u03B1\u03B5\u03BE\u03B1\u03B4\u03B9\u03BA\u03AD\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = \u03A7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7\u03C2 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7\u03C2
+OptionPanel.time_for_automatic_save.tooltip = <html> \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03B1\u03BD\u03AC\u03BC\u03B5\u03C3\u03B1 \u03C3\u03B5 \u03B4\u03CD\u03BF \u03B4\u03B9\u03B1\u03B4\u03BF\u03C7\u03B9\u03BA\u03AD\u03C2 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B5\u03C2 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03C3\u03B5\u03B9\u03C2 (\u03C3\u03B5 msec): \u0393\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7\u03C2 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7\u03C2, \u03B4\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C4\u03B9\u03BC\u03AE 2000000000.</html>
+OptionPanel.time_for_delayed_selection = \u03A7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03BA\u03B1\u03B8\u03C5\u03C3\u03C4\u03B5\u03C1\u03B7\u03BC\u03AD\u03BD\u03B7\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE\u03C2
+OptionPanel.time_for_delayed_selection.tooltip = <html> \u03A7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03BA\u03B1\u03B8\u03C5\u03C3\u03C4\u03AD\u03C1\u03B7\u03C3\u03B7\u03C2, \u03CC\u03C4\u03B1\u03BD \u03C4\u03BF \u03C0\u03BF\u03BD\u03C4\u03AF\u03BA\u03B9 \u03C0\u03AC\u03B5\u03B9 \u03C0\u03AC\u03BD\u03C9 \u03C3\u03C4\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF, \u03BC\u03AD\u03C7\u03C1\u03B9 \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 (in msec). \u039C\u03B5 \u03C4\u03B9\u03BC\u03AE 1, \u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B3\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03C7\u03C9\u03C1\u03AF\u03C2 \u03BA\u03B1\u03B8\u03C5\u03C3\u03C4\u03AD\u03C1\u03B7\u03C3\u03B7.</html>
+OptionPanel.toolTipManager.max_tooltip_width = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C3\u03C5\u03BC\u03B2\u03BF\u03C5\u03BB\u03AE\u03C2
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>\u03A4\u03BF \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03C3\u03C5\u03BC\u03B2\u03BF\u03C5\u03BB\u03AE\u03C2 (\u03C3\u03B5 pixels).</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = \u039C\u03AE \u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+OptionPanel.undo_levels = \u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03B1/\u0392\u03AE\u03BC\u03B1\u03C4\u03B1 \u03B1\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7\u03C2
+OptionPanel.undo_levels.tooltip = <html>\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C0\u03CC\u03C3\u03B1 \u03B2\u03AE\u03BC\u03B1\u03C4\u03B1 \u03BC\u03C0\u03BF\u03C1\u03BF\u03CD\u03BD \u03BD\u03B1 \u03B1\u03BD\u03B1\u03B9\u03C1\u03B5\u03B8\u03BF\u03CD\u03BD \u03C3\u03C4\u03B7\u03BD \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE "\u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7".</html>
+OptionPanel.vi = Vi[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+out_of_memory = Out of memory.[translate me]
+PageAction.text = \u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2...
+PasteAction.text = \u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03B7\u03C3\u03B7
+PatternNewNameProperty = \u039D\u03AD\u03BF \u03C0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF
+PatternToString.backgroundColor = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5
+PatternToString.color = \u03A7\u03C1\u03CE\u03BC\u03B1
+PatternToString.EdgeStyle = \u039C\u03BF\u03C1\u03C6\u03AE \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+PatternToString.EdgeWidth = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
+PatternToString.FontBold = \u00A8\u0395\u03BD\u03C4\u03BF\u03BD\u03B1
+PatternToString.Icon = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF
+PatternToString.NodeFontSize = \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2
+plugins/ScriptEditor.exit = \u0395\u03BE\u03BF\u03B4\u03BF\u03C2
+plugins/ScriptEditor.menu_actions = \u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2
+plugins/ScriptEditor.run = \u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7
+plugins/ScriptEditor/window.Result = \u0391\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1:
+plugins/ScriptEditor/window.title = \u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B7\u03C2 \u03B4\u03AD\u03C3\u03BC\u03B7\u03C2 \u03B5\u03BD\u03C4\u03BF\u03BB\u03CE\u03BD
+plugins/TimeList.xml_Created = \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5
+plugins/TimeList.xml_Date = \u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
+plugins/TimeList.xml_Icons = \u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1
+plugins/TimeList.xml_Modified = \u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03AE\u03B8\u03B7\u03BA\u03B5
+plugins/TimeList.xml_Notes = \u03A3\u03B7\u03BC\u03B5\u03B9\u03CE\u03C3\u03B5\u03B9\u03C2
+plugins/TimeList.xml_Text = \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF
+plugins/TimeManagement.xml_appendButton = \u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1\u03C2 \u03C3\u03C4\u03BF\u03C5\u03C2 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2
+plugins/TimeManagement.xml_Cancel = \u0391\u03BA\u03C5\u03C1\u03BF
+plugins/TimeManagement.xml_cancelButton = \u0391\u03BA\u03C5\u03C1\u03BF
+plugins/TimeManagement.xml_closeButton = \u039A\u03BB\u03B5\u03AF\u03C3\u03B5
+plugins/TimeManagement.xml_Export = \u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD
+plugins/TimeManagement.xml_Find = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7
+plugins/TimeManagement.xml_Goto = \u03A0\u03AE\u03B3\u03B1\u03B9\u03BD\u03B5
+plugins/TimeManagement.xml_hour = \u03A9\u03C1\u03B1:
+plugins/TimeManagement.xml_menu_actions = \u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2
+plugins/TimeManagement.xml_minute = \u039B\u03B5\u03C0\u03C4\u03CC:
+plugins/TimeManagement.xml_reminderButton = \u03A5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7 \u03C3\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>\u039F\u03C4\u03B1\u03BD \u03C4\u03BF \u03C0\u03B1\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5, \u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03AE\u03C4\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03C7\u03C1\u03BF\u03BD\u03CC\u03BC\u03B5\u03C4\u03C1\u03BF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5. \u0398\u03B1 \u03B5\u03B9\u03B4\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03AE\u03C4\u03B5 \u03BC\u03B5 \u03B1\u03C0\u03B1\u03C3\u03C4\u03C1\u03AC\u03C0\u03C4\u03C9\u03BD \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF.<br>\u0395\u03AC\u03BD \u03BA\u03BB\u03B5\u03AF\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1, \u03C4\u03BF \u03C7\u03C1\u03BF\u03BD\u03CC\u03BC\u03B5\u03C4\u03C1\u03BF \u03B8\u03B1 \u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C4\u03B7\u03BD \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03B7 \u03C6\u03BF\u03C1\u03AC \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C4\u03BF \u03B1\u03BD\u03BF\u03AF\u03BE\u03B5\u03C4\u03B5.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>\u03A0\u03C1\u03BF\u03C2 \u03C4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03BF\u03C1\u03B9\u03C3\u03C4\u03B5\u03AF \u03BC\u03AF\u03B1 \u03BC\u03CC\u03BD\u03BF \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7 \u03B1\u03BD\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF. <br>\u0397 \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7 \u03BF\u03C1\u03AF\u03C3\u03C4\u03B7\u03BA\u03B5 \u03B3\u03B9\u03B1 {0,date} {0,time}, \u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C3\u03B1\u03C2 \u03AE\u03C4\u03B1\u03BD {1,date} {1,time}. <br><br>\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 \u03C4\u03BF \u03C7\u03C1\u03CC\u03BD\u03BF \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7\u03C2 (\u039D\u03B1\u03AF) <br>\u03AE \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03C1\u03B1\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03C0\u03B1\u03BB\u03B9\u03CC (\u039F\u03C7\u03B9);</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = \u03A5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03C4\u03B9\u03C2 {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7\u03C2
+plugins/TimeManagement.xml_removeReminderButton_tooltip = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C5\u03C0\u03B5\u03BD\u03B8\u03C5\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C0\u03BF\u03C5 \u03C3\u03C7\u03B5\u03C4\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BA\u03CC\u03BC\u03B2\u03BF.
+plugins/TimeManagement.xml_Replace = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+plugins/TimeManagement.xml_Replace_All = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD
+plugins/TimeManagement.xml_Replace_Selected = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD
+plugins/TimeManagement.xml_Select = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
+plugins/TimeManagement.xml_todayButton = \u03A3\u03AE\u03BC\u03B5\u03C1\u03B1
+plugins/TimeManagement.xml_WindowTitle = \u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C5
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+preferences = \u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03B9\u03C2
+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...
+PropertyAction.text = \u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03B9\u03C2 ...
+QuitAction.text = \u0395\u03BE\u03BF\u03B4\u03BF\u03C2
+read_only = \u039C\u03CC\u03BD\u03BF \u03B1\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7
+RedoAction.text = \u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7
+RedoFilterAction.text = \u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7
+ReminderHookAction.text = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7\u03C2
+ReminderHookAction.tooltip = \u0391\u03C6\u03B1\u03B9\u03C1\u03B5\u03AF \u03C4\u03B7\u03BD \u03C5\u03C0\u03B5\u03BD\u03B8\u03CD\u03BC\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 \u03BA\u03CC\u03BC\u03B2\u03BF.
+RemoveAllIconsAction.text = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD
+RemoveIconAction.text = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C0\u03C1\u03CC\u03C3\u03C6\u03B1\u03C4\u03BF\u03C5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03BF\u03C5
+repair_link = \u0395\u03C0\u03B9\u03C3\u03BA\u03B5\u03C5\u03AE \u03B4\u03B5\u03C3\u03BC\u03BF\u03CD
+repair_link_question = \u0394\u03B5\u03BD \u03BC\u03C0\u03CC\u03C1\u03B5\u03C3\u03B1 \u03BD\u03B1 \u03B1\u03BD\u03BF\u03AF\u03BE\u03C9 \u03C4\u03BF \u03C3\u03C5\u03BD\u03B4\u03B5\u03BC\u03AD\u03BD\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1. \u039D\u03B1 \u03BA\u03AC\u03BD\u03BF\u03C5\u03BC\u03B5 \u03B5\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 ;
+replace = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+ResetNodeLocationAction.text = \u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03B8\u03AD\u03C3\u03B7\u03C2
+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 ; :
+SaveAction.text = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
+SaveAll.text = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD
+SaveAll.tooltip = \u0391\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03B5\u03B9 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B1\u03BD\u03BF\u03B9\u03C7\u03C4\u03AC \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1.
+SaveAsAction.text = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C9\u03C2...
+saved = \u0391\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03BC\u03AD\u03BD\u03BF
+scheme_evaluate = \u0391\u03C0\u03BF\u03C4\u03AF\u03BC\u03B7\u03C3\u03B7!
+ScriptEditor.text = \u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B7\u03C2 \u03B4\u03AD\u03C3\u03BC\u03B7\u03C2 \u03B5\u03BD\u03C4\u03BF\u03BB\u03CE\u03BD...
+ScriptEditor.tooltip = \u0395\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03B5\u03B9 \u03C4\u03B7 \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03BC\u03B1\u03BA\u03C1\u03BF\u03C3\u03BA\u03B5\u03BB\u03CE\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B4\u03AD\u03C3\u03BC\u03B7\u03C2 \u03B5\u03BD\u03C4\u03BF\u03BB\u03CE\u03BD \u03C3\u03C4\u03BF Freeplane.
+ScriptEditorPanel.changed_cancel = \u039F\u03B9 \u03B5\u03BD\u03C4\u03BF\u03BB\u03AD\u03C2 \u03AC\u03BB\u03BB\u03B1\u03BE\u03B1\u03BD. \u0398\u03AD\u03BB\u03B5\u03B9\u03C2 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03C1\u03AF\u03C8\u03B5\u03B9\u03C2 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2;
+select_favorites_folder = \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF \u03C0\u03BF\u03C5 \u03B2\u03C1\u03AF\u03C3\u03BA\u03BF\u03BD\u03C4\u03B1\u03B9 "\u03A4\u03B1 \u03B1\u03B3\u03B1\u03C0\u03B7\u03BC\u03AD\u03BD\u03B1 " \u03C3\u03B1\u03C2
+select_folder_for_importing = \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03B9\u03C3\u03AC\u03B3\u03BF\u03C5\u03BC\u03B5
+SelectAllAction.text = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03CC\u03BB\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AE
+SelectBranchAction.text = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B5\u03BC\u03C6\u03B1\u03BD\u03BF\u03CD\u03C2 \u03BA\u03BB\u03AC\u03B4\u03BF\u03C5
+selection_method_by_click = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BC\u03B5 \u03BC\u03BF\u03BD\u03CC \u03BA\u03BB\u03B9\u03BA
+selection_method_delayed = \u039A\u03B1\u03B8\u03C5\u03C3\u03C4\u03AD\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE\u03C2
+selection_method_direct = \u0394\u03B5\u03AF\u03BE\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5
+SelectNoteAction.text = \u0394\u03B9\u03B1\u03BA\u03CC\u03C0\u03C4\u03B7\u03C2 \u03C3\u03CD\u03BD\u03C4\u03B1\u03BE\u03B7\u03C2 \u03C3\u03B7\u03BC\u03B5\u03B9\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2
+SelectNoteAction.tooltip = \u0394\u03B9\u03B1\u03BA\u03CC\u03C0\u03C4\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03B1\u03C0\u03CC\u03BA\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03C3\u03B7\u03BC\u03B5\u03B9\u03CE\u03C3\u03B5\u03C9\u03BD
+SetImageByFileChooserAction.text = \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 ...
+SetLinkByFileChooserAction.text = \u0394\u03B5\u03C3\u03BC\u03CC\u03C2 (\u0393\u03C1\u03B1\u03C6\u03B9\u03BA\u03AE \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD) ...
+SetLinkByTextFieldAction.text = \u0394\u03B5\u03C3\u03BC\u03CC\u03C2 (\u03A0\u03B5\u03B4\u03AF\u03BF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5) ...
+ShowAllAttributesAction.text = \u0394\u03B5\u03AF\u03BE\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+ShowAncestorsAction.text = \u0394\u03B5\u03AF\u03BE\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03C0\u03C1\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2
+ShowAttributeDialogAction.text = \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD
+ShowDescendantsAction.text = \u0394\u03B5\u03AF\u03BE\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2
+ShowHideNoteAction.text = \u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B5/\u039A\u03C1\u03CD\u03C8\u03B5 \u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03C3\u03B7\u03BC\u03B5\u03AF\u03C9\u03C3\u03B7\u03C2
+ShowHideNoteAction.tooltip = \u0395\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03B1 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BC\u03B5\u03BD\u03BF\u03CD \u03B3\u03B9\u03B1 \u03C4\u03B1 \u03BC\u03B9\u03BA\u03C1\u03AC \u03B2\u03AD\u03BB\u03B7 \u03C3\u03C4\u03B7 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE.
+ShowSelectedAttributesAction.text = \u0394\u03B5\u03AF\u03BE\u03B5 \u03C4\u03B1 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
+simplyhtml.aboutFrameTitle = \u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE
+simplyhtml.alignCenter = \u03BA\u03AD\u03BD\u03C4\u03C1\u03BF
+simplyhtml.alignLabel = \u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7:
+simplyhtml.alignLeft = \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC
+simplyhtml.alignRight = \u03B4\u03B5\u03BE\u03B9\u03AC
+simplyhtml.allCellsRangeLabel = \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03BA\u03B5\u03BB\u03B9\u03AC
+simplyhtml.allOccurrencesReplaced = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03B8\u03B7\u03BA\u03B5 \u03C3\u03B5 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03C3\u03B5\u03B9\u03C2 \u03C4\u03BF\u03C5
+simplyhtml.appendTableColLabel = \u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2
+simplyhtml.appendTableRowLabel = \u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2
+simplyhtml.applyCellAttrLabel = \u0395\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C3\u03B5
+simplyhtml.backgroundLabel = \u03A5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF:
+simplyhtml.boldItalicName = \u03AD\u03BD\u03C4\u03BF\u03BD\u03B1 \u03C0\u03BB\u03AC\u03B3\u03B9\u03B1
+simplyhtml.boldName = \u03AD\u03BD\u03C4\u03BF\u03BD\u03B1
+simplyhtml.borderColorLabel = \u03A7\u03C1\u03CE\u03BC\u03B1:
+simplyhtml.borderWidthLabel = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2
+simplyhtml.bottomLabel = \u03C0\u03C5\u03B8\u03BC\u03AD\u03BD\u03B1\u03C2:
+simplyhtml.cancelBtnName = \u0391\u03BA\u03C5\u03C1\u03BF
+simplyhtml.cellBorderTabLabel = \u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
+simplyhtml.cellGenTabLabel = \u0393\u03B5\u03BD\u03B9\u03BA\u03AC
+simplyhtml.cellMarginTabLabel = \u03A0\u03B5\u03C1\u03B9\u03B8\u03CE\u03C1\u03B9\u03BF
+simplyhtml.cellPanelTitle = \u03BC\u03BF\u03C1\u03C6\u03AE \u03BA\u03B5\u03BB\u03B9\u03BF\u03C5
+simplyhtml.clearFormatLabel = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2
+simplyhtml.clearFormatTip = \u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2
+simplyhtml.close = \u039A\u03BB\u03B5\u03AF\u03C3\u03B5
+simplyhtml.closeBtnName = \u039A\u03BB\u03B5\u03AF\u03C3\u03B5
+simplyhtml.colorLabel = \u03A7\u03C1\u03CE\u03BC\u03B1
+simplyhtml.copyLabel = \u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE
+simplyhtml.copyTip = \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE
+simplyhtml.cTagNameHead1 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 1
+simplyhtml.cTagNameHead2 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 2
+simplyhtml.cTagNameHead3 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 3
+simplyhtml.cTagNameHead4 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 4
+simplyhtml.cTagNameHead5 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 5
+simplyhtml.cTagNameHead6 = \u0395\u03C0\u03B9\u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 6
+simplyhtml.cTagNameLink = \u0394\u03B5\u03C3\u03BC\u03CC\u03C2
+simplyhtml.cTagNameOL = \u03A4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03BC\u03AD\u03BD\u03B7 \u039B\u03AF\u03C3\u03C4\u03B1
+simplyhtml.cTagNamePara = \u03A0\u03B1\u03C1\u03AC\u03B3\u03C1\u03B1\u03C6\u03BF\u03C2
+simplyhtml.cTagNameUL = \u039B\u03AF\u03C3\u03C4\u03B1
+simplyhtml.cutLabel = \u0391\u03C0\u03BF\u03BA\u03BF\u03C0\u03AE
+simplyhtml.cutTip = \u03B1\u03C0\u03BF\u03BA\u03BF\u03C0\u03AE
+simplyhtml.defaultDocName = \u0391\u03C4\u03B9\u03C4\u03BB\u03BF
+simplyhtml.deleteTableColLabel = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2
+simplyhtml.deleteTableRowLabel = \u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2
+simplyhtml.docTitleQuery = \u03C4\u03AF\u03C4\u03BB\u03BF\u03C2:
+simplyhtml.docTitleTitle = \u03A3\u03CD\u03BD\u03C4\u03B1\u03BE\u03B7 \u03C4\u03AF\u03C4\u03BB\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5
+simplyhtml.editLabel = \u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1
+simplyhtml.effectLabel = \u0395\u03C6\u03AD
+simplyhtml.familyLabel = \u039F\u03B9\u03BA\u03BF\u03B3\u03AD\u03BD\u03B5\u03B9\u03B1
+simplyhtml.findNext = \u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5...
+simplyhtml.findReplaceDialogTitle = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+simplyhtml.findReplaceLabel = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+simplyhtml.findReplaceTip = \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 & \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
+simplyhtml.fontBoldLabel = \u00A8\u0395\u03BD\u03C4\u03BF\u03BD\u03B1
+simplyhtml.fontBoldTip = \u03AD\u03BD\u03C4\u03BF\u03BD\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.fontDialogTitle = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2
+simplyhtml.fontItalicLabel = \u03A0\u03BB\u03AC\u03B3\u03B9\u03B1
+simplyhtml.fontItalicTip = \u03A0\u03BB\u03AC\u03B3\u03B9\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.fontLabel = \u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC...
+simplyhtml.fontTabLabel = \u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
+simplyhtml.fontTip = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2...
+simplyhtml.fontUnderlineLabel = \u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7
+simplyhtml.fontUnderlineTip = \u03C5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.foregroundLabel = \u03A0\u03C1\u03BF\u03C3\u03BA\u03AE\u03BD\u03B9\u03BF:
+simplyhtml.formatLabel = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7
+simplyhtml.formatListLabel = \u039B\u03AF\u03C3\u03C4\u03B1...
+simplyhtml.formatListTip = \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2
+simplyhtml.formatParaLabel = \u03A0\u03B1\u03C1\u03AC\u03B3\u03C1\u03B1\u03C6\u03BF\u03C2...
+simplyhtml.formatParaTip = \u0391\u03BB\u03BB\u03AC\u03B6\u03B5\u03B9 \u03C4\u03B7\u03BD \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5
+simplyhtml.formatTableLabel = \u03A0\u03AF\u03BD\u03B1\u03BA\u03B1\u03C2...
+simplyhtml.formatTableTip = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1
+simplyhtml.helpLabel = \u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1
+simplyhtml.htmlTabTitle = \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1 HTML
+simplyhtml.imageFileDesc = \u0391\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2
+simplyhtml.insertTableColLabel = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2
+simplyhtml.insertTableLabel = \u03A0\u03AF\u03BD\u03B1\u03BA\u03B1\u03C2...
+simplyhtml.insertTableMsg = \u03A0\u03CC\u03C3\u03B5\u03C2 \u03C3\u03C4\u03AE\u03BB\u03B5\u03C2;
+simplyhtml.insertTableRowLabel = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2
+simplyhtml.insertTableTitle = \u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03A0\u03AF\u03BD\u03B1\u03BA\u03B1
+simplyhtml.italicName = \u03C0\u03BB\u03AC\u03B3\u03B9\u03B1
+simplyhtml.layoutTabTitle = \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7\u03C2
+simplyhtml.leftLabel = \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC:
+simplyhtml.listDialogTitle = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u039B\u03AF\u03C3\u03C4\u03B1\u03C2
+simplyhtml.listIndentTitle = \u0395\u03C3\u03BF\u03C7\u03AE:
+simplyhtml.listPosInside = \u03B5\u03C3\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03AC
+simplyhtml.listPositionLabel = \u0398\u03AD\u03C3\u03B7:
+simplyhtml.listPosOutside = \u03B5\u03BE\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03AC
+simplyhtml.listTypeCircle = \u03C3\u03C6\u03B1\u03B9\u03C1\u03B9\u03BA\u03AE \u03BA\u03BF\u03C5\u03BA\u03AF\u03B4\u03B1
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = \u03C3\u03CD\u03BC\u03B2\u03BF\u03BB\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C9\u03C2 \u03BA\u03BF\u03C5\u03BA\u03AF\u03B4\u03B1
+simplyhtml.listTypeLabel = \u0395\u03AF\u03B4\u03BF\u03C2:
+simplyhtml.listTypeLowerAlpha = \u03B1.,\u03B2.,\u03B3.,\u03B4.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = \u03C4\u03AF\u03C0\u03BF\u03C4\u03B1
+simplyhtml.listTypeSquare = \u03C4\u03B5\u03C4\u03C1\u03AC\u03B3\u03C9\u03BD\u03B7 \u03BA\u03BF\u03C5\u03BA\u03AF\u03B4\u03B1
+simplyhtml.listTypeUpperAlpha = \u0391.,\u0392.,\u0393.,\u0394.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = \u0395\u03BE\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CC
+simplyhtml.matchCase = \u03A4\u03B1\u03AF\u03C1\u03B9\u03B1\u03C3\u03BC\u03B1 \u03A0\u03B5\u03B6\u03CE\u03BD/\u039A\u03B5\u03C6\u03B1\u03BB\u03B1\u03AF\u03C9\u03BD
+simplyhtml.newStyleDefaultName = \u03BD\u03AD\u03BF \u03CD\u03C6\u03BF\u03C2
+simplyhtml.nextTableCellLabel = \u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF \u03BA\u03B5\u03BB\u03AF
+simplyhtml.noLineLabel = \u03C4\u03AF\u03C0\u03BF\u03C4\u03B1
+simplyhtml.noMoreOccurrencesFound = \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD (\u03AC\u03BB\u03BB\u03B5\u03C2) \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03C3\u03B5\u03B9\u03C2
+simplyhtml.okBtnName = \u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
+simplyhtml.paddingLabel = \u0395\u03C3\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CC
+simplyhtml.paraAlignCenterLabel = \u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03C3\u03C4\u03BF \u03BA\u03AD\u03BD\u03C4\u03C1\u03BF
+simplyhtml.paraAlignCenterTip = \u039A\u03B5\u03BD\u03C4\u03C1\u03B9\u03BA\u03AE \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5
+simplyhtml.paraAlignLeftLabel = \u0391\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AE \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7
+simplyhtml.paraAlignLeftTip = \u0391\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AE \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5
+simplyhtml.paraAlignRightLabel = \u0394\u03B5\u03BE\u03B9\u03AC \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7
+simplyhtml.paraAlignRightTip = \u0394\u03B5\u03BE\u03AF\u03B1 \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5
+simplyhtml.paraStyleDialogTitle = \u038E\u03C6\u03BF\u03C2 \u03A0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5
+simplyhtml.paraTabLabel = \u03A0\u03B1\u03C1\u03AC\u03B3\u03C1\u03B1\u03C6\u03BF\u03C2
+simplyhtml.pasteLabel = \u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03B7\u03C3\u03B7
+simplyhtml.pasteTip = \u03B5\u03C0\u03B9\u03BA\u03CC\u03BB\u03B7\u03C3\u03B7
+simplyhtml.plainName = \u03B1\u03C0\u03BB\u03AC
+simplyhtml.previewLabel = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B9\u03C3\u03B7
+simplyhtml.previewText = \u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5
+simplyhtml.prevTableCellLabel = \u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF \u03BA\u03B5\u03BB\u03AF
+simplyhtml.redoLabel = \u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7
+simplyhtml.redoTip = \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7
+simplyhtml.replace = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7...
+simplyhtml.replaceAll = \u038C\u03BB\u03B1
+simplyhtml.replaceDone = \u0388\u03B3\u03B9\u03BD\u03B5
+simplyhtml.replaceNo = \u039F\u03C7\u03B9
+simplyhtml.replaceThisQuery = \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AD\u03C3\u03C4\u03B7\u03C3\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5
+simplyhtml.replaceWith = \u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BC\u03B5:
+simplyhtml.replaceYes = \u039D\u03B1\u03B9
+simplyhtml.rightLabel = \u03B4\u03B5\u03BE\u03B9\u03AC:
+simplyhtml.searchDown = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C0\u03C1\u03BF\u03C2 \u03C4\u03B1 \u03BA\u03AC\u03C4\u03C9
+simplyhtml.searchFromStart = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03B7\u03BD \u03B1\u03C1\u03C7\u03AE
+simplyhtml.searchUp = \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C0\u03C1\u03BF\u03C2 \u03C4\u03B1 \u03C0\u03AC\u03BD\u03C9
+simplyhtml.selectAllLabel = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD
+simplyhtml.sizeLabel = \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2
+simplyhtml.standardStyleName = \u03C4\u03C5\u03C0\u03B9\u03BA\u03CC
+simplyhtml.strikeLabel = \u0394\u03B9\u03B1\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7
+simplyhtml.styleLabel = \u03A4\u03C1\u03CC\u03C0\u03BF\u03C2
+simplyhtml.styleNameInputText = \u039F\u03BD\u03BF\u03BC\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03CD\u03C6\u03BF\u03C5\u03C2;
+simplyhtml.styleNameInputTitle = \u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03CD\u03C6\u03BF\u03C5\u03C2
+simplyhtml.tableBgColLabel = \u03A7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03CC\u03B2\u03B1\u03B8\u03C1\u03BF\u03C5
+simplyhtml.tableDialogTitle = \u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1
+simplyhtml.tableLabel = \u03A0\u03AF\u03BD\u03B1\u03BA\u03B1\u03C2
+simplyhtml.tablePanelTitle = \u039C\u03BF\u03C1\u03C6\u03AE \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1
+simplyhtml.tableWidthLabel = \u03A0\u03BB\u03AC\u03C4\u03BF\u03C2
+simplyhtml.textIndentLabel = \u0395\u03C3\u03BF\u03C7\u03AE:
+simplyhtml.textToFind = \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\u03C2:
+simplyhtml.thisCellRangeLabel = \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03BA\u03B5\u03BB\u03AF
+simplyhtml.thisColRangeLabel = \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03C3\u03C4\u03AE\u03BB\u03B7
+simplyhtml.thisRowRangeLabel = \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE
+simplyhtml.toggleBulletsLabel = \u039B\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03BA\u03BF\u03C5\u03BA\u03AF\u03B4\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.toggleBulletsTip = \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03BA\u03BF\u03C5\u03BA\u03AF\u03B4\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.toggleNumbersLabel = \u0391\u03C1\u03B9\u03B8\u03BC\u03B7\u03BC\u03AD\u03BD\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.toggleNumbersTip = \u03B1\u03C1\u03B9\u03B8\u03BC\u03B7\u03BC\u03AD\u03BD\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BD\u03B1\u03B9/\u03CC\u03C7\u03B9
+simplyhtml.topLabel = \u03BA\u03BF\u03C1\u03C5\u03C6\u03AE:
+simplyhtml.uLineLabel = \u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7
+simplyhtml.unableToOpenFileError = \u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03CE \u03BD\u03B1 \u03B1\u03BD\u03BF\u03AF\u03BE\u03C9 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF
+simplyhtml.unableToRedoError = \u0391\u03B4\u03CD\u03BD\u03B1\u03C4\u03B7 \u03B7 \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7:
+simplyhtml.unableToUndoError = \u0391\u03B4\u03CD\u03BD\u03B1\u03C4\u03B7 \u03B7 \u03B1\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7:
+simplyhtml.undoLabel = \u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+simplyhtml.undoTip = \u03B1\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+simplyhtml.valignBaseline = \u0392\u03B1\u03C3\u03B9\u03BA\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE
+simplyhtml.valignBottom = \u03C0\u03C5\u03B8\u03BC\u03AD\u03BD\u03B1\u03C2
+simplyhtml.valignLabel = \u039A\u03AC\u03B8\u03B5\u03C4\u03B7 \u03C3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7:
+simplyhtml.valignMiddle = \u03BC\u03AD\u03C3\u03BF
+simplyhtml.valignTop = \u03BA\u03BF\u03C1\u03C5\u03C6\u03AE
+simplyhtml.wholeWordsOnly = \u039C\u03CC\u03BD\u03BF \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
+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>
+style = \u03A4\u03C1\u03CC\u03C0\u03BF\u03C2
+svg = SVG[translate me]
+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 ...
+TimeListAction.tooltip = \u03A0\u03C1\u03BF\u03B2\u03AC\u03BB\u03B5\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C5\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03C3\u03C7\u03B5\u03C4\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2.
+TimeManagementAction.text = \u0394\u03B5\u03AF\u03BE\u03B5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF ...
+TimeManagementAction.tooltip = <html>\u0394\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03C4\u03BF \u03AC\u03C1\u03B8\u03C1\u03C9\u03BC\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03C4\u03BF\u03C5 Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B4\u03B9\u03C0\u03BB\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03C9\u03BD
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C3\u03CD\u03BC\u03C0\u03C4\u03B9\u03BE\u03B7\u03C2
+ToggleLeftToolbarAction.text = \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AE\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD
+ToggleMenubarAction.text = \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03BC\u03B5\u03BD\u03BF\u03CD
+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
+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
+underlined = \u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF
+UndoAction.text = \u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+UndoFilterAction.text = \u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7
+unfold = \u039E\u03B5\u03B4\u03AF\u03C0\u03BB\u03C9\u03BC\u03B1
+UnfoldAllAction.text = \u0391\u03BD\u03B1\u03B4\u03AF\u03C0\u03BB\u03C9\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD
+UnfoldAllAction.tooltip = <html>\u039E\u03B5\u03B4\u03B9\u03C0\u03BB\u03CE\u03BD\u03B5\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2.</html>
+UnfoldOneLevelAction.text = \u039E\u03B5\u03B4\u03B9\u03C0\u03BB\u03C9\u03BC\u03B1 \u03AD\u03BD\u03B1 \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF
+UnfoldOneLevelAction.tooltip = <html>Unfolds the selected nodes by one level.</html>
+url_error = \u039B\u03AC\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AD\u03BD\u03BF URL!
+url_load_error = \u0394\u03B5\u03BD \u03BC\u03C0\u03CC\u03C1\u03B5\u03C3\u03B5 \u03BD\u03B1 \u03B1\u03BD\u03BF\u03B9\u03C7\u03C4\u03B5\u03AF \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03BC\u03B5 URL:
+UsePlainTextAction.text = \u03A7\u03C1\u03AE\u03C3\u03B7 \u03B1\u03C0\u03BB\u03BF\u03CD \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5
+user_defined_zoom = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7
+user_defined_zoom_status_bar = \u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03C4\u03B7\u03BD \u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03C4\u03B9\u03BC\u03AE {0}%.
+user_zoom = \u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 (0.0 - 2.0):
+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
+yes = \u039D\u03B1\u03B9
+ZoomInAction.text = \u039C\u03B5\u03B3\u03AD\u03B8\u03C5\u03BD\u03C3\u03B7
+ZoomOutAction.text = \u03A3\u03BC\u03AF\u03BA\u03C1\u03C5\u03BD\u03C3\u03B7
diff --git a/freeplane/resources/translations/Resources_es.properties b/freeplane/resources/translations/Resources_es.properties
new file mode 100644
index 0000000..e839b67
--- /dev/null
+++ b/freeplane/resources/translations/Resources_es.properties
@@ -0,0 +1,1770 @@
+about_text = Freeplane - Programa libre para creaci\u00f3n de mapas conceptuales y construcci\u00f3n del conocimiento
+AboutAction.text = Acerca de...
+acceleratorPresets = Teclas de acceso r\u00e1pido (atajos) predefinidas
+accelerators_loading_error = No se pueden cargar la configuraci\u00f3n de los atajos de {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Cambiar formato de los nodos
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Cambiar patr\u00F3n
+accessories/plugins/EncryptNode.properties_0 = Elija contrase\u00F1a para cifrar nodo
+accessories/plugins/EncryptNode.properties_1 = Las contrase\u00F1as no son iguales o son muy cortas.
+accessories/plugins/EncryptNode.properties_2 = Escriba la Contrase\u00F1a:
+accessories/plugins/EncryptNode.properties_3 = Vuelva a escribir la Contrase\u00F1a:
+accessories/plugins/EncryptNode.properties_4 = Escriba su contrase\u00f1a.
+accessories/plugins/EncryptNode.properties_5 = <html>Recuerde que la calidad del cifrado<br> depende casi completamente de la calidad de su contrase\u00F1a.</html>
+accessories/plugins/EncryptNode.properties_6 = Ok
+accessories/plugins/EncryptNode.properties_7 = Cancelar
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = S\u00f3lo puede (des)activar el cifrado si el nodo ha sido cifrado anteriormente. Por favor inserte un nodo cifrado utilizando el men\u00FA de herramientas.
+accessories/plugins/EncryptNode.properties_select_me = \u00a1Debe marcarme para seguir!
+accessories/plugins/EncryptNode.properties_wrong_password = La contrase\u00F1a no es correcta.
+accessories/plugins/ExportWithTWiki.text = Como TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Exporta el mapa como un documento TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Este es un m\u00E9todo est\u00e1ndar de exportaci\u00F3n utilizando scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Como Applet de Java ...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporta el mapa como un applet java para Navegador
+accessories/plugins/ExportWithXSLT_Flash.text = Como Flash ...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporta el mapa como una aplicaci\u00F3n flash
+accessories/plugins/ExportWithXSLT_HTML.text = Como XHTML (versi\u00F3n JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Como XHTML (versi\u00F3n mapa Seleccionable)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Recursos del nodo RECURSOS al fichero TaskJuggler ...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exporta recursos del nodo RECURSOS al m\u00F3dulo Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tareas del nodo de TAREAS al fichero TaskJuggler ...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exporta tareas de las TAREAS del nodo al m\u00F3dulo Taskjuggler. </html>
+action_keystroke_in_use_error = La tecla {0} que quiere asignar a la acci\u00f3n {1} ya est\u00e1 en uso para {2}
+active = Activo
+actual_map_styles = Estilos condicionales del mapa aplicados al nodo
+actual_node_styles = Estilos condicionales del nodo aplicados al nodo
+add = &A\u00f1adir
+AddConnectorAction.text = A\u00f1adir Conector
+AddElementaryConditionAction.text = A\u00f1adir
+AddLocalLinkAction.text = Agregar Enlace Local
+AddMenuItemLinkAction.text = Hiperenlace (Entrada de Men\u00fa)...
+AddOnDetailsPanel.authored.by = Por {0}
+AddOnDetailsPanel.header.function = Funci\u00f3n
+AddOnDetailsPanel.header.menu = Localizaci\u00f3n del men\u00fa
+AddOnDetailsPanel.header.shortcut = Enlace directo
+AddOnDetailsPanel.homepage = P\u00e1gina de inicio:
+addons.installer.canceled = Instalaci\u00f3n cancelada
+addons.installer.confirm.licence = <html><body><h1>Licencia</h1>{0}<p><p><em>\u00bfAcepta esta licencia?</em></p></body></html>
+addons.installer.failed = Fall\u00f3 la instalaci\u00f3n: {0}
+addons.installer.freeplaneversion.format.error = Error en el formato de {0} (valor: {1})
+addons.installer.groovy.script.name = El nombre del script {0} no acaba en ".groovy"
+addons.installer.html.script = El cuerpo del script puede que no est\u00e9 en formato HTML
+addons.installer.install = Instalar
+addons.installer.invalid.keyboard.shortcut = Enlace directo no v\u00e1lido {0}.
+addons.installer.licence.unchanged = La licencia sigue sin cambios
+addons.installer.map.structure = Error en la estructura del mapa: {0}
+addons.installer.missing.child.nodes = Faltan nodos hijos: {0}
+addons.installer.missing.permission.attribute = Script {0}: detalles de los permisos no encontrados {1}
+addons.installer.missing.properties = Propiedades no encontradas: {0}
+addons.installer.missing.translation = No hay traducci\u00f3n de {0} para {1}
+addons.installer.no.scripts = No se encuentran scripts
+addons.installer.no.zipdata = No se ha encontrado datos comprimidos
+addons.installer.nonstandard.permissions = El script requiere los siguiente permisos que no est\u00e1n activados: {0}.\n\u00bfDeber\u00edan ser a\u00f1adidos a los permisos habituales?
+addons.installer.one.child.expected = Se esperaba s\u00f3lo un hijo de {0} pero hay {1}.
+addons.installer.script.no.execution_mode = No hay definido "modo de ejecuci\u00f3n" para {0}
+addons.installer.script.no.menulocation = No hay atributo "menuLocation" definido para {0}
+addons.installer.script.no.menutitle = No hay atributo "menuTitleKey" definido para {0}
+addons.installer.script.no.permissions = Sin permisos definidos para {0}
+addons.installer.success = Instalaci\u00f3n correcta.\n El nuevo complemento estar\u00e1 disponible tras reiniciar.
+addons.installer.success.update = Actualizada correctamente de la {0} a {1}.\n Algunas funciones s\u00f3lo pueden estar disponibles tras reiniciar.
+addons.installer.title = Instalador de complementos
+addons.installer.too.new = Su versi\u00f3n actual de Freeplane {0} es muy reciente. Este complemento soporta hasta la {1}
+addons.installer.too.old = Su versi\u00f3n actual de Freeplane {0} es muy antigua. Este complemento requiere al menos {1}
+addons.installer.unknown.deinstallation.rules = Sin detalles para la desintalaci\u00f3n de {0}
+addons.installer.update = Actualizar de la versi\u00f3n {0}
+addons.installer.warning = <html><body><em>S\u00f3lo deber\u00eda instalar complementos de fuentes de confianza. Software malintencionado puede da\u00f1ar sus datos o comprometer su privacidad.</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = A\u00f1adir atributos de estilo
+AddStyleAttributes.tooltip = A\u00f1adir atributos del estilo del nodo
+AllMapsNodeListAction.text = Buscar y reemplazar en todos los mapas
+always = Siempre
+AlwaysUnfoldedNodeAction.text = Siempre tener los nodos desplegados (fijar/quitar)
+antialias_all = Alisar Todo
+antialias_edges = Alisar Bordes
+antialias_none = No Alisar
+apply = Aplicar
+ApplyAction.text = Aplicar
+ApplyFormatPlugin.text = Cambiar formato ...
+ApplyFormatPlugin.tooltip = Presenta un di\u00E1logo en el que los atributos de nodo y borde pueden ser cambiados al mismo tiempo.
+ApplyNoFilteringAction.text = Sin Filtrado
+ApplySelectedViewConditionAction.text = Filtrar nodos seleccionados
+ApplyToVisibleAction.text = Se aplica a los nodos seleccionados
+as_parent = Como Principal
+AskForHelp.text = Pedir ayuda
+AssignAttributesAction.text = Asignar Atributos...
+attribute_delete = Borrar todos los Valores
+attribute_delete_value = Borrar este Valor
+attribute_font_size_tooltip = Tama\u00F1o de Fuente del Atributo
+attribute_list_box_label_text = Valores Existentes
+attribute_name = Nombre del atributo
+attribute_replace = Reemplazar con
+attribute_top = Todos los Atributos conocidos para los Mapas cargados
+attribute_value = Valor del atributo
+attributes_AddAttributeAction.text = A\u00f1adir atributo
+attributes_adding_empty_attribute_error = No se puede usar la cadena vac\u00EDa como nombre de atributo
+attributes_all = Todos los Atributos
+attributes_assign_dialog = Asignar atributos
+attributes_attribute = Atributos
+attributes_close = Cerrar
+attributes_deselect_all = Nada
+attributes_dialog_title = Gestor de Atributos
+attributes_edit = Editar
+attributes_edit_tooltip = Editar Conjunto
+attributes_for_selected = Nodos Seleccionados
+attributes_for_visible = Todos los Nodos Visibles
+attributes_import = Importar
+attributes_import_tooltip = Importar atributos de otros mapas abiertos
+attributes_no_import_candidates_found = No se ha encontrado ning\u00fan atributo nuevo
+attributes_popup_delete = Borrar
+attributes_popup_down = Abajo
+attributes_popup_edit = Editar
+attributes_popup_hide = Ocultar
+attributes_popup_new = Nuevo Atributo
+attributes_popup_optimal_width = Anchura \u00D3ptima
+attributes_popup_up = Arriba
+attributes_refresh = Actualizar
+attributes_RemoveAllAttributesAction.text = Quitar todos los tributos
+attributes_RemoveFirstAttributeAction.text = Quitar el primer atributo
+attributes_RemoveLastAttributeAction.text = Quitar el \u00faltimo atributo
+attributes_restricted_attributes_tooltip = Restringir Conjunto de Atributos
+attributes_restricted_values_tooltip = Restringir Conjunto de Valores para el Atributo actual
+attributes_restriction = Conjunto Restringido
+attributes_select_all = Todos
+attributes_select_all_tooltip = Seleccionar/Deseleccionar todos
+attributes_show = Mostrar
+attributes_skip_root = Evitar Nodo Ra\u00edz
+attributes_visible = Seleccionado Visible
+attributes_visible_tooltip = Seleccionado Visible
+automatic_layout = Dise\u00f1o autom\u00e1tico
+automatic_layout_disabled = desactivado
+automatically_save_message = El Mapa se salv\u00F3 autom\u00E1ticamente (utilizando el nombre de fichero {0}) ...
+AutomaticEdgeColorHookAction.text = Color del borde autom\u00e1tico
+AutomaticLayout.ALL = para todos los nodos
+AutomaticLayout.HEADINGS = para nodos que no est\u00e9n sueltos
+AutomaticLayout.level = Nivel {0}
+AutomaticLayout.level.root = Ra\u00edz
+AutomaticLayoutAction.text = Presentaci\u00F3n Autom\u00e1tica
+AutomaticLayoutAction.tooltip = <html>Arregla la presentaci\u00F3n del mapa. <br>El primer nivel es negro, el segundo azul, etc.</html>
+AutomaticLayoutControllerAction.ALL.text = para todos los nodos
+AutomaticLayoutControllerAction.HEADINGS.text = para nodos que no est\u00e9n sueltos
+AutomaticLayoutControllerAction.null.text = desactivado
+BackAction.text = Atr\u00e1s
+BackAction.tooltip = Salta hacia atr\u00E1s en la cadena de selecci\u00F3n
+background = Fondo
+bitmaps = Mapas de bits
+black = Negro
+BlinkingNodeHookAction.text = Nodo Parpadeante
+BlinkingNodeHookAction.tooltip = <html>Esto hace que el nodo parpadee. Pero tenga cuidado. No lo utilice en muchos nodos,y <strong> no lo haga junto con otros formatos automaticos en el mismo nodo</strong></html>
+blue = Azul
+BoldAction.text = Negrita
+boldify_branch = Oscurecer Rama
+branch = Rama
+browse = Navegar...
+calendar_attributes_panel = Calendario y atributos
+calendar_panel = Calendario
+can_not_connect_to_info_server = No se puede conectar con el servidor de informaci\u00f3n
+can_not_delete_predefined_style = No se puede borrar el estilo predefinido
+can_not_delete_root_style = No se puede borrar el estilo de la ra\u00edz
+can_not_delete_style_group = No se puede borrar el estilo del grupo
+can_not_save_key_set = No se puede guardar la configuraci\u00f3n de teclas de acceso r\u00e1pido
+cancel = Cancelar
+CancelAction.text = Cancelar
+cannot_add_parent_diff_parents = Todos los nodos deben tener el mismo nodo principal para poder utilizar esta funci\u00F3n.
+cannot_add_parent_to_root = El nodo Ra\u00EDz no puede ser agregado a un nuevo nodo Principal.
+cannot_delete_root = El nodo raiz no puede ser borrado o cortado.
+cannot_join_nodes_with_children = No se pueden unir nodos con hijos
+cannot_move_to_child = No se puede mover un nodo dentro de uno de sus hijos.
+CenterAction.text = Centrar
+CenterSelectedNodeAction.text = Centrar en el nodo seleccionado
+ChangeConnectorArrowsAction.backward.text = Atr\u00e1s
+ChangeConnectorArrowsAction.both.text = Ambos
+ChangeConnectorArrowsAction.forward.text = Adelante
+ChangeConnectorArrowsAction.none.text = Ninguno
+ChangeConnectorArrowsAction.text = Cambiar las flechas del Conector
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Curva
+ChangeConnectorShapeAction.EDGE_LIKE.text = Simular el borde
+ChangeConnectorShapeAction.LINE.text = L\u00ednea
+ChangeConnectorShapeAction.LINEAR_PATH.text = Trazo lineal
+ChangeNodeLevelLeftsAction.text = Nodo izquierdo
+ChangeNodeLevelLeftsAction.tooltip = A la izquierda de la raiz los nodos son desplazados hacia abajo. Se convierten en hijos de su hermano superior. A la derecha de la raiz, los nodos son desplazados hacia arriba. Directamente en la raiz, el nodo cambia de lado.
+ChangeNodeLevelRightsAction.text = Nodo derecho
+ChangeNodeLevelRightsAction.tooltip = A la derecha de la raiz los nodos son desplazados hacia abajo. Ellos se convierten en hijos de su hermano superior. A la izquierda de la raiz los nodos son desplazados hacia arriba. Directamente en la raiz, los nodos cambian de lado.
+choose_background_color = Elegir Color de Fondo:
+choose_cloud_color = Elegir Color de Nube:
+choose_edge_color = Elegir Color del Borde
+choose_map_background_color = Elegir el Color de fondo del Mapa
+choose_node_background_color = Elegir Color de Fondo del Nodo:
+choose_node_color = Elegir Color del Nodo:
+ClearLinkAnchorAction.text = Borrar la etiqueta de ancla
+ClearLinkAnchorAction.tooltip = <html>quitar la etiqueta previa de ancla del nodo</html>
+close_btn = &Cerrar
+CloseAction.text = Cerrar
+CloudAction.text = Nube
+CloudColorAction.text = Color de Nube...
+CloudShapeAction.ARC.text = Arco
+CloudShapeAction.RECT.text = Rect\u00e1ngulo
+CloudShapeAction.ROUND_RECT.text = Rect\u00e1ngulo redondeado
+CloudShapeAction.STAR.text = Estrella
+ColorProperty.ResetColor = Reinicia Color
+combined = Combinado
+condition = Condici\u00f3n
+confirmation = Confirmaci\u00F3n
+connector = Conector
+connector_arrows = Flechas del conector
+connector_label = Etiqueta del Conector
+connector_lines = L\u00edneas del conector
+connector_shapes = Formas del conector
+ConnectorColorAction.text = Color del Conector...
+CopyAction.text = Copiar
+CopyAction.tooltip = Copiar la rama seleccionada
+CopyAttributes.text = Copiar atributos
+CopyIDAction.text = Copiar la Identidad del Nodo
+CopyMapStylesAction.text = Copiar el estilo del mapa de...
+CopyNodeURIAction.text = Copiar la URL del nodo
+copyright = Copyright \u00a9 2000-2012 Equipo de Freeplane y otros
+CopySingleAction.text = Copia Sencilla
+CopySingleAction.tooltip = Copiar s\u00f3lo el nodo seleccionado
+CopyStyleExtensionsAction.text = Copiar contenido del estilo
+corrupt_map = El contenido del mapa est\u00e1 corrupto
+CreateConjunctConditionAction.text = Y
+CreateDisjunctConditionAction.text = O
+CreateNotSatisfiedConditionAction.text = No
+CreationModificationPluginAction.text = Mostrar Sucesi\u00f3n de Modificaciones
+CreationModificationPluginAction.tooltip = <html>Esta funci\u00F3n sigue la pista del tiempo de creaci\u00F3n y modificaci\u00F3n de nodos.</html>
+current_dir = Mapas
+CutAction.text = Cortar
+decrease_branch_font_size = Reducir Fuente
+DecreaseNodeFontAction.text = Reducir Fuente
+default = Por defecto
+DefaultColorAction.text = Color por defecto
+defaultstyle.details = Contenid (detalles)
+defaultstyle.floating = Nodo flotante
+defaultstyle.note = Nota
+delete = Borrar
+delete_child = Borrar Nodo
+DeleteAction.text = Eliminar Nodo
+DeleteConditionAction.text = Borrar
+DeleteDetailsAction.text = Borrar detalles
+DeleteLevelStyleAction.text = Eliminar el estilo autom\u00e1tico por nivel
+DeleteStyleAction.text = Eliminar el estilo
+DeleteUserStyleAction.text = Eliminar el estilo creado por el usuario
+dialect_info.app = El mapa conceptual {0} se cre\u00f3 con {1}.
+dialect_info.unknownApp = El mapa conceptual {0} se cre\u00f3 con un programa desconocido.
+dialect_info.unknownURL = Este sitio web no es conocido.
+dialect_info.url = Visite la p\u00e1gina web del programa {0} para tener m\u00e1s informaci\u00f3n.
+dialect_info.warning = Puede que Freeplane no lo abra, muestre o guarde correctamente.
+DirectHtmlFlavorHandler = HTML como nodo simple
+DocumentationAction.text = Documentaci\u00F3n
+down = Abajo
+download = Descargar
+dropped_file_error = No se pudo abrir el/los archivo(s) descargado(s). Raz\u00f3n: {0}
+edge = Borde
+edge_is_formatted_by_style = El formato del borde lo determina el estilo. Edite los estilos implicados si es necesario.
+edge_style = Estilo del Borde
+edge_width = Ancho del Borde
+EdgeColorAction.text = Color del Borde...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.bezier.tooltip = <html>Mostrar el borde como curva suave.</html>
+EdgeStyleAction.hide_edge.text = Ocultar el borde
+EdgeStyleAction.hide_edge.tooltip = <html>Para los nodos seleccionados mostrar el borde hacia el padre como<br>l\u00ednea de puntos. Si no ocultar el borde.</html>
+EdgeStyleAction.horizontal.text = Horizontal
+EdgeStyleAction.horizontal.tooltip = <html>Usar l\u00edneas rectas perpendiculares para los bordes.</html>
+EdgeStyleAction.linear.text = Lineal
+EdgeStyleAction.linear.tooltip = <html>Mostrar el borde como l\u00ednea recta.</html>
+EdgeStyleAction.sharp_bezier.text = Conexi\u00F3n Bezier
+EdgeStyleAction.sharp_bezier.tooltip = <html>Mostrar el borde como l\u00ednea curva con finales afilados .</html>
+EdgeStyleAction.sharp_linear.text = Conexi\u00F3n lineal
+EdgeStyleAction.sharp_linear.tooltip = <html>Mostrar el borde como l\u00ednea recta con finales afilados .</html>
+EdgeStyleAsParentAction.text = Como Principal
+EdgeStyleAsParentAction.tooltip = <html>Usar el estilo de borde del nodo padre.</html>[obsoleto]
+EdgeWidthAction_width_parent.text = Principal
+EdgeWidthAction_width_thin.text = Delgado
+edit = Editar
+edit.decision = Editor HTML
+edit.edit_rich_text = \u00BFQuiere usar formatos como negrita o cursiva?
+edit_details = Editar los detalles del nodo
+edit_end_label = <html>Conector<br>etiqueta
+edit_label_font_family = Letra
+edit_label_font_size = Tama\u00f1o de letra
+edit_link_manually = Editar Enlace Manualmente...
+edit_long_node = Edici\u00f3n Avanzada del Nodo
+edit_middle_label = Editar la Etiqueta de en Medio
+edit_note = Editar nodo
+edit_source_label = Editar la Etiqueta Fuente
+edit_target_label = Editar la Etiqueta Final
+edit_transparency_label = Transparencia
+edit_width_label = Anchura
+EditAction.text = Editar Nodo
+EditAttributesAction.text = Editar Atributos
+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...
+EditScript = Editar Script...
+EditStylesAction.text = Editar estilos
+EncryptedMap.text = Crear Mapa Cifrado...
+EncryptedMap.tooltip = Crear un nuevo mapa cifrado
+enter_base_url = Voy a pegar enlaces relativos. Por favor ingrese la URL base.
+enter_condition_name = Escribir un nombre para la nueva condici\u00f3n
+enter_confirms = La tecla Intro sirve para Confirmar
+enter_keyset_name = Escribir un nombre para el conjunto de teclas de acceso r\u00e1pido
+enter_map_url = Escribir la URL del mapa
+enter_new_style_name = Escribir un nombre para el nuevo estilo
+enter_node_id = Introducir la ID del nodo
+enter_zoom = Indicar zoom
+EnterPassword.text = (Des)activar cifrado
+error = Error
+error_applying_template = Error aplicando la plantilla XSL.
+error_creating_directory = No se puede crear el directorio para exportar.
+error_in_template = Errores en la plantilla por defecto para mapas {0}. Pruebe a quitar este archivo
+errornumber = {0} errores
+ExecuteScriptError.text = Error al ejecutar el script.\nMire el archivo de registro para m\u00e1s detalles.
+ExecuteScriptForAllNodes.text = Ejecutar todos los scripts
+ExecuteScriptForSelectionAction.text = Ejecutar los scripts de los nodos seleccionados
+ExecuteScriptOnSelectedNode.text = Ejecutar {0} en todos los nodos seleccionados
+ExecuteScriptOnSelectedNodeRecursively.text = Ejecutar {0} en los nodos seleccionados, de forma recursiva
+ExecuteScriptOnSingleNode.text = Ejecutar {0} en un nodo seleccionado
+ExecuteScripts.noScriptsAvailable = No est\u00e1 disponible
+ExecuteScripts.text = Scripts
+ExecuteScriptSecurityError.text = Ocurri\u00f3 un error mientras se ejecutaba el script: {0}
+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
+ExportBranchAction.text = Rama como nuevo Mapa...
+ExportBranchToHTMLAction.text = Rama como HTML
+exported_file = archivo {0}
+ExportPdf.text = Como PDF...
+ExportSvg.text = Como SVG...
+ExportToHTMLAction.text = Como HTML
+ExportToImage.jpg.text = Como JPEG...
+ExportToImage.png.text = Como PNG...
+ExportToOoWriter.text = Como Documento Open Office Writer ...
+extension_menu = Estilo F\u00EDsico
+ExternalImage_popupMenu_Change = Cambiar...
+ExternalImage_popupMenu_Open = Abrir en visor
+ExternalImage_popupMenu_Remove = Quitar
+ExternalImage_popupMenu_ResetZoom = Reajustar el zoom
+ExternalImageAddAction.text = A\u00f1adir imagen externa...
+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
+f_button_unassigned = No hay nada que hacer
+FaqOpenURLAction.text = FAQ
+file = Archivo
+file_already_exists = El archivo {0} ya existe. \u00BFQuiere sobrescribirlo?
+file_not_found = No se ha encontrado el archivo {0}
+FileListFlavorHandler = Enlaces a los archivos
+FileProperties_BranchLeafCount = N\u00famero de nodos hoja en la(s) rama(s) seleccionada(s):
+FileProperties_BranchNodeCount = N\u00famero de nodos en la(s) rama(s) seleccionada(s):
+FileProperties_ChangesSinceLastSave = Cambios desde la \u00faltima vez que se guard\u00f3:
+FileProperties_FileName = Nombre del archivo:
+FileProperties_FileSaved = Archivo guardado:
+FileProperties_FileSize = Tama\u00f1o del archivo:
+FileProperties_MainBranchCount = N\u00famero de ramas principales:
+FileProperties_NeverSaved = Nunca guardado
+FileProperties_NodeChildCount = N\u00famero de hijos del nodo(s) seleccionado(s):
+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...
+FileRevisionsDialog.cancel = &Cancelar
+FileRevisionsDialog.file_last_modified = Fecha y hora
+FileRevisionsDialog.file_name = Archivo
+FileRevisionsDialog.file_size = Bytes
+FileRevisionsDialog.open = &Abrir
+FileRevisionsDialog.open.tooltip = Abrir el archivo incluso si estuviera desfasado
+FileRevisionsDialog.question = Revisiones encontradas para {0}
+FileRevisionsDialog.restore = Rest&urar
+FileRevisionsDialog.restore.tooltip = Reemplarzar {0} por {1}
+FileRevisionsDialog.title = Revisiones del archivo
+filter = Filtro
+filter_add = A\u00F1adir
+filter_and = Y
+filter_any_text = Esencial, detalles o notas
+filter_conditions = Filtros
+filter_contains = Contiene
+filter_created_after = Creado despu\u00e9s de
+filter_created_before = Creado antes de
+filter_delete = Borrar
+filter_details = Detalles
+filter_dialog = Creador de filtros
+filter_does_not_exist = No Existe
+filter_edit_description = Editar Lista de Filtros
+filter_enter_value = Indicar el Valor
+filter_even_level = Nodo de nivel impar
+filter_exist = Existe
+filter_icon = Icono
+filter_is_equal_to = Es igual a
+filter_is_not_equal_to = No es igual a
+filter_leaf = Nodo hoja
+filter_link = Hiperenlace
+filter_match_approximately = &Aproximado
+filter_match_approximately_tooltip = <html>Si se permiten coincidencias aproximadas,<br/>como p.e. al buscar la palabra 'files' se puede aceptar 'flies'.</html>
+filter_match_case = &Caso coincidente
+filter_match_case_tooltip = Si se destaca el caso cuando hay coincidencia.
+filter_modified_after = Modificado despu\u00e9s de
+filter_modified_before = Modificado antes del
+filter_no_filtering = Sin Filtrado
+filter_node = Texto del Nodo
+filter_node_level = Nivel del nodo
+filter_not = No
+filter_note = Nota
+filter_odd_level = Nodo de nivel par
+filter_or = O
+filter_parent = Texto de origen
+filter_periodic_level = Peri\u00f3dico
+filter_priority = Prioridad
+filter_regexp_matches = Coincide con Expresiones regulares
+filter_reminder = Recordatorio
+filter_reminder_after = programado despu\u00e9s
+filter_reminder_before = programado antes
+filter_reminder_executed = ya terminado
+filter_reminder_later = programado m\u00e1s tarde
+filter_root = Nodo ra\u00edz
+filter_script = Filtro de script
+filter_select = Seleccionar
+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)
+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
+FitToPage.text = Acercamiento Todo en Una Pagina
+FitToPage.tooltip = Ajusta el nivel de acercamiento de manera tal que todo el mapa pueda verse en la ventana actual.
+fold = Doblar
+FoldAllAction.text = Doblar Todos
+FoldAllAction.tooltip = <html>Dobla los nodos seleccionados y todos sus hijos.</html>
+FoldOneLevelAction.text = Dobla Un Nivel
+FoldOneLevelAction.tooltip = <html>Dobla un nivel de nodos seleccionados.</html>
+follow_graphical_link = Ir a:
+FollowLinkAction.text = Ir a:
+font = Fuente
+FontFamilyAction.text = Familia de la Fuente
+FontSizeAction.text = Tama\u00F1o de Fuente
+format_invalid_pattern = No es un patr\u00f3n v\u00e1lido
+format_menu_cloud_shapes = Nube
+format_menu_edge_styles = Estilos de Bordes
+format_menu_edge_widths = Anchura Bordes
+format_panel = Formato
+FormatCopy.text = Copiar Formato
+FormatCopy.tooltip = <html>Copia el formato de un nodo.</html>
+FormatPaste.text = Pegar Formato
+FormatPaste.tooltip = <html>Pega el formato de un nodo.</html>
+formats_not_loaded = El archivo est\u00e1 da\u00f1ado, no se pudieron cargar los formatos
+formula.error.attributeValueIsNull = El valor del atributo "{0}" es nulo tras evaluarlo.
+formula.error.circularReference = Referencia circular: la f\u00f3rmula en el nodo "{0}" hace referencia a s\u00ed misma.
+formula.EvaluateAllAction.text = Evaluar todo
+formula.EvaluateAllAction.tooltip = Evaluar todas las f\u00f3rmulas en el mapa actual
+formula.menuname = F\u00f3rmulas
+formula_editor = Editar f\u00f3rmula
+ForwardAction.text = Adelante
+ForwardAction.tooltip = Salta adelante en la cadena de selecci\u00F3n
+FreeNodeAction.text = Nodo colocado libremente (fijar/quitar)
+Freeplane.progress.buildScreen = Construir Pantalla ...
+Freeplane.progress.createController = Crear Controlador ...
+Freeplane.progress.createInitialMode = Crear Modo Inicial ...
+Freeplane.progress.endStartup = Finalizar Inicio.
+Freeplane.progress.gettingPreferenceDirectories = Cargando Preferencias de Directorio ...
+Freeplane.progress.gettingPreferences = Cargando Preferencias ...
+Freeplane.progress.loadMaps = Cargar Mapas ...
+Freeplane.progress.propagateLookAndFeel = Extender Estilo y Apariencia ...
+Freeplane.progress.settingPreferences = Fijar Preferencias ...
+Freeplane.progress.startCreateController = Iniciar Crear Controlador ...
+Freeplane.progress.updateLookAndFeel = Actualizar Estilo y Apariencia ...
+freeplane_reverted = Freeplane_Revertido_
+FreeplaneHelpStarter.text = Ayuda en l\u00ednea...
+FreeplaneHelpStarter.tooltip = Ayuda Ampliada de Freeplane
+GettingStartedAction.text = Primeros pasos
+GotoLinkNodeAction.text = Ir al Enlace
+GotoNodeAction.text = Seleccionar nodo con ID...
+GrabKeyDialog.common.cancel = Cancelar
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Asignado a
+GrabKeyDialog.grab-key.assigned-to.none = Por ahora est\u00e1 sin asignar
+GrabKeyDialog.grab-key.clear = Limpiar
+GrabKeyDialog.grab-key.remove = Borrar
+GrabKeyDialog.grab-key.remove-ask = \u00BFEst\u00E1 seguro que quiere borrar esta combinaci\u00f3n de teclas?
+GrabKeyDialog.grab-key.title = Introducir nueva tecla
+green = Verde
+help = Ayuda
+HideableAction.tooltip = <html>Marca el fondo de cada nodo que se ha modificado.</html>
+HideAllAttributesAction.text = Esconder Todos los Atributos
+HierarchicalIcons2Action.text = Mostrar las intersecciones de los iconos hijos
+HierarchicalIconsAction.text = Mostrar Iconos Jer\u00e1rquicamente
+HierarchicalIconsAction.tooltip = Si uno de los hijos tiene un \u00EDcono, lo mostrar\u00E9 en un formato peque\u00F1o.
+hot_keys = Teclas de acceso r\u00e1pido
+hot_keys_table = Tabla con las teclas de acceso r\u00e1pido
+HotKeyInfoAction.text = Tecla de Referencia
+html_export_based_on_headings = Exportar HTML - Basado en Encabezados
+html_export_fold_all = Exportar HTML - Doblar Todo
+html_export_fold_currently_folded = Exportar HTML - Doblar lo Actualmente Doblado
+html_export_no_folding = Exportar HTML - Sin Doblar
+html_problem = <html>No se puede procesar a html<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Adici\u00f3n
+icon_attach = \u00a1Ojo!
+icon_audio = Audio
+icon_back = Atr\u00e1s
+icon_bee = Freeplane
+icon_bell = Recordar
+icon_bookmark = Excelente
+icon_broken-line = Roto
+icon_button_cancel = Mal
+icon_button_ok = Bien
+icon_calendar = Fecha
+icon_checked = Revisado
+icon_clanbomber = Peligroso
+icon_clock = Hora
+icon_clock2 = Nota recordatoria
+icon_closed = Prohibido Entrar
+icon_decrypted = Abierto
+icon_desktop_new = No Olvidar
+icon_division = Divisi\u00f3n
+icon_down = Abajo
+icon_edit = Pulir
+icon_encrypted = Encriptado
+icon_executable = Ejecutable
+icon_family = Familia
+icon_fema = Hombre y Mujer
+icon_female1 = Mujer1
+icon_female2 = Mujer2
+icon_females = Mujeres
+icon_flag = Bandera Roja
+icon_flag-black = Bandera Negra
+icon_flag-blue = Bandera Azul
+icon_flag-green = Bandera Verde
+icon_flag-orange = Bandera Naranja
+icon_flag-pink = Bandera Rosa
+icon_flag-yellow = Bandera Amarilla
+icon_folder = Carpeta
+icon_forward = Adelante
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Prioridad 0
+icon_full-1 = Prioridad 1
+icon_full-2 = Prioridad 2
+icon_full-3 = Prioridad 3
+icon_full-4 = Prioridad 4
+icon_full-5 = Prioridad 5
+icon_full-6 = Prioridad 6
+icon_full-7 = Prioridad 7
+icon_full-8 = Prioridad 8
+icon_full-9 = Prioridad 9
+icon_go = Sem\u00e1foro en Verde
+icon_gohome = Inicio
+icon_group = Grupo
+icon_help = Pregunta
+icon_hourglass = Esperando
+icon_icon_not_found = Icono no encontrado
+icon_idea = Idea
+icon_image = Imagen
+icon_info = Informaci\u00f3n
+icon_internet = Internet
+icon_internet_warning = Aviso de Internet
+icon_kaddressbook = Tel\u00E9fono
+icon_kmail = Correo electr\u00f3nico
+icon_knotify = M\u00FAsica
+icon_korn = Buz\u00F3n
+icon_ksmiletris = \u00a1Estoy Feliz!
+icon_launch = Lanzamiento
+icon_licq = Lindo
+icon_list = Lista
+icon_Mail = Correo
+icon_male1 = Hombre1
+icon_male2 = Hombre2
+icon_males = Hombres
+icon_menu = Iconos
+icon_messagebox_warning = Importante
+icon_mindmap = Mapa conceptual
+icon_multiplication = Multiplicaci\u00f3n
+icon_narrative = Narraci\u00f3n
+icon_negative = Negativo
+icon_neutral = Neutro
+icon_password = Llave
+icon_pencil = Para Pulir
+icon_penguin = Linux
+icon_positive = Positivo
+icon_prepare = Sem\u00e1foro en \u00c1mbar
+icon_revision = Revisi\u00f3n
+icon_smiley-angry = Enfadado
+icon_smiley-neutral = No Importa
+icon_smiley-oh = Sorpresa
+icon_smily_bad = Estoy triste
+icon_stop = Detener
+icon_stop-sign = Stop
+icon_subtraction = Sustracci\u00f3n
+icon_unchecked = Sin revisar
+icon_up = Arriba
+icon_user_icon = Iconos del usuario
+icon_very_negative = Muy negativo
+icon_very_positive = Muy positivo
+icon_video = V\u00eddeo
+icon_wizard = Magia
+icon_xmag = Para Discutir
+icon_yes = Importante
+IconGroupPopupAction.arrows.text = Flechas
+IconGroupPopupAction.docs_folders.text = Documentos y Carpetas
+IconGroupPopupAction.flags.text = Banderas
+IconGroupPopupAction.math.text = Matem\u00e1ticas
+IconGroupPopupAction.media.text = Media
+IconGroupPopupAction.miscellaneous.text = Miscel\u00e1nea
+IconGroupPopupAction.nature.text = Naturaleza
+IconGroupPopupAction.numbers.text = N\u00fameros
+IconGroupPopupAction.office.text = Oficina
+IconGroupPopupAction.people.text = Gente
+IconGroupPopupAction.rating.text = Clasificaci\u00f3n
+IconGroupPopupAction.signs.text = Se\u00f1ales
+IconGroupPopupAction.smiley.text = Smiley
+IconGroupPopupAction.time.text = Hora
+IconGroupPopupAction.user.text = Iconos del usuario
+IconProgressExtended10Action.text = Progreso aumentado 10%
+IconProgressExtended10Action.tooltip = <html>A\u00f1ade una indicaci\u00f3n de que el progreso se ha aumentado un 10% al hacer doble click.<br>Control + doble click izquierdo lo reduce o lo elimina.</html>
+IconProgressExtended25Action.text = Progreso aumentado 25%
+IconProgressExtended25Action.tooltip = <html>A\u00f1ade una indicaci\u00f3n de que el progreso se ha aumentado un 25% al hacer doble click.<br>Control + doble click izquierdo lo reduce o lo elimina.</html>
+IconProgressIconDownAction.text = Bajar progreso
+IconProgressIconDownAction.tooltip = Disminuye/ inserta/ elimina los iconos de progreso (100% -> 75% -> 50% -> 25% -> 0% -> eliminar).
+IconProgressIconUpAction.text = Subir progreso
+IconProgressIconUpAction.tooltip = incrementa/ inserta los iconos de progreso (0% -> 25% -> 50% -> 75% -> 100% + OK).
+IconProgressRemoveAction.text = Elimina progreso
+IconProgressRemoveAction.tooltip = Elimina los iconos de progreso e iconos extendidos de progreso
+IconSelectionPlugin.text = Seleccionar Icono...
+IconSelectionPlugin.tooltip = <html>Aqu\u00ED puede seleccionar un icono utilizando una subventana.</html>
+image_covertLink = Convertir enlace a imagen
+ImageFlavorHandler = Imagen (utilizar un archivo separado)
+import = Importar
+import_linked_branch_no_link = El nodo seleccionado no tiene enlaces que importar.
+ImportAction.text = Importar
+ImportBranchAction.text = Rama...
+ImportExplorerFavoritesAction.text = Favoritos del Explorer...
+ImportFolderStructureAction.text = Estructura de Carpetas...
+ImportLinkedBranchAction.text = Rama Enlazada
+ImportLinkedBranchWithoutRootAction.text = (Rama Enlazada) Sin Ra\u00EDz...
+ImportMindmanagerFiles.text = Mapa MindManager X5 ...
+increase_branch_font_size = Agrandar Fuente
+IncreaseNodeFontAction.text = Agrandar Fuente
+internal_error_tooltip = Errores internos. Consulte el \u00faltimo log en {0} para m\u00e1s informaci\u00f3n.
+invalid_export_file = Nombre para exportar el archivo no v\u00e1lido
+invalid_file_msg = No se ha podido encontrar archivo para {0}
+invalid_uri = URL Incorrecta {0}
+invalid_url = No se pudo crear una URL v\u00e1lida
+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
+LatexDeleteLatexAction.text = Quitar f\u00f3rmula LaTe&X
+LatexEditLatexAction.text = Editar f\u00f3rmula &LaTeX
+LatexInsertLatexAction.text = A\u00f1adir f\u00f3rmula &LaTeX
+less_than_two_selected_nodes = Tiene que seleccionar al menos dos nodos para poder crear enlaces.
+license = Licencia
+license_text = <html>Este programa es software libre; puede redistribuirlo y/o<br>modificarlo bajos los t\u00e9rminos de la Licencia P\u00fablica General GNU<br>como ha sido publicada por la Free Software Foundation; tanto la versi\u00f3n 2<br>de la licencia, o (a su elecci\u00f3n) cualquier versi\u00f3n posterior.<br><br>Este programa se distribuye con la esperanza de que sea \u00fatil,<br>pero SIN NINGUNA GARANT\u00cdA; incluso sin la garant\u00eda impl\u00edcita para su<br>COMERCIALIZACI\u00d3N O IDONEIDAD PARA USO PARTICULAR. Lea la<br>Licencia P\u00fablica General GNU para m\u00e1s detalles.<br><br>Deber\u00eda haber recibido una copia de la Licencia P\u00fablica General GNU<br>con este programa; si no es as\u00ed, escriba a la Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = &Cargar
+load_accelerator_presets = Cargar
+LoadAcceleratorPresetsAction.textPatterns.text = Patrones para el texto
+locking_failed_by_open = Fallo al intentar bloquear el mapa {0}. Se abre como S\u00f3lo Lectura.
+locking_failed_by_save_as = Fallo al intentar bloquear el mapa {0}. La acci\u00f3n de Guardar como se cancel\u00f3.
+locking_old_lock_removed = El mapa {0} fu\u00E9 bloqueado por el usuario {1}. Se ha quitado ya que es de hace mucho tiempo.
+long_node_changed_cancel = Ha cambiado el nodo. \u00BFQuiere ignorar los cambios?*
+long_node_changed_submit = Ha cambiado el Nodo. \u00BFDesea salvar los cambios?*
+lots_of_links_warning = Vas a crear muchos enlaces apuntando al mismo nodo. \u00bfEst\u00e1 seguro que quiere hacerlo?
+main_resource_directory = Fuentes de Instalaci\u00f3n: {0}
+MainView.errorUpdateText = Error al fijar el texto para la siguiente entrada: {0}. El error fue: {1}
+MakeLinkFromAnchorAction.text = Crear enlace de una etiqueta de ancla
+MakeLinkFromAnchorAction.tooltip = <html>crear un enlace global o local del<br/>nodo con etiqueta de ancla al nodo seleccionado</html>
+MakeLinkToAnchorAction.text = Convertir enlace a etiqueta de ancla
+MakeLinkToAnchorAction.tooltip = <html>crear un enlace global o local del<br/>nodo seleccionado al nodo con etiqueta de ancla</html>
+ManageAddOnsAction.text = Complementos
+ManageAddOnsDialog.activate = Activar
+ManageAddOnsDialog.activation.success = {0} se activar\u00e1 tras reiniciar.
+ManageAddOnsDialog.authored.by = por {0}.
+ManageAddOnsDialog.cannot.activate = No se puede activar: {0} ya est\u00e1 activo.
+ManageAddOnsDialog.cannot.configure = No se puede configurar {0}.
+ManageAddOnsDialog.cannot.deactivate = No se puede desactivar: {0} no est\u00e1 activado.
+ManageAddOnsDialog.cannot.deinstall = No se puede desintalar {0}.
+ManageAddOnsDialog.configure = Configurar
+ManageAddOnsDialog.deactivate = Desactivar
+ManageAddOnsDialog.deactivation.success = {0} se desactivar\u00e1 tras reiniciar.
+ManageAddOnsDialog.deinstall = Desintalar
+ManageAddOnsDialog.deinstallation.success = {0} se desintalar\u00e1 tras reiniciar.
+ManageAddOnsDialog.error = Error en la instalaci\u00f3n: {0}.
+ManageAddOnsDialog.install = &Instalar
+ManageAddOnsDialog.install.from.known.location = Instalar complemento de un origen conocido
+ManageAddOnsDialog.install.tooltip = Poner aqu\u00ed la URL del archivo de instalaci\u00f3n de un complemento
+ManageAddOnsDialog.map.not.opened = Parece que el mapa {0} no est\u00e1 abierto.
+ManageAddOnsDialog.really.deinstall = \u00bfDe verdad quiere desintalar {0}?
+ManageAddOnsDialog.search = Buscar complementos
+ManageAddOnsDialog.search.file = Buscar
+ManageAddOnsDialog.select.tooltip = Seleccionar archivo
+ManageAddOnsDialog.status.downloading = Descargando archivo...
+ManageAddOnsDialog.status.installing = Instalando complemento
+ManageAddOnsDialog.status.success = Se ha instalado correctamente {0}.
+ManageAddOnsDialog.tab.install = Buscar e instalar
+ManageAddOnsDialog.tab.install.tooltip = Buscar e instalar nuevos complementos
+ManageAddOnsDialog.tab.manage = Complementos
+ManageAddOnsDialog.tab.manage.themes = Temas
+ManageAddOnsDialog.tab.manage.themes.tooltip = Gestionar temas instalados
+ManageAddOnsDialog.tab.manage.tooltip = Gestionar complementos instalados
+ManageAddOnsDialog.visit.addon.page = Visitar la p\u00e1gina de complementos...
+ManageConditionalStylesAction.text = Gestionar los estilos condicionales
+ManageNodeConditionalStylesAction.text = Gestionar los estilos condicionales del nodo
+map_already_exists = El mapa ya existe. \u00BFQuiere sobrescribirlo?
+map_corrupted = Mapa corrupto. \u00BFQuiere ver los detalles?
+map_load_error = No se pudo cargar el mapa {0}
+map_locked_by_open = El mapa {0} lo est\u00E1 editando el usuario {1}. Abri\u00e9ndolo como S\u00f3lo Lectura.
+map_locked_by_save_as = El mapa {0} lo est\u00e1 editando el usuario {1}. La acci\u00F3n Guardar Como se cancel\u00f3.
+map_not_saved = El mapa no se ha guard\u00f3do antes.
+MapBackgroundColorAction.text = Fondo del Mapa
+MaxNodeWidth.text = Fijar el ancho m\u00e1ximo del nodo
+menu_applyStyle = Aplicar estilo
+menu_attributes = Atributos
+menu_clouds = Nubes
+menu_copy = Copiar
+menu_coreFormat = Nodo central
+menu_details = Contenido (detalles)
+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...
+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_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
+MindMapNodesFlavorHandler = Jerarqu\u00eda de los nodos
+mindmaps = Mapas
+mindmaps_desc = Mapas (*.mm)
+mindmaps_filter_desc = Filtros (*.mmfilter)
+MinNodeWidth.text = Fijar el ancho m\u00ednimo del nodo
+mode_Browse = Modo de Navegaci\u00f3n
+mode_File = Modo de Archivo
+mode_MindMap = Modo de Mapa Conceptual
+mode_na = Modo no disponible
+mode_status = Cambio a Modo {0}
+mode_title = Freeplane - Modo {0}
+modes = Modos
+ModesMenuAction.Browse.text = Navegador de Mapas
+ModesMenuAction.File.text = Gestor de Archivos
+ModesMenuAction.MindMap.text = Editor de Mapa Conceptual
+most_recent_files = Archivos M\u00E1s Recientes
+MoveToRootAction.text = Mover a Ra\u00EDz
+NameConditionAction.text = Nombrar
+NavigationNextMapAction.text = Siguiente Mapa
+NavigationPreviousMapAction.text = Mapa Previo
+new = Nuevo
+new_map_from_user_templates.text = Nuevo mapa usando plantilla...
+new_mindmap = Nuevo Mapa
+new_node = Nuevo Nodo
+new_node_as_sibling_not_possible_for_the_root = No es posible un Nuevo Nodo Hermano en la Ra\u00EDz
+new_version_available = Hay una nueva versi\u00f3n disponible ''{0}''
+NewChildAction.text = Nuevo Nodo Hijo
+NewerFileRevisionsFoundDialog.cancel = Saltar
+NewerFileRevisionsFoundDialog.cancel.tooltip = No abrir este archivo
+NewerFileRevisionsFoundDialog.file_last_modified = Sello de hora
+NewerFileRevisionsFoundDialog.file_name = Archivo
+NewerFileRevisionsFoundDialog.file_size = Bytes
+NewerFileRevisionsFoundDialog.open = Abrir
+NewerFileRevisionsFoundDialog.open.tooltip = Abrir el archivo aunque no sea el m\u00e1s reciente
+NewerFileRevisionsFoundDialog.question = \u00a1Encontrada versi\u00f3n m\u00e1s reciente para {0}! \u00bfDesea abrirla {0} (mire la primera l\u00ednea) no obstante? Para reemplazar {0} por un archivo guardado automaticamente de la lista, debe seleccionarlo y pulsar en ''Restaurar''.
+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
+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>
+NewPreviousSiblingAction.text = Nuevo Nodo Previo Hermano
+NewSiblingAction.text = Nuevo Nodo Hermano
+NewSummaryAction.text = Nuevo nodo principal (nodos seleccionados)
+NewUserStyleAction.text = Nuevo estilo a partir de la selecci\u00f3n
+NextNodeAction.BACK.text = Nodo Previo
+NextNodeAction.BACK_N_FOLD.text = Nodo Previo (plegado)
+NextNodeAction.FORWARD.text = Siguiente nodo
+NextNodeAction.FORWARD_N_FOLD.text = Siguiente nodo (plegado)
+NextPresentationItemAction.text = Desplegar el siguiente elemento de la presentaci\u00f3n
+no = No
+no_copy_attributes_before_paste_attributes = No puede pegar atributos si antes no ha copiado alguno.
+NO_FORMAT = Texto
+no_format_copy_before_format_paste = No puede pegar un formato a menos que haya copiado uno.
+no_found_from = No "{0}" encontrado en "{1}".
+no_more_found_from = No m\u00e1s "{0}" encontrado en "{1}".
+no_previous_find = No se encontr\u00f3 ninguno Anterior.
+no_styles_found_in_map = No se han encontrado estilos en el mapa
+node = Nodo
+node_changed_discard_changes = Ha cambiado el nodo. \u00BFQuiere ignorar los cambios?*
+node_is_write_protected = El nodo escogido est\u00e1 protegido contra escritura
+node_location_help = Arrastrando se cambia el nodo de sitio, ctrl+arrartre cambia las distancias, doble click y ctrl+doble click lo deshacen.
+node_selector = Selecci\u00f3n de nodo
+node_selector_message = Doble click para seleccionar el nodo
+node_styles = Estilos del nodo
+NodeBackgroundColorAction.text = Color de Fondo del Nodo...
+NodeColorAction.text = Color del Nodo...
+NodeColorBlendAction.text = Mezclar Color
+NodeDownAction.text = Bajar Nodo
+NodeExtensions.EditNodeExtensions = Editar las extensiones del nodo
+NodeExtensions.RemoveNodeExtensions = Quitar las extensiones del nodo
+NodeListAction.text = Buscar y Reemplazar ...
+NodeListAction.tooltip = Muestra todos los nodos como una lista de b\u00FAsqueda con propiedades de filtro.
+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
+ok = De Acuerdo
+OKAction.text = De Acuerdo
+OnlineReference.text = Documentaci\u00f3n de Mapas conceptuales en l\u00ednea
+open_asMindMap = Mapa conceptual
+OpenAction.text = Abrir...
+OpenFreeplaneSiteAction.text = P\u00e1gina Web de Freeplane
+OpenPathAction.text = Abrir Archivo
+OpenURLMapAction.text = Abrir mapa desde una URL...
+OpenUserDirAction.text = Abrir el directorio del usuario
+option_changes_may_require_restart = Para ver los efectos de las propiedades cambiadas, probablemente deber\u00E1 reiniciar Freeplane.
+OptionalDontShowMeAgainDialog.cancel = No
+OptionalDontShowMeAgainDialog.dontShowAgain = No preguntar otra vez
+OptionalDontShowMeAgainDialog.ok = S\u00ED
+OptionalDontShowMeAgainDialog.rememberMyDescision = Recordar decisi\u00F3n
+OptionPanel.absolute = Absoluto
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Patrones autom\u00E1ticos de distribuci\u00F3n
+OptionPanel.ADD_CHILD = A\u00f1adir nodo hijo
+OptionPanel.ADD_SIBLING = A\u00f1adir nodo hermano
+OptionPanel.addons = Complementos
+OptionPanel.always_fold_all_after_load = Plegar todo
+OptionPanel.always_load_last_maps = Cargar el \u00faltimo mapa y los nuevos
+OptionPanel.always_load_last_maps.tooltip = Abrir los \u00faltimos archivos fijados por las opciones de arriba, incluso abrir FreePlane con un mapa en concreto.
+OptionPanel.always_save_folding = Siempre
+OptionPanel.always_save_folding_state = Siempre guardar los cambios que hay en los plegamientos
+OptionPanel.always_save_folding_state.tooltip = Si se marca, cada plegado ensuciar\u00e1 el mapa y le recordar\u00e1 que debe guardarlo.
+OptionPanel.always_unfold_all_after_load = Desplegar todo
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Determina la calidad del mapa. M\u00E1s antialias necesita m\u00E1s tiempo.</html>
+OptionPanel.antialias_all = Alisar Todo
+OptionPanel.antialias_edges = Alisar Bordes
+OptionPanel.antialias_none = Sin Alisar
+OptionPanel.Appearance = Apariencia
+OptionPanel.apply_system_screen_resolution = Aplicar la resoluci\u00f3n de pantalla por defecto del sistema
+OptionPanel.approximate_search_threshold = L\u00edmite para la coincidencia aproximada
+OptionPanel.approximate_search_threshold.tooltip = <html>L\u00edmite para la coincidencia aproximada<br/><font size="2">mire http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(cuanto m\u00e1s alto, menos variaciones<br/>se encontrar\u00e1n del t\u00e9rmino de b\u00fasqueda)</html>
+OptionPanel.ar = Ar / \u00c1rabe
+OptionPanel.ARC = Arco
+OptionPanel.as_parent = Como el principal
+OptionPanel.ask = Pregunta
+OptionPanel.automatic = Autom\u00E1tico
+OptionPanel.automaticFormat_level = Estilos autom\u00E1ticos de disposici\u00F3n
+OptionPanel.automaticFormat_level1 = Formato del Nodo Ra\u00edz
+OptionPanel.automaticFormat_level2 = Formato de Nodos de Nivel 1.
+OptionPanel.backup_file_number = N\u00famero de copias de seguridad que se conservar\u00e1n
+OptionPanel.Behaviour = Comportamiento
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Burbuja
+OptionPanel.ca = Catal\u00e1n, Valenciano / Catal\u00e1
+OptionPanel.Cancel = Cancelar
+OptionPanel.center_selected_node = Centrar los nodos seleccionados
+OptionPanel.check_updates_automatically = Buscar actualizaciones al iniciar el programa
+OptionPanel.childpattern = Patr\u00F3n de Hijos
+OptionPanel.childpattern.tooltip = El patr\u00F3n seleccionado se aplica a todos los hijos.
+OptionPanel.clear_all_setters = Cambiar todos
+OptionPanel.clear_all_setters.tooltip = Activa o desactiva todas las indicaciones de cambio
+OptionPanel.cloud = Nube
+OptionPanel.cloudcolor = Color de la Nube
+OptionPanel.cloudshape = Forma de la Nube
+OptionPanel.combined = Combinado
+OptionPanel.compare_as_number = Comparar como n\u00fameros
+OptionPanel.convert_to_current_version = <html>\u00bfConvertir autom\u00e1ticamente mapas de versiones anteriores <br>de Freeplane a la versi\u00f3n actual?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>S\u00f3lo mapas muy grandes que no requieren conversi\u00f3n <br>(consejo de experto) se pueden abrir sin conversi\u00f3n previa.</html>
+OptionPanel.cs = Cs / Checo
+OptionPanel.cut_nodes_without_question = \u00bfCortar los nodos sin confirmaci\u00f3n?
+OptionPanel.cut_nodes_without_question.tooltip = Si esta casilla est\u00e1 marcada, los nodos se cortan sin pedir confirmaci\u00f3n. Puede causar perdida de informaci\u00f3n si se marca por un casual.
+OptionPanel.da = Dk / Dan\u00e9s
+OptionPanel.date_format = Formaro de fecha est\u00e1ndar
+OptionPanel.date_format.tooltip = Cualquiera de SHORT, MEDIUM, LONG o FULL o un patr\u00f3n como "MM/dd/yyyy"
+OptionPanel.datetime_format = Formato de fecha-hora est\u00e1ndar
+OptionPanel.datetime_format.tooltip = Cualquier <datestyle>,<timestyle> (con SHORT, MEDIUM, LONG o FULL como estilo) o un patr\u00f3n completo como "M/d/yyyy hh:mm"
+OptionPanel.de = De / Alem\u00e1n
+OptionPanel.default = Por Defecto
+OptionPanel.default_attribute_key_column_width = Ancho est\u00e1ndar del atributo clave
+OptionPanel.default_attribute_value_column_width = Valor por defecto para el ancho
+OptionPanel.default_browser_command_mac = Navegador por defecto. Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> y MAC: (gracias a to Nick!)</html>
+OptionPanel.default_browser_command_other_os = Navegador por defecto. Otros SO
+OptionPanel.default_browser_command_other_os.tooltip = <html> Esto es t\u00EDpicamente Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Navegador por defecto. Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Para Windows (los "" signos son necesarios debido a los enlaces, que tienen "=" en su URL).</html>
+OptionPanel.default_browser_command_windows_nt = Navegador por defecto. Windows Nt
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Para Windows (los "" signos son necesarios debido a los enlaces, que tienen "=" en su URL).</html>
+OptionPanel.default_charset = Juego de Caracteres
+OptionPanel.Defaults = Por Defecto
+OptionPanel.delete_automatic_saves_at_exit = Borrar Salvados Autom\u00E1ticos al Salir
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Si los ficheros deben ser borrados autom\u00E1ticamente en un apagado normal de Freeplane, fijar la siguiente variable a 'true'</html>
+OptionPanel.delete_nodes_without_question = \u00BFBorrar nodo sin confirmaci\u00F3n?
+OptionPanel.delete_nodes_without_question.tooltip = Si esta check box se activa los nodos ser\u00E1n borrados sin confirmaci\u00F3n. Esto puede causar p\u00E9rdida de informaci\u00F3n si se presiona sin intenci\u00F3n.
+OptionPanel.disable_cursor_move_paper = Desactivar Papel de Movimiento de Cursor
+OptionPanel.disable_cursor_move_paper.tooltip = <html>No mostrar 'mover' cursor durante arrastre de papel</html>
+OptionPanel.display_inline_editor_for_all_new_nodes = Mostrar el editor para todos los nodos nuevos
+OptionPanel.display_node_id = Mostrar la Identidad del nodo
+OptionPanel.edgecolor = Color del Borde
+OptionPanel.edgecolor.tooltip = Propiedad del borde del nodo padre (se aplica tambi\u00E9n a todos los nodos hijos)
+OptionPanel.edgestyle = Estilo del borde
+OptionPanel.edgestyle.tooltip = Propiedad del borde del nodo padre (se aplica tambi\u00E9n a todos los nodos hijos)
+OptionPanel.edgewidth = Anchura del borde
+OptionPanel.edgewidth.tooltip = Propiedad del borde del nodo padre (se aplica tambi\u00E9n a todos los nodos hijos)
+OptionPanel.EDIT_CURRENT = Sobreescribir contenido
+OptionPanel.edit_on_double_click = Editar al hacer doble click
+OptionPanel.editor_extra_width = Paso muy ancho
+OptionPanel.editor_extra_width.tooltip = <html>Determina el n\u00famero de pixels para incrementar la anchura de un nodo si el texto supera la anchura actual.</html>
+OptionPanel.el = El / Griego
+OptionPanel.el__buttons_above = Botones en la parte superior
+OptionPanel.el__enter_confirms_by_default = Intro, Por Defecto Confirma
+OptionPanel.el__max_default_window_height = Altura Max de Ventana por Defecto
+OptionPanel.el__max_default_window_width = Anchura Max. de Ventana por Defecto
+OptionPanel.el__min_default_window_height = Altura M\u00EDn de Ventana por Defecto
+OptionPanel.el__min_default_window_width = Anchura M\u00EDnima de Ventana por Defecto
+OptionPanel.el__position_window_below_node = Situar Ventana Debajo del Nodo
+OptionPanel.en = En / Ingl\u00e9s
+OptionPanel.Environment = Entorno
+OptionPanel.es = Es / Espa\u00f1ol
+OptionPanel.et = Et / Estonio
+OptionPanel.execute_scripts_without_asking = \u00bfQuiere que los scripts se ejecuten sin pedir confirmaci\u00f3n?
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Los scripts de Freeplane son capaces de realizar cualquier acto en su ordenador. <br>Por tanto, no deber\u00eda ejecutar aquellos de lo que no est\u00e9 seguro de su uso. </html>
+OptionPanel.execute_scripts_without_exec_restriction = Permitir Ejecutar otras Aplicaciones (No recomendable)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>Si su script necesita ejecutar alguna otra aplicaci\u00f3n (como un navegador) sin pedir confirmaci\u00f3n (!),<br> debe activar esta opci\u00f3n. <br>\u00a1\u00dasela con cuidado porque scripts da\u00f1inos pueden estropear su ordenador!</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Permitir operar con Archivos (No recomendable)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Si su script necesita trabajar con ficheros (abrir, cerrar, leer, escribir, borrar(!)), <br>debe activar esta opci\u00f3n. <br>\u00a1\u00dasela con cuidado porque scripts da\u00f1inos pueden estropear su ordenador!</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Permitir trabajos en Red (No recomendable)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Si su script necesita trabajar en Red, <br> active esta opci\u00f3n. <br>\u00a1\u00dasela con cuidado porque scripts da\u00f1inos pueden revelar contenidos de su ordenador!</body></html>
+OptionPanel.execute_scripts_without_write_restriction = Permitir escribir en los archivos (NO recomendada)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>Si su script necesita permisos de escritura a los archivos (escribir, \u00a1borrar!),<br>debe activar esta opci\u00f3n. <br>Se suele utilizar con permisos de lectura.<br>Pero \u00fasela con cuidado ya que !scripts maliciosos pueden da\u00f1ar su ordenador!</body></html>
+OptionPanel.experimental_file_locking_on = Bloqueo de Ficheros Experimental
+OptionPanel.experimental_file_locking_on.tooltip = <html> Caracter\u00EDstica Experimental </html>
+OptionPanel.export_icons_in_html = Exportar Iconos en Html
+OptionPanel.export_icons_in_html.tooltip = <html> Indica si el HTML exportado de Freeplane deber\u00EDa contener iconos. El problema con iconos es que bastante amenudo los enlaces a iconos no pueden ser encontrados en el HTML exportado.</html>
+OptionPanel.Files = Archivos
+OptionPanel.first = Primero
+OptionPanel.fold_on_click_inside = Plegar al hacer click dentro
+OptionPanel.foldingsymbolwidth = Anchura del S\u00edmbolo de Plegado
+OptionPanel.foldingsymbolwidth.tooltip = <html>Anchura del c\u00edrculo que indica el plegado</html>
+OptionPanel.fork = Bifurcaci\u00F3n
+OptionPanel.format_locale = Idioma para los formatos
+OptionPanel.format_locale.tooltip = Ajustes de idioma para formateo y an\u00e1lisis de los datos
+OptionPanel.formula_disable_caching = Desactivad el cach\u00e9 para la evaluaci\u00f3n de f\u00f3rmulas
+OptionPanel.formula_disable_plugin = Desactivar la evaluaci\u00f3n de f\u00f3rmulas
+OptionPanel.fr = Fr / Franc\u00e9s
+OptionPanel.gl = Gl / Gallego
+OptionPanel.goto_note_end_on_edit = Situar el cursor al final
+OptionPanel.grid_size = Tama\u00f1o del espacio de la cuadr\u00edcula
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Ocultar el borde
+OptionPanel.highlight_formulas = Destacar f\u00f3rmulas
+OptionPanel.horizontal = Horizontal
+OptionPanel.hr = Hr / Croata
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Basado en las Cabeceras
+OptionPanel.html_export_fold_all = Plegar Todos
+OptionPanel.html_export_fold_currently_folded = Plegar los Actualmente Plegados
+OptionPanel.html_export_folding = Carpeta de Exportaci\u00F3n Html
+OptionPanel.html_export_no_folding = Sin Plegar
+OptionPanel.hu = Hu / H\u00fangaro
+OptionPanel.ic_disable = Desactivar
+OptionPanel.ic_file = Uso de disco
+OptionPanel.ic_ram = En la memoria RAM
+OptionPanel.icon = Icono
+OptionPanel.icon.tooltip = Si se aplica, el nodo tendr\u00E1 exactamente este icono.
+OptionPanel.icons.list = Listado de los Iconos est\u00e1ndares mostrados
+OptionPanel.icons.list.tooltip = Aqu\u00ed puede ordenar o quitar los iconos por defecto. Los iconos deben separarse por un ';'.
+OptionPanel.id = Id / Indonesio
+OptionPanel.IGNORE = Hacer nada
+OptionPanel.il__enter_confirms_by_default = Por defecto, la tecla Intro sirve para confirmar
+OptionPanel.image_cache = para im\u00e1genes
+OptionPanel.it = It / Italiano
+OptionPanel.ja = Ja / Japon\u00e9s
+OptionPanel.key_type_action = Al escribir
+OptionPanel.Keystrokes = Atajos y combinaciones del teclado
+OptionPanel.ko = Kr / Coreano
+OptionPanel.label_font_family = Familia de la Fuente
+OptionPanel.label_font_size = Tama\u00F1o de Fuente
+OptionPanel.language = Idioma
+OptionPanel.language.tooltip = <html>Este es el diioma que deber\u00EDa ser usado en el programa. 'autom\u00E1tico' intenta cargar el lenguaje actual del usuario. </html>
+OptionPanel.last = \u00DAltimo
+OptionPanel.last_opened_list_length = Longitud del Listado de \u00daltimos Archivos Abiertos
+OptionPanel.layout_map_on_text_change = Apariencia del mapa durante la edici\u00f3n
+OptionPanel.layout_map_on_text_change.tooltip = Desactivar para mejorar el rendimiento
+OptionPanel.linear = Lineal
+OptionPanel.links = Enlaces
+OptionPanel.links.tooltip = <html>Fijar los Enlaces o bier relativos o bien absolutos </html>
+OptionPanel.load_folding = Cargar
+OptionPanel.load_folding_from_map_default_fold_all = Cargar del mapa o plegar todo
+OptionPanel.load_folding_from_map_default_unfold_all = Cargar del mapa o desplegar todo
+OptionPanel.load_last_map = Abrir autom\u00E1ticamente el \u00FAltimo mapa
+OptionPanel.load_last_map.tooltip = <html>Si est\u00e1 marcado, cuando Freeplane se inicia, carga el \u00FAltimo mapa abierto</html>
+OptionPanel.load_last_maps = Cargar todos los \u00faltimos mapas
+OptionPanel.lookandfeel = Estilo y Apariencia (L&F)
+OptionPanel.lookandfeel.tooltip = <html> El Estilo y Apariencia (L&F) que se utilizar\u00e1. Est\u00E1n soportados \u201Cmetal\u201D, 'windows', 'motif', \u201Cgtk\u201D, \u201Cmac\u201D est\u00E1 disponible solamente en MacOS. Por defecto significa que se usa el look and feel por defecto. Si desea utilizar su propio L&F, incorporar por favor el nombre de la clase aqu\u00ED y asegurase que los archivos jar correspondientes est\u00E1n cargados. Si hay problemas con el L&F, entonces aqu\u00ED elegir 'nada' . Funciona con los applets </html>
+OptionPanel.lt = Lt / Lituano
+OptionPanel.max_displayed_node_count = N\u00famero m\u00e1ximo de nodos mostrados
+OptionPanel.max_image_width = M\u00e1ximo inicial del ancho de la imagen
+OptionPanel.max_image_width.tooltip = Las im\u00e1genes se reducen para ajustarlas al ancho
+OptionPanel.max_menu_item_count = N\u00famero m\u00e1ximo de elementos del men\u00fa
+OptionPanel.max_menu_item_count.tooltip = N\u00famero m\u00e1ximo de elementos dentro de un submen\u00fa, al menos 10
+OptionPanel.max_node_width = Anchura M\u00E1xima de Nodo
+OptionPanel.max_shortened_text_length = M\u00e1xima longitud del nodo abreviado
+OptionPanel.metal = Metal
+OptionPanel.min_node_width = Ancho m\u00ednimo del nodo
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb / Noruego
+OptionPanel.never_save_folding = Nunca
+OptionPanel.nl = Nl / Holand\u00e9s
+OptionPanel.nn = Nn / Noruego
+OptionPanel.nodebackgroundcolor = Color de Fondo del nodo
+OptionPanel.nodebackgroundcolor.tooltip = El fondo del nodo cuando no est\u00e1 seleccionado.
+OptionPanel.nodecolor = Color del Nodo
+OptionPanel.nodecolor.tooltip = El color de primer plano cuando el nodo no est\u00e1 seleccionado.
+OptionPanel.nodefontbold = Fuente Negrita
+OptionPanel.nodefonthyperlink = Hiperenlace
+OptionPanel.nodefontitalic = Fuente Cursiva
+OptionPanel.nodefontname = Fuente del Nodo
+OptionPanel.nodefontsize = Fuente del Nodo
+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 plegado, en cualquier otro caso seg\u00fan la elecci\u00f3n.</td></tr></table></html>
+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
+OptionPanel.number_format = Formato de n\u00famero est\u00e1ndar
+OptionPanel.number_format.tooltip = Patr\u00f3n que contiene '#' para n\u00fameros opcionales o '0' para n\u00fameros obligatorios. Ejemplos: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = N\u00famero de archivos distintos para que se guarden autom\u00e1ticamente
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> n\u00FAmero n de diferentes ficheros en los que almacenar los mapas. El primer salvado autom\u00E1tico se hace en el primer fichero, y de esta manera hasta el salvado n+1 que de forma c\u00EDclica se almacena en el primer fichero</html>
+OptionPanel.OK = Guardar
+OptionPanel.org.freeplane.plugin.bugreport = Norma
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Siempre enviar
+OptionPanel.org.freeplane.plugin.bugreport.ask = Mostrar el di\u00e1logo para el informe
+OptionPanel.org.freeplane.plugin.bugreport.denied = Nunca enviar
+OptionPanel.org.freeplane.plugin.bugreport.userid = Identificador opcional para enviar
+OptionPanel.outline_hgap = Distancia horizontal
+OptionPanel.outline_vgap = Distancia vertical
+OptionPanel.paint_connectors_behind = Los nodos ocultan los conectores
+OptionPanel.parse_data = Reconoce la entrada de n\u00fameros y fecha-hora
+OptionPanel.parse_data.tooltip = Intente analizar la entrade de fecha-hora y n\u00famero y use formatos est\u00e1ndar. Ejemplos: 100,000.00, 12/31, 12/31/99, 1999-12-31 y 1999-12-31 23:59
+OptionPanel.PASTE_HTML = Pegar como HTML
+OptionPanel.PASTE_PLAIN_TEXT = Pegar como texto simple
+OptionPanel.path_property_may_not_be_empty = \u00a1La ruta no puede estar vac\u00eda! No se ha hecho el cambio.
+OptionPanel.patternname = Nombre
+OptionPanel.patternname.tooltip = Nombre de patr\u00F3n \u00FAnico
+OptionPanel.pl = Pl / Polaco
+OptionPanel.placenewbranches = Ubicar Ramas Nuevas
+OptionPanel.placenewbranches.tooltip = <html>Donde ubicar nuevas ramas. Valores v\u00E1lidos: 'Primero' y '\u00FAltimo' </html>
+OptionPanel.plugin.tooltip = Complementos que no son del n\u00facleo.
+OptionPanel.plugins = Complementos
+OptionPanel.presentation_dimmer_transparency = Regulador la transparencia de la presentaci\u00f3n
+OptionPanel.presentation_mode = Modo presentaci\u00f3n
+OptionPanel.printonwhitebackground = <html>Fondo Blanco para impresi\u00F3n</html>
+OptionPanel.printonwhitebackground.tooltip = <html>Siempre usar fondo blanco para impresi\u00F3n</html>
+OptionPanel.pt_BR = Pt BR / Portugu\u00e9s (Brasil)
+OptionPanel.pt_PT = Pt PT / Portugu\u00e9s (Portugal)
+OptionPanel.RECT = Rect\u00e1ngulo
+OptionPanel.relative = Relativo
+OptionPanel.remind_type_of_new_nodes.tooltip = <html>"Preguntar" siempre preguntar\u00e1 (usar en caso de duda).<br>"S\u00ed" muestra el editor de texto enriquecido.<br>"No" muestra el editor de texto simple.</html>
+OptionPanel.remind_use_rich_text_in_new_nodes = Utilizar texto enriquecido para los nodos pegados
+OptionPanel.remove_notes_without_question = \u00bfQuitar las notas sin preguntar?
+OptionPanel.remove_notes_without_question.tooltip = Si se activa esta casilla, las notas que les correspodan a los nodos seleccionados se quitar\u00e1n sin pedir confirmaci\u00f3n. Si se activa de forma accidental puede que pierda informaci\u00f3n.
+OptionPanel.resources_use_default_font_for_notes_too = Utilizar tambi\u00e9n para las notas la fuente que hay por defecto
+OptionPanel.resources_use_margin_top_zero_for_notes = Quitar el margen superior a las notas
+OptionPanel.revision_color = Revisi\u00f3n del Color
+OptionPanel.revision_color.tooltip = Color de fondo para los nodos modificados.
+OptionPanel.ROUND_RECT = Rect\u00e1ngulo redondeado
+OptionPanel.ru = Ru / Ruso
+OptionPanel.save_folding = Guardar el estado de plegamiento
+OptionPanel.save_folding_if_map_is_changed = Si el mapa es modificado
+OptionPanel.save_modification_times = Guardar cada modificaci\u00f3n
+OptionPanel.script_classpath = Ruta de clase para script: directorios que contienen clases y/o JARs (ver sugerencia)
+OptionPanel.script_classpath.tooltip = <html>Listado de JARs y/o directorios para a\u00f1adir a la ruta de clase de scripts y f\u00f3rmulas.<br>Use ; (Windows) o : (Linux, Mac) para separar entradas.<br>Se buscar\u00e1n en los directorios archivos JAR y .class.<br>Rutas que no sean absolutas, se considerar\u00e1n relativas al directorio del usuario de Freeplane.<br>\u00a1Si fija la ruta de clase, debe dar permiso de lectura a los archivos!</html>
+OptionPanel.script_directories = Ruta de b\u00fasqueda para los scripts (separar las entradas con ;;)
+OptionPanel.script_directories.tooltip = <html>Listado de directorios.<br>Use ; (Windows) o : (Linux, Mac) para separar entradas.<br>Rutas que no son absolutas, se considerar\u00e1n relativas al directorio de usuario de Freeplane.</html>
+OptionPanel.script_user_key_name_for_signing = Alias del usuario con cuyas claves se firmar\u00e1 (opcional)
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>Si quiere firmar sus scripts, escriba el alias de la llave aqu\u00ed. <br>Se supone que est\u00e1ra en el almac\u00e9n de claves. <br>La contrase\u00f1a de la llave debe coincidir con la que tiene en el almac\u00e9n (por defecto).</html>
+OptionPanel.scrollbar_increment = Velocidad
+OptionPanel.scrolling_speed = Velocidad autom\u00e1tica de desplazamiento en mapas
+OptionPanel.selection_method = M\u00E9todo de Selecci\u00F3n
+OptionPanel.selection_method.tooltip = <html> con el siguiente selector puede activar/desactivar el esquema de selecci\u00F3n retardado. Opciones Autom\u00E1ticas. De cualquier manera No modificar estas mientras sean salvadas en auto.properties.</html>
+OptionPanel.selection_method_by_click = Por Click
+OptionPanel.selection_method_delayed = Aplazado
+OptionPanel.selection_method_direct = Directo
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Patrones
+OptionPanel.separator.anti_alias = Alisado
+OptionPanel.separator.attributes = Atributos
+OptionPanel.separator.automatic_save = Guardado Autom\u00E1tico
+OptionPanel.separator.behaviour = Comportamiento
+OptionPanel.separator.browser = Navegador
+OptionPanel.separator.cache = Cach\u00e9
+OptionPanel.separator.CloudControls = Nubes
+OptionPanel.separator.commands_for_the_program = Atajos del programa
+OptionPanel.separator.connectors = Conectores
+OptionPanel.separator.data_formats = Formateo y an\u00e1lisis de los datos
+OptionPanel.separator.default_colors = Colores por Defecto
+OptionPanel.separator.default_fonts = Fuentes por Defecto
+OptionPanel.separator.default_styles = Estilos por Defecto
+OptionPanel.separator.EdgeControls = Bordes
+OptionPanel.separator.edit_long_node_window = Ventana de Edici\u00F3n Avanzada del Nodo
+OptionPanel.separator.editing = Par\u00e1metros del Editor
+OptionPanel.separator.files = Archivos
+OptionPanel.separator.formula = F\u00f3rmulas
+OptionPanel.separator.General = General
+OptionPanel.separator.html_export = Exportaci\u00F3n de Html
+OptionPanel.separator.html_import = Importaci\u00f3n de Html
+OptionPanel.separator.hyperlink_types = Tipos de Hiperenlaces
+OptionPanel.separator.icon_properties = Iconos
+OptionPanel.separator.icons = Iconos en "Seleccionar Icono..."
+OptionPanel.separator.initial_map_size = Tama\u00F1o de Mapa Inicial
+OptionPanel.separator.inline_editor = Editor de nodos en la l\u00ednea
+OptionPanel.separator.key_typing = Teclear
+OptionPanel.separator.language = Idioma
+OptionPanel.separator.load = Cargar
+OptionPanel.separator.look_and_feel = Estilo y Apariencia
+OptionPanel.separator.mouse_wheel = Rueda del rat\u00F3n
+OptionPanel.separator.new_node_commands = Instrucciones de Nuevo Nodo
+OptionPanel.separator.node_editing_commands = Instrucciones de Edici\u00F3n de Nodo
+OptionPanel.separator.node_navigation_commands = Instrucciones de Navegaci\u00F3n de Nodo
+OptionPanel.separator.NodeColors = Colores del Nodo
+OptionPanel.separator.NodeFont = Fuente del Nodo
+OptionPanel.separator.NodeShape = Forma del nodo
+OptionPanel.separator.NodeStyle = Estilo del nodo
+OptionPanel.separator.NodeText = Texto del nodo
+OptionPanel.separator.notifications = Confirmaciones
+OptionPanel.separator.org.freeplane.plugin.bugreport = Informar autom\u00e1ticamente de errores
+OptionPanel.separator.other_defaults = Otros Par\u00E1metros por Defecto
+OptionPanel.separator.others = Otros enlaces clave
+OptionPanel.separator.outline_view = Vista de Esquema
+OptionPanel.separator.patterns = Patrones
+OptionPanel.separator.RichTextEditor = Editor de texto enriquecido
+OptionPanel.separator.root_node_appearance = Apariencia del nodo ra\u00edz
+OptionPanel.separator.save = Guardar
+OptionPanel.separator.scripting = Scripting
+OptionPanel.separator.scrollbar = Barra de desplazamiento
+OptionPanel.separator.search = B\u00fasqueda
+OptionPanel.separator.selection_colors = Colores de Selecci\u00F3n
+OptionPanel.separator.selection_method = M\u00E9todo de Selecci\u00F3n
+OptionPanel.separator.single_instance_mode = Instancia \u00fanica de programa
+OptionPanel.separator.size_limits = L\u00edmites de tama\u00f1o
+OptionPanel.separator.spelling = Opciones del corrector ortogr\u00e1fico
+OptionPanel.separator.status = L\u00ednea de estado
+OptionPanel.separator.tooltip = Veces de la descripci\u00f3n emergente
+OptionPanel.separator.undo = Deshacer
+OptionPanel.separator.updates = Programar Actualizaciones
+OptionPanel.set_property_text = Cambiar
+OptionPanel.set_property_text.tooltip = Vac\u00edo: No se modifica; Menos=Eliminar la propiedad (fijar los valores por defecto); M\u00E1s=Cambia la propiedad
+OptionPanel.setscript = \u00bfCambiar?
+OptionPanel.setscript.tooltip = Se puede asociar al estilo un script.
+OptionPanel.sharp_bezier = Bezier con \u00e1ngulos
+OptionPanel.sharp_linear = L\u00ednea con \u00e1ngulos
+OptionPanel.show_icon_for_attributes = Mostrar el Icono para Atributos
+OptionPanel.show_node_tooltips = Mostrat ayuda emergente en los nodos
+OptionPanel.show_note_icons = Mostrar las notas de los iconos
+OptionPanel.show_styles_in_tooltip = Mostrar estilos del nodo en texto flotante (sugerencia)
+OptionPanel.signed_script_are_trusted = Confiar en scripts firmados (recomendable),
+OptionPanel.signed_script_are_trusted.tooltip = Si los scripts los firman alguien de confianza (es decir del autor de Freeplane o t\u00fa), se ejecutar\u00e1 sin restricciones.
+OptionPanel.simplyhtml.default_paste_mode = Pegado por defecto
+OptionPanel.single_backup_directory = Usar un \u00fanico directorio para copias de seguridad
+OptionPanel.single_backup_directory.tooltip = <html> Si las copias de seguridad y autom\u00e1ticas deber\u00edan estar en un \u00fanico directorio en vez de un subdirectorio dentro del que est\u00e1 el mapa.</html>
+OptionPanel.single_backup_directory_path = Directorio de copias de seguridad (si la opci\u00f3n anterior se ha marcado)
+OptionPanel.single_backup_directory_path.tooltip = <html>Anula el directorio por defecto para copias de seguridad <freeplaneuserdir>/.</html>
+OptionPanel.single_instance = Abrir archivs en la instancia que se est\u00e1 ejecutando
+OptionPanel.single_instance_force = Descartar una segunda instancia en cualquier caso
+OptionPanel.single_instance_force.tooltip = Evitar un segundo intento incluso si no hay archivo que cargar
+OptionPanel.sk = Sk / Eslovaco
+OptionPanel.sl = Sl / Esloveno
+OptionPanel.spelling_opt_case_sensitive = Distinguir may\u00fasculas/min\u00fasculas
+OptionPanel.spelling_opt_ignore_all_caps_words = Ignorar palabras en may\u00fascula.
+OptionPanel.spelling_opt_ignore_capitalization = Ignorar la letra en may\u00fascula al principio de la palabra
+OptionPanel.spelling_opt_ignore_words_with_numbers = Ignorar palabras con n\u00fameros
+OptionPanel.spelling_opt_suggestions_limit_dialog = M\u00e1ximo n\u00famero de sugerencias en el di\u00e1logo
+OptionPanel.spelling_opt_suggestions_limit_menu = M\u00e1ximo n\u00famero de sugerencias en el men\u00fa
+OptionPanel.sr = Serbio / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = Archivo de plantilla est\u00e1ndar
+OptionPanel.standardbackgroundcolor = Color de Fondo Est\u00E1ndar
+OptionPanel.standardbackgroundcolor.tooltip = <html>El color est\u00E1ndar de fondo en notaci\u00F3n html </html>
+OptionPanel.standardcloudcolor = Color Est\u00E1ndar de Nube
+OptionPanel.standardcloudcolor.tooltip = <html>El color de nuve est\u00E1ndar en notaci\u00F3n html</html>
+OptionPanel.standardcloudestyle = Estilo Est\u00E1ndar de Nubes
+OptionPanel.standardcloudestyle.tooltip = <html>El estilo est\u00E1ndar de nubes. Actualmente s\u00F3lo est\u00E1 soportado 'bezier'</html>
+OptionPanel.standarddrawrectangleforselection = Mostrar Selecci\u00F3n como Rect\u00E1ngulo
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Marcar los nodos seleccionados mediante un rect\u00E1ngulo.</html>
+OptionPanel.standardlinkcolor = Color Est\u00E1ndar del Enlace
+OptionPanel.standardlinkcolor.tooltip = <html>El color est\u00E1ndar del enlace en notaci\u00F3n html </html>
+OptionPanel.standardlinkestyle = Estilo de Enlace Est\u00E1ndar
+OptionPanel.standardlinkestyle.tooltip = <html>El estilo est\u00E1ndar de enlace. Actualmente s\u00F3lo est\u00E1 soportado 'bezier'</html>
+OptionPanel.standardselectednodecolor = Color de Nodo Seleccionado
+OptionPanel.standardselectednodecolor.tooltip = <html>El color est\u00E1ndar del nodo si seleccionado. En notaci\u00F3n html (#RRGGBB en valores hex) </html>
+OptionPanel.standardselectednoderectanglecolor = Color de Rect\u00E1ngulo de Selecci\u00F3n
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>El color est\u00E1ndar del rect\u00E1ngula que marca los nodos seleccionados. En notaci\u00F3n html (#RRGGBB en valores hex) </html>
+OptionPanel.STAR = Estrella
+OptionPanel.structured_html_import = Importar el HTML como una estructura de nodos
+OptionPanel.structured_icon_toolbar = Barra de herramientas de iconos
+OptionPanel.summary = Resumen
+OptionPanel.sv = Se / Sueco
+OptionPanel.text.use_ctrl_key = Usar 'Asignar Atajo' del men\u00fa de Herramientas
+OptionPanel.time_for_automatic_save = Tiempo para Guardado Autom\u00E1tico
+OptionPanel.time_for_automatic_save.tooltip = <html> tiempo entre dos salvados autom\u00E1ticos consecutivos (en msec): Para deshabilitar el salvado autom\u00E1tico fijar este n\u00FAmero a 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tiempo para la Selecci\u00F3n Aplazada
+OptionPanel.time_for_delayed_selection.tooltip = <html> Tiempo de retardo de Selecci\u00F3n de nodos cuando el rat\u00F3n est\u00E1 encima (en msec). Cambiar este valor a 1 si quiere selecci\u00F3n directa cuando el rat\u00F3n est\u00E9 encima.</html>
+OptionPanel.toolTipManager.dismissDelay = Quitar retraso, ms
+OptionPanel.toolTipManager.initialDelay = Retraso inicial, ms
+OptionPanel.toolTipManager.max_tooltip_width = Anchura de la Herramienta de Consejos
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>La anchura por defecto, en pixels, de la herramienta de consejos.</html>
+OptionPanel.toolTipManager.reshowDelay = Mostrar el retraso,ms
+OptionPanel.tr = Tr / Turco
+OptionPanel.uk_UA = Uk UA / Ucraniano
+OptionPanel.undefined_font = Fuente no definida
+OptionPanel.undo_levels = Deshacer Niveles
+OptionPanel.undo_levels.tooltip = <html>Determina cuantos pasos almacenados pueden ser deshechos v\u00EDa "Deshacer".</html>
+OptionPanel.unfold_on_paste = Despliega nodo al pegar
+OptionPanel.unfold_on_paste.tooltip = Despliega nodo al pegar o Arrastrar y Soltar
+OptionPanel.use_common_out_point_for_root_node = Los bordes comienzan en un punto del nodo ra\u00edz
+OptionPanel.use_common_out_point_for_root_node.tooltip = Los bordes comienzan en un punto del nodo ra\u00edz
+OptionPanel.use_tabbed_pane = Usar Pesta\u00F1as
+OptionPanel.use_tabbed_pane.tooltip = Si los mapas seleccionados son mostrados como pesta\u00F1as (como en FireFox :-) ).
+OptionPanel.user_defined_screen_resolution = Resoluci\u00f3n de pantalla definida por el usuario (dpi)
+OptionPanel.validate_classpath_needs_readaccess = Scripting: \u00a1Si fija la ruta de clase, debe dar permisos de lectura a los archivos!
+OptionPanel.validate_invalid_date_format = Formato de fecha est\u00e1ndar no v\u00e1lido
+OptionPanel.validate_invalid_datetime_format = Formato de fecha-hora est\u00e1ndar no v\u00e1lido
+OptionPanel.validate_invalid_number_format = Formato de n\u00famero no v\u00e1lido
+OptionPanel.validate_write_without_read = Scripting: considere a\u00f1adir el permiso Lectura/Archivo a Escritura/Archivo.
+OptionPanel.validation_error = <html><body>Error(es) de validaci\u00f3n:<p><em>{0}</em><p>Por favor, cambie las preferencias para subsanar el(los) error(es).</body></html>
+OptionPanel.validation_warning = <html><body>Advetencia(s) de validaci\u00f3nn:<p><em>{0}</em></body></html>
+OptionPanel.vi = Vi / Vietnamita
+OptionPanel.wheel_velocity = Velocidad
+OptionPanel.wheel_velocity.tooltip = Un valor m\u00E1s alto tendr\u00E1 como consecuencia un efecto mayor del movimiento de la rueda del rat\u00F3n en el mapa.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN / Chino simplificado
+OptionPanel.zh_TW = Zh / Chino tradicional
+org.freeplane.plugin.bugreport.agree = Enviar
+org.freeplane.plugin.bugreport.always_agree = Siempre enviar
+org.freeplane.plugin.bugreport.always_deny = Nunca enviar
+org.freeplane.plugin.bugreport.deny = No enviar
+org.freeplane.plugin.bugreport.dialog.title = Informar de forma autom\u00e1tica de los errores
+org.freeplane.plugin.bugreport.freeplane_team = Mensaje para el equipo de Freeplane
+org.freeplane.plugin.bugreport.lastreport = El informe recibido
+org.freeplane.plugin.bugreport.never = Que nunca me pidan ayuda
+org.freeplane.plugin.bugreport.question = Freeplane incluye un gestor autom\u00e1tico de seguimiento de errores. \nNo se enviar\u00e1n datos personales o el contenido del mapa.\nInformar de los errores nos permitir\u00e1 mejorar el programa.
+org.freeplane.plugin.bugreport.report = Informe actual
+org.freeplane.plugin.bugreport.wanted_bug = Se produjo un error interno y se inform\u00f3 autom\u00e1ticamente.\nNos gustar\u00eda algo m\u00e1s de informaci\u00f3n para poder reproducir el error.\nPor favor, ay\u00fadenos envi\u00e1ndonos un informe de error a nuestro gestor de seguimiento de errores Mantis:\nexplique lo que estaba haciendo en ese momento, para que podamos reproducirlo.\n\nPulse en OK para abrir la p\u00e1gina de seguimiento de errores en su navegador.\n\nGracias por ayudarnos a reparar un error.\nEl Equipo de Freeplane
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = El nodo {0} no est\u00e1 definido
+out_of_memory = Sin espacio en la memoria.
+overwrite_keyset_question = \u00bfSobrescribir la configuraci\u00f3n de teclas existente?
+PageAction.text = Configurar P\u00E1gina...
+password_is_not_ascii = La contrase\u00f1a no est\u00e1 en ASCII
+PasteAction.text = Pegar
+PasteAttributes.text = Pegar atributos
+PatternNewNameProperty = Nuevo Patr\u00F3n
+PatternToString.backgroundColor = Color de Fondo
+PatternToString.Child = Estilo del nodo hijo
+PatternToString.color = Color
+PatternToString.EdgeColor = Color del Borde
+PatternToString.EdgeStyle = Estilo del Borde
+PatternToString.EdgeWidth = Ancho del Borde
+PatternToString.FontBold = Negrita
+PatternToString.FontItalic = Cursiva
+PatternToString.FontName = Nombre de la Fuente
+PatternToString.Icon = Icono
+PatternToString.NodeFontSize = Tama\u00F1o de Fuente
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = d\u00edas
+PeriodUnit.HOUR = horas
+PeriodUnit.MINUTE = minutos
+PeriodUnit.MONTH = meses
+PeriodUnit.WEEK = semanas
+PeriodUnit.YEAR = a\u00f1os
+plugins/latex/LatexNodeHook.editorTitle = Editar Latex
+plugins/script_filter = Filtro de Script {0}
+plugins/script_filter_error = {0} deber\u00eda haber dado un resultado booleano en {1} pero result\u00f3 {2}
+plugins/ScriptEditor.cancel = &Descartar Cambios y Salir
+plugins/ScriptEditor.exit = Guardar y Salir
+plugins/ScriptEditor.FORBIDDEN_ACTION = Los scripts en Freeplane est\u00e1n restringidos. Las siguientes {0,choice,0#File|1#Network|2#Exec} operaciones est\u00e1n prohibidas: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Puede cambiarlo en la configuraci\u00f3n del programa.
+plugins/ScriptEditor.menu_actions = Acciones
+plugins/ScriptEditor.new_script = Nuevo Script
+plugins/ScriptEditor.run = Ejecutar
+plugins/ScriptEditor.sign = Firmar Script...
+plugins/ScriptEditor/window.Result = Resultado:
+plugins/ScriptEditor/window.title = Editor de Scripts
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Acceso ilegal a la API interna (paquete {0}). - Por favor, contacte con el equipo de Freeplane si la API de scripting no es suficientemente capaz.
+plugins/TimeList.xml_Created = Creado
+plugins/TimeList.xml_Date = Fecha
+plugins/TimeList.xml_Icons = Iconos
+plugins/TimeList.xml_Modified = Modificado
+plugins/TimeList.xml_Notes = Notas
+plugins/TimeList.xml_Text = Texto
+plugins/TimeManagement.xml_appendButton = Agregar Fecha A Los Nodos Seleccionados
+plugins/TimeManagement.xml_Cancel = Cancelar
+plugins/TimeManagement.xml_cancelButton = Cancelar
+plugins/TimeManagement.xml_closeButton = Cerrar
+plugins/TimeManagement.xml_Export = Exportar los Nodos Seleccionados
+plugins/TimeManagement.xml_Find = Buscar
+plugins/TimeManagement.xml_Goto = Ir a
+plugins/TimeManagement.xml_hour = Hora:
+plugins/TimeManagement.xml_menu_actions = Acciones
+plugins/TimeManagement.xml_minute = Minuto:
+plugins/TimeManagement.xml_reminderButton = Recordar En Esta Fecha
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Cuando se presiona, un temporizador es activado en la fecha estipulada. Despu\u00E9s, una ventana llama su atenci\u00F3n.<br> Si usted cierra el mapa, los temporizadores ser\u00E1n reactivados la pr\u00F3xima vez que el mapa sea abierto.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Por el momento s\u00f3lo puede haber un recordatorio por nodo. <br>El recordatorio actual esta ajustado a {0,date} {0,time}, su opci\u00F3n fu\u00E9 {1,date} {1,time}. <br><br>Desea cambiar el recordatorio del nodo (SI) <br>o desea mantener el anterior (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Recordatorio especificado en {0,date} {0,time}.
+plugins/TimeManagement.xml_remindLaterButton = Recordar m\u00e1s tarde
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Recordar m\u00e1s tarde
+plugins/TimeManagement.xml_removeReminderButton = Eliminar Recordatorio
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Eliminar todos los recordatorios asociados con los nodos seleccionados.
+plugins/TimeManagement.xml_Replace = Reemplazar
+plugins/TimeManagement.xml_Replace_All = Reemplazar Todos
+plugins/TimeManagement.xml_Replace_Selected = Reemplazar los Seleccionados
+plugins/TimeManagement.xml_Select = Seleccionar
+plugins/TimeManagement.xml_todayButton = Hoy
+plugins/TimeManagement.xml_WindowTitle = Administraci\u00F3n de Tiempo
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Buscar y Reemplazar
+preferences = Preferencias
+print_preview_title = Vista Preliminar
+PrintAction.text = Imprimir...
+PrintDirectAction.text = Imprimir
+printing_settings = Escalado de impresi\u00F3n
+PrintPreviewAction.text = Vista Previa...
+PropertyAction.dialog = Preferencias
+PropertyAction.text = Preferencias ...
+QuickFilterAction.text = Filtro r\u00e1pido
+QuickFindAction.BACK.text = Encontrar el previo
+QuickFindAction.FORWARD.text = Encontrar el siguiente
+QuickFindAllAction.text = Seleccionar todos los que concuerdan
+QuickHighlightAction.text = Destacar todos los nodos que coinciden
+QuitAction.text = Salir
+read_only = S\u00f3lo Lectura
+ReadScriptError.text = Error al leer el script\nMire el archivo de registro para m\u00e1s detalles.
+really_convert_to_current_version = <html>Este mapa se cre\u00f3 con una versi\u00f3n anterior de Freeplane. <br>\u00bfQuiere convertirlo (recomendable)? <br>(De otra forma, se deber\u00e1 aceptar tal y como est\u00e1 sin garant\u00eda ninguna.) </html>
+really_cut_node = \u00bfDe verdad quiere cortar el/los nodo(s)?
+really_execute_script = \u00bfEst\u00e1 seguro que desea ejecutar los cripts que contiene el mapa? Puede da\u00f1ar su ordenador.
+really_remove_node = \u00BFDe verdad quiere borrar el/los nodo(s)?
+really_remove_notes = \u00bfDe verdad quiere borrar la(s) nota(s)?
+ReapplyFilterAction.text = Volver a aplicar
+red = Rojo
+RedefineStyleAction.text = Redefinir el estilo
+RedoAction.text = Rehacer
+RedoFilterAction.text = Rehacer
+regular_expressions = Expresiones regulares
+ReminderHookAction.text = Eliminar Recordatorio
+ReminderHookAction.tooltip = Borra un recordatorio del nodo.
+remove_file_from_list_on_error = No se ha abierto el archivo {0}. \u00bfQuiere que se quite del listado de \u00faltimos archivos abiertos?
+remove_shortcut_question = \u00bfCambiar tecla?
+remove_shortcut_title = \u00bfQuitar enlace directo?
+RemoveAllIconsAction.text = Eliminar Todos los Iconos
+RemoveConnectorAction.text = Quitar el Conector
+RemoveEncryption.text = Quitar cifrado
+RemoveFormatAction.text = Eliminar el formato
+RemoveIcon_0_Action.text = Quitar el primer icono
+RemoveIconAction.text = Eliminar \u00FAltimo Icono
+RemoveNoteAction.text = Quitar Notas
+RemoveNoteAction.tooltip = <html>Posiblemente quita el contenido de varias notas.</html>
+rename = Renombrar
+repair_link = Reparar Enlace
+repair_link_question = No se pudo cargar el Mapa enlazado. \u00BFQuiere reparar el enlace manualmente?
+replace = Reemplazar
+replace_shortcut_question = Este atajo del teclado ya est\u00e1 asignado a \n {0}.\n \u00bfQuiere reemplazarlo?
+replace_shortcut_title = \u00bfReemplazar el enlace directo?
+ReportBugAction.text = Informar de un fallo
+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
+RevisionPluginAction.text = Cambiar las modificaciones del color de fondo
+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 la configuraci\u00f3n de teclas
+SaveAction.text = Guardar
+SaveAll.text = Guardar Todo
+SaveAll.tooltip = Guardar todos los mapas abiertos
+SaveAsAction.text = Guardar Como...
+saved = Guardado
+saving_canceled = Se ha cancelado la acci\u00f3n de guardar
+scanners_not_loaded = No se pudieron cargar los scanners, fichero corrupto.
+scheme_evaluate = \u00a1Evaluar!
+script_execution_disabled = Ejecuci\u00f3n de script desactivada
+ScriptEditor.text = Editor de Scripts ...
+ScriptEditor.tooltip = Activa escribir scripts grandes en Freeplane.
+ScriptEditorPanel.changed_cancel = Los scripts fueron modificados. \u00BFQuiere salir sin guardar estos cambios?
+scripting_api_generator_legend = Leyenda
+scripting_api_generator_proxy = Proxy
+scripting_api_generator_title = Scripting API
+scripting_api_generator_utilities = Utilidades
+scripting_api_generator_web = Recursos web
+select_favorites_folder = Seleccione la carpeta donde est\u00e1n sus favoritos
+select_file_export_to = Elegir el archivo que se quiere exportar
+select_folder_for_importing = Seleccionar carpeta a importar
+select_icon = Seleccionar un Icono
+select_menu_item_dialog = Seleccione una opci\u00f3n del men\u00fa
+select_menu_item_root_node = Men\u00fa
+SelectAllAction.text = Selecciona Todos los visibles
+SelectBranchAction.text = Selecciona Rama Visible
+SelectedPasteAction.text = Pegar como...
+selection_method_by_click = Pulse una vez para seleccionar
+selection_method_delayed = Selecci\u00F3n Autom\u00E1tica Retardada
+selection_method_direct = Apunta para seleccionar
+SelectNoteAction.text = Muestra/Oculta el Editor de Notas
+SelectNoteAction.tooltip = Muestra u Oculta el Editor de Notas
+set_accelerator_on_next_click_action = Pulse en cualquier elemento del men\u00fa para asignarle un nuevo atajo
+SetAcceleratorOnNextClickAction.text = Asignar atajo
+SetImageByFileChooserAction.text = Imagen (Seleccionar archivo u enlace)...
+SetLinkAnchorAction.text = Definir el enlace a la etiqueta de ancla
+SetLinkAnchorAction.tooltip = <html>Marcar el nodo seleccionado como etiqueta de ancla para futuros<br/>enlaces globales o locales.
+SetLinkAnchorAction.tooltip_anchored = <html>Marcar el nodo seleccionado como etiqueta de ancla de futuros<br/>enlaces globales o locales. Etiqueta de ancla actual:<br/>{0}
+SetLinkByFileChooserAction.text = Enlace (Seleccionar archivo)...
+SetLinkByTextFieldAction.text = Enlace (Campo de texto)...
+SetNodeLink.text = Fijar enlace del nodo...
+SetNoteWindowPosition.bottom.text = Abajo
+SetNoteWindowPosition.left.text = Izquierda
+SetNoteWindowPosition.right.text = Derecha
+SetNoteWindowPosition.top.text = Arriba
+SetShortenerStateAction.text = Contenido abrevidado del nodo
+sf_login_required = Debe iniciar sesi\u00f3n en Source Forge. \u00bfDesea continuar?
+ShowAllAttributesAction.text = Mostrar todos los atributos
+ShowAncestorsAction.text = Mostrar Ascendentes
+ShowAttributeDialogAction.text = Gestor Atributos...
+ShowDescendantsAction.text = Mostrar Descendientes
+ShowFilterToolbarAction.text = Barra de herramientas de Filtros
+ShowFormatPanel.text = Panel de formato
+ShowFormatPanel.tooltip = Muestra un cuadro de di\u00e1logo que permite cambiar de una vez el estilo del nodo y el borde.
+ShowHideNoteAction.text = Mostrar/Esconder Ventana de Notas
+ShowHideNoteAction.tooltip = Permite ocultar o mostrar la ventana de notas
+ShowNextChildAction.text = Mostrar siguiente hijo
+ShowNotesInMapAction.text = Mostrar notas en el mapa
+ShowSelectedAttributesAction.text = Mostrar Atributos Seleccionados
+ShowSelectionAsRectangleAction.text = Muestra/Oculta la Selecci\u00F3n dentro de un Rect\u00e1ngulo
+simplyhtml.aboutFrameTitle = Acerca de esta aplicaci\u00F3n
+simplyhtml.aboutLabel = Acerca de SimplyHTML...
+simplyhtml.alignCenter = centro
+simplyhtml.alignLabel = Alineaci\u00f3n:
+simplyhtml.alignLeft = izquierda
+simplyhtml.alignRight = derecha
+simplyhtml.allCellsRangeLabel = todas las celdas
+simplyhtml.allOccurrencesReplaced = Todas las ocurrencias reemplazadas
+simplyhtml.appendTableColLabel = A\u00F1adir columna
+simplyhtml.appendTableRowLabel = A\u00F1adir fila
+simplyhtml.applyCellAttrLabel = Aplicar a
+simplyhtml.backgroundLabel = Fondo
+simplyhtml.boldItalicName = cursiva negrita
+simplyhtml.boldName = negrita
+simplyhtml.borderColorLabel = Color:
+simplyhtml.borderWidthLabel = Anchura
+simplyhtml.bottomLabel = Abajo:
+simplyhtml.cancelBtnName = Cancelar
+simplyhtml.cellBorderTabLabel = Bordes
+simplyhtml.cellGenTabLabel = General
+simplyhtml.cellMarginTabLabel = Margen
+simplyhtml.cellPanelTitle = Formato de Celda
+simplyhtml.clearFormatLabel = Eliminar Formato
+simplyhtml.clearFormatTip = Eliminar Formato
+simplyhtml.close = Cerrar
+simplyhtml.closeBtnName = Cerrar
+simplyhtml.colorLabel = Color
+simplyhtml.copyLabel = Copiar
+simplyhtml.copyTip = copiar
+simplyhtml.cTagNameHead1 = T\u00EDtulo 1
+simplyhtml.cTagNameHead2 = T\u00EDtulo 2
+simplyhtml.cTagNameHead3 = T\u00EDtulo 3
+simplyhtml.cTagNameHead4 = T\u00EDtulo 4
+simplyhtml.cTagNameHead5 = T\u00EDtulo 5
+simplyhtml.cTagNameHead6 = T\u00EDtulo 6
+simplyhtml.cTagNameLink = Enlace
+simplyhtml.cTagNameOL = Lista Ordenada
+simplyhtml.cTagNamePara = Par\u00E1grafo
+simplyhtml.cTagNameUL = Lista no ordenada
+simplyhtml.cutLabel = Cortar
+simplyhtml.cutTip = cortar
+simplyhtml.defaultDocName = Sin t\u00EDtulo
+simplyhtml.deleteTableColLabel = Borrar columna
+simplyhtml.deleteTableRowLabel = Borrar fila
+simplyhtml.docTitleQuery = Fijar t\u00EDtulo a:
+simplyhtml.docTitleTitle = Editar T\u00EDtulo del Documento
+simplyhtml.editLabel = Editar
+simplyhtml.effectLabel = Efecto
+simplyhtml.familyLabel = Familia
+simplyhtml.findNext = Buscar siguiente...
+simplyhtml.findReplaceDialogTitle = B\u00FAscar y Reemplazar
+simplyhtml.findReplaceLabel = B\u00FAscar y Reemplazar
+simplyhtml.findReplaceTip = encontrar y reemplazar
+simplyhtml.fontBoldLabel = Negrita
+simplyhtml.fontBoldTip = conmutar negrita on/off
+simplyhtml.fontColorLabel = Color del texto
+simplyhtml.fontColorTip = Color del texto
+simplyhtml.fontDialogTitle = Formatear Fuente
+simplyhtml.fontItalicLabel = Cursiva
+simplyhtml.fontItalicTip = Activa o desactiva la cursiva
+simplyhtml.fontLabel = Fuente...
+simplyhtml.fontTabLabel = Fuente
+simplyhtml.fontTip = Formato de fuente...
+simplyhtml.fontUnderlineLabel = Subrayar
+simplyhtml.fontUnderlineTip = Activa o desactiva el subrayado
+simplyhtml.foregroundLabel = Primer Plano
+simplyhtml.formatLabel = Formato
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = cambiar formato de lista
+simplyhtml.formatParaLabel = Par\u00E1grafo...
+simplyhtml.formatParaTip = Cambiar formato de par\u00E1grafo
+simplyhtml.formatTableLabel = Tabla...
+simplyhtml.formatTableTip = Formatea tabla
+simplyhtml.helpLabel = Ayuda
+simplyhtml.htmlTabTitle = Vista de c\u00F3digo HTML
+simplyhtml.imageFileDesc = Ficheros de imagen
+simplyhtml.insertTableColLabel = Insertar columna
+simplyhtml.insertTableLabel = Tabla...
+simplyhtml.insertTableMsg = \u00BFCuantas columnas?
+simplyhtml.insertTableRowLabel = Insertar fila
+simplyhtml.insertTableTitle = insertarTabla
+simplyhtml.italicName = cursiva
+simplyhtml.layoutTabTitle = Vista de disposici\u00F3n
+simplyhtml.leftLabel = izquierda:
+simplyhtml.listDialogTitle = Formato de Lista
+simplyhtml.listIndentTitle = Sangrado:
+simplyhtml.listPosInside = dentro
+simplyhtml.listPositionLabel = Posici\u00F3n:
+simplyhtml.listPosOutside = fuera
+simplyhtml.listTypeCircle = vi\u00F1eta redonda
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = S\u00EDmbolo de fichero como vi\u00F1eta
+simplyhtml.listTypeLabel = Tipo:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = ninguno
+simplyhtml.listTypeSquare = vi\u00F1eta cuadrada
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Exterior
+simplyhtml.matchApproximately = Coincidencia aproximada
+simplyhtml.matchApproximately.tooltip = <html>Si se admiten coincidencias aproximadas,<br/>p.e. al buscar la palabra 'files' se acepta 'flies'.</html>
+simplyhtml.matchCase = Coincidir may\u00FAsculas y min\u00FAsculas
+simplyhtml.matchCase.tooltip = Si se destaca el caso cuando hay coincidencia.
+simplyhtml.newStyleDefaultName = nuevo estilo
+simplyhtml.nextTableCellLabel = Celda siguiente
+simplyhtml.noLineLabel = ninguno
+simplyhtml.noMoreOccurrencesFound = no se han encontrado (m\u00E1s) ocurrencias
+simplyhtml.okBtnName = Bien
+simplyhtml.paddingLabel = Interior
+simplyhtml.paraAlignCenterLabel = Centrado
+simplyhtml.paraAlignCenterTip = Centrar el par\u00E1grafo
+simplyhtml.paraAlignLeftLabel = Alinear izquierda
+simplyhtml.paraAlignLeftTip = Fijar alineado izquierdo de par\u00E1grafo
+simplyhtml.paraAlignRightLabel = Alinear derecha
+simplyhtml.paraAlignRightTip = Fijar alineado derecho de par\u00E1grafo
+simplyhtml.paraStyleDialogTitle = Estilo de Par\u00E1grafo
+simplyhtml.paraTabLabel = Par\u00E1grafo
+simplyhtml.pasteHTMLLabel = Pegar como HTML
+simplyhtml.pasteLabel = Pegar
+simplyhtml.pastePlainTextLabel = Pegar como texto simple
+simplyhtml.pasteTip = pegar
+simplyhtml.plainName = sencillo
+simplyhtml.previewLabel = Vista Previa
+simplyhtml.previewText = Vista previa del texto
+simplyhtml.prevTableCellLabel = Celda previa
+simplyhtml.printLabel = Imprimir...
+simplyhtml.redoLabel = Rehacer
+simplyhtml.redoTip = rehacer
+simplyhtml.replace = Reemplazar...
+simplyhtml.replaceAll = Todos
+simplyhtml.replaceDone = Hecho
+simplyhtml.replaceNo = No
+simplyhtml.replaceThisQuery = Reemplazar esta indicendia de
+simplyhtml.replaceWith = Reemplazar con:
+simplyhtml.replaceYes = S\u00ED
+simplyhtml.rightLabel = derecha:
+simplyhtml.searchDown = Buscar hacia abajo
+simplyhtml.searchDown.tooltip = Buscar de arriba a abajo.
+simplyhtml.searchFromStart = Buscar desde el principio
+simplyhtml.searchFromStart.tooltip = Empezar a buscar desde el inicio en vez de la posici\u00f3n del cursor.
+simplyhtml.searchUp = B\u00FAscar hacia arriba
+simplyhtml.searchUp.tooltip = Buscar de abajo a arriba.
+simplyhtml.selectAllLabel = Seleccionar todos
+simplyhtml.sizeLabel = Tama\u00F1o
+simplyhtml.standardStyleName = est\u00E1ndar
+simplyhtml.strikeLabel = Tachado
+simplyhtml.styleLabel = Estilo
+simplyhtml.styleNameInputText = \u00BFNombre del nuevo estilo?
+simplyhtml.styleNameInputTitle = Guardar estilo
+simplyhtml.tableBgColLabel = Color de fondo:
+simplyhtml.tableDialogTitle = Formatear Tabla
+simplyhtml.tableLabel = Tabla
+simplyhtml.tablePanelTitle = Formato de Tabla
+simplyhtml.tableWidthLabel = Anchura:
+simplyhtml.textIndentLabel = Sangrar:
+simplyhtml.textToFind = Texto buscado:
+simplyhtml.thisCellRangeLabel = esta celda
+simplyhtml.thisColRangeLabel = esta columna
+simplyhtml.thisRowRangeLabel = esta fila
+simplyhtml.toggleBulletsLabel = Vi\u00F1etas on/off
+simplyhtml.toggleBulletsTip = vi\u00F1etas on/off
+simplyhtml.toggleNumbersLabel = Activar o desactivar la Numeraci\u00F3n
+simplyhtml.toggleNumbersTip = activa o desactiva el listado numerado
+simplyhtml.topLabel = Arriba:
+simplyhtml.uLineLabel = Subrayar
+simplyhtml.unableToOpenFileError = El archivo no se puede abrir
+simplyhtml.unableToRedoError = No es posible rehacer:
+simplyhtml.unableToUndoError = No es posible deshacer:
+simplyhtml.undoLabel = Deshacer
+simplyhtml.undoTip = deshacer
+simplyhtml.valignBaseline = L\u00EDnea Base
+simplyhtml.valignBottom = fondo
+simplyhtml.valignLabel = Alineaci\u00f3n Vertical:
+simplyhtml.valignMiddle = medio
+simplyhtml.valignTop = arriba
+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
+SplitConditionAction.text = Dividir
+SplitNode.text = Dividir el Nodo
+SplitNode.tooltip = <html>El Nodo se divide</html>
+STANDARD_FORMAT = Est\u00e1ndar
+stop_processing = Parar
+StringFlavorHandler = Texto simple como jerarqu\u00eda de nodos
+StructuredHtmlFlavorHandler = HTML como jerarqu\u00eda de nodos
+style = Estilo
+style_already_exists = El estilo ya existe.
+styledialog.cancel.text = Anular
+styledialog.ok.text = De acuerdo
+styles = Est&ilos
+styles.AutomaticLayout = Dise\u00f1o autom\u00e1tico
+styles.connection = Conexi\u00f3n
+styles.date = Fecha
+styles.definition = Definici\u00f3n
+styles.description = Descripci\u00f3n
+styles.floating_node = Nodo flotante
+styles.idea = Idea
+styles.important = Importante
+styles.key = Llave
+styles.list = Lista
+styles.needs_action = Requiere acci\u00f3n
+styles.note = Nota
+styles.ok = De acuerdo
+styles.pending = Pendiente
+styles.predefined = Estilos predefinidos
+styles.question = Pregunta
+styles.quotation = Cita
+styles.root_node = Estilos
+styles.subsubtopic = Subsubt\u00f3pico
+styles.subtopic = Subt\u00f3pico
+styles.topic = T\u00f3pico
+styles.user-defined = Estilos definidos por el usuario
+styles.website = Sitio web
+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...
+TimeListAction.tooltip = Muestra todos los tiempos agendados y los correspondientes nodos.*
+TimeManagementAction.text = Mostrar Calendario...
+TimeManagementAction.tooltip = <html>Muestra el m\u00F3dulo calendario por Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = (Des)doblar hija
+ToggleDetailsAction.text = (Des)activar detalles
+ToggleFBarAction.text = Barra con teclas de Funci\u00f3n
+ToggleFoldedAction.text = (Des)activar Plegado
+ToggleFullScreenAction.text = Modo Pantalla completa
+ToggleLeftToolbarAction.text = (Des)activar Barra de herramientas izquierda
+ToggleMenubarAction.text = (Des)activar Barra de men\u00FA
+ToggleStatusAction.text = Mostrar estado de l\u00ednea
+ToggleToolbarAction.text = (Des)activar Barra de herramientas
+undefined_error = Ocurri\u00F3 un error inesperado. Por favor reportelo a los desarrolladores de Freeplane.
+underline = Subrayar
+UnderlineAction.text = Subrayar
+underlined = Subrayado
+UndoAction.text = Deshacer
+UndoFilterAction.text = Deshacer
+unfold = Desplegar
+UnfoldAllAction.text = Desplegar Todos
+UnfoldAllAction.tooltip = <html>Desdobla los nodos seleccionados y todos sus hijos.</html>
+UnfoldOneLevelAction.text = Desplegar Un Nivel
+UnfoldOneLevelAction.tooltip = <html>Despliega un nivel de nodos seleccionados.</html>
+up = Arriba
+update_failed = La actualizaci\u00f3n fall\u00f3 y di\u00f3 el siguiente mensaje {0}
+UpdateCheckAction.text = Comprobar actualizaciones
+updatecheckdialog = Di\u00e1logo de la Comprobaci\u00f3n de Actualizaciones
+url_error = \u00a1Esta URL est\u00E1 mal escrita!
+url_open_error = No se puede abrir la URL {0}.
+used_in_menu = No se puede usar este acceso r\u00e1pido, ya que se utiliza en uno del men\u00fa.
+UsePlainTextAction.text = Usar Texto Simple
+user_config_folder = Carpeta con la configuraci\u00f3n del usuario: {0}
+user_defined_scale = Escala definida por el usuario
+user_defined_zoom = Definido por el usuario.
+user_defined_zoom_status_bar = Cambiar el nivel de acercamiento al nivel definido por el usuario {0}%.
+user_icon = Icono del Usuario "{0}"
+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...
+ViewLayoutTypeAction.OUTLINE.text = Vista en esquema
+WebDocuAction.text = Documentaci\u00F3n Web
+width = Anchura
+wrong_regexp = Expresi\u00f3n regular err\u00f3nea "{0}", error {1}
+xslt_export.html = Documento HTML
+xslt_export.latex = Documento Latex
+xslt_export.latexbook = Libro en Latex
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Formato Excel (2003 o posteriores) XML
+xslt_export.ms_project = Formato MS Project (2003 o posteriores) XML
+xslt_export.ms_word = Formato Word (2003 o posteriores) XML
+xslt_export.text = Texto simple
+xslt_export_not_possible = La exportaci\u00f3n Freeplane XSLT no es posible
+yes = S\u00ED
+ZoomInAction.text = Acercar
+ZoomOutAction.text = Alejar
diff --git a/freeplane/resources/translations/Resources_et.properties b/freeplane/resources/translations/Resources_et.properties
new file mode 100644
index 0000000..c8929be
--- /dev/null
+++ b/freeplane/resources/translations/Resources_et.properties
@@ -0,0 +1,982 @@
+AboutAction.text = Programmist
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Muuda s\u00F5lmede kujundust
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Muuda mustrit
+accessories/plugins/EncryptNode.properties_0 = Vali salas\u00F5na kr\u00FCpteeritud s\u00F5lme jaoks
+accessories/plugins/EncryptNode.properties_1 = Salas\u00F5nad ei ole samad v\u00F5i on liiga l\u00FChikesed.
+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_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.
+accessories/plugins/EncryptNode.properties_select_me = Vali mind, et j\u00E4tkata!
+accessories/plugins/EncryptNode.properties_wrong_password = Salas\u00F5na ei ole \u00F5ige.
+accessories/plugins/ExportWithTWiki.text = Kui TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Ekspordib kaardi TWiki dokumendina.
+accessories/plugins/ExportWithXSLT.tooltip = See on unikaalne eksportimise meetod kasutades XSLT skripte.
+accessories/plugins/ExportWithXSLT_Applet.text = Kui Java rakend...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Ekspordib kaardi kui veebilehitseja Java rakendi.
+accessories/plugins/ExportWithXSLT_Flash.text = Kui v\u00E4lkrakendus (.swf)...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Ekspordib kaardi v\u00E4lkrakendusena (.swf).
+accessories/plugins/ExportWithXSLT_HTML.text = Kui XHTML (JavaScript-i versioon)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Kui XHTML (Kl\u00F5psatav kaart, pildiversioon)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Ressursid s\u00F5lmest RESSURSID Tegumihalduri faili...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Ekspordib ressursid s\u00F5lmest RESSURSID Tegumihalduri moodulisse. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = \u00DClesanded moodulist \u00DCLESANDED Tegumihalduri faili...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Ekspordib \u00FClesanded \u00DCLESANDED s\u00F5lmest Tegumihalduri moodulisse.</html>
+add = &Lisa
+AddLocalLinkAction.text = Lisa kohalik h\u00FCperviide
+antialias_all = Pehmenda: fonte k\u00F5ikjal
+antialias_edges = Pehmenda: servad
+antialias_none = Eemalda pehmendamine
+apply = &Rakenda
+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...
+attribute_delete = Kustuta k\u00F5ik v\u00E4\u00E4rtused
+attribute_delete_value = Kustuta see v\u00E4\u00E4rtus
+attribute_font_size_tooltip = Omaduste kirjasuurus
+attribute_list_box_label_text = Praegused v\u00E4\u00E4rtused
+attribute_replace = Asenda sellega
+attribute_top = K\u00F5ik tuntud omadused avatud m\u00F5ttekaartidele
+attributes_adding_empty_attribute_error = Omaduse nimena ei saa t\u00FChja v\u00E4\u00E4rtust kasutada
+attributes_all = K\u00F5ik omadused
+attributes_attribute = Omadused
+attributes_close = Sulge
+attributes_deselect_all = Mitte midagi
+attributes_dialog_title = Omaduste haldur
+attributes_edit = Redigeeri
+attributes_edit_tooltip = Redigeeri valikut
+attributes_for_selected = Valitud s\u00F5lmed
+attributes_for_visible = K\u00F5ik n\u00E4htavad s\u00F5lmed
+attributes_import = &Impordi
+attributes_import_tooltip = Impordi omadused teistelt avatud m\u00F5ttekaartidelt
+attributes_popup_delete = Kustuta
+attributes_popup_down = Alla
+attributes_popup_edit = Redigeeri
+attributes_popup_hide = Peida
+attributes_popup_new = Uus omadus
+attributes_popup_optimal_width = Paras laius
+attributes_popup_up = \u00DCles
+attributes_refresh = V\u00E4rskenda
+attributes_restricted_attributes_tooltip = Piiratud valik omadusi
+attributes_restricted_values_tooltip = K\u00E4esoleva omaduse piiratud valik v\u00E4\u00E4rtusi
+attributes_restriction = Piiratud valik
+attributes_select_all = K\u00F5ik
+attributes_select_all_tooltip = Vali / Eemalda k\u00F5ik
+attributes_show = N\u00E4ita
+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.tooltip = <html>Parandab kaardi formaati. <br>Esimene tase on must, teine sinine, jne.</html>
+BackAction.text = Tagasi
+BackAction.tooltip = H\u00FCppab valitud ahelas tagasi
+background = Taust
+BlinkingNodeHookAction.text = Vilkuv s\u00F5lm
+BlinkingNodeHookAction.tooltip = <html>See paneb s\u00F5lme vilkuma. Kuid ole ettevaatlik. \u00C4ra lisa seda liiga paljudele s\u00F5lmedele ja <strong> mitte koos teise automaatse efektiga samale s\u00F5lmele</strong></html>
+BoldAction.text = Rasvane
+boldify_branch = Tee rasvaseks
+branch = Haru
+cancel = &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_move_to_child = Ei suuda s\u00F5lme alams\u00F5lme k\u00FClge liigutada .
+CenterAction.text = Keskele
+ChangeConnectorArrowsAction.backward.text = Tagasi
+ChangeConnectorArrowsAction.forward.text = Edasi
+ChangeNodeLevelLeftsAction.text = S\u00F5lm vasakule
+ChangeNodeLevelLeftsAction.tooltip = Peas\u00F5lmest vasakul on s\u00F5lm(ed) t\u00F5stetud allapoole. Need/nemad saavad olema alams\u00F5lmed nende kohal oleva peas\u00F5lme all. Peas\u00F5lmest paremal on s\u00F5lm(ed) t\u00F5stetud allapoole. Alates peas\u00F5lmest muudab(-vad) s\u00F5lm(ed) pooli.
+ChangeNodeLevelRightsAction.text = S\u00F5lm paremale
+ChangeNodeLevelRightsAction.tooltip = Peas\u00F5lmest paremal on s\u00F5lm(ed) t\u00F5stetud allapoole. Need/nemad saavad olema alams\u00F5lmed nende kohal oleva peas\u00F5lme all. Peas\u00F5lmest vasakul on s\u00F5lm(ed) t\u00F5stetud \u00FClespoole. Alates peas\u00F5lmest muudab(-vad) s\u00F5lm(ed) pooli.
+choose_background_color = Vali taustav\u00E4rv:
+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
+CloudAction.text = Pilv
+CloudColorAction.text = Pilve v\u00E4rv...
+ColorProperty.ResetColor = Taasta v\u00E4rvi algv\u00E4\u00E4rtus
+combined = Kombineeritud
+confirmation = Kinnitus
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Kopeeri
+CopySingleAction.text = Kopeeri \u00FCksik
+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
+DecreaseNodeFontAction.text = V\u00E4henda haru kirja
+delete = &Kustuta
+delete_child = Kustuta s\u00F5lm
+DeleteAction.text = Eemalda s\u00F5lm
+DeleteConditionAction.text = Kustuta
+DocumentationAction.text = Dokumentatsioon
+edge = \u00DChendusjoon
+edge_style = \u00DChendusjoone stiil
+edge_width = \u00DChendusjoone laius
+EdgeColorAction.text = \u00DChendusjoone v\u00E4rv...
+EdgeStyleAction.bezier.text = Puutuja k\u00F5ver
+EdgeStyleAction.linear.text = Lineaarne
+EdgeStyleAction.sharp_bezier.text = K\u00F5ver ahenev s\u00F5lmede \u00FChendusjoon
+EdgeStyleAction.sharp_linear.text = Sirge ahenev s\u00F5lmede \u00FChendusjoon
+EdgeStyleAsParentAction.text = Kui eelmine
+EdgeWidthAction_width_parent.text = Naabers\u00F5lmega \u00FChendusjoon
+EdgeWidthAction_width_thin.text = Kitsas
+edit = &Redigeerimine
+edit.decision = HTML Redaktor
+edit.edit_rich_text = Kas soovid kasutada vorminduselemente nagu rasvane - ja kaldkiri?
+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 ...
+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
+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
+ExportBranchAction.text = S\u00F5lmede haru kui uus kaart ...
+ExportBranchToHTMLAction.text = Haru HTML-ina
+ExportPdf.text = Kui PDF...
+ExportSvg.text = Kui SVG...
+ExportToHTMLAction.text = HTML-ina
+ExportToImage.jpg.text = Kui JPEG...
+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
+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_add = &Lisa
+filter_and = &ja
+filter_conditions = Filtrid
+filter_contains = Sisaldab
+filter_delete = &Kustuta
+filter_dialog = Filtri Koostaja
+filter_does_not_exist = Ei ole olemas
+filter_edit_description = Redigeeri filtrite nimekirja
+filter_enter_value = Sisesta v\u00E4\u00E4rtus
+filter_exist = On olemas
+filter_icon = Ikoon
+filter_is_equal_to = On v\u00F5rdne
+filter_is_not_equal_to = Ei ole v\u00F5rdne
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Ei filtreerita
+filter_node = S\u00F5lme tekst
+filter_not = &Ei ole
+filter_or = &v\u00F5i
+filter_select = &Vali
+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.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:
+FollowLinkAction.text = Ava h\u00FCperviide
+font = Kirjat\u00FC\u00FCp
+FontFamilyAction.text = kirja perekond
+FontSizeAction.text = kirja suurus
+format_menu_edge_styles = &\u00DChendusjoone stiilid
+format_menu_edge_widths = \u00DChendusjoone &Laiused
+FormatCopy.text = Kopeeri kujundus
+FormatCopy.tooltip = <html>Kopeerib s\u00F5lme kujunduse.</html>
+FormatPaste.text = Aseta kujundus
+FormatPaste.tooltip = <html>Asetab s\u00F5lme kujunduse.</html>
+ForwardAction.text = Edasi
+ForwardAction.tooltip = H\u00FCppab valitud ahelas edasi
+Freeplane.progress.buildScreen = Loon graafilise liidese...
+Freeplane.progress.createController = Loo kontroller...
+Freeplane.progress.createInitialMode = Loo algne re\u017Eiim...
+Freeplane.progress.endStartup = Programmi k\u00E4ivitamine l\u00F5petatud.
+Freeplane.progress.gettingPreferenceDirectories = Hangin kataloogide eelistusi...
+Freeplane.progress.gettingPreferences = Hangin eelistusi...
+Freeplane.progress.loadMaps = Laadin kaardid...
+Freeplane.progress.propagateLookAndFeel = Kehtesta v\u00E4limus ja tunnetus...
+Freeplane.progress.settingPreferences = Muudan eelistused...
+Freeplane.progress.startCreateController = Alusta kontrolleri loomist...
+Freeplane.progress.updateLookAndFeel = Uuenda v\u00E4ljan\u00E4gemist ja tunnetust...
+freeplane_reverted = Freeplane_Taastatud_
+FreeplaneHelpStarter.text = Abi...
+FreeplaneHelpStarter.tooltip = Freeplane-i laiendatud abi
+GotoLinkNodeAction.text = Mine aadressile
+GrabKeyDialog.common.cancel = Loobu
+GrabKeyDialog.common.ok = Sobib
+GrabKeyDialog.grab-key.assigned-to = On m\u00E4\u00E4ratud
+GrabKeyDialog.grab-key.assigned-to.none = Hetkel ei ole m\u00E4\u00E4ratud
+GrabKeyDialog.grab-key.clear = Puhasta
+GrabKeyDialog.grab-key.remove = Eemalda
+GrabKeyDialog.grab-key.remove-ask = Oled Sa kindel, et soovid seda kiirklahvi eemaldada?
+GrabKeyDialog.grab-key.title = Sisesta uus klahv
+help = Abi
+HideAllAttributesAction.text = Peida k\u00F5ik omadused
+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
+html_export_fold_all = HTML-i eksportimine - voldi k\u00F5ik
+html_export_fold_currently_folded = HTML-i eksportimine - voldi nii nagu hetkel on volditud
+html_export_no_folding = HTML-i eksportimine - ei voldita
+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]
+icon_attach = Vaata siia
+icon_back = Tagasi
+icon_bee = Freeplane[translate me]
+icon_bell = J\u00E4ta meelde
+icon_bookmark = Parim
+icon_broken-line = Katkine
+icon_button_cancel = Ei sobi
+icon_button_ok = Sobib
+icon_calendar = Kuup\u00E4ev
+icon_clanbomber = Ohtlik
+icon_clock = Aeg
+icon_closed = Sissep\u00E4\u00E4su ei ole
+icon_decrypted = Lahti lukustatud
+icon_desktop_new = \u00C4ra unusta
+icon_down = Alla
+icon_edit = Puhasta
+icon_encrypted = Lukustatud
+icon_family = Perekond
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Punane lipp
+icon_flag-black = Must lipp
+icon_flag-blue = Sinine lipp
+icon_flag-green = Roheline lipp
+icon_flag-orange = Oran\u017E lipp
+icon_flag-pink = Roosa lipp
+icon_flag-yellow = Kollane lipp
+icon_folder = Kataloog
+icon_forward = Edasi
+icon_freemind_butterfly = FreeMind
+icon_full-1 = Prioriteet 1
+icon_full-2 = Prioriteet 2
+icon_full-3 = Prioriteet 3
+icon_full-4 = Prioriteet 4
+icon_full-5 = Prioriteet 5
+icon_full-6 = Prioriteet 6
+icon_full-7 = Prioriteet 7
+icon_full-8 = Prioriteet 8
+icon_full-9 = Prioriteet 9
+icon_gohome = Kodu
+icon_group = Group[translate me]
+icon_help = K\u00FCsimus
+icon_hourglass = Ootab
+icon_idea = Idee
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_kmail = E-post
+icon_knotify = Muusika
+icon_korn = E-postkast
+icon_ksmiletris = Olen \u00F5nnelik
+icon_licq = Kena
+icon_Mail = E-post
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = &Ikoonid
+icon_messagebox_warning = T\u00E4htis
+icon_password = V\u00F5ti
+icon_pencil = Rafineeritud
+icon_penguin = GNU/Linux
+icon_smiley-angry = Vihane
+icon_smiley-neutral = M\u00F5tet ei ole
+icon_smiley-oh = \u00DCllatav
+icon_smily_bad = Ma ei ole kaasa haaratud
+icon_stop = Seis
+icon_stop-sign = Seis
+icon_up = \u00DCles
+icon_wizard = Maagiline
+icon_xmag = R\u00E4\u00E4gitud
+icon_yes = T\u00E4htis
+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_linked_branch_no_link = Valitud s\u00F5lmel ei ole \u00FChtki viidet importida.
+ImportAction.text = &Impordi
+ImportBranchAction.text = Haru...
+ImportExplorerFavoritesAction.text = MS Internet Explorer-i viited...
+ImportFolderStructureAction.text = Kataloogide struktuur...
+ImportLinkedBranchAction.text = Viidatud haru
+ImportLinkedBranchWithoutRootAction.text = (Viidatud haru) ilma juurkataloogita...
+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.
+load = &Laadi
+locking_failed_by_open = {0} kaardi lukustamine eba\u00F5nnestus. Avan vaid lugemisre\u017Eiimis.
+locking_failed_by_save_as = {0} kaardi lukustamine eba\u00F5nnestus. Tegevus Salvesta kui... katkestati.
+locking_old_lock_removed = {0} kaart lukustati {1} kasutaja poolt. Lukustus eemaldati kuna see on vana.
+long_node_changed_cancel = Sa oled muutnud s\u00F5lme. Kas soovid muudatused unustada?
+long_node_changed_submit = Sa oled muutnud s\u00F5lme. Kas soovid muudatused salvestada?
+lots_of_links_warning = Sa oled samale s\u00F5lmele mitut viidet loomas. Kas t\u00F5esti soovid neid viiteid luua?
+map_already_exists = Kaart on juba olemas. Kas soovid seda \u00FCle kirjutada?
+map_corrupted = Kaart on vigane. Kas soovid detaile n\u00E4ha?
+map_locked_by_open = {0} kaarti redigeerib juba {1} kasutaja. Avan vaid lugemisre\u017Eiimis.
+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)
+mindmaps_filter_desc = Filtrid (*.mmfilter)
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Re\u017Eiim ei ole saadaval
+mode_status = Re\u017Eiim muudeti re\u017Eiimiks {0}
+mode_title = Freeplane - {0} re\u017Eiim
+modes = Re\u017Eiimid
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = &Enimkasutatavad failid
+MoveToRootAction.text = Liigu algusesse
+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.
+NewChildAction.text = Uus s\u00F5lm olemasoleva s\u00F5lme alla
+NewMapAction.text = Uus
+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
+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>.
+no_more_found_from = <html>Rohkem <b>{0}</b> ei leitud <b>{1}</b>.
+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...
+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
+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.
+ok = &Sobib
+OKAction.text = &Sobib
+OpenAction.text = Ava...
+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.ok = &Jah
+OptionalDontShowMeAgainDialog.rememberMyDescision = &J\u00E4ta minu otsus meelde.
+OptionPanel.absolute = Absoluutne
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automaatne mustrite paigutus
+OptionPanel.antialias = Kirjakujude pehmendamine
+OptionPanel.antialias.tooltip = <html>M\u00E4\u00E4ratleb kaardi kvaliteedi. Kirjakujude pehmendamise (antialias) suurendamine n\u00F5uab ka rohkem aega.</html>
+OptionPanel.antialias_all = Pehmenda: fonte k\u00F5ikjal
+OptionPanel.antialias_edges = Pehmenda: servad
+OptionPanel.antialias_none = L\u00FClita kirja pehmendamine v\u00E4lja
+OptionPanel.Appearance = V\u00E4limus
+OptionPanel.ar = AR (araabia keel)
+OptionPanel.as_parent = Kui naaber
+OptionPanel.ask = K\u00FCsi
+OptionPanel.automatic = Automaatne
+OptionPanel.automaticFormat_level = Automaatne stiilide paigutus
+OptionPanel.automaticFormat_level1 = Peas\u00F5lme kujundus
+OptionPanel.automaticFormat_level2 = 1. taseme s\u00F5lme kujundus
+OptionPanel.Behaviour = K\u00E4itumine
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.bubble = Mull
+OptionPanel.Cancel = Loobu
+OptionPanel.childpattern = Alams\u00F5lme muster
+OptionPanel.childpattern.tooltip = Valitud muster m\u00E4\u00E4ratakse k\u00F5ikidele alams\u00F5lmedele.
+OptionPanel.clear_all_setters = L\u00FClita k\u00F5ik
+OptionPanel.clear_all_setters.tooltip = Lubab v\u00F5i keelab k\u00F5ik muutmise indikaatorid.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Kombineeritud
+OptionPanel.convert_to_current_version = <html>Teisenda kaardid automaatselt vanast Freeplane-i versioonist <br>k\u00E4esolevasse versiooni?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>Ainult v\u00E4ga suurtele kaartidele, mida ei ole vaja teisendada <br>(see info on ekspertidele) v\u00F5id Sa avada vanemas vormingus kaarte neid k\u00E4esolevasse vormingusse teisendamata.</html>
+OptionPanel.cs = CS (t\u0161ehhi keel)
+OptionPanel.cut_nodes_without_question = L\u00F5igata s\u00F5lmed kinnitust k\u00FCsimata?
+OptionPanel.cut_nodes_without_question.tooltip = Kui see on valitud siis s\u00F5lmed l\u00F5igatakse kinnitust k\u00FCsimata. See v\u00F5ib p\u00F5hjustada informatsiooni kaotuse kui t\u00E4helepanuta kasutada.
+OptionPanel.da = DK (taani keel)
+OptionPanel.de = DE (saksa keel)
+OptionPanel.default = Vaikimisi
+OptionPanel.default_browser_command_mac = Vaikimisi veebilehitseja k\u00E4ivitamise k\u00E4sk Mac-is
+OptionPanel.default_browser_command_mac.tooltip = <html> ja Mac-ile: (t\u00E4nud Nick-ile!)</html>
+OptionPanel.default_browser_command_other_os = Vaikimisi veebilehitseja k\u00E4ivitamise k\u00E4sk teistes OS-ides
+OptionPanel.default_browser_command_other_os.tooltip = <html> See on Linux-ile t\u00FC\u00FCpiline:</html>
+OptionPanel.default_browser_command_windows_9x = Vaikimisi veebilehitseja k\u00E4ivitamise k\u00E4sk MS Windows 9x-s
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Windowsi jaoks (jutum\u00E4rgid on vajalikud t\u00E4nu h\u00FCperviitele, millel on "=" m\u00E4rk viites).</html>
+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.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.
+OptionPanel.disable_cursor_move_paper = Keela kursor tausta liigutamisel
+OptionPanel.disable_cursor_move_paper.tooltip = <html>\u00C4ra n\u00E4ita tausta liigutamisel kursori kuju muutust</html>
+OptionPanel.edgecolor = \u00DChendusjoone v\u00E4rv
+OptionPanel.edgecolor.tooltip = Naabers\u00F5lmega \u00FChendava joone omadused (kehtib samuti k\u00F5ikide teisi alams\u00F5lmi \u00FChendavate joonte kohta)
+OptionPanel.edgestyle = \u00DChendusjoone stiil
+OptionPanel.edgestyle.tooltip = Naabers\u00F5lmega \u00FChendava joone omadused (kehtib samuti k\u00F5ikide teisi alams\u00F5lmi \u00FChendavate joonte kohta)
+OptionPanel.edgewidth = \u00DChendusjoone laius
+OptionPanel.edgewidth.tooltip = Naabers\u00F5lmega \u00FChendava joone omadused (kehtib samuti k\u00F5ikide teisi alams\u00F5lmi \u00FChendavate joonte kohta)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Sisestusklahv (Enter) kinnitab vaikimisi
+OptionPanel.el__max_default_window_height = Suurim vaikimisi akna k\u00F5rgus
+OptionPanel.el__max_default_window_width = Suurim vaikimisi akna laius
+OptionPanel.el__min_default_window_height = V\u00E4him vaikimisi akna k\u00F5rgus
+OptionPanel.el__min_default_window_width = V\u00E4him vaikimisi akna laius
+OptionPanel.el__position_window_below_node = Asukoha aken allpool s\u00F5lme
+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.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>
+OptionPanel.execute_scripts_without_file_restriction = Failioperatsioonide lubamine (EI ole soovitatav)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Kui Sinu Lahe Skript vajab k\u00E4ivitumiseks failioperatsioone (avamine, sulgemine, lugemine, kirjutamine, kustutamine (!)),<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>
+OptionPanel.execute_scripts_without_network_restriction = Luba v\u00F5rguoperatsioonid (EI ole soovitatav)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Kui Sinu Lahe Skript vajab k\u00E4ivitumiseks v\u00F5rguoperatsioone,<br>siis pead Sa selle v\u00F5imaluse lubama. <br>Kuid ole ettevaatlik kuna t\u00E4nap\u00E4eval v\u00F5ivad kahtlased skriptid paljastada Sinu saladused!</body></html>
+OptionPanel.experimental_file_locking_on = Katseline faili lukustamine
+OptionPanel.experimental_file_locking_on.tooltip = <html> Katsetusj\u00E4rgus olev omadus</html>
+OptionPanel.export_icons_in_html = Ekspordi ikoonid HTML-i
+OptionPanel.export_icons_in_html.tooltip = <html> M\u00E4\u00E4rab Freeplane-ist HTML-i eksportimisel ikoonide kaasapanemise. P\u00F5hiprobleem ikoonidega on see, et ei leita HTML-koodis viidatud aadressilt ikooni.</html>
+OptionPanel.Files = Failid
+OptionPanel.first = Esimene
+OptionPanel.foldingsymbolwidth = Voltimise s\u00FCmboli laius
+OptionPanel.foldingsymbolwidth.tooltip = <html>Voltimise m\u00E4rkimist v\u00F5imaldava ringikujulise s\u00FCmboli laius</html>
+OptionPanel.fork = Haru
+OptionPanel.fr = FR (prantsuse keel)
+OptionPanel.gl = GL (Galicia, Hispaania)
+OptionPanel.gtk = Gtk
+OptionPanel.hr = HR (horvaadi keel)
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = P\u00F5hineb p\u00E4istel
+OptionPanel.html_export_fold_all = Voldi k\u00F5ik kokku
+OptionPanel.html_export_fold_currently_folded = Voldi hetkel volditud kokku
+OptionPanel.html_export_folding = Voltimine HTML-ekspordil
+OptionPanel.html_export_no_folding = Ei voldita
+OptionPanel.hu = HU (ungari keel)
+OptionPanel.icon = Ikoon
+OptionPanel.icon.tooltip = Kui kehtestada siis s\u00F5lmele tekib t\u00E4pselt samasugune ikoon.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = IT (itaalia keel)
+OptionPanel.ja = JA (jaapani keel)
+OptionPanel.Keystrokes = Kiirklahvid
+OptionPanel.ko = KR (kanuri keel)
+OptionPanel.label_font_size = Kirjakuju suurus
+OptionPanel.language = Keel
+OptionPanel.language.tooltip = <html>See on keel, mida programm kasutama peaks. 'automaatne' proovib laadida sisseloginud kasutajakeskkonna keele eelistust. </html>
+OptionPanel.last = Viimane
+OptionPanel.last_opened_list_length = Viimati avatud nimekirja pikkus
+OptionPanel.linear = Linear[translate me]
+OptionPanel.links = Viited
+OptionPanel.links.tooltip = <html>Sisesta viited kas suhteliste v\u00F5i absoluutaadressidena.</html>
+OptionPanel.load_folding = On Load[translate me]
+OptionPanel.load_last_map = Ava automaatselt viimati avatud kaart
+OptionPanel.load_last_map.tooltip = <html>Kui Freeplane k\u00E4ivitub siis avab ta automaatselt viimati avatud kaardi, kui see on valitud.</html>
+OptionPanel.lookandfeel = V\u00E4limus
+OptionPanel.lookandfeel.tooltip = <html>V\u00E4ljan\u00E4gemine kasutamiseks. 'metalne','windows','motif', 'gtk' on toetatud 'mac'on saadaval vaid MacOS-is. Vaikimisi t\u00E4hendab seda, et vaikimisi v\u00E4ljan\u00E4gemist kasutatakse. Kui soovid isetehtud v\u00E4limust kasutada, palun sisesta klassi nimi siia ja veendu, et vastav *.jar fail on ka olemas, mida laadida. Kui v\u00E4ljan\u00E4gemisega ilmnevad probleemid siis vali 'mitte midagi' siin. See t\u00F6\u00F6tab applet-itega. </html>
+OptionPanel.lt = LT (leedu keel)
+OptionPanel.max_node_width = Maksimaalne s\u00F5lme laius
+OptionPanel.max_node_width.tooltip = <html>Vaikimisi maksimaalne s\u00F5lme laius pikselites</html>
+OptionPanel.metal = Metalne
+OptionPanel.motif = Motif
+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.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 kokku volditud, muidu haru.</td></tr></table></html>
+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
+OptionPanel.number_of_different_files_for_automatic_save = Automaatsalvestamisel erinevate failide arv
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> kaartide salvestuste erinevate failide arv n. Esimene automaatne salvestus kirjutatakse esimesse faili, jne kuni n+1 salvestuseni, mis salvestatakse taas esimese failina (ts\u00FCklina)</html>
+OptionPanel.OK = Salvesta
+OptionPanel.patternname = Nimi
+OptionPanel.patternname.tooltip = Unikaalne mustri nimi
+OptionPanel.pl = PL (poola keel)
+OptionPanel.placenewbranches = Aseta uued harud
+OptionPanel.placenewbranches.tooltip = <html>Kuhu asetada s\u00F5lmede uued harud. Kehtivad v\u00E4\u00E4rtused on 'esimeseks' ja 'viimaseks' </html>
+OptionPanel.printonwhitebackground = <html>Valge taust printimise ajaks</html>
+OptionPanel.printonwhitebackground.tooltip = <html>Kasuta printimisel alati valget tausta</html>
+OptionPanel.pt_BR = PT BR (brasiilia portugali keel)
+OptionPanel.pt_PT = PT PT (portugali keel)
+OptionPanel.relative = Suhteline
+OptionPanel.remove_notes_without_question = Eemaldada m\u00E4rkmed kinnitust k\u00FCsimata?
+OptionPanel.remove_notes_without_question.tooltip = Kui see m\u00E4rkeruut on m\u00E4rgitud siis valitud s\u00F5lmede m\u00E4rkused eemaldatakse kinnitust k\u00FCsimata. See v\u00F5ib lohaka kasutuse tagaj\u00E4rjel tuua kaasa informatsiooni kaotuse.
+OptionPanel.ru = RU (vene keel)
+OptionPanel.script_user_key_name_for_signing = V\u00F5imalik kiirklahv allkirjastamiseks
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>Kui soovid oma skripte allkirjastada, sisesta v\u00F5tme analoog siia. <br>See v\u00F5ti j\u00E4\u00E4b vaikimisi kiirklahvide hulka. <br>Salastatud v\u00F5tmete salas\u00F5na peab langema kokku kiirklahvide salas\u00F5naga (see on vaikimisi nii).</html>
+OptionPanel.selection_method = Valiku meetod
+OptionPanel.selection_method.tooltip = <html> j\u00E4rgneva v\u00F5tme abil saab lubada/keelata viivitusega valiku skeemi. Automaatseadistus. \u00C4ra muuda neid kuna need salvestatakse faili auto.properties nagunii.</html>
+OptionPanel.selection_method_by_click = Kl\u00F5psamisel
+OptionPanel.selection_method_delayed = Viivitusega
+OptionPanel.selection_method_direct = Otse
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Mustrid
+OptionPanel.separator.anti_alias = Kirjakujude pehmendamine
+OptionPanel.separator.attributes = Omadused
+OptionPanel.separator.automatic_save = Automaatne salvestamine
+OptionPanel.separator.behaviour = K\u00E4itumine
+OptionPanel.separator.browser = Lehitseja
+OptionPanel.separator.commands_for_the_program = Programmik\u00E4sud
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Vaikimisi v\u00E4rvid
+OptionPanel.separator.default_fonts = Vaikimisi kirjat\u00FC\u00FCbid
+OptionPanel.separator.default_styles = Vaikimisi stiilid
+OptionPanel.separator.EdgeControls = \u00DChendusjooned
+OptionPanel.separator.edit_long_node_window = Redigeeri s\u00F5lme h\u00FCpikaknas
+OptionPanel.separator.files = Failid
+OptionPanel.separator.General = \u00DCldine
+OptionPanel.separator.html_export = HTML-eksport
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = H\u00FCperviite t\u00FC\u00FCbid
+OptionPanel.separator.icon_properties = Ikoonid
+OptionPanel.separator.icons = Ikoonid valikus "Vali ikoon..."
+OptionPanel.separator.initial_map_size = Esialgne kaardi suurus
+OptionPanel.separator.key_typing = Kiirklahvid
+OptionPanel.separator.language = Keel
+OptionPanel.separator.look_and_feel = V\u00E4limus
+OptionPanel.separator.mouse_wheel = Hiireratas
+OptionPanel.separator.new_node_commands = Uue s\u00F5lme k\u00E4sud
+OptionPanel.separator.node_editing_commands = S\u00F5lme redigeerimise k\u00E4sud
+OptionPanel.separator.node_navigation_commands = S\u00F5lme liigutamise k\u00E4sud
+OptionPanel.separator.NodeColors = S\u00F5lmede v\u00E4rvid
+OptionPanel.separator.NodeFont = S\u00F5lme kirjakuju
+OptionPanel.separator.notifications = Kinnitused
+OptionPanel.separator.other_defaults = Teised vaikimisi seaded
+OptionPanel.separator.others = Teised kiirklahvid
+OptionPanel.separator.patterns = Mustrid
+OptionPanel.separator.root_node_appearance = Peas\u00F5lme v\u00E4limus
+OptionPanel.separator.save = Salvesta
+OptionPanel.separator.selection_colors = V\u00E4rvivalik
+OptionPanel.separator.selection_method = Valiku meetod
+OptionPanel.separator.undo = V\u00F5ta tagasi
+OptionPanel.separator.updates = Program Updates[translate me]
+OptionPanel.set_property_text = Muuda
+OptionPanel.set_property_text.tooltip = T\u00FChi: \u00C4ra puutu; Miinus=Eemalda omadused (kehtestab vaikimisi v\u00E4\u00E4rtused); Pluss=Muuda omadust
+OptionPanel.setscript = Muudame?
+OptionPanel.setscript.tooltip = Skripti v\u00F5ib ka stiiliga siduda.
+OptionPanel.sharp_bezier = j\u00E4rsud kurvid
+OptionPanel.sharp_linear = terav serv
+OptionPanel.show_icon_for_attributes = N\u00E4ita omaduste ikooni
+OptionPanel.signed_script_are_trusted = Usalda allkirjastatud skripte (soovitatav).
+OptionPanel.signed_script_are_trusted.tooltip = Kui skriptid on allkirjastatud usaldusv\u00E4\u00E4rsete partnerite poolt (nt Freeplane-i autori v\u00F5i Sinu enda poolt), siis see k\u00E4ivitatakse ilma piiranguteta.
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = SL (sloveenia keel)
+OptionPanel.standardbackgroundcolor = Standardne taustav\u00E4rv
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standardne taustav\u00E4rv HTML-viidetes </html>
+OptionPanel.standardcloudcolor = Standardne pilve v\u00E4rv
+OptionPanel.standardcloudcolor.tooltip = <html>Standardne pilve v\u00E4rv HTML-m\u00E4rgendis </html>
+OptionPanel.standardcloudestyle = Standardne pilvestiil
+OptionPanel.standardcloudestyle.tooltip = <html>Standardne pilvestiil. Hetkel vaid 'puutujak\u00F5ver' on toetatud</html>
+OptionPanel.standarddrawrectangleforselection = N\u00E4ita valitud s\u00F5lmi mullides
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Joonista valitud s\u00F5lmedele mullid \u00FCmber.</html>
+OptionPanel.standardlinkcolor = Standardne viite v\u00E4rv
+OptionPanel.standardlinkcolor.tooltip = <html>Standardne viite v\u00E4rv HTML-m\u00E4rgendis </html>
+OptionPanel.standardlinkestyle = Standardne viite stiil
+OptionPanel.standardlinkestyle.tooltip = <html>Standardne viite stiil. Hetkel vaid 'puutujak\u00F5ver' on toetatud</html>
+OptionPanel.standardselectednodecolor = Standardne valitud s\u00F5lme v\u00E4rv
+OptionPanel.standardselectednodecolor.tooltip = <html>Standardne s\u00F5lme v\u00E4rv kui see on valitud (aktiivne). HTML-is #RRGGBB (16nd-koodis) </html>
+OptionPanel.standardselectednoderectanglecolor = Valitud s\u00F5lme mulli v\u00E4rv
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>Valitud s\u00F5lmede mulli v\u00E4rv. HTML-is #RRGGBB (16nd-koodis) </html>
+OptionPanel.sv = SE (p\u00F5hja-saami, rootsi keel)
+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.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.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
+OptionPanel.use_tabbed_pane = Kasuta kaarte
+OptionPanel.use_tabbed_pane.tooltip = Kui valitud siis kaarte n\u00E4idatakse sakkidena (nagu Firefoxis :-) ).
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Kiirus
+OptionPanel.wheel_velocity.tooltip = Kaarti saab hiire rattaga kiiremini liigutada kui siia panna suurem v\u00E4\u00E4rtus.
+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
+PasteAction.text = Aseta
+PatternNewNameProperty = Uus muster
+PatternToString.backgroundColor = Taustav\u00E4rv
+PatternToString.Child = Alams\u00F5lme stiil
+PatternToString.color = V\u00E4rv
+PatternToString.EdgeColor = \u00DChendusjoone v\u00E4rv
+PatternToString.EdgeStyle = \u00DChendusjoone stiil
+PatternToString.EdgeWidth = \u00DChendusjoone laius
+PatternToString.FontBold = Rasvane
+PatternToString.FontItalic = Kaldu
+PatternToString.FontName = Kirjakuju nimi
+PatternToString.Icon = Ikoon
+PatternToString.NodeFontSize = Kirjakuju suurus
+plugins/ScriptEditor.cancel = &T\u00FChista muudatused ja v\u00E4lju
+plugins/ScriptEditor.exit = &Salvesta ja v\u00E4lju
+plugins/ScriptEditor.FORBIDDEN_ACTION = Freeplane-i lahedad skriptid on piiratud. J\u00E4rgnev {0,choice,0#File|1#Network|2#Exec} operatsioon on keelatud: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Sa saad seda muuta programmi seadistustes.
+plugins/ScriptEditor.menu_actions = &Tegevused
+plugins/ScriptEditor.new_script = Uus skript
+plugins/ScriptEditor.run = &K\u00E4ivita
+plugins/ScriptEditor.sign = Allkirjasta skript...
+plugins/ScriptEditor/window.Result = Tulemus:
+plugins/ScriptEditor/window.title = Skripti redaktor
+plugins/TimeList.xml_Created = Loodud
+plugins/TimeList.xml_Date = Kuup\u00E4ev
+plugins/TimeList.xml_Icons = Ikoonid
+plugins/TimeList.xml_Modified = Muudetud
+plugins/TimeList.xml_Notes = M\u00E4rkmed
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Lisa kuup\u00E4ev valitud s\u00F5lmedele
+plugins/TimeManagement.xml_Cancel = Loobu
+plugins/TimeManagement.xml_cancelButton = Loobu
+plugins/TimeManagement.xml_closeButton = Sulge
+plugins/TimeManagement.xml_Export = Ekspordi valitud s\u00F5lmed
+plugins/TimeManagement.xml_Find = Otsi
+plugins/TimeManagement.xml_Goto = Mine
+plugins/TimeManagement.xml_hour = Tund:
+plugins/TimeManagement.xml_menu_actions = Tegevused
+plugins/TimeManagement.xml_minute = Minut:
+plugins/TimeManagement.xml_reminderButton = J\u00E4ta mind selle kuup\u00E4evaga meelde
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Kui ajaarvestajale kl\u00F5psatud siis m\u00E4rgitakse k\u00E4esolev aeg \u00FCles. Vilkuvad ikoonid p\u00FC\u00FCavad siis Sinu t\u00E4helepanu.<br> Kui kaardi sulged siis \u00FClesm\u00E4rgitud ajad aktiveeruvad j\u00E4rgmine kord kui kaart avatakse.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Hetkel saab olla vaid \u00FCks meeldetuletaja s\u00F5lme kohta. <br>K\u00E4esolev meeldetuletaja on m\u00E4\u00E4ratud {0,date} {0,time}, Sinu valik oli {1,date} {1,time}. <br><br>Kas soovid s\u00F5lme meeldetuletajat muuta (JAH) <br>v\u00F5i soovid vana alles hoida (EI)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Meeldetuletaja m\u00E4rgitud {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Eemalda meeldetuletaja
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Eemalda k\u00F5ik meeldetuletajad, mis on seotud valitud s\u00F5lmedega.
+plugins/TimeManagement.xml_Replace = Asenda
+plugins/TimeManagement.xml_Replace_All = Asenda k\u00F5ik
+plugins/TimeManagement.xml_Replace_Selected = Asenda valitud
+plugins/TimeManagement.xml_Select = M\u00E4rgi
+plugins/TimeManagement.xml_todayButton = T\u00E4na
+plugins/TimeManagement.xml_WindowTitle = Ajahaldus
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Otsi & Asenda
+preferences = Eelistused
+print_preview_title = Tr\u00FCkkimise eelvaatlus
+PrintAction.text = Tr\u00FCki...
+PrintDirectAction.text = Tr\u00FCki
+printing_settings = Tr\u00FCkkimise skaleerimine
+PrintPreviewAction.text = &Tr\u00FCkkimise eelvaatlus...
+PropertyAction.text = Eelistused ...
+QuitAction.text = Sulge programm
+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)?
+really_execute_script = Kas t\u00F5esti soovid k\u00E4ivitada selle kaardiga kaasasolevaid olevaid skripte? On v\u00F5imalik, et need kahjustavad Sinu arvutit.
+really_remove_node = Kas t\u00F5esti kustutada need s\u00F5lmed?
+really_remove_notes = Kas t\u00F5esti eemaldada need m\u00E4rkmed?
+RedoAction.text = Tee uuesti
+RedoFilterAction.text = Tee uuesti
+ReminderHookAction.text = Eemalda meeldetuletaja
+ReminderHookAction.tooltip = Eemaldab s\u00F5lmelt meeldetuletuse.
+RemoveAllIconsAction.text = Eemalda k\u00F5ik ikoonid
+RemoveIconAction.text = Eemalda viimane ikoon
+RemoveNoteAction.text = Eemalda m\u00E4rkmed
+RemoveNoteAction.tooltip = <html>Eemaldab m\u00E4rkuse sisu ja v\u00F5imalik, et mitmelt m\u00E4rkmelt.</html>
+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
+save_failed = {0} katse kaarti salvestada eba\u00F5nnestus.
+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...
+saved = Salvestatud
+scheme_evaluate = Hinda!
+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
+SelectBranchAction.text = Vali n\u00E4htav haru
+selection_method_by_click = \u00DCks kl\u00F5ps m\u00E4rkimiseks
+selection_method_delayed = Viivitusega automaatvalik
+selection_method_direct = Osuta, et valida
+SelectNoteAction.text = S\u00F5lme muutmise l\u00FCliti
+SelectNoteAction.tooltip = L\u00FClitu m\u00E4rkme loomise aknasse
+SetImageByFileChooserAction.text = Pilt (faililehitseja v\u00F5i viide)...
+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...
+ShowDescendantsAction.text = N\u00E4ita j\u00E4rglasi
+ShowHideNoteAction.text = M\u00E4rkuste aken
+ShowHideNoteAction.tooltip = Lubab viisakalt m\u00E4rkuste aknal ilmuda v\u00F5i kaduda.
+ShowSelectedAttributesAction.text = N\u00E4ita valitud omadusi
+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.alignLeft = vasakule
+simplyhtml.alignRight = paremale
+simplyhtml.allCellsRangeLabel = k\u00F5ik lahtrid
+simplyhtml.allOccurrencesReplaced = K\u00F5ik kokkulangevused asendatud
+simplyhtml.appendTableColLabel = Lisa veerg
+simplyhtml.appendTableRowLabel = Lisa rida
+simplyhtml.applyCellAttrLabel = Rakenda
+simplyhtml.backgroundLabel = Taust:
+simplyhtml.boldItalicName = rasvane kaldkiri
+simplyhtml.boldName = rasvane
+simplyhtml.borderColorLabel = V\u00E4rv:
+simplyhtml.borderWidthLabel = Laius
+simplyhtml.bottomLabel = all:
+simplyhtml.cancelBtnName = Loobu
+simplyhtml.cellBorderTabLabel = Piirded
+simplyhtml.cellGenTabLabel = \u00DCldine
+simplyhtml.cellMarginTabLabel = Veeris
+simplyhtml.cellPanelTitle = Lahtri vormindus
+simplyhtml.clearFormatLabel = Eemalda vormindus
+simplyhtml.clearFormatTip = Eemalda vormindus
+simplyhtml.close = Sulge
+simplyhtml.closeBtnName = Sulge
+simplyhtml.colorLabel = V\u00E4rv
+simplyhtml.copyLabel = Kopeeri
+simplyhtml.copyTip = kopeeri
+simplyhtml.cTagNameHead1 = Pealkiri 1
+simplyhtml.cTagNameHead2 = Pealkiri 2
+simplyhtml.cTagNameHead3 = Pealkiri 3
+simplyhtml.cTagNameHead4 = Pealkiri 4
+simplyhtml.cTagNameHead5 = Pealkiri 5
+simplyhtml.cTagNameHead6 = Pealkiri 6
+simplyhtml.cTagNameLink = Viide
+simplyhtml.cTagNameOL = Sorteeritud nimekiri
+simplyhtml.cTagNamePara = L\u00F5ik
+simplyhtml.cTagNameUL = Sorteerimata nimekiri
+simplyhtml.cutLabel = L\u00F5ika
+simplyhtml.cutTip = l\u00F5ika
+simplyhtml.defaultDocName = Nimetu
+simplyhtml.deleteTableColLabel = Kustuta veerg
+simplyhtml.deleteTableRowLabel = Kustuta rida
+simplyhtml.docTitleQuery = M\u00E4\u00E4ra pealkiri:
+simplyhtml.docTitleTitle = Muuda dokumendi pealkirja
+simplyhtml.editLabel = Redigeeri
+simplyhtml.effectLabel = Efekt
+simplyhtml.familyLabel = Perekond
+simplyhtml.findNext = Otsi j\u00E4rgmine...
+simplyhtml.findReplaceDialogTitle = Otsi & Asenda
+simplyhtml.findReplaceLabel = Otsi & Asenda
+simplyhtml.findReplaceTip = otsi & asenda
+simplyhtml.fontBoldLabel = Rasvane
+simplyhtml.fontBoldTip = l\u00FClita rasvane kiri sisse/v\u00E4lja
+simplyhtml.fontDialogTitle = Muuda kirjakuju
+simplyhtml.fontItalicLabel = Kaldkiri
+simplyhtml.fontItalicTip = l\u00FClita kaldkiri sisse/v\u00E4lja
+simplyhtml.fontLabel = Kirjakuju...
+simplyhtml.fontTabLabel = Kirjat\u00FC\u00FCp
+simplyhtml.fontTip = Muuda kirjakuju...
+simplyhtml.fontUnderlineLabel = Jooni alla
+simplyhtml.fontUnderlineTip = l\u00FClita allajoonimine sisse/v\u00E4lja
+simplyhtml.foregroundLabel = Esiplaan:
+simplyhtml.formatLabel = Vormindus
+simplyhtml.formatListLabel = Loetelu...
+simplyhtml.formatListTip = muuda loetelu kujundust
+simplyhtml.formatParaLabel = L\u00F5ik...
+simplyhtml.formatParaTip = Muuda l\u00F5igu kujundust
+simplyhtml.formatTableLabel = Tabel...
+simplyhtml.formatTableTip = Vorminda tabelit
+simplyhtml.helpLabel = Abi
+simplyhtml.htmlTabTitle = HTML-koodi vaade
+simplyhtml.imageFileDesc = Pildifailid
+simplyhtml.insertTableColLabel = Sisesta veerg
+simplyhtml.insertTableLabel = Tabel...
+simplyhtml.insertTableMsg = Mitu veergu?
+simplyhtml.insertTableRowLabel = Sisesta rida
+simplyhtml.insertTableTitle = Sisesta tabel
+simplyhtml.italicName = kaldkiri
+simplyhtml.layoutTabTitle = Paigutuse vaade
+simplyhtml.leftLabel = vasak:
+simplyhtml.listDialogTitle = Nimekirja kujundamine
+simplyhtml.listIndentTitle = Taane:
+simplyhtml.listPosInside = sees
+simplyhtml.listPositionLabel = Asukoht:
+simplyhtml.listPosOutside = v\u00E4ljas
+simplyhtml.listTypeCircle = \u00FCmart\u00E4pp
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = faili s\u00FCmbol kui t\u00E4pp
+simplyhtml.listTypeLabel = T\u00FC\u00FCp:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = puudub
+simplyhtml.listTypeSquare = ruudukujuline t\u00E4pp
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = V\u00E4line
+simplyhtml.matchCase = T\u00F5stutundlik
+simplyhtml.newStyleDefaultName = uus stiil
+simplyhtml.nextTableCellLabel = J\u00E4rgmine lahter
+simplyhtml.noLineLabel = puudub
+simplyhtml.noMoreOccurrencesFound = rohkem kokkulangevusi ei leitud
+simplyhtml.okBtnName = Sobib
+simplyhtml.paddingLabel = Sisemine
+simplyhtml.paraAlignCenterLabel = Joonda keskele
+simplyhtml.paraAlignCenterTip = Joonda l\u00F5ik keskele
+simplyhtml.paraAlignLeftLabel = Joonda vasakule
+simplyhtml.paraAlignLeftTip = Joonda l\u00F5ik vasakule
+simplyhtml.paraAlignRightLabel = Joonda paremale
+simplyhtml.paraAlignRightTip = Joonda l\u00F5ik paremale
+simplyhtml.paraStyleDialogTitle = L\u00F5igustiil
+simplyhtml.paraTabLabel = L\u00F5ik
+simplyhtml.pasteLabel = Aseta
+simplyhtml.pasteTip = aseta
+simplyhtml.plainName = paljas
+simplyhtml.previewLabel = Eelvaade
+simplyhtml.previewText = Teksti eelvaade
+simplyhtml.prevTableCellLabel = Eelmine lahter
+simplyhtml.redoLabel = Tee uuesti
+simplyhtml.redoTip = tee uuesti
+simplyhtml.replace = Asenda...
+simplyhtml.replaceAll = K\u00F5ik
+simplyhtml.replaceDone = Tehtud
+simplyhtml.replaceNo = Ei
+simplyhtml.replaceThisQuery = asenda see kokkulangevus
+simplyhtml.replaceWith = Asendada millega:
+simplyhtml.replaceYes = Jah
+simplyhtml.rightLabel = parem:
+simplyhtml.searchDown = Otsi allapoole
+simplyhtml.searchFromStart = Otsi algusest
+simplyhtml.searchUp = Otsi \u00FClespoole
+simplyhtml.selectAllLabel = Vali k\u00F5ik
+simplyhtml.sizeLabel = Suurus
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = L\u00E4bikriipsutus
+simplyhtml.styleLabel = Stiil
+simplyhtml.styleNameInputText = Uue stiili nimi?
+simplyhtml.styleNameInputTitle = Salvesta stiil
+simplyhtml.tableBgColLabel = Taustav\u00E4rv:
+simplyhtml.tableDialogTitle = Vorminda tabelit
+simplyhtml.tableLabel = Tabel
+simplyhtml.tablePanelTitle = Tabeli vormindus
+simplyhtml.tableWidthLabel = Laius:
+simplyhtml.textIndentLabel = Taane:
+simplyhtml.textToFind = Tekst, mida otsida:
+simplyhtml.thisCellRangeLabel = see lahter
+simplyhtml.thisColRangeLabel = see veerg
+simplyhtml.thisRowRangeLabel = see rida
+simplyhtml.toggleBulletsLabel = T\u00E4pploetelu sisse/v\u00E4lja
+simplyhtml.toggleBulletsTip = t\u00E4pploetelu sisse/v\u00E4lja
+simplyhtml.toggleNumbersLabel = Numberloetelu sisse/v\u00E4lja
+simplyhtml.toggleNumbersTip = numberloetelu sisse/v\u00E4lja
+simplyhtml.topLabel = \u00FCleval:
+simplyhtml.uLineLabel = Jooni alla
+simplyhtml.unableToOpenFileError = Faili ei saa avada
+simplyhtml.unableToRedoError = Ei saa uuesti teha:
+simplyhtml.unableToUndoError = Ei saa tagasi v\u00F5tta:
+simplyhtml.undoLabel = V\u00F5ta tagasi
+simplyhtml.undoTip = v\u00F5ta tagasi
+simplyhtml.valignBaseline = alusjoon
+simplyhtml.valignBottom = alla
+simplyhtml.valignLabel = P\u00FCstine joondus:
+simplyhtml.valignMiddle = keskele
+simplyhtml.valignTop = \u00FCles
+simplyhtml.wholeWordsOnly = Ainult terved s\u00F5nad
+SortNodes.text = &Sorteeri alams\u00F5lmed
+SortNodes.tooltip = Sorteerib k\u00F5ik alams\u00F5lmed t\u00E4hestiku j\u00E4rjekorras.
+split = &Poolita
+SplitNode.text = &Poolita s\u00F5lm
+SplitNode.tooltip = <html>S\u00F5lm on poolitatud</html>
+style = Stiil
+svg = SVG[translate me]
+TimeListAction.text = N\u00E4ita ajastatud toiminguid ja &Nimekirja ...
+TimeListAction.tooltip = N\u00E4itab k\u00F5iki m\u00E4rgitud aegu ja seotud s\u00F5lmi.
+TimeManagementAction.text = N\u00E4ita kalendrit...
+TimeManagementAction.tooltip = <html>N\u00E4itab kalendrimoodulit (autor: Kai Toedter).</html>
+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
+ToggleMenubarAction.text = Men\u00FC\u00FCriba
+ToggleToolbarAction.text = &T\u00F6\u00F6riistariba
+undefined_error = Ootamatu viga tekkis. Palun proovi raporteerida sellest.
+underline = Jooni alla
+underlined = Allajoonitud
+UndoAction.text = V\u00F5ta tagasi
+UndoFilterAction.text = V\u00F5ta tagasi
+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>
+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_status_bar = Suurenduse muutmine kasutaja poolt m\u00E4\u00E4ratud v\u00E4\u00E4rtusele {0}%.
+user_zoom = Tr\u00FCkkimise suurendus (0.0 - 2.0):
+WebDocuAction.text = Dokumentatsioon internetis
+width = Laius
+yes = Jah
+ZoomInAction.text = Suurenda
+ZoomOutAction.text = V\u00E4henda
diff --git a/freeplane/resources/translations/Resources_fr.properties b/freeplane/resources/translations/Resources_fr.properties
new file mode 100644
index 0000000..96f9a9f
--- /dev/null
+++ b/freeplane/resources/translations/Resources_fr.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane - Logiciel libre de conception de cartes mentales
+AboutAction.text = \u00c0 propos...
+acceleratorPresets = Charger ou enregistrer les touches de fonction
+accelerators_loading_error = Impossible de charger les touches de fonction depuis {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Editeur de mise en forme
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Editeur de mise en forme
+accessories/plugins/EncryptNode.properties_0 = Saisie du mot de passe
+accessories/plugins/EncryptNode.properties_1 = Les mots de passe ne sont pas identiques ou sont trop courts.
+accessories/plugins/EncryptNode.properties_2 = Entrez le mot de passe :
+accessories/plugins/EncryptNode.properties_3 = Confirmez le mot de passe :
+accessories/plugins/EncryptNode.properties_4 = Entrez votre mot de passe.
+accessories/plugins/EncryptNode.properties_5 = Rappel : le niveau de protection repose sur la qualit\u00e9 de votre mot de passe.
+accessories/plugins/EncryptNode.properties_6 = Valider
+accessories/plugins/EncryptNode.properties_7 = Annuler
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Vous pouvez uniquement basculer le status de protection d'un n\u0153ud. Pour cr\u00e9er une carte prot\u00e9g\u00e9e utilisez le menu "Fichier".
+accessories/plugins/EncryptNode.properties_select_me = Nouvelle carte prot\u00e9g\u00e9e
+accessories/plugins/EncryptNode.properties_wrong_password = Le mot de passe est incorrect.
+accessories/plugins/ExportWithTWiki.text = TWiki
+accessories/plugins/ExportWithTWiki.tooltip = Exporte la carte en document TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Il s'agit d'une m\u00e9thode d'exportation utilisant des scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Applet Java
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporte la carte en applet Java pour navigateur Web.
+accessories/plugins/ExportWithXSLT_Flash.text = Animation Flash
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporte la carte en animation Flash.
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML JavaScript
+accessories/plugins/ExportWithXSLT_HTML3.text = XHTML image cliquable
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Les ressources depuis le n\u0153ud Ressouces vers un fichier TaskJuggler
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = Exporte les ressources depuis le n\u0153ud Ressouces vers l'outil TaskJuggler
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Les t\u00e2ches depuis le n\u0153ud T\u00e2ches vers un fichier TaskJuggler
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = Exporte les t\u00e2ches depuis le n\u0153ud T\u00e2ches vers l'outil TaskJuggler
+action_keystroke_in_use_error = Le raccourci ''{0}'' demand\u00e9 pour l''action ''{1}'' est d\u00e9j\u00e0 associ\u00e9 \u00e0 l''action ''{2}''.
+active = Activer
+actual_map_styles = Styles conditionnels appliqu\u00e9s \u00e0 la carte
+actual_node_styles = Styles conditionnels appliqu\u00e9s au n\u0153ud
+add = Ajouter
+AddConnectorAction.text = Connecteur
+AddElementaryConditionAction.text = Ajouter
+AddLocalLinkAction.text = Lien vers un n\u0153ud
+AddMenuItemLinkAction.text = Lien vers une commande...
+AddOnDetailsPanel.authored.by = Par {0}
+AddOnDetailsPanel.header.function = Description
+AddOnDetailsPanel.header.menu = Emplacement dans le menu
+AddOnDetailsPanel.header.shortcut = Raccourci
+AddOnDetailsPanel.homepage = Accueil :
+addons.installer.canceled = Installation annul\u00e9e
+addons.installer.confirm.licence = <html><body><h1>Licence</h1>{0}<p><p><em>Acceptez-vous les termes de cette licence ?
+addons.installer.failed = L''installation a \u00e9chou\u00e9. Erreur : {0}.
+addons.installer.freeplaneversion.format.error = Erreur de format pour {0} (valeur erronn\u00e9e : {1})
+addons.installer.groovy.script.name = Le nom du script {0} ne se termine pas en ".groovy"
+addons.installer.html.script = Le contenu d'un script ne peut pas \u00eatre du HTML
+addons.installer.install = Installer
+addons.installer.invalid.keyboard.shortcut = Raccourci {0} invalide.
+addons.installer.licence.unchanged = Licence non modifi\u00e9e
+addons.installer.map.structure = Erreur de structure dans la carte : {0}
+addons.installer.missing.child.nodes = N\u0153ud fils manquant : {0}
+addons.installer.missing.permission.attribute = Script {0} : autorisation {1} manquante
+addons.installer.missing.properties = Propri\u00e9t\u00e9 manquante : {0}
+addons.installer.missing.translation = Traduction {0} manquante pour la langue {1}
+addons.installer.no.scripts = Script non trouv\u00e9
+addons.installer.no.zipdata = Aucune donn\u00e9e compress\u00e9e retrouv\u00e9e
+addons.installer.nonstandard.permissions = Le script n\u00e9cessite les droits suivants qui sont actuellement d\u00e9sactiv\u00e9s : {0}.\nVoulez-vous activer ces droits ?
+addons.installer.one.child.expected = Le n\u0153ud {0} devrait poss\u00e9der un fils, il en poss\u00e8de {1}.
+addons.installer.script.no.execution_mode = Le param\u00e8tre "execution_mode" est manquant pour {0}
+addons.installer.script.no.menulocation = Le param\u00e8tre "menuLocation" est manquant pour {0}
+addons.installer.script.no.menutitle = Le param\u00e8tre "menuTitleKey" est manquant pour {0}
+addons.installer.script.no.permissions = Aucune permission n''est d\u00e9fini pour {0}
+addons.installer.success = Installation termin\u00e9e.\nLe nouvel add-on sera disponible apr\u00e8s re-d\u00e9marrage.
+addons.installer.success.update = Mise \u00e0 jour de {0} en {1} effectu\u00e9e.\nPour que les modications prennent effet vous devriez re-d\u00e9marrer.
+addons.installer.title = Installation d'un add-on
+addons.installer.too.new = La version de Freeplane {0} est trop r\u00e9cente. Cet add-on fonctionne avec une version plus ancienne de Freeplane {1}.
+addons.installer.too.old = La version Freeplane {0} est trop ancienne. Cet add-on n\u00e9cessite une version {1} ou sup\u00e9rieure.
+addons.installer.unknown.deinstallation.rules = D\u00e9sinstallation impossible, {0}
+addons.installer.update = Mise \u00e0 jour de la version {0}
+addons.installer.warning = <html><body><em>Attention : vous ne devez installer que des add-ons de sources v\u00e9rifi\u00e9es. Certains codes peuvent causer des dommages voire conduire \u00e0 la perte de vos donn\u00e9es.
+addons.site = http://freeplane.sourceforge.net/addons
+AddStyleAttributes.text = Ajouter des attributs par style
+AddStyleAttributes.tooltip = Ajouter des attributs bas\u00e9s sur le style du n\u0153ud
+AllMapsNodeListAction.text = Rechercher et remplacer dans toutes les cartes...
+always = Toujours
+AlwaysUnfoldedNodeAction.text = Noeud toujours d\u00e9pli\u00e9
+antialias_all = Tout lisser
+antialias_edges = Lisser les lignes
+antialias_none = Ne rien lisser
+apply = Appliquer
+ApplyAction.text = Appliquer
+ApplyFormatPlugin.text = Modifier la mise en forme...
+ApplyFormatPlugin.tooltip = Modifiez tous les param\u00e9tres de mise en forme des n\u0153uds s\u00e9lectionn\u00e9s
+ApplyNoFilteringAction.text = Effacer le filtre
+ApplySelectedViewConditionAction.text = Filtrer les n\u0153uds s\u00e9lectionn\u00e9s
+ApplyToVisibleAction.text = Cumuler les filtres
+as_parent = Comme le p\u00e8re
+AskForHelp.text = Demander de l'aide
+AssignAttributesAction.text = Modifier les attributs...
+attribute_delete = Supprimer toutes les valeurs
+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_replace = Remplacer par
+attribute_top = Tous les attributs connus de la carte courante
+attribute_value = Valeur
+attributes_AddAttributeAction.text = Modifier les attributs dans une nouvelle fen\u00eatre...
+attributes_adding_empty_attribute_error = Ne peut pas utiliser une chaine vide comme nom d'attribut
+attributes_all = Tous les attributs
+attributes_assign_dialog = Modifier les attributs
+attributes_attribute = Attributs
+attributes_close = Fermer
+attributes_deselect_all = Rien
+attributes_dialog_title = Gestionnaire d'attributs
+attributes_edit = Modifier
+attributes_edit_tooltip = Modifier la s\u00e9lection
+attributes_for_selected = N\u0153uds s\u00e9lectionn\u00e9s
+attributes_for_visible = Tous les n\u0153uds visibles
+attributes_import = Importer
+attributes_import_tooltip = Importer des attributs depuis les autres cartes charg\u00e9es
+attributes_no_import_candidates_found = Aucun nouvel attribut trouv\u00e9
+attributes_popup_delete = Supprimer
+attributes_popup_down = Descendre
+attributes_popup_edit = Modifier
+attributes_popup_hide = Masquer
+attributes_popup_new = Nouvel attribut
+attributes_popup_optimal_width = Ajuster la largeur
+attributes_popup_up = Monter
+attributes_refresh = Actualiser
+attributes_RemoveAllAttributesAction.text = Supprimer tous les attributs
+attributes_RemoveFirstAttributeAction.text = Supprimer le premier attribut
+attributes_RemoveLastAttributeAction.text = Supprimer le dernier attribut
+attributes_restricted_attributes_tooltip = Restreindre la s\u00e9lection d'attributs
+attributes_restricted_values_tooltip = Restreindre la s\u00e9lection de valeurs pour les attributs courants
+attributes_restriction = S\u00e9lection r\u00e9duite
+attributes_select_all = Tout
+attributes_select_all_tooltip = Tout s\u00e9lectionner / d\u00e9s\u00e9lectionner
+attributes_show = Afficher
+attributes_skip_root = Ignorer le n\u0153ud racine
+attributes_visible = S\u00e9lectionner ce qui est visible
+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}
+AutomaticEdgeColorHookAction.text = Couleur de ligne automatique
+AutomaticLayout.ALL = Pour tous les niveaux
+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.HEADINGS.text = Sauf pour les derniers niveaux
+AutomaticLayoutControllerAction.null.text = D\u00e9sactiv\u00e9
+BackAction.text = N\u0153ud pr\u00e9c\u00e9dent dans l'historique
+BackAction.tooltip = Aller au n\u0153ud pr\u00e9c\u00e9dent dans l'historique de navigation
+background = Fond
+bitmaps = Images
+black = Noir
+BlinkingNodeHookAction.text = N\u0153ud clignotant
+BlinkingNodeHookAction.tooltip = N\u0153ud clignotant. Note : cette mise en forme est prioritaire sur les autres mises en forme de couleur.
+blue = Bleu
+BoldAction.text = Gras
+boldify_branch = Branche en gras
+branch = Branche
+browse = Ouvrir...
+calendar_attributes_panel = Calendrier et attributs
+calendar_panel = Calendrier
+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_save_key_set = Impossible d'enregistrer les touches de fonction
+cancel = Annuler
+CancelAction.text = Annuler
+cannot_add_parent_diff_parents = Pour utiliser cette fonction, tous les n\u0153uds doivent avoir le m\u00eame p\u00e8re
+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 poss\u00e9dant des 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
+ChangeConnectorArrowsAction.backward.text = Fl\u00e8che au d\u00e9part
+ChangeConnectorArrowsAction.both.text = Double fl\u00e8ches
+ChangeConnectorArrowsAction.forward.text = Fl\u00e8che \u00e0 l'arriv\u00e9e
+ChangeConnectorArrowsAction.none.text = Aucune fl\u00e8che
+ChangeConnectorArrowsAction.text = Modifier les fl\u00e8ches du connecteur
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Courbe
+ChangeConnectorShapeAction.EDGE_LIKE.text = Comme le n\u0153ud d'arriv\u00e9e
+ChangeConnectorShapeAction.LINE.text = Droit
+ChangeConnectorShapeAction.LINEAR_PATH.text = Rectiligne
+ChangeNodeLevelLeftsAction.text = D\u00e9placer le n\u0153ud vers la gauche
+ChangeNodeLevelLeftsAction.tooltip = Le n\u0153ud est d\u00e9plac\u00e9 dans la hi\u00e9rarchie. A droite du n\u0153ud racine, le n\u0153ud monte dans la hi\u00e9rarchie; \u00e0 gauche du n\u0153ud racine, le n\u0153ud descend dans la hi\u00e9rarchie. A la racine, le n\u0153ud bascule \u00e0 gauche.
+ChangeNodeLevelRightsAction.text = D\u00e9placer le n\u0153ud vers la droite
+ChangeNodeLevelRightsAction.tooltip = Le n\u0153ud est d\u00e9plac\u00e9 dans la hi\u00e9rarchie. A droite du n\u0153ud racine, le n\u0153ud descend dans la hi\u00e9rarchie; \u00e0 gauche du n\u0153ud racine, le n\u0153ud monte dans la hi\u00e9rarchie. A la racine, le n\u0153ud bascule \u00e0 droite.
+choose_background_color = S\u00e9lectionner la couleur de fond du n\u0153ud
+choose_cloud_color = Couleur du nuage
+choose_edge_color = Couleur de la ligne
+choose_map_background_color = Couleur de fond de la carte
+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
+close_btn = Fermer
+CloseAction.text = Fermer la carte
+CloudAction.text = Ajouter un nuage
+CloudColorAction.text = Ajouter un nuage ou modifier sa couleur...
+CloudShapeAction.ARC.text = Arc
+CloudShapeAction.RECT.text = Rectangle
+CloudShapeAction.ROUND_RECT.text = Rectangle arrondi
+CloudShapeAction.STAR.text = Etoile
+ColorProperty.ResetColor = Mise \u00e0 z\u00e9ro des couleurs
+combined = Mixte
+condition = Condition
+confirmation = Confirmation
+connector = Connecteur
+connector_arrows = Extr\u00e9mit\u00e9s du connecteur
+connector_label = Libell\u00e9 du connecteur
+connector_lines = Trait du connecteur
+connector_shapes = Forme du connecteur
+ConnectorColorAction.text = Couleur du connecteur...
+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'URI du n\u0153ud
+copyright = Copyright \u00a9 2000-2012 \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
+corrupt_map = Le contenu de la carte est corrompu
+CreateConjunctConditionAction.text = Et
+CreateDisjunctConditionAction.text = Ou
+CreateNotSatisfiedConditionAction.text = Non
+CreationModificationPluginAction.text = Afficher dates/heures en info-bulle
+CreationModificationPluginAction.tooltip = Affiche les dates et heures de cr\u00e9ation et de derni\u00e8re modification dans l'info-bulle du n\u0153ud
+current_dir = Cartes
+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
+DefaultColorAction.text = Couleur par d\u00e9faut
+defaultstyle.details = D\u00e9tails
+defaultstyle.floating = N\u0153ud libre
+defaultstyle.note = Note
+delete = Supprimer
+delete_child = Supprimer le n\u0153ud
+DeleteAction.text = Supprimer le n\u0153ud
+DeleteConditionAction.text = Supprimer
+DeleteDetailsAction.text = Supprimer les d\u00e9tails
+DeleteLevelStyleAction.text = Supprimer le dernier style automatique de niveau
+DeleteStyleAction.text = Supprimer le style
+DeleteUserStyleAction.text = Supprimer le style utilisateur
+dialect_info.app = La Mind-Map {0} a \u00e9t\u00e9 cr\u00e9\u00e9e avec le logiciel {1}.
+dialect_info.unknownApp = La Mind-Map {0} a \u00e9t\u00e9 cr\u00e9\u00e9e avec un logiciel inconnu.
+dialect_info.unknownURL = Le site web est inconnu
+dialect_info.url = Visiter la page web du programme {0} pour plus d''informations
+dialect_info.warning = Freeplane peut ne pas ouvrir, afficher ou sauver la carte correctement.
+DirectHtmlFlavorHandler = Coller en HTML comme un seul n\u0153ud
+DocumentationAction.text = Documentation
+down = Descendre
+download = T\u00e9l\u00e9charger
+dropped_file_error = Impossible d''ouvrir le fichier. Motif\: {0}.
+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
+EdgeColorAction.text = Couleur de ligne...
+EdgeStyleAction.bezier.text = Courbe
+EdgeStyleAction.bezier.tooltip = Le style de ligne est une courbe
+EdgeStyleAction.hide_edge.text = Invisible
+EdgeStyleAction.hide_edge.tooltip = <html>La ligne est invisible (n\u0153ud flottant) sauf si<br>le n\u0153ud est s\u00e9lectionn\u00e9 : la ligne est alors une courbe pointill\u00e9e
+EdgeStyleAction.horizontal.text = Rectiligne
+EdgeStyleAction.horizontal.tooltip = Le style de ligne est une ligne bris\u00e9e
+EdgeStyleAction.linear.text = Droit
+EdgeStyleAction.linear.tooltip = Le style de ligne est une droite
+EdgeStyleAction.sharp_bezier.text = Courbe effil\u00e9
+EdgeStyleAction.sharp_bezier.tooltip = Le style de ligne est une courbe s'affinant \u00e0 son extr\u00eamit\u00e9
+EdgeStyleAction.sharp_linear.text = Droit effil\u00e9
+EdgeStyleAction.sharp_linear.tooltip = Le style de ligne est une droite s'affinant \u00e0 son extr\u00eamit\u00e9
+EdgeStyleAsParentAction.text = Comme le p\u00e8re
+EdgeStyleAsParentAction.tooltip = Le style de ligne est h\u00e9rit\u00e9 du n\u0153ud p\u00e8re
+EdgeWidthAction_width_parent.text = Comme le p\u00e8re
+EdgeWidthAction_width_thin.text = Fine
+edit = \u00c9&dition
+edit.decision = \u00c9diteur HTML
+edit.edit_rich_text = Souhaitez-vous cr\u00e9er le n\u0153ud en texte riche ?
+edit_details = D\u00e9tails
+edit_end_label = <html>Connecteur<br>libell\u00e9
+edit_label_font_family = Police
+edit_label_font_size = Taille du texte
+edit_link_manually = Valeur du lien :
+edit_long_node = Editeur texte riche
+edit_middle_label = Libell\u00e9 du connecteur
+edit_note = \u00c9diteur de notes
+edit_source_label = Libell\u00e9 au d\u00e9part
+edit_target_label = Libell\u00e9 \u00e0 l'arriv\u00e9e
+edit_transparency_label = Transparence
+edit_width_label = \u00c9paisseur
+EditAction.text = Modifier le n\u0153ud
+EditAttributesAction.text = Modifier les attributs
+EditDetailsAction.text = Modifier les d\u00e9tails
+EditDetailsInDialogAction.text = Modifier les d\u00e9tails dans une nouvelle fen\u00eatre...
+EditFilterAction.text = G\u00e9rer les filtres...
+EditLongAction.text = Modifier le n\u0153ud en texte riche...
+EditNoteInDialogAction.text = Modifier les notes...
+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
+enter_base_url = Je vais coller les liens associ\u00e9s. Merci de saisir l'URL de base.
+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 :
+enter_map_url = Adresse de la carte :
+enter_new_style_name = Nom du nouveau style :
+enter_node_id = Saisissez l'ID du n\u0153ud
+enter_zoom = Entrez le niveau de zoom
+EnterPassword.text = Prot\u00e9ger / d\u00e9prot\u00e9ger la branche
+error = Erreur
+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)
+ExecuteScriptError.text = Erreur \u00e0 l''ex\u00e9cution du script :\n{0}\nConsultez le fichier journal pour plus de d\u00e9tails.
+ExecuteScriptForAllNodes.text = Ex\u00e9cuter tous les scripts
+ExecuteScriptForSelectionAction.text = Ex\u00e9cuter les scripts des n\u0153uds s\u00e9lectionn\u00e9s
+ExecuteScriptOnSelectedNode.text = Ex\u00e9cuter {0} sur tous les n\u0153uds s\u00e9lectionn\u00e9s
+ExecuteScriptOnSelectedNodeRecursively.text = Ex\u00e9cuter {0} r\u00e9cursivement sur tous les n\u0153uds s\u00e9lectionn\u00e9s
+ExecuteScriptOnSingleNode.text = Ex\u00e9cuter {0} sur le n\u0153ud s\u00e9lectionn\u00e9
+ExecuteScripts.noScriptsAvailable = Aucun script
+ExecuteScripts.text = Scripts
+ExecuteScriptSecurityError.text = Une erreur s''est produite pendant l''ex\u00e9cution du script : {0}
+export_failed = L'export a \u00e9chou\u00e9
+export_pdf_text = Document PDF
+export_svg_text = Image vectorielle
+export_using_xslt = Exporter la carte
+ExportAction.text = Exporter...
+ExportBranchAction.text = Exporter la branche comme nouvelle carte...
+ExportBranchToHTMLAction.text = Branche en HTML texte
+exported_file = {0} fichier
+ExportPdf.text = En PDF...
+ExportSvg.text = En SVG...
+ExportToHTMLAction.text = HTML texte
+ExportToImage.jpg.text = En JPEG...
+ExportToImage.png.text = En PNG...
+ExportToOoWriter.text = Document Open Office Writer
+extension_menu = Styles
+ExternalImage_popupMenu_Change = Changer d'image...
+ExternalImage_popupMenu_Open = Ouvrir...
+ExternalImage_popupMenu_Remove = Supprimer
+ExternalImage_popupMenu_ResetZoom = Restaurer la taille initiale
+ExternalImageAddAction.text = Ajouter une image...
+ExternalImageChangeAction.text = Modifier l'image...
+ExternalImageRemoveAction.text = Supprimer l'image
+ExtractLinkFromTextAction.text = Cr\u00e9er un lien hypertext \u00e0 partir du n\u0153ud
+ExtractLinkFromTextAction.tooltip = Cr\u00e9er un lien hypertext \u00e0 partir du texte pr\u00e9sent dans le n\u0153ud
+f_button_unassigned = <aucune action>
+FaqOpenURLAction.text = Foire aux questions (FAQ)
+file = &Fichier
+file_already_exists = Le fichier {0} existe d\u00e9j\u00e0. Voulez-vous le remplacer ?
+file_not_found = Le fichier {0} n''a pas \u00e9t\u00e9 trouv\u00e9
+FileListFlavorHandler = Liens vers des fichiers
+FileProperties_BranchLeafCount = Nombre de n\u0153uds de dernier niveau dans les branches s\u00e9lectionn\u00e9es :
+FileProperties_BranchNodeCount = Nombre de n\u0153uds dans les branches s\u00e9lectionn\u00e9es :
+FileProperties_ChangesSinceLastSave = Nombre de modifications depuis le dernier enregistrement :
+FileProperties_FileName = Nom et emplacement du fichier :
+FileProperties_FileSaved = Dernier enregistrement :
+FileProperties_FileSize = Taille du fichier :
+FileProperties_MainBranchCount = Nombre de branches partant du n\u0153ud racine :
+FileProperties_NeverSaved = Carte non enregistr\u00e9e
+FileProperties_NodeChildCount = Nombre de n\u0153uds fils des n\u0153uds s\u00e9lectionn\u00e9s :
+FileProperties_NodeSelectionCount = Nombre de n\u0153uds s\u00e9lectionn\u00e9s :
+FileProperties_TotalFilteredCount = Nombre de n\u0153uds r\u00e9pondant au filtre :
+FileProperties_TotalLeafCount = Nombre de n\u0153uds de dernier niveau :
+FileProperties_TotalNodeCount = Nombre total de n\u0153uds :
+FilePropertiesAction.text = Propri\u00e9t\u00e9s de la carte...
+FileRevisionsDialog.cancel = Abandonner
+FileRevisionsDialog.file_last_modified = Horodatage
+FileRevisionsDialog.file_name = Fichier
+FileRevisionsDialog.file_size = Bytes
+FileRevisionsDialog.open = Ouvrir
+FileRevisionsDialog.open.tooltip = Ouvrir le fichier m\u00eame s'il est obsol\u00e8te
+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_add = Ajouter
+filter_and = Et
+filter_any_text = Toutes les zones de texte
+filter_conditions = Filtres
+filter_contains = contient
+filter_created_after = cr\u00e9\u00e9 apr\u00e8s
+filter_created_before = cr\u00e9\u00e9 avant
+filter_delete = Supprimer
+filter_details = D\u00e9tails
+filter_dialog = Editeur de filtre
+filter_does_not_exist = Inexistant
+filter_edit_description = Modifier la liste des filtres
+filter_enter_value = Entrez une valeur
+filter_even_level = N\u0153ud de niveau impair
+filter_exist = existe
+filter_icon = Ic\u00f4ne
+filter_is_equal_to = est \u00e9gal \u00e0
+filter_is_not_equal_to = est diff\u00e9rent de
+filter_leaf = N\u0153uds de dernier niveau
+filter_link = Lien
+filter_match_approximately = Accepter les variantes
+filter_match_approximately_tooltip = <html>Rechercher les variantes des mots<br>Par exemple : rechercher 'fichier' trouvera 'fcihier'</html>
+filter_match_case = Respecter la casse
+filter_match_case_tooltip = Rechercher en respectant les majuscules / minuscules
+filter_modified_after = modifi\u00e9 apr\u00e8s
+filter_modified_before = modifi\u00e9 avant
+filter_no_filtering = Aucun filtre
+filter_node = Texte du n\u0153ud
+filter_node_level = Niveau de n\u0153ud
+filter_not = Non
+filter_note = Note
+filter_odd_level = N\u0153ud de niveau pair
+filter_or = Ou
+filter_parent = Texte du p\u00e8re
+filter_periodic_level = Formule de niveau
+filter_priority = Priorit\u00e9
+filter_regexp_matches = Expression r\u00e9guli\u00e8re
+filter_reminder = Alerte
+filter_reminder_after = apr\u00e8s le
+filter_reminder_before = avant le
+filter_reminder_executed = pass\u00e9e
+filter_reminder_later = \u00e0 venir
+filter_root = N\u0153ud racine
+filter_script = Script
+filter_select = S\u00e9lectionner
+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...
+filters_not_loaded = Les filtres n'ont pas pu \u00eatre charg\u00e9s, le fichier est corrompu
+find_what = Que rechercher ?
+FindAction.text = Rechercher des n\u0153uds...
+FirstGroupNodeAction.text = D\u00e9but de synth\u00e8se
+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.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 :
+FollowLinkAction.text = Suivre le lien
+font = Police
+FontFamilyAction.text = Famille de police
+FontSizeAction.text = Taille de police
+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
+format_menu_edge_widths = \u00c9paisseur de ligne
+format_panel = Mise en forme
+FormatCopy.text = Copier la mise en forme
+FormatCopy.tooltip = Copie la mise en forme du n\u0153ud
+FormatPaste.text = Coller la mise en forme
+FormatPaste.tooltip = Colle la mise en forme m\u00e9moris\u00e9e
+formats_not_loaded = Impossible de charger les mises en forme.
+formula.error.attributeValueIsNull = L''attribut ''{0}'' est nul.
+formula.error.circularReference = R\u00e9f\u00e9rence circulaire : la formule du n\u0153ud ''{0}'' se r\u00e9f\u00e9rence elle-m\u00eame.
+formula.EvaluateAllAction.text = Evaluer tout
+formula.EvaluateAllAction.tooltip = Evaluer toutes les formules de la carte courante
+formula.menuname = Formules
+formula_editor = Modifier formule
+ForwardAction.text = N\u0153ud suivant dans l'historique
+ForwardAction.tooltip = Aller au n\u0153ud suivant dans l'historique de navigation
+FreeNodeAction.text = N\u0153ud libre
+Freeplane.progress.buildScreen = Cr\u00e9ation de l'\u00e9cran ...
+Freeplane.progress.createController = Cr\u00e9ation du contr\u00f4leur ...
+Freeplane.progress.createInitialMode = Cr\u00e9ation du mode initial ...
+Freeplane.progress.endStartup = Termine le d\u00e9marrage.
+Freeplane.progress.gettingPreferenceDirectories = R\u00e9cup\u00e9ration du dossier de pr\u00e9f\u00e9rences ...
+Freeplane.progress.gettingPreferences = R\u00e9cup\u00e9ration des pr\u00e9f\u00e9rences ...
+Freeplane.progress.loadMaps = Charges les cartes ...
+Freeplane.progress.propagateLookAndFeel = Chargement du th\u00e8me...
+Freeplane.progress.settingPreferences = Application des pr\u00e9f\u00e9rences ...
+Freeplane.progress.startCreateController = Lance le contr\u00f4leur de cr\u00e9ation du ...
+Freeplane.progress.updateLookAndFeel = Mise \u00e0 jour du th\u00e8me...
+freeplane_reverted = Freeplane_r\u00e9cup\u00e9r\u00e9_
+FreeplaneHelpStarter.text = Aide...
+FreeplaneHelpStarter.tooltip = Aide \u00e9tendue de Freeplane
+GettingStartedAction.text = Guide de d\u00e9marrage rapide
+GotoLinkNodeAction.text = Aller au lien
+GotoNodeAction.text = Aller au n\u0153ud portant l'ID...
+GrabKeyDialog.common.cancel = Annuler
+GrabKeyDialog.common.ok = Valider
+GrabKeyDialog.grab-key.assigned-to = Assign\u00e9e \u00e0
+GrabKeyDialog.grab-key.assigned-to.none = Non assign\u00e9
+GrabKeyDialog.grab-key.clear = Effacer
+GrabKeyDialog.grab-key.remove = Retirer
+GrabKeyDialog.grab-key.remove-ask = Voulez-vous vraiment effacer ce raccourci clavier ?
+GrabKeyDialog.grab-key.title = Combinaison de touches pour ce raccourci
+green = Vert
+help = Aid&e
+HideableAction.tooltip = Marque l'arri\u00e8re-plan de chaque n\u0153ud modifi\u00e9
+HideAllAttributesAction.text = Masquer tous les attributs
+HierarchicalIcons2Action.text = Afficher les ic\u00f4nes communs dans le p\u00e8re
+HierarchicalIconsAction.text = Afficher les ic\u00f4nes dans les p\u00e8res
+HierarchicalIconsAction.tooltip = Affiche dans un p\u00e8re l'ensemble des ic\u00f4nes pr\u00e9sents dans ses n\u0153uds fils
+hot_keys = Raccourcis
+hot_keys_table = Liste des raccourcis clavier
+HotKeyInfoAction.text = Raccourcis clavier...
+html_export_based_on_headings = Export HTML - Bas\u00e9 sur les titres
+html_export_fold_all = Export HTML - Tout pli\u00e9
+html_export_fold_currently_folded = Export HTML - Respecte les pliages actuels
+html_export_no_folding = Export HTML - Tout d\u00e9pli\u00e9
+html_problem = <html>ne peut pas g\u00e9n\u00e9rer de fichier html<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Addition
+icon_attach = Pi\u00e8ce jointe
+icon_audio = Son
+icon_back = A gauche
+icon_bee = FreePlane
+icon_bell = Se souvenir
+icon_bookmark = Excellent
+icon_broken-line = Cass\u00e9
+icon_button_cancel = Faux
+icon_button_ok = Vrai
+icon_calendar = Date
+icon_checked = Coch\u00e9
+icon_clanbomber = Danger
+icon_clock = Heure
+icon_clock2 = Rappel
+icon_closed = Interdit
+icon_decrypted = D\u00e9verrouill\u00e9
+icon_desktop_new = Bureau
+icon_division = Division
+icon_down = En bas
+icon_edit = Document
+icon_encrypted = Verrouill\u00e9
+icon_executable = Programme
+icon_family = Famille
+icon_fema = Couple
+icon_female1 = Femme1
+icon_female2 = Femme2
+icon_females = Femmes
+icon_flag = Drapeau rouge
+icon_flag-black = Drapeau noir
+icon_flag-blue = Drapeau bleu
+icon_flag-green = Drapeau vert
+icon_flag-orange = Drapeau orange
+icon_flag-pink = Drapeau violet
+icon_flag-yellow = Drapeau jaune
+icon_folder = Dossier
+icon_forward = A droite
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Priorit\u00e9 0
+icon_full-1 = Priorit\u00e9 1
+icon_full-2 = Priorit\u00e9 2
+icon_full-3 = Priorit\u00e9 3
+icon_full-4 = Priorit\u00e9 4
+icon_full-5 = Priorit\u00e9 5
+icon_full-6 = Priorit\u00e9 6
+icon_full-7 = Priorit\u00e9 7
+icon_full-8 = Priorit\u00e9 8
+icon_full-9 = Priorit\u00e9 9
+icon_go = Feu vert
+icon_gohome = Accueil
+icon_group = Groupe
+icon_help = Question
+icon_hourglass = En cours
+icon_icon_not_found = Ic\u00f4ne non trouv\u00e9e
+icon_idea = Id\u00e9e
+icon_image = Image
+icon_info = Information
+icon_internet = Internet
+icon_internet_warning = Internet dangereux
+icon_kaddressbook = T\u00e9l\u00e9phone
+icon_kmail = Courriel
+icon_knotify = Musique
+icon_korn = Bo\u00eete \u00e0 lettres
+icon_ksmiletris = Je suis content
+icon_launch = Lancer
+icon_licq = Fleur
+icon_list = Liste
+icon_Mail = Message
+icon_male1 = Homme1
+icon_male2 = Homme2
+icon_males = Hommes
+icon_menu = Ic\u00f4ne
+icon_messagebox_warning = Attention
+icon_mindmap = Carte mentale
+icon_multiplication = Multiplication
+icon_narrative = R\u00e9cit
+icon_negative = Mauvais
+icon_neutral = Moyen
+icon_password = Clef
+icon_pencil = \u00c0 modifier
+icon_penguin = Linux
+icon_positive = Bien
+icon_prepare = Feu orange
+icon_revision = R\u00e9vis\u00e9
+icon_smiley-angry = En col\u00e8re
+icon_smiley-neutral = Neutre
+icon_smiley-oh = Surpris
+icon_smily_bad = M\u00e9content
+icon_stop = Feu rouge
+icon_stop-sign = Stop
+icon_subtraction = Soustraction
+icon_unchecked = D\u00e9coch\u00e9
+icon_up = En haut
+icon_user_icon = Ic\u00f4nes utilisateur
+icon_very_negative = Tr\u00e8s mauvais
+icon_very_positive = Tr\u00e8s bien
+icon_video = Vid\u00e9o
+icon_wizard = Magique
+icon_xmag = \u00c0 discuter
+icon_yes = Important
+IconGroupPopupAction.arrows.text = Fl\u00e8ches
+IconGroupPopupAction.docs_folders.text = Documents
+IconGroupPopupAction.flags.text = Drapeaux
+IconGroupPopupAction.math.text = Calcul
+IconGroupPopupAction.media.text = M\u00e9dia
+IconGroupPopupAction.miscellaneous.text = Autre
+IconGroupPopupAction.nature.text = Nature
+IconGroupPopupAction.numbers.text = Num\u00e9ros
+IconGroupPopupAction.office.text = Bureau
+IconGroupPopupAction.people.text = Personnes
+IconGroupPopupAction.rating.text = \u00c9valuation
+IconGroupPopupAction.signs.text = Symboles
+IconGroupPopupAction.smiley.text = \u00c9motic\u00f4nes
+IconGroupPopupAction.time.text = Heure
+IconGroupPopupAction.user.text = Ic\u00f4nes utilisateur
+IconProgressExtended10Action.text = Ajouter une image cliquable d'avancement par 10%
+IconProgressExtended10Action.tooltip = <html>Ajoute une image d'avancement redimensionnable qui augmente de 10% \u00e0 chaque clic droit sur l'image.<br>Pour r\u00e9duire l'avancement faire Ctrl + clic droit sur l'image
+IconProgressExtended25Action.text = Ajouter une image cliquable d'avancement par 25%
+IconProgressExtended25Action.tooltip = <html>Ajoute une image d'avancement redimensionnable qui augmente de 25% \u00e0 chaque clic droit sur l'image.<br>Pour r\u00e9duire l'avancement faire Ctrl + clic droit sur l'image
+IconProgressIconDownAction.text = R\u00e9duire l'ic\u00f4ne d'avancement
+IconProgressIconDownAction.tooltip = Modifie l'ic\u00f4ne d'avancement en d\u00e9croissant : 100% -> 75% -> 50% -> 25% -> 0% -> Suppression
+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
+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_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...
+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
+ImportMindmanagerFiles.text = Carte MindManager X5...
+increase_branch_font_size = Augmenter la taille du texte de la branche
+IncreaseNodeFontAction.text = Augmenter la taille du texte
+internal_error_tooltip = Une erreur interne s''est produite. Pour plus de d\u00e9tails, consultez le dernier fichier log dans {0}.
+invalid_export_file = Nom du fichier export\u00e9 invalide
+invalid_file_msg = Impossible de trouver le fichier {0}
+invalid_uri = URI invalide : {0}
+invalid_url = impossible de cr\u00e9er une URL valide
+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
+LatexDeleteLatexAction.text = Supprimer la formule LaTeX
+LatexEditLatexAction.text = Modifier la formule LaTeX...
+LatexInsertLatexAction.text = Ajouter une formule LaTeX...
+less_than_two_selected_nodes = Vous devez s\u00e9lectionner au moins deux n\u0153uds pour les lier.
+license = Licence
+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 License for more details.<br><br>You should have received a copy of the GNU General Public License<br>along with this program; if not, write to the Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = Ouvrir...
+load_accelerator_presets = Ouvrir
+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.
+locking_old_lock_removed = La carte {0} est verrouill\u00e9e par l''utilisateur {1}. Le verrou a \u00e9t\u00e9 supprim\u00e9 car il est ancien.
+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_resource_directory = Dossier d''installation du programme : {0}
+MainView.errorUpdateText = Impossible de calculer {0}.\u000aD\u00e9tails de l''erreur : {1}.
+MakeLinkFromAnchorAction.text = Cr\u00e9er un lien dans le n\u0153ud m\u00e9moris\u00e9
+MakeLinkFromAnchorAction.tooltip = Ajoute, dans le n\u0153ud m\u00e9moris\u00e9, un lien vers le n\u0153ud courant
+MakeLinkToAnchorAction.text = Cr\u00e9er un lien dans le n\u0153ud courant
+MakeLinkToAnchorAction.tooltip = Ajoute, dans le n\u0153ud courant, un lien vers le n\u0153ud m\u00e9moris\u00e9
+ManageAddOnsAction.text = Add-ons
+ManageAddOnsDialog.activate = Activer
+ManageAddOnsDialog.activation.success = {0} sera activ\u00e9 au prochain d\u00e9marrage.
+ManageAddOnsDialog.authored.by = par {0}
+ManageAddOnsDialog.cannot.activate = Impossible d''activer {0} : {0} est d\u00e9j\u00e0 actif.
+ManageAddOnsDialog.cannot.configure = Impossible de configurer {0}.
+ManageAddOnsDialog.cannot.deactivate = Impossible de d\u00e9sactiver {0} : {0} n''est pas activ\u00e9.
+ManageAddOnsDialog.cannot.deinstall = Impossible de d\u00e9sintaller {0}.
+ManageAddOnsDialog.configure = Configurer
+ManageAddOnsDialog.deactivate = D\u00e9sactiver
+ManageAddOnsDialog.deactivation.success = {0} sera automatiquement d\u00e9sactiv\u00e9 au prochain d\u00e9marrage.
+ManageAddOnsDialog.deinstall = D\u00e9sinstaller
+ManageAddOnsDialog.deinstallation.success = {0} sera automatiquement d\u00e9sinstall\u00e9 au prochain d\u00e9marrage.
+ManageAddOnsDialog.error = L''installation a \u00e9chou\u00e9. Erreur : {0}.
+ManageAddOnsDialog.install = Installer...
+ManageAddOnsDialog.install.from.known.location = Installer un add-on depuis un fichier
+ManageAddOnsDialog.install.tooltip = Entrez l'URL d'installation de l'add-on
+ManageAddOnsDialog.map.not.opened = La carte {0} n''est pas ouverte.
+ManageAddOnsDialog.really.deinstall = Confirmez-vous la d\u00e9sinstallation de {0}?
+ManageAddOnsDialog.search = Rechercher des add-ons
+ManageAddOnsDialog.search.file = Parcourir...
+ManageAddOnsDialog.select.tooltip = S\u00e9lectionnez le fichier...
+ManageAddOnsDialog.status.downloading = T\u00e9l\u00e9chargement en cours...
+ManageAddOnsDialog.status.installing = Installation en cours...
+ManageAddOnsDialog.status.success = {0} : installation termin\u00e9e.
+ManageAddOnsDialog.tab.install = Rechercher et installer
+ManageAddOnsDialog.tab.install.tooltip = Rechercher et installer de nouveaux add-ons
+ManageAddOnsDialog.tab.manage = Add-ons
+ManageAddOnsDialog.tab.manage.themes = Th\u00e8mes
+ManageAddOnsDialog.tab.manage.themes.tooltip = G\u00e9rer les th\u00e8mes
+ManageAddOnsDialog.tab.manage.tooltip = G\u00e9rer les add-ons
+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 = La carte existe d\u00e9j\u00e0. Souhaitez-vous vraiment la remplacer ?
+map_corrupted = Carte corrompue. Afficher d'avantage ?
+map_load_error = Fichier {0} impossible \u00e0 ouvrir.
+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...
+MaxNodeWidth.text = Largeur maximale du n\u0153ud
+menu_applyStyle = Appliquer un style
+menu_attributes = Attributs
+menu_clouds = Nuage
+menu_copy = Copier
+menu_coreFormat = N\u0153ud
+menu_details = D\u00e9tails
+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
+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_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
+MindMapNodesFlavorHandler = Avec mise en forme
+mindmaps = Carte
+mindmaps_desc = Cartes (*.mm)
+mindmaps_filter_desc = Filtre (*.mmfilter)
+MinNodeWidth.text = Largeur minimale du n\u0153ud
+mode_Browse = Visionneuse
+mode_File = Explorateur de fichiers
+mode_MindMap = Concepteur
+mode_na = Mode indisponible
+mode_status = Bascul\u00e9 en mode {0}
+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
+MoveToRootAction.text = Aller \u00e0 la racine
+NameConditionAction.text = Nommer le filtre
+NavigationNextMapAction.text = Carte suivante
+NavigationPreviousMapAction.text = Carte pr\u00e9c\u00e9dente
+new = Nouveau...
+new_map_from_user_templates.text = Nouvelle carte \u00e0 partir de...
+new_mindmap = Nouvelle carte
+new_node = Nouveau n\u0153ud
+new_node_as_sibling_not_possible_for_the_root = Impossible de cr\u00e9er un n\u0153ud fr\u00e8re pour la racine
+new_version_available = Une nouvelle version ''{0}'' est disponible
+NewChildAction.text = N\u0153ud fils
+NewerFileRevisionsFoundDialog.cancel = Abandonner
+NewerFileRevisionsFoundDialog.cancel.tooltip = Ne pas ouvrir ce fichier
+NewerFileRevisionsFoundDialog.file_last_modified = Date et heure
+NewerFileRevisionsFoundDialog.file_name = Fichier
+NewerFileRevisionsFoundDialog.file_size = Octets
+NewerFileRevisionsFoundDialog.open = Ouvrir
+NewerFileRevisionsFoundDialog.open.tooltip = Ouvrir le fichier m\u00eame si ce n'est pas le plus r\u00e9cent
+NewerFileRevisionsFoundDialog.question = Il existe une version plus r\u00e9cente de ''{0}'' !\n Voulez-vous vraiement l''ouvrir ? (voir la premi\u00e8re ligne)?\nPour remplacer ''{0}'' par une sauvegarde automatique : s\u00e9lectionnez la sauvegarde dans la liste puis choississez ''Restaurer''.
+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
+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 ?
+NewMapAction.text = Nouvelle carte
+NewMapViewAction.text = Ouvrir la carte dans un nouvel onglet
+NewParentNode.text = N\u0153ud p\u00e8re
+NewParentNode.tooltip = La s\u00e9lection est envoy\u00e9e vers un nouveau parent
+NewPreviousSiblingAction.text = N\u0153ud fr\u00e8re en haut
+NewSiblingAction.text = N\u0153ud fr\u00e8re en bas
+NewSummaryAction.text = Cr\u00e9er un n\u0153ud synth\u00e8se des n\u0153uds s\u00e9lectionn\u00e9s
+NewUserStyleAction.text = Cr\u00e9er un style \u00e0 partir de ce noeud...
+NextNodeAction.BACK.text = N\u0153ud pr\u00e9c\u00e9dent de la carte
+NextNodeAction.BACK_N_FOLD.text = N\u0153ud pr\u00e9c\u00e9dent de la carte (avec pliage automatique)
+NextNodeAction.FORWARD.text = N\u0153ud suivant de la carte
+NextNodeAction.FORWARD_N_FOLD.text = N\u0153ud suivant de la carte (avec pliage automatique)
+NextPresentationItemAction.text = D\u00e9plier le prochain n\u0153ud pr\u00e9sent\u00e9
+no = Non
+no_copy_attributes_before_paste_attributes = Pour coller des attributs, veuillez d'abord les copier.
+NO_FORMAT = Texte
+no_format_copy_before_format_paste = Pour coller un format, veuillez d'abord le copier.
+no_found_from = <html><b>{0}</b> n''a pas \u00e9t\u00e9 trouv\u00e9 \u00e0 partir du n\u0153ud <b>{1}</b>.</html>
+no_more_found_from = <html>Recherche termin\u00e9e :<br>il n''y a plus de <b>{0}</b> \u00e0 partir du n\u0153ud <b>{1}</b>.
+no_previous_find = Aucune recherche n'est en cours.
+no_styles_found_in_map = Aucun style trouv\u00e9 sur la carte
+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_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
+NodeBackgroundColorAction.text = Couleur de fond du n\u0153ud...
+NodeColorAction.text = Couleur du texte...
+NodeColorBlendAction.text = Assortir le texte \u00e0 l'arri\u00e8re-plan
+NodeDownAction.text = D\u00e9placer le n\u0153ud vers le bas
+NodeExtensions.EditNodeExtensions = Modifier les extensions du n\u0153ud
+NodeExtensions.RemoveNodeExtensions = Supprimer les extensions du n\u0153ud
+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
+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
+ok = Valider
+OKAction.text = Valider
+OnlineReference.text = Documentation en ligne
+open_asMindMap = Carte
+OpenAction.text = Ouvrir...
+OpenFreeplaneSiteAction.text = Site Web Freeplane
+OpenPathAction.text = Ouvrir fichier
+OpenURLMapAction.text = Ouvrir une carte depuis Internet...
+OpenUserDirAction.text = Ouvrir le dossier utilisateur
+option_changes_may_require_restart = Pour prendre en compte vos nouvelles pr\u00e9f\u00e9rences, vous devriez red\u00e9marrer Freeplane.
+OptionalDontShowMeAgainDialog.cancel = Non
+OptionalDontShowMeAgainDialog.dontShowAgain = A l'avenir, ex\u00e9cuter sans confirmation
+OptionalDontShowMeAgainDialog.ok = Oui
+OptionalDontShowMeAgainDialog.rememberMyDescision = M\u00e9moriser ce choix
+OptionPanel.absolute = Absolu
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Styles automatiques par niveau
+OptionPanel.ADD_CHILD = Ajouter un n\u0153ud fils
+OptionPanel.ADD_SIBLING = Ajouter un n\u0153ud fr\u00e8re
+OptionPanel.addons = Add-ons
+OptionPanel.always_fold_all_after_load = Tout plier
+OptionPanel.always_load_last_maps = Appliquer les options ci-dessus au d\u00e9marrage depuis un fichier
+OptionPanel.always_load_last_maps.tooltip = Tenir compte des 2 options pr\u00e9c\u00e9dentes lorsque Freeplane d\u00e9marre apr\u00e8s un double clic sur un fichier *.mm
+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_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.
+OptionPanel.antialias_all = Tout lisser
+OptionPanel.antialias_edges = Lisser les lignes
+OptionPanel.antialias_none = Sans lissage
+OptionPanel.Appearance = Apparence
+OptionPanel.apply_system_screen_resolution = Utiliser la r\u00e9solution \u00e9cran par d\u00e9faut
+OptionPanel.approximate_search_threshold = Seuil pour la recherche par variantes
+OptionPanel.approximate_search_threshold.tooltip = <html>Plus le nombre est \u00e9lev\u00e9 moins il y aura de r\u00e9sultats<br><font size="2">Plus de d\u00e9tails sur : http://freeplane.sf.net/wiki/index.php/Approximate_search</font></html>
+OptionPanel.ar = Arabe
+OptionPanel.ARC = Arc
+OptionPanel.as_parent = Comme le p\u00e8re
+OptionPanel.ask = Demander
+OptionPanel.automatic = Automatique
+OptionPanel.automaticFormat_level = Styles automatiques par niveau
+OptionPanel.automaticFormat_level1 = Mise en forme du n\u0153ud racine
+OptionPanel.automaticFormat_level2 = Mise en forme des n\u0153uds de niveau 1
+OptionPanel.backup_file_number = Nombre de fichiers de sauvegarde conserv\u00e9s
+OptionPanel.Behaviour = Comportement
+OptionPanel.bezier = Courbe
+OptionPanel.bubble = Bulle
+OptionPanel.ca = Catalan
+OptionPanel.Cancel = Annuler
+OptionPanel.center_selected_node = Centrer automatiquement la carte sur la s\u00e9lection
+OptionPanel.check_updates_automatically = V\u00e9rifier les mises \u00e0 jour au d\u00e9marrage
+OptionPanel.childpattern = Mod\u00e8le fils
+OptionPanel.childpattern.tooltip = Le mod\u00e8le s\u00e9lectionn\u00e9 est appliqu\u00e9 \u00e0 tous les fils
+OptionPanel.clear_all_setters = Modification g\u00e9n\u00e9rale
+OptionPanel.clear_all_setters.tooltip = Pilote l'ensemble des modifications.
+OptionPanel.cloud = Nuage
+OptionPanel.cloudcolor = Couleur du nuage
+OptionPanel.cloudshape = Forme du nuage
+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.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
+OptionPanel.da = Danois
+OptionPanel.date_format = Format des dates
+OptionPanel.date_format.tooltip = Saisissez SHORT, MEDIUM, LONG, FULL ou un motif pr\u00e9cis comme "MM/dd/yyyy"
+OptionPanel.datetime_format = Format date-heure
+OptionPanel.datetime_format.tooltip = <html>Saisissez <datestyle>,<timestyle> (valeurs possibles : SHORT, MEDIUM, LONG ou FULL)<br>ou saisissez un motif pr\u00e9cis comme "M/d/yyyy hh:mm"
+OptionPanel.de = Allemand
+OptionPanel.default = Par d\u00e9faut
+OptionPanel.default_attribute_key_column_width = Largeur par d\u00e9faut de la colonne Nom des attributs
+OptionPanel.default_attribute_value_column_width = Largeur par d\u00e9faut de la colonne Valeurs des attributs
+OptionPanel.default_browser_command_mac = Commande pour le navigateur par d\u00e9faut pour Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> et le <strong>Mac</strong>\: (grace \u00e0 Nick \!)</html>
+OptionPanel.default_browser_command_other_os = Commande pour le navigateur par d\u00e9faut pour d'autres syst\u00e8mes
+OptionPanel.default_browser_command_other_os.tooltip = <html>Cela correspond typiquement \u00e0 Linux.</html>
+OptionPanel.default_browser_command_windows_9x = Commande pour le navigateur par d\u00e9faut pour Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Pour Windows (les signes "" sont n\u00e9cessaires \u00e0 cause des liens qui contiennent un caract\u00e8re "\=" dans leur URL).</html>
+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.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.
+OptionPanel.delete_nodes_without_question = Supprimer les n\u0153uds sans confirmation
+OptionPanel.delete_nodes_without_question.tooltip = Supprime imm\u00e9diatement les n\u0153uds, sans confirmation
+OptionPanel.disable_cursor_move_paper = Ne pas modifier le pointeur lors du d\u00e9placement de la carte
+OptionPanel.disable_cursor_move_paper.tooltip = Ne pas modifier l'apparence du pointeur de la souris lors du d\u00e9placement de la carte
+OptionPanel.display_inline_editor_for_all_new_nodes = Activer la saisie dans la carte pour les formules
+OptionPanel.display_node_id = Afficher l'identifiant du n\u0153ud
+OptionPanel.edgecolor = Couleur de ligne
+OptionPanel.edgecolor.tooltip = Couleur de ligne du n\u0153ud (s'applique aussi aux n\u0153uds fils)
+OptionPanel.edgestyle = Style de ligne
+OptionPanel.edgestyle.tooltip = Style de ligne du n\u0153ud (s'applique aussi aux n\u0153uds fils)
+OptionPanel.edgewidth = \u00c9paisseur de ligne
+OptionPanel.edgewidth.tooltip = \u00c9paisseur de ligne du n\u0153ud (s'applique aussi aux n\u0153uds fils)
+OptionPanel.EDIT_CURRENT = Effacer le contenu
+OptionPanel.edit_on_double_click = Le double clic permet de modifier le texte du n\u0153ud
+OptionPanel.editor_extra_width = Agrandissement automatique de la zone de saisie (en pixels)
+OptionPanel.editor_extra_width.tooltip = D\u00e9finit la taille suppl\u00e9mentaire dont s'agrandit la zone de saisie lorsque le texte du n\u0153ud d\u00e9passe la taille courante du n\u0153ud
+OptionPanel.el = Grecque
+OptionPanel.el__buttons_above = Afficher les boutons en haut
+OptionPanel.el__enter_confirms_by_default = La touche "Entr\u00e9e" valide le n\u0153ud
+OptionPanel.el__max_default_window_height = Hauteur maximum par d\u00e9faut de la fen\u00eatre
+OptionPanel.el__max_default_window_width = Largeur maximum par d\u00e9faut de la fen\u00eatre
+OptionPanel.el__min_default_window_height = Hauteur minimum par d\u00e9faut de la fen\u00eatre
+OptionPanel.el__min_default_window_width = Largeur minimum par d\u00e9faut de la fen\u00eatre
+OptionPanel.el__position_window_below_node = Afficher l'\u00e9diteur sous le n\u0153ud
+OptionPanel.en = Anglais
+OptionPanel.Environment = Environnement
+OptionPanel.es = Espagnol
+OptionPanel.et = \u00c9thipien
+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
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html>Autorise les scripts \u00e0 ex\u00e9cuter des commandes externes comme le lancement d'autres applications (exemple : lancement d'un nagivateur Web).
+OptionPanel.execute_scripts_without_file_restriction = Autoriser les op\u00e9rations de lecture sur les fichiers
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html>Autorise les scripts \u00e0 ouvrir et lire les fichiers de votre ordinateur.
+OptionPanel.execute_scripts_without_network_restriction = Autoriser les op\u00e9rations r\u00e9seau
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html>Autorise les scripts \u00e0 acc\u00e9der aux fichiers r\u00e9seau.
+OptionPanel.execute_scripts_without_write_restriction = Autoriser les op\u00e9ration d'\u00e9criture sur les fichiers
+OptionPanel.execute_scripts_without_write_restriction.tooltip = Autorise les scripts \u00e0 modifier les fichiers de votre ordinateur.
+OptionPanel.experimental_file_locking_on = Verrouiller les cartes ouvertes (exp\u00e9rimental)
+OptionPanel.experimental_file_locking_on.tooltip = Cette fonctionalit\u00e9 exp\u00e9rimentale permet de verrouiller une carte partag\u00e9e (fonctionnement collaboratif en r\u00e9seau)
+OptionPanel.export_icons_in_html = Exporter les ic\u00f4nes
+OptionPanel.export_icons_in_html.tooltip = Indique que l'HTML export\u00e9 doit int\u00e9grer les ic\u00f4nes
+OptionPanel.Files = Fichiers
+OptionPanel.first = En haut
+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
+OptionPanel.fork = Fourche
+OptionPanel.format_locale = Param\u00e8tres r\u00e9gionaux
+OptionPanel.format_locale.tooltip = Param\u00e8tres d'affichage et de d\u00e9tection des nombres et des dates
+OptionPanel.formula_disable_caching = D\u00e9sactiver la mise en cache des formules
+OptionPanel.formula_disable_plugin = D\u00e9sactiver les formules
+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.gtk = Gtk
+OptionPanel.hide_edge = Invisible
+OptionPanel.highlight_formulas = Entourer les formules
+OptionPanel.horizontal = Rectiligne
+OptionPanel.hr = Croate
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = \u00c0 partir des titres
+OptionPanel.html_export_fold_all = Tout pli\u00e9
+OptionPanel.html_export_fold_currently_folded = Pliage actuel
+OptionPanel.html_export_folding = Exporter le pliage
+OptionPanel.html_export_no_folding = Tout d\u00e9pli\u00e9
+OptionPanel.hu = Hongrois
+OptionPanel.ic_disable = Inactif
+OptionPanel.ic_file = Utiliser le disque
+OptionPanel.ic_ram = Utiliser la m\u00e9moire vive (RAM)
+OptionPanel.icon = Ic\u00f4ne
+OptionPanel.icon.tooltip = Si appliqu\u00e9, le n\u0153ud aura exactement cette ic\u00f4ne.
+OptionPanel.icons.list = Liste des ic\u00f4nes standard affich\u00e9es
+OptionPanel.icons.list.tooltip = Vous pouvez ordonner ou d\u00e9sactiver les ic\u00f4nes standard. Les ic\u00f4nes doivent \u00eatre s\u00e9p\u00e9es par ';'.
+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.it = Italien
+OptionPanel.ja = Japonais
+OptionPanel.key_type_action = Saisie clavier hors d'un noeud
+OptionPanel.Keystrokes = Raccourcis clavier
+OptionPanel.ko = Cor\u00e9en
+OptionPanel.label_font_family = Police
+OptionPanel.label_font_size = Taille du texte
+OptionPanel.language = Langue de l'utilisateur
+OptionPanel.language.tooltip = <html>Langue qui doit \u00eatre utilis\u00e9e par l'application.<br>La valeur 'automatique' tente de charger la langue utilis\u00e9e actuellement par l'utilisateur dans son syst\u00e8me.</html>
+OptionPanel.last = En bas
+OptionPanel.last_opened_list_length = Nombre de fichiers dans la liste des fichiers r\u00e9cents
+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
+OptionPanel.links = Type des liens
+OptionPanel.links.tooltip = Le chemin des liens hypertextes peut \u00eatre soit d\u00e9fini en relatif par rapport \u00e0 la carte courante, soit \u00eatre un chemin absolu.
+OptionPanel.load_folding = \u00c9tat du pliage
+OptionPanel.load_folding_from_map_default_fold_all = Pliage de la carte ou tout plier
+OptionPanel.load_folding_from_map_default_unfold_all = Pliage de la carte ou tout d\u00e9plier
+OptionPanel.load_last_map = D\u00e9marrer en affichant la derni\u00e8re carte utilis\u00e9e
+OptionPanel.load_last_map.tooltip = Au d\u00e9marrage ouvrir automatiquement la derni\u00e8re carte utilis\u00e9e
+OptionPanel.load_last_maps = D\u00e9marrer en affichant toutes les cartes ouvertes lors de l'arr\u00eat
+OptionPanel.lookandfeel = Th\u00e8me
+OptionPanel.lookandfeel.tooltip = <html>Les <em>th\u00e8mes</em> disponibles.<br>\n"M\u00e9tal", "Windows", "Motif" "GTk" sont support\u00e9s, "Mac" n'est disponible que sur syst\u00e8me Mac OS.<br>\n"D\u00e9faut" indique d'utiliser le th\u00e8me par d\u00e9faut pour la machine virtuelle.<br>\nPour utiliser votre propre th\u00e8me, merci de saisir le nom de la classe et assurez-vous que le fichier JAR est correctement charg\u00e9.<br>\nS'il y a un probl\u00e8me de th\u00e8me, choisissez "Par d\u00e9faut".\n</html>
+OptionPanel.lt = Lituanien
+OptionPanel.max_displayed_node_count = Nombre maximum de n\u0153uds affich\u00e9s
+OptionPanel.max_image_width = Largeur par d\u00e9faut des images
+OptionPanel.max_image_width.tooltip = Les nouvelles images sont retaill\u00e9es \u00e0 cette largeur
+OptionPanel.max_menu_item_count = Nombre de commandes affich\u00e9es dans les menus
+OptionPanel.max_menu_item_count.tooltip = (10 minimum). Au-del\u00e0 de ce nombre les commandes apparaissent en sous-menu.
+OptionPanel.max_node_width = Largeur maximale des n\u0153uds
+OptionPanel.max_shortened_text_length = Largeur utilis\u00e9e pour r\u00e9sumer les n\u0153uds
+OptionPanel.metal = M\u00e9tal
+OptionPanel.min_node_width = Largeur minimale des n\u0153uds
+OptionPanel.motif = Motif
+OptionPanel.nb = Norv\u00e9gien
+OptionPanel.never_save_folding = Jamais
+OptionPanel.nl = N\u00e9erlandais
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Couleur du fond
+OptionPanel.nodebackgroundcolor.tooltip = Couleur du fond du n\u0153ud
+OptionPanel.nodecolor = Couleur du texte
+OptionPanel.nodecolor.tooltip = Couleur du texte dans le n\u0153ud
+OptionPanel.nodefontbold = Gras
+OptionPanel.nodefonthyperlink = Lien hypertexte
+OptionPanel.nodefontitalic = Italique
+OptionPanel.nodefontname = Type de police
+OptionPanel.nodefontsize = Taille du texte
+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.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
+OptionPanel.number_format = Format des nombres
+OptionPanel.number_format.tooltip = <html>'#' indique un chiffre optionnel, '0' indique un chiffre obligatoire. Exemples : "0,00" ou "#0".<br>Le format peut aussi contenir des caract\u00e8res fixes. Exemples : "0,0%" ou "0,0#\u20ac"
+OptionPanel.number_of_different_files_for_automatic_save = Nombre de fichiers diff\u00e9rents pour la sauvegarde automatique
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html>Nombre de fichiers (n) conserv\u00e9s lors des sauvegardes automatiques.<br>La sauvegarde est cyclique : la (n+1)e sauvegarde \u00e9crase le 1i\u00e8re.
+OptionPanel.OK = Enregistrer sous...
+OptionPanel.org.freeplane.plugin.bugreport = Pr\u00e9f\u00e9rence
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Toujours envoyer
+OptionPanel.org.freeplane.plugin.bugreport.ask = Demander
+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.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.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.
+OptionPanel.patternname = Nom
+OptionPanel.patternname.tooltip = Nom unique de mod\u00e8le
+OptionPanel.pl = Polonais
+OptionPanel.placenewbranches = Position des nouveaux n\u0153uds
+OptionPanel.placenewbranches.tooltip = D\u00e9finit l'emplacement des nouveaux n\u0153uds fils sur la carte
+OptionPanel.plugin.tooltip = Plugins
+OptionPanel.plugins = Formules & Scripts
+OptionPanel.presentation_dimmer_transparency = Transparence de l'arri\u00e8re-plan en mode pr\u00e9sentation
+OptionPanel.presentation_mode = Mode pr\u00e9sentation
+OptionPanel.printonwhitebackground = Fond blanc \u00e0 l'impression
+OptionPanel.printonwhitebackground.tooltip = Toujours utiliser un fond blanc \u00e0 l'impression
+OptionPanel.pt_BR = Portugais (du Br\u00e9sil)
+OptionPanel.pt_PT = Portugais (du Portugal)
+OptionPanel.RECT = 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.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
+OptionPanel.resources_use_margin_top_zero_for_notes = Enlever la marge sup\u00e9rieure pour les notes
+OptionPanel.revision_color = Couleur de r\u00e9vision
+OptionPanel.revision_color.tooltip = Couleur de fond indiquant les n\u0153uds r\u00e9vis\u00e9s (lorsque l'option est active dans le menu Outils)
+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_modification_times = Enregistrer les heures de modification
+OptionPanel.script_classpath = Dossiers contenant les JAR et fichiers .class (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_directories = Dossiers contenant les scripts (sous Windows s\u00e9parateur ;)
+OptionPanel.script_directories.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_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.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
+OptionPanel.selection_method_delayed = Avec d\u00e9lai
+OptionPanel.selection_method_direct = Imm\u00e9diat
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Styles automatiques par niveau
+OptionPanel.separator.anti_alias = Lissage
+OptionPanel.separator.attributes = Attributs
+OptionPanel.separator.automatic_save = Sauvegardes automatiques
+OptionPanel.separator.behaviour = Comportement
+OptionPanel.separator.browser = Navigateur
+OptionPanel.separator.cache = Cache
+OptionPanel.separator.CloudControls = Nuage
+OptionPanel.separator.commands_for_the_program = Raccourcis clavier
+OptionPanel.separator.connectors = Connecteurs
+OptionPanel.separator.data_formats = D\u00e9tection et formatage de donn\u00e9es
+OptionPanel.separator.default_colors = Couleurs par d\u00e9faut
+OptionPanel.separator.default_fonts = Police par d\u00e9faut
+OptionPanel.separator.default_styles = Forme des n\u0153uds
+OptionPanel.separator.EdgeControls = Lignes
+OptionPanel.separator.edit_long_node_window = Editeur de n\u0153ud en texte riche
+OptionPanel.separator.editing = Editeur de n\u0153ud texte brut
+OptionPanel.separator.files = Fichiers
+OptionPanel.separator.formula = Formules
+OptionPanel.separator.General = G\u00e9n\u00e9ral
+OptionPanel.separator.html_export = Export HTML
+OptionPanel.separator.html_import = Import HTML
+OptionPanel.separator.hyperlink_types = Liens hypertextes
+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.key_typing = Saisie clavier
+OptionPanel.separator.language = Langue
+OptionPanel.separator.load = Ouverture
+OptionPanel.separator.look_and_feel = G\u00e9n\u00e9ral
+OptionPanel.separator.mouse_wheel = Molette de la souris
+OptionPanel.separator.new_node_commands = Commandes pour cr\u00e9er un n\u0153ud
+OptionPanel.separator.node_editing_commands = Commandes pour modifier un n\u0153ud
+OptionPanel.separator.node_navigation_commands = Commandes de navigation dans les n\u0153uds
+OptionPanel.separator.NodeColors = Couleurs du n\u0153ud
+OptionPanel.separator.NodeFont = Texte du n\u0153ud
+OptionPanel.separator.NodeShape = Forme du n\u0153ud
+OptionPanel.separator.NodeStyle = Style du n\u0153ud
+OptionPanel.separator.NodeText = Texte calcul\u00e9
+OptionPanel.separator.notifications = Confirmations
+OptionPanel.separator.org.freeplane.plugin.bugreport = Rapport automatique d'erreur
+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.RichTextEditor = \u00c9diteur de texte riche
+OptionPanel.separator.root_node_appearance = Apparence du n\u0153ud racine
+OptionPanel.separator.save = Enregistrement
+OptionPanel.separator.scripting = Scripts
+OptionPanel.separator.scrollbar = Ascenseur
+OptionPanel.separator.search = Recherche
+OptionPanel.separator.selection_colors = Couleurs de la s\u00e9lection
+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.status = Barre d'\u00e9tat
+OptionPanel.separator.tooltip = Info-bulles
+OptionPanel.separator.undo = Annulation
+OptionPanel.separator.updates = Mise \u00e0 jour du programme
+OptionPanel.set_property_text = Personalis\u00e9
+OptionPanel.set_property_text.tooltip = D\u00e9cocher r\u00e9tablit la mise en forme du style
+OptionPanel.setscript = Ex\u00e9cuter
+OptionPanel.setscript.tooltip = Un script peut \u00eatre associ\u00e9 au mod\u00e8le.
+OptionPanel.sharp_bezier = Courbe effil\u00e9
+OptionPanel.sharp_linear = Droit effil\u00e9
+OptionPanel.show_icon_for_attributes = Afficher les ic\u00f4nes des attributs
+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
+OptionPanel.signed_script_are_trusted = Autoriser les scripts sign\u00e9s (recommand\u00e9)
+OptionPanel.signed_script_are_trusted.tooltip = Si des scripts sont sign\u00e9s par un tiers de confiance (par ex. les auteurs de Freeplane ou vous-m\u00eame), ils seront ex\u00e9cut\u00e9s sans restriction.
+OptionPanel.simplyhtml.default_paste_mode = Mode par d\u00e9faut lors d'un Coller
+OptionPanel.single_backup_directory = Utiliser un dossier de sauvegarde unique
+OptionPanel.single_backup_directory.tooltip = <html>Pour que les sauvegardes soient stock\u00e9es dans un dossier unique pour toutes les cartes.<br>Dans le cas contraire, les sauvegardes sont effectu\u00e9es dans un sous-dossier du dossier d'enregistrement de la carte.
+OptionPanel.single_backup_directory_path = Dossier de sauvegarde (lorsque l'option pr\u00e9c\u00e9dente est active)
+OptionPanel.single_backup_directory_path.tooltip = Remplace le dossier de sauvegarde par d\u00e9faut <freeplaneuserdir>/.backup
+OptionPanel.single_instance = Ouvrir les fichiers dans l'instance courante
+OptionPanel.single_instance_force = Toujours utiliser une seule instance du programme
+OptionPanel.single_instance_force.tooltip = Toujours utiliser une seule instance du programme m\u00eame s'il n'y a aucun fichier \u00e0 ouvrir
+OptionPanel.sk = Slovaque
+OptionPanel.sl = Slov\u00e8ne
+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.sr = Serbe / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = Mod\u00e8le de carte par d\u00e9faut
+OptionPanel.standardbackgroundcolor = Couleur de fond
+OptionPanel.standardbackgroundcolor.tooltip = Couleur par d\u00e9faut du fond
+OptionPanel.standardcloudcolor = Couleur de nuage
+OptionPanel.standardcloudcolor.tooltip = Couleur par d\u00e9faut des nuages
+OptionPanel.standardcloudestyle = Style de nuage
+OptionPanel.standardcloudestyle.tooltip = Style par d\u00e9faut des nuages
+OptionPanel.standarddrawrectangleforselection = Entourer les n\u0153uds s\u00e9lectionn\u00e9s
+OptionPanel.standarddrawrectangleforselection.tooltip = Entoure d'un rectangle color\u00e9 les n\u0153uds s\u00e9lectionn\u00e9s
+OptionPanel.standardlinkcolor = Couleur de connecteur
+OptionPanel.standardlinkcolor.tooltip = Couleur par d\u00e9faut des connecteurs
+OptionPanel.standardlinkestyle = Style de lien par d\u00e9faut
+OptionPanel.standardlinkestyle.tooltip = Style par d\u00e9faut des lignes de lien
+OptionPanel.standardselectednodecolor = Couleur du n\u0153ud s\u00e9lectionn\u00e9
+OptionPanel.standardselectednodecolor.tooltip = Couleur identifiant les n\u0153uds s\u00e9lectionn\u00e9s
+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.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 'Cr\u00e9er un nouveau raccourci' dans le menu 'Outils'.
+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.</html>
+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.reshowDelay = D\u00e9lai de r\u00e9affichage (en millisecondes)
+OptionPanel.tr = Turque
+OptionPanel.uk_UA = Ukrainien
+OptionPanel.undefined_font = Police inconnue
+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.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
+OptionPanel.use_tabbed_pane.tooltip = Les cartes ouvertes sont pr\u00e9sent\u00e9es dans des onglets.
+OptionPanel.user_defined_screen_resolution = R\u00e9solution \u00e9cran personnalis\u00e9e (en dpi)
+OptionPanel.validate_classpath_needs_readaccess = Scripts : v\u00e9rifiez que les dossiers et les fichiers sont accessibles en lecture
+OptionPanel.validate_invalid_date_format = Le format de date n'est pas valide
+OptionPanel.validate_invalid_datetime_format = Le format de date/heure n'est pas valide
+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.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.windows = Fen\u00eatre
+OptionPanel.zh_CN = Chinois (simplifi\u00e9)
+OptionPanel.zh_TW = Chinois (Mandarin)
+org.freeplane.plugin.bugreport.agree = Envoyer
+org.freeplane.plugin.bugreport.always_agree = Toujours envoyer
+org.freeplane.plugin.bugreport.always_deny = Ne jamais envoyer
+org.freeplane.plugin.bugreport.deny = Ne pas envoyer
+org.freeplane.plugin.bugreport.dialog.title = Rapport automatique d'erreur
+org.freeplane.plugin.bugreport.freeplane_team = Message de l'\u00e9quipe FreePlane
+org.freeplane.plugin.bugreport.lastreport = Le dernier rapport re\u00e7u
+org.freeplane.plugin.bugreport.never = Ne jamais demander
+org.freeplane.plugin.bugreport.question = Freeplane propose de signaler les erreurs aux \u00e9quipes de d\u00e9veloppement. Aucune donn\u00e9e personnelle ni le moindre contenu de vos cartes ne sera transmis.\nL'envoi de rapports d'erreur permet, ensemble, d'am\u00e9liorer Freeplane.
+org.freeplane.plugin.bugreport.report = Rapport d\u00e9taill\u00e9 de l'erreur
+org.freeplane.plugin.bugreport.wanted_bug = Une erreur interne s'est produite et a \u00e9t\u00e9 report\u00e9e automatiquement.\nNous souhaiterions plus d'informations afin de reproduire ce comportement inattendu.\nAidez-nous en cr\u00e9ant un rapport d'erreur dans Mantis, notre banque de bogues :\nexpliquez ce que vous faisiez au moment o\u00f9 l'erreur s'est produite, afin de nous donner une chance de reproduire le bogue.\n\nAppuyez sur Valider pour ouvrir la banque de bogues dans votre navigateur.\n\nMerci de nous aider \u00e0 r\u00e9soudre ce probl\u00e8me.\nVotre \u00e9quipe Freeplane
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = Le n\u0153ud {0} n''est pas d\u00e9fini
+out_of_memory = M\u00e9moire insuffisante
+overwrite_keyset_question = Il existe d\u00e9j\u00e0 un enregistrement portant ce nom. Remplacer l'enregistrement existant ?
+PageAction.text = Mise en page...
+password_is_not_ascii = le mot de passe n'est pas en ASCII
+PasteAction.text = Coller
+PasteAttributes.text = Coller les attributs
+PatternNewNameProperty = Nouveau style
+PatternToString.backgroundColor = Couleur du fond
+PatternToString.Child = Style de n\u0153ud fils
+PatternToString.color = Couleur
+PatternToString.EdgeColor = Couleur de ligne
+PatternToString.EdgeStyle = Style de ligne
+PatternToString.EdgeWidth = \u00c9paisseur de ligne
+PatternToString.FontBold = Gras
+PatternToString.FontItalic = Italique
+PatternToString.FontName = Nom de police
+PatternToString.Icon = Ic\u00f4ne
+PatternToString.NodeFontSize = Taille de police
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = jours
+PeriodUnit.HOUR = heures
+PeriodUnit.MINUTE = minutes
+PeriodUnit.MONTH = mois
+PeriodUnit.WEEK = semaines
+PeriodUnit.YEAR = ann\u00e9es
+plugins/latex/LatexNodeHook.editorTitle = Modifier la formule LaTeX
+plugins/script_filter = Script de filtre {0}
+plugins/script_filter_error = {0} doit renvoyer un bol\u00e9en sur {1} mais renvoit {2}
+plugins/ScriptEditor.cancel = Ignorer les modifications et quitter
+plugins/ScriptEditor.exit = Enregistrer et quitter
+plugins/ScriptEditor.FORBIDDEN_ACTION = Les scripts Groovy dans Freeplane sont restreints. L'op\u00e9ration suivante {0,choice,0\#File|1\#Network|2\#Exec} est interdite \: {1,choice,0\#Accept|1\#Connect|2\#Listen|3\#Multicast|4\#SetFactory|5\#Exec|6\#Link|7\#Delete|8\#Read|9\#Write}. Vous pouvez changer ces options dans les pr\u00e9f\u00e9rences.
+plugins/ScriptEditor.menu_actions = Actions
+plugins/ScriptEditor.new_script = Nouveau script
+plugins/ScriptEditor.run = Ex\u00e9cuter
+plugins/ScriptEditor.sign = Signer le script...
+plugins/ScriptEditor/window.Result = R\u00e9sultat :
+plugins/ScriptEditor/window.title = \u00c9diteur de scripts
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Acc\u00e8s illegale \u00e0 l''API interne (package {0}). Contactez l''\u00e9quipe Freeplane pour faire \u00e9voluer l''API.
+plugins/TimeList.xml_Created = Cr\u00e9\u00e9
+plugins/TimeList.xml_Date = Date
+plugins/TimeList.xml_Icons = Ic\u00f4nes
+plugins/TimeList.xml_Modified = Modifi\u00e9
+plugins/TimeList.xml_Notes = Notes
+plugins/TimeList.xml_Text = Texte
+plugins/TimeManagement.xml_appendButton = Ins\u00e9rer la date
+plugins/TimeManagement.xml_Cancel = Annuler
+plugins/TimeManagement.xml_cancelButton = Annuler
+plugins/TimeManagement.xml_closeButton = Fermer
+plugins/TimeManagement.xml_Export = Exporter les n\u0153uds s\u00e9lectionn\u00e9s
+plugins/TimeManagement.xml_Find = Rechercher
+plugins/TimeManagement.xml_Goto = Aller \u00e0
+plugins/TimeManagement.xml_hour = Heure :
+plugins/TimeManagement.xml_menu_actions = Actions
+plugins/TimeManagement.xml_minute = Minutes :
+plugins/TimeManagement.xml_reminderButton = Cr\u00e9er l'alerte
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Cr\u00e9\u00e9 une alerte pour la date et l'heure sp\u00e9cifi\u00e9s.<br>L'alerte est indiqu\u00e9e par l'ajout d'une ic\u00f4ne sur le n\u0153ud.<br>Une fois l'alerte d\u00e9pass\u00e9e, l'ic\u00f4ne clignote pour attirer votre attention.
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Il ne peut y avoir qu''une seule alerte par n\u0153ud.<br>Une alerte est d\u00e9j\u00e0 planifi\u00e9e le {0,date} \u00e0 {0,time}.<br>Souhaitez-vous remplacer cette alerte par une nouvelle alerte le {1,date} \u00e0 {1,time} ?
+plugins/TimeManagement.xml_reminderNode_tooltip = Alerte planifi\u00e9e le {0,date} \u00e0 {0,time}.
+plugins/TimeManagement.xml_remindLaterButton = Rappeler
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Rappeler
+plugins/TimeManagement.xml_removeReminderButton = Supprimer l'alerte
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Supprime les alertes des n\u0153uds s\u00e9lectionn\u00e9s.
+plugins/TimeManagement.xml_Replace = Remplacer
+plugins/TimeManagement.xml_Replace_All = Tout remplacer
+plugins/TimeManagement.xml_Replace_Selected = Remplacer la s\u00e9lection
+plugins/TimeManagement.xml_Select = S\u00e9lectionner
+plugins/TimeManagement.xml_todayButton = Aujourd'hui
+plugins/TimeManagement.xml_WindowTitle = Gestion du temps
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Rechercher et remplacer
+preferences = Pr\u00e9f\u00e9rences
+print_preview_title = Aper\u00e7u avant impression
+PrintAction.text = Imprimer...
+PrintDirectAction.text = Imprimer
+printing_settings = Mise en page de l'impression
+PrintPreviewAction.text = Aper\u00e7u avant impression...
+PropertyAction.dialog = Pr\u00e9f\u00e9rences utilisateur
+PropertyAction.text = Pr\u00e9f\u00e9rences...
+QuickFilterAction.text = Afficher uniquement les r\u00e9sultats
+QuickFindAction.BACK.text = R\u00e9sultat pr\u00e9c\u00e9dent
+QuickFindAction.FORWARD.text = R\u00e9sultat suivant
+QuickFindAllAction.text = S\u00e9lectionner les r\u00e9sultats
+QuickHighlightAction.text = Entourer les r\u00e9sultats
+QuitAction.text = Quitter Freeplane
+read_only = En lecture seule
+ReadScriptError.text = Erreur \u00e0 la lecture du script
+really_convert_to_current_version = <html>Cette carte a \u00e9t\u00e9 cr\u00e9\u00e9e avec une ancienne version de Freeplane.<br>Voulez-vous la convertir (recommand\u00e9) ?<br>(Sinon vous pouvez essayer de l'utiliser telle quelle, sans garantie.)</html>
+really_cut_node = Souhaitez-vous vraiment couper les n\u0153uds s\u00e9lectionn\u00e9s ?
+really_execute_script = Souhaitez-vous vraiment ex\u00e9cuter les scripts inclus dans cette carte ? Des scripts malveillants peuvent faire courir un risque \u00e0 votre ordinateur.
+really_remove_node = Souhaitez-vous vraiment supprimer les n\u0153uds s\u00e9lectionn\u00e9s ?
+really_remove_notes = Souhaitez-vous vraiment supprimer les notes des n\u0153uds s\u00e9lectionn\u00e9s ?
+ReapplyFilterAction.text = R\u00e9appliquer les filtres
+red = Rouge
+RedefineStyleAction.text = Enregistrer la mise en forme actuelle dans le style
+RedoAction.text = R\u00e9tablir
+RedoFilterAction.text = Filtre suivant
+regular_expressions = Expressions r\u00e9guli\u00e8res
+ReminderHookAction.text = Supprimer l'alerte
+ReminderHookAction.tooltip = Supprime l'alerte d'un n\u0153ud
+remove_file_from_list_on_error = <html>Fichier {0} introuvable !<br>Souhaitez-vous le retirer de la liste des fichiers r\u00e9cents ?
+remove_shortcut_question = Remplacer le raccourci ?
+RemoveAllIconsAction.text = Supprimer toutes les ic\u00f4nes
+RemoveConnectorAction.text = Supprimer le connecteur
+RemoveEncryption.text = Supprimer la protection
+RemoveFormatAction.text = Supprimer la mise en forme
+RemoveIcon_0_Action.text = Supprimer la premi\u00e8re ic\u00f4ne
+RemoveIconAction.text = Supprimer la derni\u00e8re ic\u00f4ne
+RemoveNoteAction.text = Supprimer les notes
+RemoveNoteAction.tooltip = Supprime les notes des n\u0153ud s\u00e9lectionn\u00e9s
+rename = Renommer
+repair_link = R\u00e9parer le lien
+repair_link_question = Impossible d'ouvrir la carte li\u00e9e. Souhaitez-vous r\u00e9parer le lien manuellement ?
+replace = Remplacer
+replace_shortcut_question = Ce raccourci est actuellement associ\u00e9 \u00e0 la commande :\n"{0}".
+replace_shortcut_title = Cr\u00e9er un raccourci
+ReportBugAction.text = Signaler une erreur
+RequestFeatureAction.text = Sugg\u00e9rer une \u00e9volution
+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
+save_failed = L''enregistrement de la carte {0} a \u00e9chou\u00e9.
+save_unsaved = Souhaitez-vous enregistrer la carte ?
+save_unsaved_styles = Enregistrer les styles ?
+SaveAcceleratorPresetsAction.text = Enregistrer les touches de fonction...
+SaveAction.text = Enregistrer
+SaveAll.text = Tout enregistrer
+SaveAll.tooltip = Enregistre toutes les cartes ouvertes
+SaveAsAction.text = Enregistrer sous...
+saved = Carte enregistr\u00e9e
+saving_canceled = Enregistrement annul\u00e9
+scanners_not_loaded = Fichier illisible
+scheme_evaluate = \u00c9valuer !
+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_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
+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
+select_icon = Biblioth\u00e8que d'ic\u00f4nes
+select_menu_item_dialog = S\u00e9lectionnez une commande
+select_menu_item_root_node = Menus de Freeplane
+SelectAllAction.text = S\u00e9lectionner les n\u0153uds visibles de la carte
+SelectBranchAction.text = S\u00e9lectionner les n\u0153uds visibles de la branche
+SelectedPasteAction.text = Collage sp\u00e9cial...
+selection_method_by_click = S\u00e9lection par simple clic
+selection_method_delayed = S\u00e9lection retard\u00e9e
+selection_method_direct = S\u00e9lection par pointage
+SelectNoteAction.text = Aller \u00e0 l'\u00e9diteur de notes
+SelectNoteAction.tooltip = Placer le curseur dans l'\u00e9diteur de notes pour la modifier
+set_accelerator_on_next_click_action = S\u00e9lectionnez une commande dans un menu en maintenant la touche 'Ctrl' enfonc\u00e9e.
+SetAcceleratorOnNextClickAction.text = Cr\u00e9er un nouveau raccourci
+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
+SetLinkAnchorAction.tooltip_anchored = M\u00e9morise le n\u0153ud courant pour la cr\u00e9ation de lien
+SetLinkByFileChooserAction.text = Lien vers un fichier...
+SetLinkByTextFieldAction.text = Lien libre... / Modifier lien existant...
+SetNodeLink.text = Lien vers un n\u0153ud...
+SetNoteWindowPosition.bottom.text = Bas
+SetNoteWindowPosition.left.text = Gauche
+SetNoteWindowPosition.right.text = Droite
+SetNoteWindowPosition.top.text = Haut
+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...
+ShowDescendantsAction.text = Afficher les fils des n\u0153uds filtr\u00e9s
+ShowFilterToolbarAction.text = Barre de filtres
+ShowFormatPanel.text = Panneau de propri\u00e9t\u00e9s
+ShowFormatPanel.tooltip = Affiche le panneau de propri\u00e9t\u00e9s du n\u0153ud qui permet de d\u00e9finir la mise en forme du n\u0153ud, de g\u00e9rer le calendrier et les attributs
+ShowHideNoteAction.text = Editeur de notes
+ShowHideNoteAction.tooltip = Affiche l'\u00e9diteur de notes
+ShowNextChildAction.text = Afficher le n\u0153ud fils suivant
+ShowNotesInMapAction.text = Afficher les notes sur la carte
+ShowSelectedAttributesAction.text = Afficher les attributs s\u00e9lectionn\u00e9s
+ShowSelectionAsRectangleAction.text = Entourer la s\u00e9lection
+simplyhtml.aboutFrameTitle = \u00c0 propos de cette application
+simplyhtml.aboutLabel = \u00c0 propos de SimplyHTML...
+simplyhtml.alignCenter = Centr\u00e9
+simplyhtml.alignLabel = Alignement
+simplyhtml.alignLeft = A gauche
+simplyhtml.alignRight = A droite
+simplyhtml.allCellsRangeLabel = toutes les cellules
+simplyhtml.allOccurrencesReplaced = Toutes les occurrences ont \u00e9t\u00e9 remplac\u00e9es
+simplyhtml.appendTableColLabel = Ajouter une colonne
+simplyhtml.appendTableRowLabel = Ajouter une ligne
+simplyhtml.applyCellAttrLabel = Tout appliquer
+simplyhtml.backgroundLabel = Arri\u00e8re plan
+simplyhtml.boldItalicName = Gras italique
+simplyhtml.boldName = Gras
+simplyhtml.borderColorLabel = Couleur
+simplyhtml.borderWidthLabel = Largeur
+simplyhtml.bottomLabel = En bas
+simplyhtml.cancelBtnName = Annuler
+simplyhtml.cellBorderTabLabel = Bordure
+simplyhtml.cellGenTabLabel = G\u00e9n\u00e9ral
+simplyhtml.cellMarginTabLabel = Marges
+simplyhtml.cellPanelTitle = Mise en forme de cellule
+simplyhtml.clearFormatLabel = Supprimer la mise en forme
+simplyhtml.clearFormatTip = Supprimer la mise en forme
+simplyhtml.close = Fermer
+simplyhtml.closeBtnName = Fermer
+simplyhtml.colorLabel = Couleur
+simplyhtml.copyLabel = Copier
+simplyhtml.copyTip = Copier
+simplyhtml.cTagNameHead1 = Titre 1
+simplyhtml.cTagNameHead2 = Titre 2
+simplyhtml.cTagNameHead3 = Titre 3
+simplyhtml.cTagNameHead4 = Titre 4
+simplyhtml.cTagNameHead5 = Titre 5
+simplyhtml.cTagNameHead6 = Titre 6
+simplyhtml.cTagNameLink = Lien
+simplyhtml.cTagNameOL = Liste ordonn\u00e9e
+simplyhtml.cTagNamePara = Paragraphe
+simplyhtml.cTagNameUL = Liste non ordonn\u00e9e
+simplyhtml.cutLabel = Couper
+simplyhtml.cutTip = Couper
+simplyhtml.defaultDocName = Sans titre
+simplyhtml.deleteTableColLabel = Supprimer une colonne
+simplyhtml.deleteTableRowLabel = Supprimer une ligne
+simplyhtml.docTitleQuery = Mettre le titre \u00e0 :
+simplyhtml.docTitleTitle = \u00c9diter le titre du document
+simplyhtml.editLabel = \u00c9dition
+simplyhtml.effectLabel = Effet
+simplyhtml.familyLabel = Police
+simplyhtml.findNext = Rechercher le suivant...
+simplyhtml.findReplaceDialogTitle = Rechercher et remplacer
+simplyhtml.findReplaceLabel = Rechercher et remplacer
+simplyhtml.findReplaceTip = Rechercher et remplacer
+simplyhtml.fontBoldLabel = Gras
+simplyhtml.fontBoldTip = Gras
+simplyhtml.fontColorLabel = Couleur du texte...
+simplyhtml.fontColorTip = Couleur du texte
+simplyhtml.fontDialogTitle = Police de caract\u00e8res
+simplyhtml.fontItalicLabel = Italique
+simplyhtml.fontItalicTip = Italique
+simplyhtml.fontLabel = Police...
+simplyhtml.fontTabLabel = Police
+simplyhtml.fontTip = Format de police...
+simplyhtml.fontUnderlineLabel = Soulign\u00e9
+simplyhtml.fontUnderlineTip = Soulign\u00e9
+simplyhtml.foregroundLabel = Premier plan
+simplyhtml.formatLabel = Mise en forme
+simplyhtml.formatListLabel = Options de liste...
+simplyhtml.formatListTip = Changer la mise en forme de la liste
+simplyhtml.formatParaLabel = Paragraphe...
+simplyhtml.formatParaTip = Changer la mise en forme du paragraphe
+simplyhtml.formatTableLabel = Tableau...
+simplyhtml.formatTableTip = Mise en forme de tableau
+simplyhtml.helpLabel = Aide
+simplyhtml.htmlTabTitle = Code HTML
+simplyhtml.imageFileDesc = Fichiers images
+simplyhtml.insertTableColLabel = Ins\u00e9rer une colonne
+simplyhtml.insertTableLabel = Tableau...
+simplyhtml.insertTableMsg = Nombre de colonnes ?
+simplyhtml.insertTableRowLabel = Ins\u00e9rer une ligne
+simplyhtml.insertTableTitle = Ins\u00e9rer un tableau
+simplyhtml.italicName = Italique
+simplyhtml.layoutTabTitle = Texte riche
+simplyhtml.leftLabel = A gauche
+simplyhtml.listDialogTitle = Mise en forme de liste
+simplyhtml.listIndentTitle = Indentation
+simplyhtml.listPosInside = Int\u00e9rieure
+simplyhtml.listPositionLabel = Position
+simplyhtml.listPosOutside = Ext\u00e9rieure
+simplyhtml.listTypeCircle = Cercle
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = Disque plein
+simplyhtml.listTypeLabel = Type
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = Aucun
+simplyhtml.listTypeSquare = Carr\u00e9
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Ext\u00e9rieur
+simplyhtml.matchApproximately = Accepter les variantes
+simplyhtml.matchApproximately.tooltip = <html>Rechercher les variantes des mots<br>Par exemple : rechercher 'fichier' trouvera 'fcihier'</html>
+simplyhtml.matchCase = Respecter la casse
+simplyhtml.matchCase.tooltip = Rechercher en respectant les majuscules / minuscules
+simplyhtml.newStyleDefaultName = Nouveau style
+simplyhtml.nextTableCellLabel = Cellule suivante
+simplyhtml.noLineLabel = Aucun
+simplyhtml.noMoreOccurrencesFound = Aucune (autre) occurrence trouv\u00e9e.
+simplyhtml.okBtnName = Valider
+simplyhtml.paddingLabel = Int\u00e9rieur
+simplyhtml.paraAlignCenterLabel = Aligner au centre
+simplyhtml.paraAlignCenterTip = Aligner le paragraphe au centre
+simplyhtml.paraAlignLeftLabel = Aligner \u00e0 gauche
+simplyhtml.paraAlignLeftTip = Aligner le paragraphe \u00e0 gauche
+simplyhtml.paraAlignRightLabel = Aligner \u00e0 droite
+simplyhtml.paraAlignRightTip = Aligner le paragraphe \u00e0 droite
+simplyhtml.paraStyleDialogTitle = Style de paragraphe
+simplyhtml.paraTabLabel = Paragraphe
+simplyhtml.pasteHTMLLabel = Coller avec mise en forme
+simplyhtml.pasteLabel = Coller
+simplyhtml.pastePlainTextLabel = Coller en texte brut
+simplyhtml.pasteTip = Coller
+simplyhtml.plainName = Normal
+simplyhtml.previewLabel = Pr\u00e9visualisation
+simplyhtml.previewText = Texte d'exemple
+simplyhtml.prevTableCellLabel = Cellule pr\u00e9c\u00e9dente
+simplyhtml.printLabel = Imprimer...
+simplyhtml.redoLabel = R\u00e9tablir
+simplyhtml.redoTip = R\u00e9tablir
+simplyhtml.replace = Remplacer...
+simplyhtml.replaceAll = Tout
+simplyhtml.replaceDone = Terminer
+simplyhtml.replaceNo = Non
+simplyhtml.replaceThisQuery = Remplacer cette occurence de
+simplyhtml.replaceWith = Remplacer par
+simplyhtml.replaceYes = Oui
+simplyhtml.rightLabel = A droite
+simplyhtml.searchDown = Chercher vers le bas
+simplyhtml.searchDown.tooltip = Cherche vers le bas
+simplyhtml.searchFromStart = Chercher depuis le d\u00e9but
+simplyhtml.searchFromStart.tooltip = Chercher depuis le d\u00e9but sans tenir compte de la position courante
+simplyhtml.searchUp = Chercher vers le haut
+simplyhtml.searchUp.tooltip = Chercher vers le haut
+simplyhtml.selectAllLabel = S\u00e9lectionner tout
+simplyhtml.sizeLabel = Taille
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Barr\u00e9
+simplyhtml.styleLabel = Style
+simplyhtml.styleNameInputText = Nom du nouveau style ?
+simplyhtml.styleNameInputTitle = Enregistrer le style
+simplyhtml.tableBgColLabel = Couleur de fond :
+simplyhtml.tableDialogTitle = Mise en forme de tableau
+simplyhtml.tableLabel = Tableau
+simplyhtml.tablePanelTitle = Mise en forme de tableau
+simplyhtml.tableWidthLabel = Largeur
+simplyhtml.textIndentLabel = Indentation
+simplyhtml.textToFind = Texte \u00e0 rechercher
+simplyhtml.thisCellRangeLabel = Cette cellule
+simplyhtml.thisColRangeLabel = Cette colonne
+simplyhtml.thisRowRangeLabel = Cette ligne
+simplyhtml.toggleBulletsLabel = Liste \u00e0 puces
+simplyhtml.toggleBulletsTip = Activer/D\u00e9sactiver la liste \u00e0 puces
+simplyhtml.toggleNumbersLabel = Liste num\u00e9rot\u00e9e
+simplyhtml.toggleNumbersTip = Activer/D\u00e9sactiver la liste num\u00e9rot\u00e9e
+simplyhtml.topLabel = En haut
+simplyhtml.uLineLabel = Soulign\u00e9
+simplyhtml.unableToOpenFileError = Le fichier ne peut pas \u00eatre ouvert
+simplyhtml.unableToRedoError = Impossible de r\u00e9tablir :
+simplyhtml.unableToUndoError = Impossible d'annuler :
+simplyhtml.undoLabel = Annuler
+simplyhtml.undoTip = Annuler
+simplyhtml.valignBaseline = Ligne de base
+simplyhtml.valignBottom = En bas
+simplyhtml.valignLabel = Alignement vertical
+simplyhtml.valignMiddle = Centr\u00e9
+simplyhtml.valignTop = En haut
+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
+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
+STANDARD_FORMAT = Standard
+stop_processing = Ne pas \u00e9valuer les styles suivants
+StringFlavorHandler = Coller en texte brut en conservant la hi\u00e9rarchie
+StructuredHtmlFlavorHandler = Coller en HTML en conservant la hi\u00e9rarchie
+style = Style
+style_already_exists = Ce style existe d\u00e9j\u00e0
+styledialog.cancel.text = Annuler
+styledialog.ok.text = Valider
+styles = Styles
+styles.AutomaticLayout = Styles automatiques par niveau
+styles.connection = Connexion
+styles.date = Date
+styles.definition = D\u00e9finition
+styles.description = Description
+styles.floating_node = N\u0153ud flottant
+styles.idea = Id\u00e9e
+styles.important = Important
+styles.key = Clef
+styles.list = Liste
+styles.needs_action = Action
+styles.note = Note
+styles.ok = Ok
+styles.pending = En attente
+styles.predefined = Styles pr\u00e9d\u00e9finis
+styles.question = Question
+styles.quotation = Citation
+styles.root_node = Styles
+styles.subsubtopic = Sous-sous-titre
+styles.subtopic = Sous-titre
+styles.topic = Titre
+styles.user-defined = Styles utilisateur
+styles.website = Site web
+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
+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
+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
+ToggleMenubarAction.text = Barre de menus
+ToggleStatusAction.text = Barre d'\u00e9tat
+ToggleToolbarAction.text = Barre d'outils principale
+undefined_error = Une erreur impr\u00e9vue vient de se produire. Merci de bien vouloir signaler le bogue.
+underline = Soulign\u00e9
+UnderlineAction.text = Soulign\u00e9
+underlined = Soulign\u00e9
+UndoAction.text = Annuler
+UndoFilterAction.text = Filtre pr\u00e9c\u00e9dent
+unfold = D\u00e9plier
+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
+up = Monter
+update_failed = La mise \u00e0 jour a \u00e9chou\u00e9. D\u00e9tail de l''erreur : {0}
+UpdateCheckAction.text = V\u00e9rifier les mises \u00e0 jour...
+updatecheckdialog = V\u00e9rification de mise \u00e0 jour
+url_error = Cette URL est incorrecte !
+url_open_error = Impossible d''ouvrir la carte \u00e0 l''URL {0} .
+used_in_menu = Ce raccourci ne peut \u00eatre d\u00e9fini, car il est utilis\u00e9 comme raccourci de menu.
+UsePlainTextAction.text = N\u0153ud en texte brut
+user_config_folder = Dossier des param\u00e8tres utilisateur : {0}
+user_defined_scale = Personnalis\u00e9e
+user_defined_zoom = Zoom personnalis\u00e9
+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) :
+value_format = Format de la valeur
+version_up_to_date = Vous utilisez la derni\u00e8re version disponible du programme.
+ViewerControllerAction.text = Objet...
+ViewLayoutTypeAction.OUTLINE.text = Vue plan
+WebDocuAction.text = Documentation Web
+width = Largeur
+wrong_regexp = L''expression "{0}" est incorrecte, erreur : "{1}"
+xslt_export.html = HTML
+xslt_export.latex = Document LaTeX
+xslt_export.latexbook = Classeur LaTeX
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Microsoft Excel 2003 et au-del\u00e0
+xslt_export.ms_project = Microsoft Project 2003 et au-del\u00e0
+xslt_export.ms_word = Microsoft Word 2003 et au-del\u00e0
+xslt_export.text = Texte brut
+xslt_export_not_possible = Export XSLT impossible
+yes = Oui
+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
new file mode 100644
index 0000000..159323d
--- /dev/null
+++ b/freeplane/resources/translations/Resources_gl.properties
@@ -0,0 +1,858 @@
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Modificar o formato dos nodos
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Modificar patr\u00F3n
+accessories/plugins/EncryptNode.properties_0 = Escolla un contrasinal para o nodo cifrado.
+accessories/plugins/EncryptNode.properties_1 = Os contrasinais non coinciden ou son demasiado curtos.
+accessories/plugins/EncryptNode.properties_2 = Escriba o contrasinal:
+accessories/plugins/EncryptNode.properties_3 = Reescriba o contrasinal:
+accessories/plugins/EncryptNode.properties_4 = Escriba o seu contrasinal.
+accessories/plugins/EncryptNode.properties_6 = Aceptar
+accessories/plugins/EncryptNode.properties_7 = Cancelar
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = S\u00F3 se pode desactivar o estado de cifrado dun nodo xa cifrado. Por favor insira un nodo dese tipo a trav\u00E9s do men\u00FA de ferramentas.
+accessories/plugins/EncryptNode.properties_select_me = Selecci\u00F3neme para continuar!
+accessories/plugins/EncryptNode.properties_wrong_password = O contrasinal \u00E9 incorrecto.
+accessories/plugins/ExportWithXSLT.tooltip = Este \u00E9 un m\u00E9todo de exportaci\u00F3n uniforme mediante scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Como un applet de Java.
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporta o mapa como un applet de Java para o navegador.
+accessories/plugins/ExportWithXSLT_Flash.text = Como Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporta o mapa como unha aplicaci\u00F3n de Flash.
+accessories/plugins/ExportWithXSLT_HTML.text = Como XHTML (versi\u00F3n JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Como XHTML (versi\u00F3n imaxe de mapa premible)
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Recursos do nodo RECURSOS ao ficheiro do TaskJuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exporta os recursos do nodo RECURSOS ao m\u00F3dulo Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tarefas do nodo TAREFAS a ficheiro de TaskJuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exporta as tarefas do nodo TAREFAS ao m\u00F3dulo Taskjuggler. </html>
+AddLocalLinkAction.text = Engadir hipeligaz\u00F3n local
+antialias_all = Suavizar todo
+antialias_edges = Suavizar arcos
+antialias_none = Non suavizar
+apply = Aplicar
+ApplyAction.text = Aplicar
+ApplyFormatPlugin.text = Modificar o formato...
+ApplyFormatPlugin.tooltip = Abre unha caixa de di\u00E1logo na que os atributos do nodo e do arco poden modificarse dunha soa vez.
+ApplyNoFilteringAction.text = Sen filtrado
+as_parent = Como pai
+AssignAttributesAction.text = Asignar atributos...
+attribute_delete = Borrar todos os valores
+attribute_delete_value = Borrar este valor
+attribute_font_size_tooltip = Tama\u00F1o da fonte do atributo
+attribute_list_box_label_text = Valores existentes
+attribute_replace = Substitu\u00EDr por
+attribute_top = Todos os atributos co\u00F1ecidos para os mapas cargados
+attributes_adding_empty_attribute_error = Non pode usar unha cadea valeira como nome de atributo
+attributes_all = Todos os atributos
+attributes_attribute = Atributos
+attributes_close = Pechar
+attributes_deselect_all = Nada
+attributes_dialog_title = Attribute Manager[translate me]
+attributes_edit = Editar
+attributes_for_selected = Nodos seleccionados
+attributes_for_visible = Todos os nodos visibles
+attributes_import = Importar
+attributes_import_tooltip = Importar os atributos doutros mapas cargados
+attributes_no_import_candidates_found = Non se atoparon novos atributos
+attributes_popup_delete = Borrar
+attributes_popup_down = Abaixo
+attributes_popup_edit = Editar
+attributes_popup_hide = Ocultar
+attributes_popup_new = Novo atributo
+attributes_popup_optimal_width = Largura \u00F3ptima
+attributes_popup_up = Arriba
+attributes_refresh = Actualizar
+attributes_restricted_attributes_tooltip = Conxunto restrinxido de atributos
+attributes_restricted_values_tooltip = Conxunto restrinxido de valores para o atributo actual
+attributes_restriction = Conxunto restrinxido
+attributes_select_all_tooltip = Seleccionar/Deseleccionar todo
+attributes_skip_root = Saltar o nodo ra\u00EDz
+attributes_visible = Selecci\u00F3n para Ver->Atributo->Amosar Atributos Seleccionados
+attributes_visible_tooltip = Selecci\u00F3n para Ver->Atributo->Amosar Atributos Seleccionados
+automatically_save_message = O mapa gardouse automaticamente (usando o nome de ficheiro {0})...
+AutomaticLayoutAction.text = Dese\u00F1o autom\u00E1tico
+AutomaticLayoutAction.tooltip = <html>Fixa o dese\u00F1o do mapa.<br>O primeiro nivel \u00E9 negro, o segundo azul,etc.</html>
+BackAction.text = Volver
+background = Fondo
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = Nodo intermitente
+BlinkingNodeHookAction.tooltip = <html>Isto fai que o nodo sexa intermitente. Te\u00F1a coidado. Non o aplique a moitos nodos <strong>nin con outros formatos autom\u00E1ticos sobre o mesmo nodo</strong></html>
+BoldAction.text = Negra
+boldify_branch = Po\u00F1er en negra
+branch = Rama
+cancel = Cancelar
+CancelAction.text = Cancelar
+cannot_add_parent_diff_parents = Todos os nodos deben ter o mesmo pai para poder usar esta funci\u00F3n.
+cannot_add_parent_to_root = Non se pode engadir o nodo ra\u00EDz a un novo pai.
+cannot_join_nodes_with_children = Non \u00E9 posible unir nodos con fillos
+cannot_move_to_child = Non se pode mover un nodo a un dos seus fillos.
+CenterAction.text = Centrar
+ChangeConnectorArrowsAction.backward.text = Volver
+ChangeConnectorArrowsAction.forward.text = Avanzar
+ChangeNodeLevelLeftsAction.text = Nodo esquerdo
+ChangeNodeLevelLeftsAction.tooltip = \u00C1 esquerda da ra\u00EDz o(s) nodo(s) \u00E9 desplazado cara abaixo. Convertese en fillo do irm\u00E1n que est\u00E1 enriba. \u00C1 dereita do ra\u00EDz o(s) nodo(s) \u00E9 desplazado cara arriba. Directamente na ra\u00EDz, os nodos cambian de lado.
+ChangeNodeLevelRightsAction.text = Nodo dereito
+ChangeNodeLevelRightsAction.tooltip = \u00C1 dereita da ra\u00EDz o(s) nodo(s) \u00E9 desplazado cara abaixo. Convertese en fillo do irm\u00E1n que est\u00E1 enriba. \u00C1 esquerda do ra\u00EDz o(s) nodo(s) \u00E9 desplazado cara arriba. Directamente na ra\u00EDz, os nodos cambian de lado.
+choose_background_color = Escolla a cor de fondo:
+choose_cloud_color = Escolla a cor da nube:
+choose_edge_color = Escoller a cor dos arcos
+choose_node_background_color = Escolla a cor de fondo do nodo:
+choose_node_color = Escolla a cor do nodo:
+CloseAction.text = Pechar
+CloudAction.text = Nube
+CloudColorAction.text = Cor da nube...
+ColorProperty.ResetColor = Restablecer cor
+combined = Combinado
+CopyAction.text = Copiar
+CopySingleAction.text = Copia simple
+CreationModificationPluginAction.text = Amosar tempos de modificaci\u00F3n
+CreationModificationPluginAction.tooltip = <html>Esta funci\u00F3n mant\u00E9n un seguimento dos tempos de creaci\u00F3n e modificaci\u00F3n dos nodos.</html>
+CutAction.text = Cortar
+decrease_branch_font_size = Fonte menor
+DecreaseNodeFontAction.text = Fonte menor
+delete = Borrar
+delete_child = Eliminar Nodo
+DeleteAction.text = Eliminar nodo
+DeleteConditionAction.text = Borrar
+DocumentationAction.text = Documentaci\u00F3n
+edge = Arco
+edge_style = Estilo do arco
+edge_width = Largura do arco
+EdgeColorAction.text = Cor do arco...
+EdgeStyleAction.bezier.text = Curva bezier
+EdgeStyleAction.horizontal.text = Horizontal[translate me]
+EdgeStyleAction.linear.text = Lineal
+EdgeStyleAction.sharp_bezier.text = Bezier afiada
+EdgeStyleAction.sharp_linear.text = Lineal afiada
+EdgeStyleAsParentAction.text = Como pai
+EdgeWidthAction_width_parent.text = Pai
+EdgeWidthAction_width_thin.text = Fino
+edit = Editar
+edit.decision = HTML Editor[translate me]
+edit_link_manually = Editar a ligaz\u00F3n manualmente...
+edit_middle_label = Edit Middle Label[translate me]
+edit_source_label = Edit Source Label[translate me]
+EditAction.text = Editar nodo
+EditAttributesAction.text = Editar os atributos
+EditFilterAction.text = Editar
+EditLongAction.text = Editar un nodo longo...
+EncryptedMap.text = Crear un mapa cifrado...
+EncryptedMap.tooltip = Crear un novo mapa cifrado.
+enter_base_url = Vanse pegar ligaz\u00F3ns relativas. Insira a URL base.
+enter_confirms = Prema Enter para confirmar
+EnterPassword.text = Activar/desactivar cifrado / descifrado
+error = Erro
+error_creating_directory = Non foi posible crear o directorio para a exportaci\u00F3n.
+ExecuteScripts.text = Scripts[translate me]
+export_pdf_text = Formato de Documento Portable (PDF)
+export_svg_text = Vector Gr\u00E1fico Escalable (SVG)
+ExportAction.text = Exportar
+ExportBranchToHTMLAction.text = Rama como HTML
+ExportPdf.text = Como PDF...
+ExportSvg.text = Como SVG...
+ExportToHTMLAction.text = Como HTML
+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
+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
+filter_delete = Borrar
+filter_dialog = Creador de filtros
+filter_does_not_exist = Non existe
+filter_edit_description = Editar a lista de filtros
+filter_enter_value = Introduza un valor
+filter_exist = Existe
+filter_icon = Icona
+filter_is_equal_to = Coincide con
+filter_is_not_equal_to = Non coincide con
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Sen filtrado
+filter_node = Texto do nodo
+filter_not = Non
+filter_or = Ou
+filter_select = Seleccionar
+filter_selected_node_view = Nodos seleccionados actualmente
+find_what = Que desexa buscar?
+FindAction.text = Buscar...
+fit_map_to_page = Axustar a unha p\u00E1xina
+FitToPage.text = Aplicar zoom para axustar \u00E1 p\u00E1xina
+FitToPage.tooltip = Axusta o zoom de xeito que se vexa o mapa enteiro na vent\u00E1 actual.
+fold = Pregar
+FoldAllAction.text = Pregar todos
+FoldAllAction.tooltip = <html>Pregar os nodos seleccionados e todos os seus fillos.</html>
+FoldOneLevelAction.text = Pregar un nivel
+FoldOneLevelAction.tooltip = <html>Prega os nodos seleccionados un nivel.</html>
+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_menu_edge_styles = Estilo dos arcos
+format_menu_edge_widths = Largura dos arcos
+FormatCopy.text = Copiar o fomato
+FormatCopy.tooltip = <html>Copia o formato dun nodo.</html>
+FormatPaste.text = Pegar o formato
+FormatPaste.tooltip = <html>Pega o formato dun nodo.</html>
+ForwardAction.text = Avanzar
+Freeplane.progress.buildScreen = Construir pantalla...
+Freeplane.progress.createController = Crear controlador...
+Freeplane.progress.createInitialMode = Crear modo inicial...
+Freeplane.progress.endStartup = Finalizar a inicializaci\u00F3n.
+Freeplane.progress.gettingPreferenceDirectories = Obtendo os directorios de preferencias...
+Freeplane.progress.gettingPreferences = Obter preferencias...
+Freeplane.progress.loadMaps = Cargar mapas...
+Freeplane.progress.propagateLookAndFeel = Propagar a apariencia...
+Freeplane.progress.settingPreferences = Configurar preferencias...
+Freeplane.progress.startCreateController = Comezar a crear un controlador...
+Freeplane.progress.updateLookAndFeel = Actualizar a apariencia...
+freeplane_reverted = Freeplane_Restaurado_
+FreeplaneHelpStarter.text = Axuda...
+FreeplaneHelpStarter.tooltip = Axuda estendida do Freeplane
+GotoLinkNodeAction.text = Ir \u00E1 ligaz\u00F3n
+GrabKeyDialog.common.cancel = Cancelar
+GrabKeyDialog.common.ok = Aceptar
+GrabKeyDialog.grab-key.assigned-to = Asignado a
+GrabKeyDialog.grab-key.assigned-to.none = Actualmente sen asignar
+GrabKeyDialog.grab-key.remove = Eliminar
+GrabKeyDialog.grab-key.remove-ask = Est\u00E1 seguro que quere quitar este atallo de teclado?
+GrabKeyDialog.grab-key.title = Introducir nova tecla
+help = Axuda
+HideAllAttributesAction.text = Ocultar todos os atributos
+HierarchicalIconsAction.text = Amosar as iconas xerarquicamente
+HierarchicalIconsAction.tooltip = Se un dos meus netos ou fillos ten unha icona, amosareina tam\u00E9n en minatura.
+html_export_based_on_headings = Exportar HTML - Baseado nas cabeceiras
+html_export_fold_all = Exportar HTML - Pregar todo
+html_export_fold_currently_folded = Exportar HTML - Pregar os actualmente pregados
+html_export_no_folding = Exportar HTML - Sen pregar
+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]
+icon_attach = Ollar aqu\u00ED
+icon_back = Volver
+icon_bee = Freeplane[translate me]
+icon_bell = Lembrar
+icon_bookmark = Excelente
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Incorrecto
+icon_button_ok = Aceptar
+icon_clanbomber = Perigoso
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Non esqueza
+icon_down = Abaixo
+icon_family = Familia
+icon_female1 = Female1[translate me]
+icon_flag = Bandeira
+icon_flag-black = Black Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_forward = Avanzar
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioridade 1
+icon_full-2 = Prioridade 2
+icon_full-3 = Prioridade 3
+icon_full-4 = Prioridade 4
+icon_full-5 = Prioridade 5
+icon_full-6 = Prioridade 6
+icon_full-7 = Prioridade 7
+icon_gohome = Inicio
+icon_help = Pregunta
+icon_idea = Idea
+icon_info = Info[translate me]
+icon_kaddressbook = Tel\u00E9fono
+icon_kmail = E-Mail[translate me]
+icon_knotify = M\u00FAsica
+icon_korn = Caixa de correo
+icon_ksmiletris = Estou feliz
+icon_licq = Bo
+icon_Mail = Correo
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = Iconas
+icon_messagebox_warning = Importante
+icon_password = Chave
+icon_pencil = Hai que refinalo
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = Non estou divertido
+icon_stop = Parar
+icon_up = Arriba
+icon_wizard = Asistente
+icon_xmag = Hai que discutilo
+icon_yes = Importante
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Seleccionar unha icona...
+IconSelectionPlugin.tooltip = <html>Aqu\u00ED pode seleccionar unha icona a trav\u00E9s dunha subvent\u00E1.</html>
+import = Importar
+import_linked_branch_no_link = O nodo seleccionado non ten ligaz\u00F3n desde a que importar.
+ImportAction.text = Importar
+ImportBranchAction.text = Rama...
+ImportExplorerFavoritesAction.text = Favoritos do Explorer...
+ImportFolderStructureAction.text = Estrutura de cartafoles...
+ImportLinkedBranchAction.text = Rama ligada
+ImportLinkedBranchWithoutRootAction.text = (Rama ligada) Sen ra\u00EDz...
+ImportMindmanagerFiles.text = Mapa MindManager X5...
+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}.
+locking_failed_by_open = Fallou o bloqueo do mapa {0}. \u00C1brese s\u00F3 para lectura.
+locking_failed_by_save_as = Fallou o bloqueo do mapa {0}. Interrompeuse a acci\u00F3n Gardar como.
+locking_old_lock_removed = O usuario {1} bloqueara o mapa {0}. Eliminouse o bloqueo porque caducou.
+long_node_changed_cancel = Modificou o nodo. Desexa descartar os cambios?
+long_node_changed_submit = Modificou o nodo. Desexa gardar os cambios?
+lots_of_links_warning = Est\u00E1 a piques de crear unha chea de ligaz\u00F3ns para o mesmo nodo. Desexa realmente crear estas ligaz\u00F3ns?
+map_already_exists = O mapa xa existe. Desexa sobrescribilo?
+map_corrupted = O mapa est\u00E1 danado. Desexa ver os detalles?
+map_locked_by_open = O mapa {0} est\u00E1 a ser editado polo usuario {1}. Abrir copia s\u00F3 para lectura.
+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)
+mode_Browse = Browse Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Modo non dispo\u00F1ible
+mode_status = O modo cambiouse ao modo {0}
+mode_title = Freeplane - Modo {0}
+modes = Modos
+ModesMenuAction.Browse.text = Map Browser[translate me]
+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
+NavigationNextMapAction.text = Seguinte mapa
+NavigationPreviousMapAction.text = Mapa anterior
+new_mindmap = Novo mapa mental
+new_node = Novo nodo
+new_node_as_sibling_not_possible_for_the_root = Non \u00E9 posible crear un novo nodo irm\u00E1n do ra\u00EDz.
+NewChildAction.text = Novo nodo fillo
+NewMapAction.text = Novo
+NewParentNode.text = Novo nodo pai
+NewPreviousSiblingAction.text = Novo nodo irm\u00E1n previo
+NewSiblingAction.text = Novo nodo irm\u00E1n
+no = Non
+no_format_copy_before_format_paste = Non pode pegar un formato sen antes copiar un.
+no_found_from = <html>Non se atopou <b>{0}</b> desde <b>{1}</b>.
+no_more_found_from = <html>Non se atopou m\u00E1is <b>{0}</b> desde <b>{1}</b>.
+no_previous_find = Non se atopou ningunha ocorrencia anterior.
+node = Nodo
+node_changed_discard_changes = Modificou o nodo. Desexa descartar os cambios?
+NodeBackgroundColorAction.text = Cor de fondo do nodo...
+NodeColorAction.text = Cor do nodo...
+NodeColorBlendAction.text = Combinar cor
+NodeDownAction.text = Nodo inferior
+NodeListAction.text = Buscar e substitu\u00EDr
+NodeListAction.tooltip = Mostra todos os nodos como unha lista na que se pode buscar con propiedades de filtros
+NodeShapeAction.bubble.text = Burbulla
+NodeShapeAction.fork.text = Bifurcaci\u00F3n
+NodeUpAction.text = Nodo superior
+nonboldify_branch = Quitar negra
+nonitalicise_branch = Quitar cursiva
+normal = Normal
+not_saved_for_link_error = O mapa debe ser gardado antes de poder configurar unha ligaz\u00F3n a trav\u00E9s do selector de ficheiros
+ok = Aceptar
+OKAction.text = Aceptar
+OpenAction.text = Abrir...
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Para visualizar o efecto dos cambios da configuraci\u00F3n, probablemente deba reiniciar o Freeplane.
+OptionPanel.absolute = Absoluto
+OptionPanel.antialias = Suavizado
+OptionPanel.antialias.tooltip = <html>Determina a calidade do mapa. M\u00E1is suavizado necesita mais tempo.</html>
+OptionPanel.antialias_all = Suavizar todo
+OptionPanel.antialias_edges = Suavizar arcos
+OptionPanel.antialias_none = Sen suavizado
+OptionPanel.Appearance = Aparencias
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Como pai
+OptionPanel.automaticFormat_level = Estilos de dese\u00F1o autom\u00E1tico
+OptionPanel.automaticFormat_level1 = Formato do nodo ra\u00EDz
+OptionPanel.Behaviour = Funcionamento
+OptionPanel.bezier = bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Cancelar
+OptionPanel.childpattern = Patr\u00F3n fillo
+OptionPanel.childpattern.tooltip = O patr\u00F3n seleccionado apl\u00EDcase a todos os fillos.
+OptionPanel.clear_all_setters = Cambiar todo
+OptionPanel.clear_all_setters.tooltip = Habilita ou desabilita a indicaci\u00F3n de todos os cambios.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Combinado
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Predeterminado
+OptionPanel.default_browser_command_mac = Comando predeterminado de navegaci\u00F3n en Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> e MAC: (grazas a Nick!)</html>
+OptionPanel.default_browser_command_other_os = Comando predeterminado de navegaci\u00F3n noutros sistemas operativos
+OptionPanel.default_browser_command_windows_9x = Comando predeterminado de navegaci\u00F3n en Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>No sistema operativo Windows (os signos "" son necesarios porque as ligaz\u00F3ns pos\u00FAen "=" no seu URL).</html
+OptionPanel.default_browser_command_windows_nt = Comando predeterminado de navegaci\u00F3n en Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>No sistema operativo Windows (os signos "" son necesarios porque as ligaz\u00F3ns pos\u00FAen "=" no seu URL).</html
+OptionPanel.default_charset = Charset[translate me]
+OptionPanel.Defaults = Predeterminadas
+OptionPanel.delete_automatic_saves_at_exit = Borrar o gardado automaticamente ao sa\u00EDr
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Se desexa eliminar automaticamente os ficheiros cando sae de Freeplane con normalidade, po\u00F1a a seguinte variable como verdadeira</html>
+OptionPanel.disable_cursor_move_paper = Deshabilitar o cursor ao arrastrar o papel
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Non mostrar o cursor de movemento mentres se arrastra o papel</html>
+OptionPanel.edgecolor = Cor do arco
+OptionPanel.edgecolor.tooltip = Propiedade do arco ao nodo pai (apl\u00EDcase tam\u00E9n a todos os nodos fillos)
+OptionPanel.edgestyle = Estilo da marxe
+OptionPanel.edgestyle.tooltip = Propiedade do arco ao nodo pai (apl\u00EDcase tam\u00E9n a todos os nodos fillos)
+OptionPanel.edgewidth = Largura do arco
+OptionPanel.edgewidth.tooltip = Propiedade do arco ao nodo pai (apl\u00EDcase tam\u00E9n a todos os nodos fillos)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Premer Intro confirma por defecto
+OptionPanel.el__max_default_window_height = Altura m\u00E1xima predeterminada da vent\u00E1
+OptionPanel.el__max_default_window_width = Largura m\u00E1xima por defecto da vent\u00E1
+OptionPanel.el__min_default_window_height = Altura m\u00EDnima predeterminada da vent\u00E1
+OptionPanel.el__min_default_window_width = Largura m\u00EDnima por defecto da vent\u00E1
+OptionPanel.en = En[translate me]
+OptionPanel.Environment = Contorno
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Bloqueo experimental do ficheiro
+OptionPanel.export_icons_in_html = Exportar iconas en Html
+OptionPanel.export_icons_in_html.tooltip = <html>Di se o HTML exportado desde o Freeplane debe conter iconas. O problema coas iconas \u00E9 que bastante a mi\u00FAdo as ligaz\u00F3ns \u00E1s iconas non se atopar\u00E1n no HTML exportado.</html>
+OptionPanel.Files = Ficheiros
+OptionPanel.first = Primeiro
+OptionPanel.foldingsymbolwidth.tooltip = <html>Largura do c\u00EDrculo que marca o despregado</html>
+OptionPanel.fork = Fork[translate me]
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.horizontal = horizontal[translate me]
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Baseado nas cabeceiras
+OptionPanel.html_export_fold_all = Pregar todos
+OptionPanel.html_export_fold_currently_folded = Pregar os pregados actualmente
+OptionPanel.html_export_folding = Exportar a HTML pregado
+OptionPanel.html_export_no_folding = Sen pregar
+OptionPanel.hu = Hu
+OptionPanel.icon = Icona
+OptionPanel.icon.tooltip = Se se aplica, o nodo ter\u00E1 exactamente esta icona.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Atallos de teclado
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Tama\u00F1o da fonte
+OptionPanel.language = Idioma
+OptionPanel.last = \u00DAltimo
+OptionPanel.links = Ligaz\u00F3ns
+OptionPanel.load_last_map = Abrir o \u00FAltimo mapa automaticamente.
+OptionPanel.load_last_map.tooltip = <html>Se est\u00E1 marcado, o Freeplane ao arrancar, localiza automaticamente o \u00FAltimo mapa aberto .</html>
+OptionPanel.lookandfeel = Apariencia
+OptionPanel.lookandfeel.tooltip = <html>A apariencia que se vai usar. Hai dispo\u00F1ible 'metal','windows','motif' e 'gtk'; 'mac' so est\u00E1 dispo\u00F1ible no Mac OS. 'default' significa que se usar\u00E1 a apariencia predeterminada. Se quere po\u00F1er a s\u00FAa propio apariencia, introduza aqu\u00ED o nome da clase e aseg\u00FArese de cargar o(s) correspondente(s) ficheiro(s) jar. Se hai problemas coa apariencia, ent\u00F3n escolla 'nothing'. Isto funciona coas miniaplicaci\u00F3ns</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Largura m\u00E1xima do nodo
+OptionPanel.max_node_width.tooltip = <html>A largura m\u00E1xima predeterminada do nodo en pixels</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nbn
+OptionPanel.nl = Ni
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Cor de fondo do nodo
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Cor do nodo
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+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
+OptionPanel.number_of_different_files_for_automatic_save = N\u00FAmero de ficheiros diferentes para o gardado autom\u00E1tico
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> n\u00FAmero n de ficheiros diferentes nos que gardar os mapas. A primeira acci\u00F3n de gardar automaticamente as modficaci\u00F3ns \u00E9 executada no primeiro ficheiro, e as\u00ED sucesivamente ata a vez n+1 que se garda novamente no primeiro ficheiro (c\u00EDclico)</html> \t\n\n
+OptionPanel.OK = Gardar
+OptionPanel.patternname.tooltip = Nome de patr\u00F3n \u00FAnico
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Colocar novas ramas
+OptionPanel.pt_BR = PtBR
+OptionPanel.pt_PT = PtPT
+OptionPanel.relative = Relativo
+OptionPanel.ru = Ru
+OptionPanel.selection_method = M\u00E9todo de selecci\u00F3n
+OptionPanel.selection_method.tooltip = <html> Aqu\u00ED pode habilitar ou deshabilitar o esquema de selecci\u00F3n retardada. Opci\u00F3ns autom\u00E1ticas. Non as modifique pois gardaranse en auto.properties de todos modos.</html>
+OptionPanel.selection_method_by_click = Premendo
+OptionPanel.selection_method_delayed = Posposto
+OptionPanel.selection_method_direct = Directo
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Patr\u00F3ns
+OptionPanel.separator.anti_alias = Suavizado
+OptionPanel.separator.attributes = Atributos
+OptionPanel.separator.automatic_save = Gardar automaticamente
+OptionPanel.separator.behaviour = Funcionamento
+OptionPanel.separator.browser = Navegador
+OptionPanel.separator.CloudControls = Clouds[translate me]
+OptionPanel.separator.commands_for_the_program = Comandos para o programa
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Cores predeterminadas
+OptionPanel.separator.default_fonts = Fontes predeterminadas
+OptionPanel.separator.default_styles = Estilos predeterminados
+OptionPanel.separator.EdgeControls = Arcos
+OptionPanel.separator.edit_long_node_window = Vent\u00E1 de edici\u00F3n de nodo longo
+OptionPanel.separator.files = Ficheiros
+OptionPanel.separator.General = Xeral
+OptionPanel.separator.html_export = Exportar HTML
+OptionPanel.separator.hyperlink_types = Tipos de hiperligaz\u00F3n
+OptionPanel.separator.icon_properties = Iconas
+OptionPanel.separator.initial_map_size = Tama\u00F1o inicial do mapa
+OptionPanel.separator.key_typing = Premer teclas
+OptionPanel.separator.language = Idioma
+OptionPanel.separator.look_and_feel = Apariencia
+OptionPanel.separator.new_node_commands = Comandos do nodo novo
+OptionPanel.separator.node_editing_commands = Comandos de edici\u00F3n de nodos
+OptionPanel.separator.node_navigation_commands = Comandos de navegaci\u00F3n de nodos
+OptionPanel.separator.NodeColors = Cores do nodo
+OptionPanel.separator.NodeFont = Fonte do nodo
+OptionPanel.separator.other_defaults = Outras configuraci\u00F3ns predeterminadas
+OptionPanel.separator.others = Outras asociaci\u00F3ns de teclas
+OptionPanel.separator.patterns = Patr\u00F3ns
+OptionPanel.separator.save = Gardar
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = M\u00E9todo de selecci\u00F3n
+OptionPanel.separator.undo = Desfacer
+OptionPanel.set_property_text.tooltip = Baleiro: Non tocar; Menos=Borrar propiedade (establecer os valores predeterminados); M\u00E1is=Cambiar a propiedade
+OptionPanel.sharp_bezier = bezier afiada
+OptionPanel.sharp_linear = lineal afiada
+OptionPanel.show_icon_for_attributes = Amosar iconas para os atributos
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Cor est\u00E1ndar do fondo
+OptionPanel.standardbackgroundcolor.tooltip = <html>A cor est\u00E1ndar do fondo en notaci\u00F3n html</html>
+OptionPanel.standardcloudcolor = Cor est\u00E1ndar da nube
+OptionPanel.standardcloudestyle = Estilo est\u00E1ndar da nube
+OptionPanel.standardcloudestyle.tooltip = <html>O estilo est\u00E1ndar da nube. De momento, s\u00F3 se admite a 'curva de Bezier'</html>
+OptionPanel.standardlinkcolor = Cor est\u00E1ndar da ligaz\u00F3n
+OptionPanel.standardlinkcolor.tooltip = <html>A cor est\u00E1ndar da ligaz\u00F3n en notaci\u00F3n html</html>
+OptionPanel.standardlinkestyle = Estilo est\u00E1ndar da ligaz\u00F3n
+OptionPanel.standardlinkestyle.tooltip = <html>O estilo est\u00E1ndar da ligaz\u00F3n. De momento, s\u00F3 se admite a curva de Bezier</html>
+OptionPanel.standardselectednodecolor = Cor est\u00E1ndar do nodo seleccionado
+OptionPanel.standardselectednodecolor.tooltip = <html>A cor est\u00E1ndar do nodo se \u00E9 seleccionado. En notaci\u00F3n html (#RRGGBB en valores hexadecim\u00E1is)</html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Time For Automatic Save[translate me]
+OptionPanel.time_for_automatic_save.tooltip = <html> tempo entre duas acci\u00F3ns consecutivas de gardado autom\u00E1tico (en miliseg): para desabilitar o gardado autom\u00E1tico, po\u00F1a este n\u00FAmero a 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tempo para a selecci\u00F3n atrasada
+OptionPanel.time_for_delayed_selection.tooltip = <html> Atraso na selecci\u00F3n dos nodos cando se pon o rato enriba (en ms). Po\u00F1a este valor a 1 para que se seleccione directamente ao po\u00F1er o rato enriba.</html>
+OptionPanel.toolTipManager.max_tooltip_width = Largura da barra de suxesti\u00F3ns
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Largura predeterminada da barri\u00F1a de suxesti\u00F3ns.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Fonte non definida
+OptionPanel.undo_levels = Desfacer os niveis
+OptionPanel.undo_levels.tooltip = <html>Determina cantos pasos se gardan e poden ser desfeitos con "Undo".</html>
+OptionPanel.use_tabbed_pane = Use Tabs[translate me]
+OptionPanel.vi = Vi[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh_CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Configuraci\u00F3n de p\u00E1xina...
+PasteAction.text = Pegar
+PatternNewNameProperty = Novo patr\u00F3n
+PatternToString.backgroundColor = Cor de fondo
+PatternToString.color = Cor
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Estilo do arco
+PatternToString.EdgeWidth = Largura do arco
+PatternToString.FontBold = Negra
+PatternToString.Icon = Icona
+PatternToString.NodeFontSize = Tama\u00F1o da fonte
+plugins/ScriptEditor.exit = Sa\u00EDr
+plugins/ScriptEditor.menu_actions = Acci\u00F3ns
+plugins/ScriptEditor.new_script = New Script[translate me]
+plugins/ScriptEditor.run = Executar
+plugins/ScriptEditor/window.Result = Resultado:
+plugins/ScriptEditor/window.title = Editor de scripts
+plugins/TimeList.xml_Created = Creado
+plugins/TimeList.xml_Icons = Iconas
+plugins/TimeList.xml_Modified = Modificado
+plugins/TimeList.xml_Notes = Anotaci\u00F3ns
+plugins/TimeList.xml_Text = Texto
+plugins/TimeManagement.xml_appendButton = Anexar a data aos nodos seleccionados
+plugins/TimeManagement.xml_Cancel = Cancelar
+plugins/TimeManagement.xml_cancelButton = Cancelar
+plugins/TimeManagement.xml_closeButton = Pechar
+plugins/TimeManagement.xml_Export = Exportar os nodos seleccionados
+plugins/TimeManagement.xml_Find = Buscar
+plugins/TimeManagement.xml_Goto = Ir a
+plugins/TimeManagement.xml_hour = Hora:
+plugins/TimeManagement.xml_menu_actions = Acci\u00F3ns
+plugins/TimeManagement.xml_minute = Minuto:
+plugins/TimeManagement.xml_reminderButton = Av\u00EDsarme nesta data
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Ao presionar, as\u00EDgnase un temporizador \u00E1 data en cuesti\u00F3n. Ent\u00F3n, unhas iconas intermitentes chamar\u00E1n a s\u00FAa atenci\u00F3n.<br> Se pecha o mapa, reactivaranse os temporizadores cando volva abrir o mapa.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Actualmente, s\u00F3 se permite unha alerta por nodo. <br>A alerta actual est\u00E1 programada para {0,date} {0,time}, escolleu {1,date} {1,time}.<br><br>Desexa cambiar a hora da alerta deste nodo (SI) <br> ou prefire manter a hora antiga (NON)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Alerta programada para {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Eliminar alerta
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Eliminar todas as alertas asociadas aos nodos seleccionados.
+plugins/TimeManagement.xml_Replace = Substitu\u00EDr
+plugins/TimeManagement.xml_Replace_All = Substitu\u00EDr todos
+plugins/TimeManagement.xml_Replace_Selected = Substitu\u00EDr o seleccionado
+plugins/TimeManagement.xml_Select = Seleccionar
+plugins/TimeManagement.xml_todayButton = Hoxe
+plugins/TimeManagement.xml_WindowTitle = Xesti\u00F3n do tempo
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Buscar e substitu\u00EDr
+preferences = Preferencias
+PrintAction.text = Imprimir...
+PrintDirectAction.text = Imprimir
+printing_settings = Escala de impresi\u00F3n
+PrintPreviewAction.text = Previsualizaci\u00F3n de impresi\u00F3n...
+PropertyAction.dialog = Preferences[translate me]
+PropertyAction.text = Preferencias ...
+QuitAction.text = Sa\u00EDr
+read_only = S\u00F3 para lectura
+RedoAction.text = Refacer
+RedoFilterAction.text = Refacer
+ReminderHookAction.text = Eliminar alerta
+ReminderHookAction.tooltip = Elimina unha alerta dun nodo
+RemoveAllIconsAction.text = Eliminar todas as iconas
+RemoveIconAction.text = Eliminar a \u00FAltima icona
+repair_link = Reparar a ligaz\u00F3n
+repair_link_question = Non se puido cargar o mapa ligado. Desexa reparar manualmente a ligaz\u00F3n?
+replace = Substitu\u00EDr
+ResetNodeLocationAction.text = Restablecer a posici\u00F3n
+save_failed = A tentativa de gardar o mapa {0} fallou.
+save_unsaved = Gardar o seguinte mapa mental? :
+SaveAction.text = Gardar
+SaveAll.text = Gardar todos
+SaveAll.tooltip = Gardar todos os mapas abertos.
+SaveAsAction.text = Gardar como...
+saved = Gardado
+scheme_evaluate = Avaliar!
+ScriptEditor.text = Editor de scripts...
+ScriptEditor.tooltip = Permite escribir scripts m\u00E1is longos dentro do Freeplane.
+ScriptEditorPanel.changed_cancel = Modific\u00E1ronse os scripts. Desexa realmente descartar as modificaci\u00F3ns?
+select_favorites_folder = Seleccione o cartafol onde se atopan os seus favoritos
+select_folder_for_importing = Seleccione o cartafol que quere importar
+SelectAllAction.text = Seleccionar todo o visible
+SelectBranchAction.text = Seleccionar rama visible
+selection_method_by_click = Premer unha vez para seleccionar
+selection_method_delayed = A selecci\u00F3n autom\u00E1tica foi posposta.
+selection_method_direct = Apunte para seleccionar
+SelectNoteAction.text = Cambia ao editor de anotaci\u00F3ns
+SelectNoteAction.tooltip = Ir ao nodo desde a vent\u00E1 de anotaci\u00F3ns
+SetImageByFileChooserAction.text = Imaxe (Selector de ficheiros ou ligaz\u00F3n)...
+SetLinkByFileChooserAction.text = Hiperligaz\u00F3n (Selector de ficheiros)...
+SetLinkByTextFieldAction.text = Hiperligaz\u00F3n (campo de texto)...
+ShowAllAttributesAction.text = Amosar todos os atributos
+ShowAncestorsAction.text = Amosar os ascendentes
+ShowAttributeDialogAction.text = Xestor de atributos
+ShowDescendantsAction.text = Amosar os descendentes
+ShowHideNoteAction.text = Amosar/ocultar a vent\u00E1 de anotaci\u00F3ns
+ShowHideNoteAction.tooltip = \u00C9 un men\u00FA para as frechi\u00F1as na li\u00F1a divisoria entre vent\u00E1s.
+ShowSelectedAttributesAction.text = Amosar os atributos seleccionados
+simplyhtml.aboutFrameTitle = Sobre esta aplicaci\u00F3n
+simplyhtml.alignLabel = Ali\u00F1amento
+simplyhtml.alignLeft = esquerda
+simplyhtml.alignRight = dereita
+simplyhtml.allCellsRangeLabel = todas as celas
+simplyhtml.allOccurrencesReplaced = Substitu\u00EDronse todas as ocorrencias
+simplyhtml.appendTableColLabel = Engadir columna
+simplyhtml.appendTableRowLabel = Engadir fila
+simplyhtml.applyCellAttrLabel = Aplicar a
+simplyhtml.backgroundLabel = Fondo:
+simplyhtml.boldItalicName = negra e cursiva
+simplyhtml.boldName = negra
+simplyhtml.borderColorLabel = Cor:
+simplyhtml.borderWidthLabel = Largura
+simplyhtml.bottomLabel = parte inferior:
+simplyhtml.cancelBtnName = Cancelar
+simplyhtml.cellBorderTabLabel = Bordos
+simplyhtml.cellGenTabLabel = Xeral
+simplyhtml.cellMarginTabLabel = Marxe
+simplyhtml.cellPanelTitle = Formato de cela
+simplyhtml.clearFormatLabel = Eliminar formato
+simplyhtml.clearFormatTip = Eliminar formato
+simplyhtml.close = Pechar
+simplyhtml.closeBtnName = Pechar
+simplyhtml.colorLabel = Cor
+simplyhtml.copyLabel = Copiar
+simplyhtml.copyTip = copiar
+simplyhtml.cTagNameHead1 = Cabeceira 1
+simplyhtml.cTagNameHead2 = Cabeceira 2
+simplyhtml.cTagNameHead3 = Cabeceira 3
+simplyhtml.cTagNameHead4 = Cabeceira 4
+simplyhtml.cTagNameHead5 = Cabeceira 5
+simplyhtml.cTagNameHead6 = Cabeceira 6
+simplyhtml.cTagNameLink = Ligaz\u00F3n
+simplyhtml.cTagNameOL = Lista ordenada
+simplyhtml.cTagNamePara = Par\u00E1grafo
+simplyhtml.cTagNameUL = Lista desordenada
+simplyhtml.cutLabel = Cortar
+simplyhtml.cutTip = cortar
+simplyhtml.defaultDocName = Sen t\u00EDtulo
+simplyhtml.deleteTableRowLabel = Borrar fila
+simplyhtml.docTitleQuery = Po\u00F1er como t\u00EDtulo:
+simplyhtml.docTitleTitle = Editar o t\u00EDtulo do documento
+simplyhtml.editLabel = Editar
+simplyhtml.effectLabel = Efecto
+simplyhtml.familyLabel = Familia
+simplyhtml.findNext = Atopar o pr\u00F3ximo...
+simplyhtml.findReplaceDialogTitle = Buscar e substitu\u00EDr
+simplyhtml.findReplaceLabel = Buscar e substitu\u00EDr
+simplyhtml.findReplaceTip = buscar e substitu\u00EDr
+simplyhtml.fontBoldLabel = Negra
+simplyhtml.fontBoldTip = Activa ou desactiva o tipo de letra negra
+simplyhtml.fontDialogTitle = Formato do tipo de letra
+simplyhtml.fontItalicLabel = Cursiva
+simplyhtml.fontItalicTip = Activa ou desactiva o tipo de letra cursiva
+simplyhtml.fontLabel = Fonte...
+simplyhtml.fontTabLabel = Tipo de letra
+simplyhtml.fontTip = Formato do tipo de letra...
+simplyhtml.fontUnderlineLabel = Subli\u00F1ado
+simplyhtml.fontUnderlineTip = Activa ou desactiva o subli\u00F1ado
+simplyhtml.foregroundLabel = Primeiro plano:
+simplyhtml.formatLabel = Formato
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = modificar o formato de lista
+simplyhtml.formatParaLabel = Par\u00E1grafo...
+simplyhtml.formatParaTip = Modificar o formato de par\u00E1grafo
+simplyhtml.formatTableLabel = T\u00E1boa...
+simplyhtml.formatTableTip = Formato de t\u00E1boa
+simplyhtml.helpLabel = Axuda
+simplyhtml.htmlTabTitle = Vista do c\u00F3digo HTML
+simplyhtml.imageFileDesc = Ficheiros de imaxe
+simplyhtml.insertTableColLabel = Inserir columna
+simplyhtml.insertTableLabel = T\u00E1boa...
+simplyhtml.insertTableMsg = Cantas colunas?
+simplyhtml.insertTableRowLabel = Inserir fila
+simplyhtml.insertTableTitle = inserir t\u00E1boa
+simplyhtml.italicName = cursiva
+simplyhtml.leftLabel = esquerda:
+simplyhtml.listDialogTitle = Formato de lista
+simplyhtml.listIndentTitle = Sangr\u00EDa:
+simplyhtml.listPosInside = dentro
+simplyhtml.listPositionLabel = Posici\u00F3n:
+simplyhtml.listPosOutside = f\u00F3ra
+simplyhtml.listTypeCircle = vi\u00F1eta redonda
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = s\u00EDmbolo de ficheiro como vi\u00F1eta
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = ning\u00FAn
+simplyhtml.listTypeSquare = vi\u00F1eta cuadrada
+simplyhtml.marginLabel = exterior
+simplyhtml.matchCase = Diferenciar mai\u00FAsculas de min\u00FAsculas
+simplyhtml.newStyleDefaultName = novo estilo
+simplyhtml.nextTableCellLabel = Cela seguinte
+simplyhtml.noLineLabel = ning\u00FAn
+simplyhtml.noMoreOccurrencesFound = non se atoparon (m\u00E1is) ocorrencias
+simplyhtml.okBtnName = Aceptar
+simplyhtml.paddingLabel = Inner[translate me]
+simplyhtml.paraAlignCenterLabel = Ali\u00F1ar no centro
+simplyhtml.paraAlignCenterTip = Establecer o ali\u00F1amento do par\u00E1grafo no centro
+simplyhtml.paraAlignLeftLabel = Ali\u00F1ar \u00E1 esquerda
+simplyhtml.paraAlignLeftTip = Establecer o ali\u00F1amento do par\u00E1grafo \u00E1 esquerda
+simplyhtml.paraAlignRightLabel = Ali\u00F1ar \u00E1 dereita
+simplyhtml.paraAlignRightTip = Establecer o ali\u00F1amento do par\u00E1grafo \u00E1 dereita
+simplyhtml.paraStyleDialogTitle = Estilo do par\u00E1grafo
+simplyhtml.paraTabLabel = Par\u00E1grafo
+simplyhtml.pasteLabel = Pegar
+simplyhtml.pasteTip = pegar
+simplyhtml.plainName = plano
+simplyhtml.previewLabel = Previsualizar
+simplyhtml.prevTableCellLabel = Cela anterior
+simplyhtml.redoLabel = Refacer
+simplyhtml.redoTip = refacer
+simplyhtml.replace = Substitu\u00EDr...
+simplyhtml.replaceDone = Completo
+simplyhtml.replaceNo = Non
+simplyhtml.replaceThisQuery = substitu\u00EDr esta ocorrencia de
+simplyhtml.replaceWith = Substitu\u00EDr por:
+simplyhtml.replaceYes = Si
+simplyhtml.rightLabel = dereita:
+simplyhtml.searchDown = Buscar hacia abaixo
+simplyhtml.searchFromStart = Buscar desde o inicio
+simplyhtml.searchUp = Buscar
+simplyhtml.selectAllLabel = Seleccionar todo
+simplyhtml.sizeLabel = Tama\u00F1o
+simplyhtml.standardStyleName = est\u00E1ndar
+simplyhtml.strikeLabel = Riscado
+simplyhtml.styleLabel = Estilo
+simplyhtml.styleNameInputText = Nome do novo estilo?
+simplyhtml.styleNameInputTitle = Gardar este estilo
+simplyhtml.tableBgColLabel = Cor de fondo:
+simplyhtml.tableDialogTitle = Formato de t\u00E1boa
+simplyhtml.tableLabel = T\u00E1boa
+simplyhtml.tablePanelTitle = Formato da t\u00E1boa
+simplyhtml.tableWidthLabel = Largura:
+simplyhtml.textIndentLabel = Sangr\u00EDa:
+simplyhtml.textToFind = Texto a buscar:
+simplyhtml.thisCellRangeLabel = esta cela
+simplyhtml.thisColRangeLabel = esta columna
+simplyhtml.thisRowRangeLabel = esta fila
+simplyhtml.toggleBulletsLabel = Activar/desactivar lista con vi\u00F1etas
+simplyhtml.toggleBulletsTip = activar/desactivar lista con vi\u00F1etas
+simplyhtml.toggleNumbersLabel = Activar/desactivar lista numerada
+simplyhtml.toggleNumbersTip = activar/desactivar lista numerada
+simplyhtml.topLabel = parte superior:
+simplyhtml.uLineLabel = Subli\u00F1ado
+simplyhtml.unableToOpenFileError = Non se puido abrir o ficheiro
+simplyhtml.unableToRedoError = Non \u00E9 posible refacer:
+simplyhtml.unableToUndoError = Non \u00E9 posible desfacer:
+simplyhtml.undoLabel = Desfacer
+simplyhtml.undoTip = desfacer
+simplyhtml.valignBottom = parte inferior
+simplyhtml.valignLabel = Ali\u00F1amento vertical
+simplyhtml.valignMiddle = medio
+simplyhtml.wholeWordsOnly = S\u00F3 palabras enteiras
+SortNodes.text = Ordenar fillos
+SortNodes.tooltip = Ordena todos os fillos dun nodo alfabeticamente.
+split = Dividir
+SplitNode.text = Dividir nodo
+SplitNode.tooltip = <html>O nodo div\u00EDdese</html>
+style = Estilo
+svg = SVG[translate me]
+TimeListAction.text = Amosar a lista de horas programadas ...
+TimeManagementAction.text = Amosar o calendario...
+ToggleChildrenFoldedAction.text = (Des)pregar fillos
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Pregar/despregar
+ToggleLeftToolbarAction.text = Ver/ocultar a barra de ferramentas lateral
+ToggleMenubarAction.text = Ver/ocultar a barra de men\u00FAs
+ToggleToolbarAction.text = Ver/ocultar a barra de ferramentas
+undefined_error = Ocorreu un erro inesperado. Faga un informe do bug.
+underline = Subli\u00F1ado
+underlined = Subli\u00F1ado
+UndoAction.text = Desfacer
+UndoFilterAction.text = Desfacer
+unfold = Despregar
+UnfoldAllAction.text = Despregar todos
+UnfoldAllAction.tooltip = <html>Despregar os nodos seleccionados e todos os seus fillos.</html>
+UnfoldOneLevelAction.text = Despregar un nivel
+UnfoldOneLevelAction.tooltip = <html>Desprega os nodos seleccionados un nivel.</html>
+UpdateCheckAction.text = Check for Updates[translate me]
+url_error = Este URL non \u00E9 correcto!
+url_load_error = Non se puido cargar o mapa co URL:
+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):
+WebDocuAction.text = Documentaci\u00F3n web
+width = Largura
+yes = Si
+ZoomInAction.text = Ampliar
+ZoomOutAction.text = Reducir
diff --git a/freeplane/resources/translations/Resources_hr.properties b/freeplane/resources/translations/Resources_hr.properties
new file mode 100644
index 0000000..06b5dce
--- /dev/null
+++ b/freeplane/resources/translations/Resources_hr.properties
@@ -0,0 +1,1770 @@
+about_text = Freeplane - program za izradu mentalnih mapa i nadogradnju znanja
+AboutAction.text = O programu
+acceleratorPresets = Postavke grupe tipkovni\u010dkih kratica F-trake
+accelerators_loading_error = Ne mogu u\u010ditati tipkovni\u010dke kratice iz {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Promjena oblika svih \u010dvorova
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Promijeni uzorak
+accessories/plugins/EncryptNode.properties_0 = Odaberi lozinku za \u0161ifrirani \u010dvor.
+accessories/plugins/EncryptNode.properties_1 = Lozinka nije ujedna\u010dena ili je prekratka.
+accessories/plugins/EncryptNode.properties_2 = Upi\u0161i lozinku:
+accessories/plugins/EncryptNode.properties_3 = Ponovno upi\u0161i lozinku:
+accessories/plugins/EncryptNode.properties_4 = Upis lozinke.
+accessories/plugins/EncryptNode.properties_5 = <html>Upamtite, mo\u0107 \u0161ifriranja <br>uvijek ovisi o kvaliteti va\u0161e lozinke.
+accessories/plugins/EncryptNode.properties_6 = U redu
+accessories/plugins/EncryptNode.properties_7 = Odustani
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Mo\u017eete uklju\u010diti ili isklju\u010diti stanje \u0161ifriranja samo na \u0161ifriranom \u010dvoru.
+accessories/plugins/EncryptNode.properties_select_me = Odaberi za nastavak!
+accessories/plugins/EncryptNode.properties_wrong_password = Neispravna lozinka.
+accessories/plugins/ExportWithTWiki.text = Kao TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Izvozi Mentalnu mapu kao Twiki dokument.
+accessories/plugins/ExportWithXSLT.tooltip = To je ujedna\u010dena metoda izvoza s upotrebom XSLT skripte.
+accessories/plugins/ExportWithXSLT_Applet.text = Kao Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Izvoz mape kao Java browser appleta.
+accessories/plugins/ExportWithXSLT_Flash.text = Kao Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Izvoz mape kao flash aplikacije.
+accessories/plugins/ExportWithXSLT_HTML.text = Kao XHTML (JavaScript verzija)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Kao XHTML (verzija kliktaju\u0107e mentalne mape)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Resursi iz \u010dvora Resursi u TaskJuggler datoteku...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Izvozi resursa iz \u010dvora Resursa u TaskJuggler modul. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Zadaci iz \u010dvora Zadaci u TaskJuggler datoteku...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Izvozi zadataka iz \u010dvora Zadaci u TaskJuggler modul. </html>
+action_keystroke_in_use_error = Tipkovni\u010dka kratica {0} koju \u017eelite koristiti za akciju {1} ve\u0107 je kori\u0161tena za akciju {2}
+active = Aktivan
+actual_map_styles = Uvjetovani stilovi mape primjenjeni na \u010dvoru
+actual_node_styles = Uvjetovani stilovi \u010dvora primjenjeni na \u010dvoru
+add = &Dodaj
+AddConnectorAction.text = Dodaj poveznik
+AddElementaryConditionAction.text = Dodaj
+AddLocalLinkAction.text = Dodaj internu vezu izme\u0111u \u010dvorova
+AddMenuItemLinkAction.text = Naredbe iz izbornika
+AddOnDetailsPanel.authored.by = Autor {0}
+AddOnDetailsPanel.header.function = Namjena
+AddOnDetailsPanel.header.menu = Pozicija izbornika
+AddOnDetailsPanel.header.shortcut = Tipkovni\u010dka kratica
+AddOnDetailsPanel.homepage = Web lokacija:
+addons.installer.canceled = Instalacija otkazana
+addons.installer.confirm.licence = <html><body><h1>Licenca</h1>{0}<p><p><em>Prihva\u0107ate li licencu?</em></p></body></html>
+addons.installer.failed = Instalacija nije uspjela: {0}
+addons.installer.freeplaneversion.format.error = Oblik gre\u0161ke u {0} (vrijednost:{1})
+addons.installer.groovy.script.name = Skripta {0} ne zavr\u0161ava sa nastavkom ".groovy"
+addons.installer.html.script = Skripta ne mo\u017ee biti oblikovana kao HTML tekst
+addons.installer.install = Instaliraj
+addons.installer.invalid.keyboard.shortcut = Neispravan pre\u010dac {0}.
+addons.installer.licence.unchanged = Licenca je nepromijenjena
+addons.installer.map.structure = Gre\u0161ka u strukturi mape: {0}
+addons.installer.missing.child.nodes = Nedostaje \u010dvor Dijete: {0}
+addons.installer.missing.permission.attribute = Skripta {0}: nedostaje dozvola za atribute {1}
+addons.installer.missing.properties = Nedostaje karakteristika: {0}
+addons.installer.missing.translation = Nedostaje prijevod od {0} za {1}
+addons.installer.no.scripts = Skripte nisu prona\u0111ene
+addons.installer.no.zipdata = Nisu prona\u0111eni komprimirani podaci (zip)
+addons.installer.nonstandard.permissions = Skripta zahtjeva slijede\u0107e dozvole koje trenutno nisu omogu\u0107ene: {0}.\n \u017delite li ih dodati u standardne dozvole?
+addons.installer.one.child.expected = O\u010dekivan je jedan \u010dvor Djete od {0}.
+addons.installer.script.no.execution_mode = "execution_mode" obilje\u017eja nije odre\u0111en za {0}
+addons.installer.script.no.menulocation = "menuLocation" obilje\u017eja nije odre\u0111en za {0}
+addons.installer.script.no.menutitle = "menuTitleKey" obilje\u017eja nije odre\u0111en za {0}
+addons.installer.script.no.permissions = Nisu definirane dozvole za {0}
+addons.installer.success = Instalacija uspje\u0161na.\n Novi dodatak biti \u0107e dostupan nakon ponovnog pokretanja programa.
+addons.installer.success.update = Nadogradnja {0} na {1} je uspje\u0161no izvedena:\nNove funkcije biti \u0107e dostupne nakon ponovnog pokretanja programa.
+addons.installer.title = Upravitelj pro\u0161irenja
+addons.installer.too.new = Trenutna verzija Freeplane {0} je novija i ne podr\u017eava ovo pro\u0161irenje. Potrebna je verzija {1}, koja podr\u017eava ovo pro\u0161irenje.
+addons.installer.too.old = Trenutna verzija Freeplane {0} je prestara za ovo pro\u0161irenje .Potrebna je verzija {1}, koja podr\u017eava ovo pro\u0161irenje.
+addons.installer.unknown.deinstallation.rules = Nepoznata pravila za deinstalaciju {0}
+addons.installer.update = Nadogradnja na verziju {0}
+addons.installer.warning = <html><body><em>Trebali bi instalirati samo pro\u0161irenja povjerljivog izvora. Zlonamjerna pro\u0161irenja mogu o\u0161tetiti va\u0161e podatke ili ugroziti va\u0161u privatnost .</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = Dodaj obilje\u017eje iz stila
+AddStyleAttributes.tooltip = Dodavanje obilje\u017eja iz stliziranog \u010dvora.
+AllMapsNodeListAction.text = Tra\u017ei i zamijeni u svim mapama
+always = Uvijek
+AlwaysUnfoldedNodeAction.text = Uvijek rasklopljen \u010dvor (uklju\u010di/ isklju\u010di)
+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...
+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
+AssignAttributesAction.text = Do&djeljivanje 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_replace = Zamijeni s:
+attribute_top = Sva poznata obilje\u017eja za u\u010ditane mape
+attribute_value = Vrijednost obilje\u017eja
+attributes_AddAttributeAction.text = &Dodaj postoje\u0107e obilje\u017eje
+attributes_adding_empty_attribute_error = Ne mo\u017eete koristiti prazni niz za ime obilje\u017eja
+attributes_all = Sva obilje\u017eja
+attributes_assign_dialog = Po\u0161ireni ure\u0111iva\u010d obilje\u017eja
+attributes_attribute = Obilje\u017eja
+attributes_close = Zatvori
+attributes_deselect_all = Ni\u0161ta
+attributes_dialog_title = Upravljanje obilje\u017ejima
+attributes_edit = Uredi
+attributes_edit_tooltip = Dodjeli skup obilje\u017eja
+attributes_for_selected = Odabrani \u010dvorovi
+attributes_for_visible = Sve vidljive \u010dvorove
+attributes_import = Uvoz
+attributes_import_tooltip = Uvoz obilje\u017eja iz drugih u\u010ditanih mapa
+attributes_no_import_candidates_found = Nisu prona\u0111ena nova obilje\u017eja
+attributes_popup_delete = Obri\u0161i
+attributes_popup_down = Dolje
+attributes_popup_edit = Uredi
+attributes_popup_hide = Sakrij
+attributes_popup_new = Novo obilje\u017eje
+attributes_popup_optimal_width = Optimalna \u0161irina
+attributes_popup_up = Gore
+attributes_refresh = Osvje\u017ei
+attributes_RemoveAllAttributesAction.text = Obri\u0161i sva obilje\u017eja
+attributes_RemoveFirstAttributeAction.text = Obri\u0161i prvo obilje\u017eje
+attributes_RemoveLastAttributeAction.text = Obri\u0161i zadnje obilje\u017eje
+attributes_restricted_attributes_tooltip = Ograni\u010deni skup obilje\u017eja
+attributes_restricted_values_tooltip = Ograni\u010deni skup vrijednosti za trenutno odabrano obilje\u017eje
+attributes_restriction = Ograni\u010den skup
+attributes_select_all = Sve
+attributes_select_all_tooltip = Odaberi / Poni\u0161ti odaberi
+attributes_show = Prika\u017ei
+attributes_skip_root = Presko\u010di korijenski \u010dvor
+attributes_visible = Prikazuj
+attributes_visible_tooltip = Potvrdi ako \u017eeli\u0161 da obilje\u017eje bude vidljivo
+automatic_layout = Automatski oblikovani izgled
+automatic_layout_disabled = Onemogu\u0107en
+automatically_save_message = Mapa je automatski spremljena (koriste\u0107i ime datoteke {0}) ...
+AutomaticEdgeColorHookAction.text = Automatska boja ruba
+AutomaticLayout.ALL = Za sve
+AutomaticLayout.HEADINGS = Za razine
+AutomaticLayout.level = Oblik \u010dvorova {0}. razine
+AutomaticLayout.level.root = Oblik korijenskog \u010dvora
+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.HEADINGS.text = za sve osim krajnje
+AutomaticLayoutControllerAction.null.text = onemogu\u0107eno
+BackAction.text = Nazad
+BackAction.tooltip = Skok unazad na odabranom nizu
+background = Pozadina
+bitmaps = bitne mape (slike)
+black = Crno
+BlinkingNodeHookAction.text = Treper\u0107i \u010dvor
+BlinkingNodeHookAction.tooltip = <html>Ovom funkcijom \u010dvor postaje trep\u0107u\u0107i.Budite oprezni.Ne povezujte ga s previ\u0161e \u010dvorova i <strong> ne s ostalim automatskim oblikovanjima u istom \u010dvoru.</html>
+blue = Zadana boja
+BoldAction.text = Podebljano
+boldify_branch = Podebljaj
+branch = Grana
+browse = Pregled...
+calendar_attributes_panel = Kalendar i Obilje\u017eja
+calendar_panel = Kalendar
+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_save_key_set = Nije mogu\u0107e pohraniti grupu tipkovni\u010dkih kratica
+cancel = &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_move_to_child = \u010cvor nije mogu\u0107e pomaknuti prema \u010dvoru njegove Djece.
+CenterAction.text = Sredina
+CenterSelectedNodeAction.text = Odabrani \u010dvor u centru prikaza
+ChangeConnectorArrowsAction.backward.text = Nazad
+ChangeConnectorArrowsAction.both.text = Obje strelice
+ChangeConnectorArrowsAction.forward.text = Naprijed
+ChangeConnectorArrowsAction.none.text = Bez strelice
+ChangeConnectorArrowsAction.text = Promjena strelica poveznika
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Krivulja
+ChangeConnectorShapeAction.EDGE_LIKE.text = Prika\u017ei poveznik kao rub
+ChangeConnectorShapeAction.LINE.text = Crta
+ChangeConnectorShapeAction.LINEAR_PATH.text = Vi\u0161estruka crta
+ChangeNodeLevelLeftsAction.text = \u010cvor ulijevo
+ChangeNodeLevelLeftsAction.tooltip = Lijevo od korijena \u010dvor/ovi je/su pomaknut/i prema dolje. \u010cvor/ovi je/su postali djeca od bratskih \u010dvorova. Desno od korijena \u010dvor/ovi je/su pomaknut/i prema gore.Direktno na korijenu \u010dvor/ovi mijena/ju strane.
+ChangeNodeLevelRightsAction.text = \u010cvor udesno
+ChangeNodeLevelRightsAction.tooltip = Desno od korijena \u010dvor/ovi je/su pomaknut/i prema dolje. \u010cvor/ovi je/su postali djeca od bratskih \u010dvorova. Lijevo od korijena \u010dvor/ovi je/su pomaknut/i prema gore.Direktno na korijenu \u010dvor/ovi mijena/ju strane.
+choose_background_color = Izaberite boju pozadine mape:
+choose_cloud_color = Izaberite boju obla\u010di\u0107a:
+choose_edge_color = Odaberi boju ruba
+choose_map_background_color = Izaberi pozadinsku boju mape
+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>
+close_btn = &Zatvori
+CloseAction.text = &Zatvori
+CloudAction.text = Obla\u010di\u0107
+CloudColorAction.text = Boja obla\u010di\u0107a...
+CloudShapeAction.ARC.text = Krivulja
+CloudShapeAction.RECT.text = Pravokutnik
+CloudShapeAction.ROUND_RECT.text = Zaobljeni pravokutnik
+CloudShapeAction.STAR.text = Zvijezda
+ColorProperty.ResetColor = Vra\u0107anje izvornih boja
+combined = kombinirano
+condition = Stanje
+confirmation = Potvrda
+connector = Poveznik
+connector_arrows = Zavr\u0161etak poveznika
+connector_label = Oznaka poveznika
+connector_lines = Vrsta crte poveznika
+connector_shapes = Oblik poveznika
+ConnectorColorAction.text = Boja poveznika
+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-2012 Freeplane tim i ostali
+CopySingleAction.text = Kopiraj pojedina\u010dno
+CopySingleAction.tooltip = Kopiraj samo odabrani \u010dvor
+CopyStyleExtensionsAction.text = Umetni stil povezanog sadr\u017eaja
+corrupt_map = Sadr\u017eaj mape je korumpiran
+CreateConjunctConditionAction.text = I
+CreateDisjunctConditionAction.text = Ili
+CreateNotSatisfiedConditionAction.text = Ne
+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
+DefaultColorAction.text = Zadana boja
+defaultstyle.details = Detalji
+defaultstyle.floating = Slobodni \u010dvor
+defaultstyle.note = Bilje\u0161ke
+delete = &Obri\u0161i
+delete_child = Obri\u0161i \u010dvor
+DeleteAction.text = Ukloni \u010dvor
+DeleteConditionAction.text = Obri\u0161i
+DeleteDetailsAction.text = Obri\u0161i detalje \u010dvora
+DeleteLevelStyleAction.text = Ukloni automatsko oblikovanje razina
+DeleteStyleAction.text = Ukloni stil
+DeleteUserStyleAction.text = Ukloni korisni\u010di definirani stil
+dialect_info.app = Datoteka {0} je kreirana u programu {1}.
+dialect_info.unknownApp = U\u010ditana datoteka kreirana je u nepoznatom programu.
+dialect_info.unknownURL = Web stranica programa u\u010ditane datoteke je nepoznata.
+dialect_info.url = Posjetite web stranicu programa za vi\u0161e informacija.
+dialect_info.warning = Freeplane mo\u017ee datoteku otvori, prikazati ili spremiti na nepravilan na\u010din.
+DirectHtmlFlavorHandler = HTML kao pojedina\u010dni \u010dvor
+DocumentationAction.text = Dokumentacija
+down = D&olje
+download = Preuzimanje
+dropped_file_error = Nije mogu\u0107e otvoriti ispu\u0161tenu datoteku(e). Razlog: {0}
+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
+EdgeColorAction.text = Boja ruba...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.bezier.tooltip = <html>Prikazuje rub kao krivulju .</html>
+EdgeStyleAction.hide_edge.text = Skriveni rub
+EdgeStyleAction.hide_edge.tooltip = <html>Rub postaje nevidljivim, samo za odabrane \u010dvorove prikazuje se<br> to\u010dkasta crta do roditeljskog \u010dvora.</html>
+EdgeStyleAction.horizontal.text = Vodoravno
+EdgeStyleAction.horizontal.tooltip = <html>Koriste se ravne ortogonalne crte za rubove .</html>
+EdgeStyleAction.linear.text = Linearno
+EdgeStyleAction.linear.tooltip = <html>Rub je prikazan kao ravna crta</html>
+EdgeStyleAction.sharp_bezier.text = Grubo bezier
+EdgeStyleAction.sharp_bezier.tooltip = <html>Rub je prikazan kao krivulja sa zadebljanim krajevima.</html>
+EdgeStyleAction.sharp_linear.text = Grubo linearno
+EdgeStyleAction.sharp_linear.tooltip = <html>Rub je prikazan kao ravna crta sa zadebljanim krajevima</html>
+EdgeStyleAsParentAction.text = Kao Roditelj
+EdgeStyleAsParentAction.tooltip = <html>\u010cvor pobprima oblik roditeljskog \u010dvora</html>[obsolete]
+EdgeWidthAction_width_parent.text = Roditelj
+EdgeWidthAction_width_thin.text = Tanko
+edit = &Ure\u0111ivanje
+edit.decision = HTML Ure\u0111iva\u010d
+edit.edit_rich_text = \u017deli\u0161 li koristiti oblikovanja kao podebljano ili uko\u0161eno?
+edit_details = Uredi detalje \u010dvora
+edit_end_label = <html>Poveznik<br>label
+edit_label_font_family = Oblik slova
+edit_label_font_size = Veli\u010dina slova
+edit_link_manually = Ru\u010dno uredi vezu (hipervezu)...
+edit_long_node = Detaljno uredi \u010dvor...
+edit_middle_label = Upis srednjeg natpisa
+edit_note = Uredi bilje\u0161ku
+edit_source_label = Upis izvornog natpisa
+edit_target_label = Upis ciljanog natpisa
+edit_transparency_label = Prozirnost
+edit_width_label = Deblijina crte
+EditAction.text = Uredi \u010dvor
+EditAttributesAction.text = Novo obilje\u017eje
+EditDetailsAction.text = Dodaj detalje \u010dvora
+EditDetailsInDialogAction.text = Uredi detalje \u010dvora u odvojenom prozoru
+EditFilterAction.text = Uredi
+EditLongAction.text = Bolje uredi \u010dvor...
+EditNoteInDialogAction.text = Uredi bilje\u0161ke
+EditScript = Uredi skriptu...
+EditStylesAction.text = Uredi stil
+EncryptedMap.text = Nova \u0161ifrirana mapa ...
+EncryptedMap.tooltip = Kreiraj novu \u0161ifriranu mentalnu mapu
+enter_base_url = Bit \u0107e zalijepljene relativne adrese. Molim unesite osnovni URL.
+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
+enter_map_url = Upi\u0161i URL mape
+enter_new_style_name = Upi\u0161i naziv novog stila
+enter_node_id = Upi\u0161i ID \u010dvora
+enter_zoom = Upi\u0161i pove\u0107anje
+EnterPassword.text = Upi\u0161i lozinku
+error = Gre\u0161ka
+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
+ExecuteScriptError.text = Gre\u0161ka kod izvo\u0111enju skripte:\n{0}
+ExecuteScriptForAllNodes.text = Izvo\u0111enje svih skripta
+ExecuteScriptForSelectionAction.text = Izvo\u0111enje skripta odabranih \u010dvorova
+ExecuteScriptOnSelectedNode.text = Izvodi {0} na svim odabranim \u010dvorovima
+ExecuteScriptOnSelectedNodeRecursively.text = Izvodi {0} na odabranim \u010dvorovima, rekurzivno
+ExecuteScriptOnSingleNode.text = Izvodi {0} na odabranom \u010dvoru
+ExecuteScripts.noScriptsAvailable = Nisu dostupne
+ExecuteScripts.text = Skripte
+ExecuteScriptSecurityError.text = Do\u0161lo je do pogre\u0161ke tijekom izvo\u0111enja skripte: {0}
+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
+ExportBranchAction.text = Grane kao nove Mape
+ExportBranchToHTMLAction.text = Izvoz grane kao HTML
+exported_file = {0} datoteka
+ExportPdf.text = Kao PDF...
+ExportSvg.text = Kao SVG...
+ExportToHTMLAction.text = Kao HTML
+ExportToImage.jpg.text = Kao JPEG...
+ExportToImage.png.text = Kao PNG...
+ExportToOoWriter.text = Kao Open Office Write dokument...
+extension_menu = Oblik &stila
+ExternalImage_popupMenu_Change = Promijeni...
+ExternalImage_popupMenu_Open = Otvori u pregledniku
+ExternalImage_popupMenu_Remove = Obri\u0161i
+ExternalImage_popupMenu_ResetZoom = Vrati izvorno pove\u0107anje
+ExternalImageAddAction.text = Dodaj vanjsku sliku...
+ExternalImageChangeAction.text = Promijeni vanjsku sliku...
+ExternalImageRemoveAction.text = Obri\u0161i vanjsku sliku...
+ExtractLinkFromTextAction.text = Hiperlink iz teksta
+ExtractLinkFromTextAction.tooltip = Postavi hiperlink na\u0111en u tekstu \u010dvora
+f_button_unassigned = nema akcije
+FaqOpenURLAction.text = \u010cesto postavljena pitanja
+file = &Datoteka
+file_already_exists = Datoteka {0} ve\u0107 postoji. \u017delite li spremiti preko postoje\u0107e datoteke?
+file_not_found = Datoteka {0} nije na\u0111ena
+FileListFlavorHandler = Linkovi do datoteka
+FileProperties_BranchLeafCount = Broj krajnih \u010dvora u odabranim granama:
+FileProperties_BranchNodeCount = Broj \u010dvorova u odabranim granama:
+FileProperties_ChangesSinceLastSave = Promjene od zadnjeg spremanja:
+FileProperties_FileName = Naziv datoteke:
+FileProperties_FileSaved = Spremljeno:
+FileProperties_FileSize = Veli\u010dina datoteke:
+FileProperties_MainBranchCount = Broj glavnih grana:
+FileProperties_NeverSaved = Nije spremljeno
+FileProperties_NodeChildCount = Brojj \u010dvorova djece odabranih \u010dvorova:
+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...
+FileRevisionsDialog.cancel = O&tka\u017ei
+FileRevisionsDialog.file_last_modified = Oznaka vremena
+FileRevisionsDialog.file_name = Datoteka
+FileRevisionsDialog.file_size = Bajtova
+FileRevisionsDialog.open = &Otvori
+FileRevisionsDialog.open.tooltip = Otvori datoteku iako je starijeg datuma
+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_add = &Dodaj
+filter_and = &I
+filter_any_text = Jezgra \u010dvora, detalji ili bilje\u0161ke
+filter_conditions = Filtri
+filter_contains = Sadr\u017ei
+filter_created_after = Kreirano poslije
+filter_created_before = Kreirano prije
+filter_delete = &Obri\u0161i
+filter_details = Detalji
+filter_dialog = Upravitelj filtara
+filter_does_not_exist = Ne postoji
+filter_edit_description = Uredi popis filtra
+filter_enter_value = Unos vrijednost
+filter_even_level = \u010cvorove iz razli\u010dite razine
+filter_exist = Postoji
+filter_icon = Ikona
+filter_is_equal_to = Jednako je
+filter_is_not_equal_to = Nije jednako
+filter_leaf = Zavr\u0161ni \u010dvor
+filter_link = Hiperveza
+filter_match_approximately = &Pribli\u017eno
+filter_match_approximately_tooltip = <html>Omogu\u0107i pribli\u017eno uspore\u0111ivanje,<br/>primjer, pretra\u017eivanje "bakar" prona\u0107i \u0107e i "bakra".</html>
+filter_match_case = Razlikuj slova
+filter_match_case_tooltip = Omogu\u0107i razlikovanje velikih i malih slova kod uspore\u0111ivanja.
+filter_modified_after = Promijenjeno poslije
+filter_modified_before = Promijenjeno prije
+filter_no_filtering = Bez filtriranja
+filter_node = Tekst \u010dvora
+filter_node_level = Razina \u010dvora
+filter_not = &Ne
+filter_note = Bilje\u0161ka
+filter_odd_level = \u010cvorove iz iste razine
+filter_or = I&li
+filter_parent = Tekst roditeljskog \u010dvora
+filter_periodic_level = Periodi\u010dki
+filter_priority = Prioritet
+filter_regexp_matches = Sparuj RegEx
+filter_reminder = Podsjetnik
+filter_reminder_after = zakazano nakon
+filter_reminder_before = zakazano prije
+filter_reminder_executed = obavljeno
+filter_reminder_later = zakazano kasnije
+filter_root = Korijenski \u010dvor
+filter_script = Filtar Skripta
+filter_select = O&zna\u010di
+filter_selected_node_view = Filtriraj odabrane \u010dvorove
+filter_selected_node_view_snapshot = Spremljen odabir
+filter_style = Stil
+filter_time = Datumski filtar
+FilterComposerDialog.save = &Spremi
+filters_not_loaded = Filtar ne mo\u017ee biti u\u010ditan, datoteka je zauzeta
+find_what = Tra\u017ei \u0161to?
+FindAction.text = Tra\u017ei...
+FirstGroupNodeAction.text = Po\u010detni \u010dvor grupe
+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.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:
+FollowLinkAction.text = Otvori hipervezu (link)
+font = Slova
+FontFamilyAction.text = Oblik slova
+FontSizeAction.text = Veli\u010dina slova
+format_invalid_pattern = Uzorak nije valjan
+format_menu_cloud_shapes = Oblik obla\u010di\u0107a
+format_menu_edge_styles = Stil &ruba
+format_menu_edge_widths = &\u0160irina ruba
+format_panel = Oblik
+FormatCopy.text = Kopiraj oblik
+FormatCopy.tooltip = <html>Kopira oblik \u010dvora.</html>
+FormatPaste.text = Zalijepi oblik
+FormatPaste.tooltip = <html>Zalijepi oblik prethodno kopiranog oblika \u010dvora.</html>
+formats_not_loaded = Oblici nemogu biti u\u010ditani, datoteka je o\u0161te\u0107ena
+formula.error.attributeValueIsNull = Nakon izra\u010dunavanja vrijednost obilje\u017eja ''{0}'' jednaka je nuli.
+formula.error.circularReference = Kru\u017ena referenca: Formula \u010dvora ''{0}'' sadr\u017ei svoju vlastitu vrijednost, pa formula ne mo\u017ee biti une\u0161ena.
+formula.EvaluateAllAction.text = Izra\u010dunaj sve
+formula.EvaluateAllAction.tooltip = Izra\u010dunaj sve formule u trenutno aktivnoj mapi
+formula.menuname = Formule
+formula_editor = Uredi formulu
+ForwardAction.text = Naprijed
+ForwardAction.tooltip = Skok unaprijed na odabranom nizu
+FreeNodeAction.text = Slobodno pozicionirani \u010dvor (postavi / postavi izvorno)
+Freeplane.progress.buildScreen = Gradnja Prikaza...
+Freeplane.progress.createController = Stvaranje Kontrolora...
+Freeplane.progress.createInitialMode = Stvaranje Po\u010detnog na\u010dina...
+Freeplane.progress.endStartup = Zavr\u0161etak pokretanja.
+Freeplane.progress.gettingPreferenceDirectories = Pribavljanje mape (Folder) Svojstava...
+Freeplane.progress.gettingPreferences = Pribavljanje Svojstava...
+Freeplane.progress.loadMaps = U\u010ditavanje mapa...
+Freeplane.progress.propagateLookAndFeel = Preno\u0161enje izgleda i ugo\u0111aja...
+Freeplane.progress.settingPreferences = Namje\u0161tanje Postavki...
+Freeplane.progress.startCreateController = Zapo\u010dinjanje stvaranja Kontrolora...
+Freeplane.progress.updateLookAndFeel = Osvje\u017eavanje izgleda i ugo\u0111aja...
+freeplane_reverted = Freeplane_Preokrenuto_
+FreeplaneHelpStarter.text = Pomo\u0107...
+FreeplaneHelpStarter.tooltip = Pro\u0161irena pomo\u0107 Freeplanea
+GettingStartedAction.text = Vodi\u010d za podu\u010davanje
+GotoLinkNodeAction.text = Idi na vezu
+GotoNodeAction.text = Idi na \u010dvor sa ID brojem
+GrabKeyDialog.common.cancel = Odustani
+GrabKeyDialog.common.ok = U redu
+GrabKeyDialog.grab-key.assigned-to = Dod
+GrabKeyDialog.grab-key.assigned-to.none = Trenutno nije dodijeljeno
+GrabKeyDialog.grab-key.clear = O\u010disti
+GrabKeyDialog.grab-key.remove = Ukloni
+GrabKeyDialog.grab-key.remove-ask = Jeste li sigurni da \u017eelite ukloniti akciju tipke?
+GrabKeyDialog.grab-key.title = Upi\u0161i novu tipku
+green = Zeleno
+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.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
+HotKeyInfoAction.text = Raspored tipkovni\u010dkih kratica
+html_export_based_on_headings = HTML Izvoz - prema naslovima
+html_export_fold_all = HTML Izvoz - Sve ra\u010dve otvorene
+html_export_fold_currently_folded = HTML Izvoz - Sa trenutnim ra\u010dvanjem
+html_export_no_folding = HTML Izvoz - Bez ra\u010dvanja
+html_problem = <html>Nemogu prikazati HTML<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Zbrajanje
+icon_attach = Pogledaj tu
+icon_audio = Audio
+icon_back = Natrag
+icon_bee = Freeplane
+icon_bell = Zapamti
+icon_bookmark = Izvrsno
+icon_broken-line = Prekinuto
+icon_button_cancel = Nije uredu
+icon_button_ok = U redu
+icon_calendar = Datum
+icon_checked = Provjereno
+icon_clanbomber = Opasno
+icon_clock = Vrijeme
+icon_clock2 = Podsjetnik
+icon_closed = Zabranjen ulaz
+icon_decrypted = Otklju\u010dano
+icon_desktop_new = Ne zaboravi
+icon_division = Dijeljenje
+icon_down = Dolje
+icon_edit = Pro\u010distiti
+icon_encrypted = Zaklju\u010dano
+icon_executable = Izvr\u0161no
+icon_family = Obitelj
+icon_fema = Par
+icon_female1 = \u017dena1
+icon_female2 = \u017dena2
+icon_females = \u017dene
+icon_flag = Crvena zastavica
+icon_flag-black = Crna zastavica
+icon_flag-blue = Plava zastavica
+icon_flag-green = Zelena zastavica
+icon_flag-orange = Naran\u010dasta zastavica
+icon_flag-pink = Ru\u017ei\u010dasta zastavica
+icon_flag-yellow = \u017duta zastavica
+icon_folder = Direktorij
+icon_forward = Naprijed
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Bez prioriteta
+icon_full-1 = Prioritet 1
+icon_full-2 = Prioritet 2
+icon_full-3 = Prioritet 3
+icon_full-4 = Prioritet 4
+icon_full-5 = Prioritet 5
+icon_full-6 = Prioritet 6
+icon_full-7 = Prioritet 7
+icon_full-8 = Prioritet 8
+icon_full-9 = Prioritet 9
+icon_go = Idi
+icon_gohome = Dom
+icon_group = Grupa
+icon_help = Pitanje
+icon_hourglass = \u010cekanje
+icon_icon_not_found = Nema ikone
+icon_idea = Ideja
+icon_image = Slika
+icon_info = Informacija
+icon_internet = Internet
+icon_internet_warning = Internet-upozorenje
+icon_kaddressbook = Telefon
+icon_kmail = E-mail
+icon_knotify = Muzika
+icon_korn = Po\u0161tanski sandu\u010di\u0107
+icon_ksmiletris = Sretan sam
+icon_launch = Pokreni
+icon_licq = Lijepo
+icon_list = Lista
+icon_Mail = Po\u0161ta
+icon_male1 = Mu\u0161karac1
+icon_male2 = Mu\u0161karac2
+icon_males = Mu\u0161karci
+icon_menu = Ikone
+icon_messagebox_warning = Upozorenje
+icon_mindmap = Mentalne mape
+icon_multiplication = Mno\u017eenje
+icon_narrative = Pripovijedanje
+icon_negative = Negativno
+icon_neutral = Neutralno
+icon_password = Klju\u010d
+icon_pencil = Pobolj\u0161anje
+icon_penguin = Linux
+icon_positive = Pozitivno
+icon_prepare = Pripremi
+icon_revision = Revizija
+icon_smiley-angry = Ljut
+icon_smiley-neutral = Ravnodu\u0161an
+icon_smiley-oh = Iznena\u0111en
+icon_smily_bad = Nezadovoljan sam
+icon_stop = Stop
+icon_stop-sign = Znak Stop
+icon_subtraction = Oduzimanje
+icon_unchecked = Neprovjereno
+icon_up = Gore
+icon_user_icon = Korisni\u010dke ikone
+icon_very_negative = Vrlo negativno
+icon_very_positive = Vrlo pozitivno
+icon_video = Video
+icon_wizard = \u010carolija
+icon_xmag = Rasprava
+icon_yes = Va\u017eno
+IconGroupPopupAction.arrows.text = Strelice
+IconGroupPopupAction.docs_folders.text = Dokumenti i mape
+IconGroupPopupAction.flags.text = Zastave
+IconGroupPopupAction.math.text = Matematika
+IconGroupPopupAction.media.text = Mediji
+IconGroupPopupAction.miscellaneous.text = Razno
+IconGroupPopupAction.nature.text = Priroda
+IconGroupPopupAction.numbers.text = Brojevi
+IconGroupPopupAction.office.text = Ured
+IconGroupPopupAction.people.text = Ljudi
+IconGroupPopupAction.rating.text = Procjena
+IconGroupPopupAction.signs.text = Znakovi
+IconGroupPopupAction.smiley.text = Smije\u0161ci
+IconGroupPopupAction.time.text = Vrijeme
+IconGroupPopupAction.user.text = Korisni\u010dke ikone
+IconProgressExtended10Action.text = Vanjska ikona napretka od 10%
+IconProgressExtended10Action.tooltip = <html>Dodaje indikator napretka sa porastom od 10% klikom desne tipke mi\u0161a na indikator.<br> Ctrl+desna tipka mi\u0161a smanjuje indikator napretla odnosno bri\u0161e ga.</html>
+IconProgressExtended25Action.text = Vanjska ikona napretka od 25%
+IconProgressExtended25Action.tooltip = <html>Dodaje indikator napretka sa porastom od 25% klikom desne tipke mi\u0161a na indikator.<br> Ctrl+desna tipka mi\u0161a smanjuje indikator napretla odnosno bri\u0161e ga.</html>
+IconProgressIconDownAction.text = Smanjenje napretka 25% (ikona)
+IconProgressIconDownAction.tooltip = Umetanje ikona napretka od ve\u0107eg prema manjem (100% -> 75% -> 50% -> 25% -> 0%-> brisanje).
+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
+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_linked_branch_no_link = Odabrani \u010dvor nema nikakvu vezu za uvoz.
+ImportAction.text = U&voz
+ImportBranchAction.text = Grane...
+ImportExplorerFavoritesAction.text = Explorer favorita...
+ImportFolderStructureAction.text = Strukture mape (Folder)...
+ImportLinkedBranchAction.text = Povezana grana
+ImportLinkedBranchWithoutRootAction.text = (Povezana grana) bez korijena...
+ImportMindmanagerFiles.text = MindManager X5 mape...
+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.
+invalid_export_file = Pogre\u0161an naziv datoteke izvoza
+invalid_file_msg = Nemogu prona\u0107i datoteku za {0}
+invalid_uri = Neispravna URI {0}
+invalid_url = Ne mogu stvoriti valjanu URL adresu
+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
+LatexDeleteLatexAction.text = Obri\u0161i LaTe&X formulu
+LatexEditLatexAction.text = Uredi LaTe&X formulu...
+LatexInsertLatexAction.text = Dodaj LaTe&X formulu...
+less_than_two_selected_nodes = Morate odabrati barem dva \u010dvora
+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 License za vi\u0161e detalja.<br><br>Trebali ste dobiti primjerak GNU General Public License<br>zajedno s ovim programom; ako niste, pi\u0161ite na Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = &U\u010ditaj
+load_accelerator_presets = U\u010ditaj
+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.
+locking_old_lock_removed = Mapa {0} je zaklju\u010dana kod korisnika {1}. Zaklju\u010davanje mape je maknuto, zato jer je mapa starija.
+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_resource_directory = Mjesto instalacije programa: {0}
+MainView.errorUpdateText = Pogre\u0161ka u postavljanu teksta za slijede\u0107i unos: {0}.\nGre\u0161ka je: {1}
+MakeLinkFromAnchorAction.text = Izradi vezu od sidra
+MakeLinkFromAnchorAction.tooltip = <html>izradi lokalnu ili globalnu vezu (link) od<br/>sidra \u010dvora do ozna\u010denog \u010dvora</html>
+MakeLinkToAnchorAction.text = Izradi link do sidra
+MakeLinkToAnchorAction.tooltip = <html>izradi lokalnu ili globalnu vezu (link) od<br/>ozna\u010denog \u010dvora do sidra \u010dvora</html>
+ManageAddOnsAction.text = Pro\u0161irenja
+ManageAddOnsDialog.activate = Uklju\u010diti
+ManageAddOnsDialog.activation.success = {0} \u0107e biti aktivirano nakon ponovnog pokretanja programa.
+ManageAddOnsDialog.authored.by = od
+ManageAddOnsDialog.cannot.activate = Ne mogu aktivirat {0} , ve\u0107 je aktivan.
+ManageAddOnsDialog.cannot.configure = Ne mogu podesiti {0}.
+ManageAddOnsDialog.cannot.deactivate = Ne mogu deaktivirat {0} , jer nije aktivan.
+ManageAddOnsDialog.cannot.deinstall = Ne mogu ukloniti {0}.
+ManageAddOnsDialog.configure = Prilagoditi
+ManageAddOnsDialog.deactivate = Isklju\u010diti
+ManageAddOnsDialog.deactivation.success = {0} \u0107e biti isklju\u010den nakon ponovnog pokretanja programa.
+ManageAddOnsDialog.deinstall = Deinstalirati
+ManageAddOnsDialog.deinstallation.success = {0} \u0107e biti uklonjen nakon ponovnog pokretanja programa.
+ManageAddOnsDialog.error = Gre\u0161ka prilikom instalacije {0}.
+ManageAddOnsDialog.install = &Instalirati
+ManageAddOnsDialog.install.from.known.location = Instaliraj pro\u0161irenje iz poznate lokacije
+ManageAddOnsDialog.install.tooltip = Ovdje umetnite URL (vezu) datoteke pro\u0161irenja koji \u017eelite instalirati
+ManageAddOnsDialog.map.not.opened = Mapa {0} nije otvorena.
+ManageAddOnsDialog.really.deinstall = Stvarno \u017eelite deinstalirati {0}?
+ManageAddOnsDialog.search = Tra\u017ei pro\u0161irenja
+ManageAddOnsDialog.search.file = Tra\u017ei
+ManageAddOnsDialog.select.tooltip = Odaberi datoteku
+ManageAddOnsDialog.status.downloading = Preuzimanje datoteke...
+ManageAddOnsDialog.status.installing = Instalacija pro\u0161irenja...
+ManageAddOnsDialog.status.success = Uspje\u0161no instaliran {0}.
+ManageAddOnsDialog.tab.install = Tra\u017ei i instaliraj
+ManageAddOnsDialog.tab.install.tooltip = Tra\u017ei i instaliraj nova pro\u0161irenja
+ManageAddOnsDialog.tab.manage = Upravljanje pro\u0161irenjima
+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 = Upravljanje uvjetovanim stilovima \u010dvora.
+map_already_exists = Mapa ve\u0107 postoji. \u017delite li prepisati preko postoje\u0107e mape?
+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
+MaxNodeWidth.text = Maksimalna \u0161irina teksta
+menu_applyStyle = Primjena stila
+menu_attributes = Obilje&\u017eja
+menu_clouds = Obla\u010di\u0107
+menu_copy = Kopiraj
+menu_coreFormat = \u010cvor
+menu_details = Detalji
+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...
+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_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
+MindMapNodesFlavorHandler = Hijerarhija \u010dvorova
+mindmaps = Mape
+mindmaps_desc = Mape (*.mm)
+mindmaps_filter_desc = Filtri (*.mmfilter)
+MinNodeWidth.text = Minaimalna \u0161irina \u010dvora
+mode_Browse = Preglednik
+mode_File = Preglednik datoteka
+mode_MindMap = Mentalne mape
+mode_na = Oblik nije dostupan
+mode_status = Oblik promijenjen u {0}
+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
+MoveToRootAction.text = Povratak na korijenski \u010dvor
+NameConditionAction.text = Postavi naziv
+NavigationNextMapAction.text = Sljede\u0107a mapa
+NavigationPreviousMapAction.text = Prethodna mapa
+new = &Novi
+new_map_from_user_templates.text = Nova mapa...
+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.
+new_version_available = Dostupna je nova verzija {0}' programa
+NewChildAction.text = Novi \u010dvor - Dijete
+NewerFileRevisionsFoundDialog.cancel = &Presko\u010di
+NewerFileRevisionsFoundDialog.cancel.tooltip = Ne otvaraj ovu datoteku
+NewerFileRevisionsFoundDialog.file_last_modified = Vremenska oznaka
+NewerFileRevisionsFoundDialog.file_name = Datoteka
+NewerFileRevisionsFoundDialog.file_size = Bajta
+NewerFileRevisionsFoundDialog.open = &Otvori
+NewerFileRevisionsFoundDialog.open.tooltip = Otvori datoteku iako je starijeg datuma
+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
+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
+NewMapViewAction.text = Nova mapa pregleda
+NewParentNode.text = Novi \u010dvor - Roditelj
+NewParentNode.tooltip = <html>Svi odabrani \u010dvorovi dodijeljeni su novom \u010dvoru Roditelju.</html>
+NewPreviousSiblingAction.text = Novi prethodni \u010dvor - Brat
+NewSiblingAction.text = Novi \u010dvor - Brat
+NewSummaryAction.text = Novi \u010dvor sa\u017eetka
+NewUserStyleAction.text = Novi stil iz ozna\u010denog \u010dvor
+NextNodeAction.BACK.text = Prethodni \u010dvor
+NextNodeAction.BACK_N_FOLD.text = Prethodni \u010dvor (sklopljeno)
+NextNodeAction.FORWARD.text = Sljede\u0107i \u010dvor
+NextNodeAction.FORWARD_N_FOLD.text = Slijede\u0107i \u010dvor (sklopljeno)
+NextPresentationItemAction.text = Prika\u017ei slijede\u0107u stavku prezentacije
+no = Ne
+no_copy_attributes_before_paste_attributes = Ne mo\u017eete zalijepiti obilje\u017eje ako ga prethodno niste kopirali.
+NO_FORMAT = Tekst
+no_format_copy_before_format_paste = Ne mo\u017eete zalijepiti oblik ako ga prethodno niste kopirali.
+no_found_from = <html>Nije<u>{0}</u>\nmogu\u0107e na\u0107i "{1}".
+no_more_found_from = <html>Nijedan <u>{0}</u>\nvi\u0161e nije na\u0111en u "{1}".
+no_previous_find = Nema podatka tra\u017eenja.
+no_styles_found_in_map = Nisu prona\u0111eni stilovi u mapi
+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_selector = Odabir \u010dvora
+node_selector_message = Dvostruki klik za odabir \u010dvora
+node_styles = Stil \u010dvora:
+NodeBackgroundColorAction.text = &Pozadinska boja \u010dvora...
+NodeColorAction.text = Boja teksta \u010dvora...
+NodeColorBlendAction.text = Pomije\u0161aj boje
+NodeDownAction.text = \u010cvor dolje
+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.fork.text = Ra&\u010dva
+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 s pretra\u017eiva\u010dem datoteka.
+note_window_location = Pozicija prozora bilje\u0161ki
+ok = &U redu
+OKAction.text = &Uredu
+OnlineReference.text = Dokumentacija - WEB
+open_asMindMap = Mentalna mapa
+OpenAction.text = Otvori...
+OpenFreeplaneSiteAction.text = Web stranica Freeplane
+OpenPathAction.text = Otvori datoteku
+OpenURLMapAction.text = Otvori mapu iz URL...
+OpenUserDirAction.text = Otvori korisni\u010dki mapu (direktorij)
+option_changes_may_require_restart = Da biste vidjeli u\u010dinak promjena postavka, morate ponovno pokrenuti Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &Ne
+OptionalDontShowMeAgainDialog.dontShowAgain = Ne &pitaj me ponovno.
+OptionalDontShowMeAgainDialog.ok = &Da
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Zapamti odluku.
+OptionPanel.absolute = Apsolutne
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatski ure\u0111eni uzorci
+OptionPanel.ADD_CHILD = Dodaj \u010dvor Djete
+OptionPanel.ADD_SIBLING = Dodaj bratski \u010dvor
+OptionPanel.addons = Pro\u0161irenja
+OptionPanel.always_fold_all_after_load = Sklopi sve
+OptionPanel.always_load_last_maps = U\u010ditaj posljednje i nove mape
+OptionPanel.always_load_last_maps.tooltip = Otvara posljednje datoteke prema gore odabranim postavkama, \u010dak i pokretanjem FP odabirom druge datoteke.
+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_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>
+OptionPanel.antialias_all = Zagladi sve
+OptionPanel.antialias_edges = Zagla\u0111ivanje ruba
+OptionPanel.antialias_none = Bez zagla\u0111ivanja
+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/><broj slova="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.ARC = Krivulja
+OptionPanel.as_parent = Kao Roditelj
+OptionPanel.ask = Pitanje
+OptionPanel.automatic = Automatski
+OptionPanel.automaticFormat_level = Stilovi automatskog izgleda
+OptionPanel.automaticFormat_level1 = Oblik korijenskog \u010dvora
+OptionPanel.automaticFormat_level2 = 1. Razina oblika \u010dvora
+OptionPanel.backup_file_number = Broj sigurnosnih kopija
+OptionPanel.Behaviour = Karakteristike
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Obla\u010di\u0107
+OptionPanel.ca = Katalonski
+OptionPanel.Cancel = Odustani
+OptionPanel.center_selected_node = Automatsko klizanje prikaza mape
+OptionPanel.check_updates_automatically = Provjeri za nadogradnju prilikom pokretanja programa
+OptionPanel.childpattern = Uzorak \u010dvora "dijete"
+OptionPanel.childpattern.tooltip = Odabrani uzorak koristit \u0107e se na svim \u010dvorovima " dijete"
+OptionPanel.clear_all_setters = Uklju\u010di sve
+OptionPanel.clear_all_setters.tooltip = Omogu\u0107uje ili onemogu\u0107uje sve indikatore promjena.
+OptionPanel.cloud = Obla\u010di\u0107
+OptionPanel.cloudcolor = Boja obla\u010di\u0107a
+OptionPanel.cloudshape = Oblik obla\u010di\u0107a
+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.cs = \u010ce\u0161ki
+OptionPanel.cut_nodes_without_question = Izre\u017ei \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.
+OptionPanel.da = Danski
+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.default = Zadano
+OptionPanel.default_attribute_key_column_width = \u0160irina 1.stupca obilje\u017eja
+OptionPanel.default_attribute_value_column_width = \u0160irina 2.stupca obilje\u017eja
+OptionPanel.default_browser_command_mac = Zadani naredbeni preglednik za MacOS
+OptionPanel.default_browser_command_mac.tooltip = <html> i MAC: (hvala, Nick!)</html>
+OptionPanel.default_browser_command_other_os = Zadani naredbeni preglednik za ostale operacijske sustave
+OptionPanel.default_browser_command_other_os.tooltip = <html> Ovo je tipi\u010dno za Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Zadani naredbeni preglednik Windows 98
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Za Windows 98 (znaci "" su obavezni zbog veza,koji imaju "=" u svojem URL-u).</html>
+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.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>
+OptionPanel.delete_nodes_without_question = Obri\u0161i \u010dvor(ove) bez potvrde.
+OptionPanel.delete_nodes_without_question.tooltip = Ako je polje odabrano \u010dvorovi \u0107e biti obrisani bez potvrde. Ovo mo\u017ee prouzro\u010diti gubitak informacija ukoliko nismo pa\u017eljivi kod brisanja.
+OptionPanel.disable_cursor_move_paper = Onemogu\u0107i pomicanje podloge pokaziva\u010dem
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Ne prikazuj pokaziva\u010d 'pomakni' prilikom povla\u010denja podloge </html>
+OptionPanel.display_inline_editor_for_all_new_nodes = Prika\u017ei jednostavni ure\u0111iva\u010d teksta \u010dvora za sve nove \u010dvorove
+OptionPanel.display_node_id = Prika\u017ei ID \u010dvora (indetifikacijski broj)
+OptionPanel.edgecolor = Boja ruba
+OptionPanel.edgecolor.tooltip = Svojstvo ruba roditeljskog \u010dvora (primijenit \u0107e se na sve \u010dvorove Djecu)
+OptionPanel.edgestyle = Stil ruba
+OptionPanel.edgestyle.tooltip = Svojstvo ruba roditeljskog \u010dvora (primijenit \u0107e se na sve \u010dvorove Djecu)
+OptionPanel.edgewidth = \u0160irina ruba
+OptionPanel.edgewidth.tooltip = Svojstvo ruba roditeljskog \u010dvora (primijenit \u0107e se na sve \u010dvorove Djecu)
+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__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
+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.Environment = Okru\u017eenje
+OptionPanel.es = \u0160panjolski
+OptionPanel.et = Etiopski
+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)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>Ukoliko Groovy skripte trebaju upravljati izvr\u0161avanjem ostalih Aplikacija (npr. internet pretra\u017eiva\u010d) bez pitanja(!),<br>morate omogu\u0107iti ovu opciju. <br> Ali koristite pa\u017eljivo, zlonamjerne skripte mogu nanijeti \u0161tetu va\u0161em ra\u010dunalu!</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Omogu\u0107i \u010ditanje datoteka (NIJE preporu\u010deno)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Ukoliko Groovy skripte trebaju upravljati \u010ditanjem datoteka (npr. otvoriti, zatvoriti, \u010ditati(!),<br>morate omogu\u0107iti ovu opciju. <br> Ali koristite pa\u017eljivo, zlonamjerne skripte mogu nanijeti \u0161tetu va\u0161em ra\u010dunalu!</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Omogu\u0107i upravljanje mre\u017enim resursima (NIJE preporu\u010deno)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Ukoliko Groovy skripte trebaju upravljati izvr\u0161avanjem mre\u017enih akcija,<br>morate omogu\u0107iti ovu opciju. <br> Ali koristite pa\u017eljivo, zlonamjerne skripte mogu otkriti va\u0161e tajne !</body></html>
+OptionPanel.execute_scripts_without_write_restriction = Omogu\u0107i pisanje/brisanje datoteka (NIJE preporu\u010deno)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>Ukoliko Groovy skripte trebaju upravljati zapisivanjem datoteke (npr. zapisati, spremiti, obrisati(!)),<br> morate omogu\u0107iti ovu opciju. <br>Uobi\u010dajeno se koristi za \u010ditanje datoteka<br>Ako koristite u druge svrhe budite pa\u017eljivi<br>zlonamjerne skripte mogu nanijeti \u0161tetu va\u0161em ra\u010dunalu!</body></html>
+OptionPanel.experimental_file_locking_on = Probno zatvaranje datoteke
+OptionPanel.experimental_file_locking_on.tooltip = <html> Probne mogu\u0107nosti</html>
+OptionPanel.export_icons_in_html = Izvoz ikona u HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Potvrdite ukoliko \u017eelite da HTML izvoz sadr\u017eava ikone. Postoji problem veza prema ikonama u HTML izvozu, \u010desto su veze prema ikonama prekinute.</html>
+OptionPanel.Files = Datoteke
+OptionPanel.first = Kao prvu
+OptionPanel.fold_on_click_inside = Rasklopi na klik unutar \u010dvora
+OptionPanel.foldingsymbolwidth = Veli\u010dina simbola (kru\u017ei\u0107a) sklopljenog \u010dvora.
+OptionPanel.foldingsymbolwidth.tooltip = <html>Veli\u010dina kruga koji ozna\u010dava sklapanje stabla</html>
+OptionPanel.fork = Ra\u010dva
+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.goto_note_end_on_edit = Pokaziva\u010d znaka (kursor) na kraju teksta bilje\u0161ke
+OptionPanel.grid_size = Veli\u010dina mre\u017ee pomaka \u010dvora
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Skriveni rubovi
+OptionPanel.highlight_formulas = Osvijetli formulu
+OptionPanel.horizontal = Vodoravno
+OptionPanel.hr = Hrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Prema naslovima
+OptionPanel.html_export_fold_all = Sklopi sve
+OptionPanel.html_export_fold_currently_folded = Sklopi trenutno otvorene \u010dvorove
+OptionPanel.html_export_folding = Prikaz \u010dvorova pri izvozu u HTML
+OptionPanel.html_export_no_folding = Bez sklapanja \u010dvora
+OptionPanel.hu = Ma\u0111arski
+OptionPanel.ic_disable = Onemogu\u0107i
+OptionPanel.ic_file = Tvrdi disk
+OptionPanel.ic_ram = Radna memorija
+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.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.key_type_action = Unos tipkovnicom:
+OptionPanel.Keystrokes = Tipkovni\u010dke kratice
+OptionPanel.ko = Korejski
+OptionPanel.label_font_family = Oblik slova
+OptionPanel.label_font_size = Veli\u010dina slova
+OptionPanel.language = Jezik
+OptionPanel.language.tooltip = <html>Ovo je jezik koji \u0107e biti upotrebljen u programu.Postavka 'automatsko' poku\u0161ava u\u010ditati trenutni korisni\u010dki jezik. </html>
+OptionPanel.last = Kao posljednju
+OptionPanel.last_opened_list_length = Lista zadnje otvaranih datoteka
+OptionPanel.layout_map_on_text_change = Prikaz mape tokom ure\u0111ivanja
+OptionPanel.layout_map_on_text_change.tooltip = Onemogu\u0107ite za bolju u\u010dinkovitost programa
+OptionPanel.linear = Linearno
+OptionPanel.links = Veze
+OptionPanel.links.tooltip = <html>Postavljanje veza kao relativne ili apsolutne </html>
+OptionPanel.load_folding = Izgled mape kod u\u010ditavanja (sklopljenost \u010dvorova)
+OptionPanel.load_folding_from_map_default_fold_all = U\u010ditaj na mapi ili sklopi sve
+OptionPanel.load_folding_from_map_default_unfold_all = U\u010ditaj na mapi ili rasklopi sve
+OptionPanel.load_last_map = Automatski otvori posljednju mapu
+OptionPanel.load_last_map.tooltip = <html>Ako je ova opcija odabran, Freeplane \u0107e prilikom pokretanja automatski otvoriti posljednju kori\u0161tenu mapu.</html>
+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 'ni\u0161ta'. Ovo djeluje na programe.</html>
+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
+OptionPanel.max_menu_item_count = Maksimalan broj stavki izbornika
+OptionPanel.max_menu_item_count.tooltip = Ograni\u010denje broja stavki ako je jedan podizbornik, najmanje 10
+OptionPanel.max_node_width = Maksimalna \u0161irina \u010dvora (pikseli)
+OptionPanel.max_shortened_text_length = Maksimalna duljina smanjenog \u010dvora
+OptionPanel.metal = Metal
+OptionPanel.min_node_width = Minimalna \u0161irina \u010dvora
+OptionPanel.motif = Motif
+OptionPanel.nb = Norve\u0161ki (Bokm\u00e5l)
+OptionPanel.never_save_folding = Nikad ne spremaj
+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
+OptionPanel.nodecolor.tooltip = Boja prednjeg plana \u010dvora kad nije odabran.
+OptionPanel.nodefontbold = Podebljano
+OptionPanel.nodefonthyperlink = Veza
+OptionPanel.nodefontitalic = Uko\u0161eno
+OptionPanel.nodefontname = Oblik slova \u010dvorova
+OptionPanel.nodefontsize = Veli\u010dina slova \u010dvorova
+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">Freeplane Formulas documentation</a> za detalje.</ul></html>
+OptionPanel.nodenumbering = Dodavanje broja \u010dvoru
+OptionPanel.nodenumbering.tooltip = Dodavanjae 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\u010dva za ostalo.</td></tr></table></html>
+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
+OptionPanel.number_format = Standardi oblik broja
+OptionPanel.number_format.tooltip = Oblici brojeva mogu sadr\u017eavati '#' za dodatnu znamenku ili '0' za obaveznu znamenku. Primjeri: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = Broj datoteka koje \u0107e biti automatski spremljene
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Brojka n razli\u010ditih datoteka u koje se spremaju Mentalne mape. Prvo automatsko spremanje se izvodi u prvu datoteku itd. do n+1 spremanja koje se opet izvodi u prvu datoteku (kru\u017eno)</html>
+OptionPanel.OK = Spremi
+OptionPanel.org.freeplane.plugin.bugreport = Postavke sigurnosti
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Uvijek \u0161alji
+OptionPanel.org.freeplane.plugin.bugreport.ask = Prika\u017ei dijalog o izvje\u0161taju gre\u0161ke
+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.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.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.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.
+OptionPanel.plugins = Dodaci
+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.RECT = 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.remove_notes_without_question = Obri\u0161i 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
+OptionPanel.resources_use_margin_top_zero_for_notes = Makni gornju marginu kod bilje\u017eaka
+OptionPanel.revision_color = Pozadinska boja izmjenjenih \u010dvorova
+OptionPanel.revision_color.tooltip = Pozadinska boja izmijenjenih \u010dvorova.
+OptionPanel.ROUND_RECT = Zaobljeni pravokutnik
+OptionPanel.ru = Ruski
+OptionPanel.save_folding = Spremi strukturu stabla
+OptionPanel.save_folding_if_map_is_changed = Samo ako je mapa promijenjena
+OptionPanel.save_modification_times = Spremi vrijeme promijene
+OptionPanel.script_classpath = Arhive classes skripta 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>
+OptionPanel.script_directories = Arhive skripta (vidi opis alata)
+OptionPanel.script_directories.tooltip = <html>Lista mapa (Folder) koje sadr\u017ee.<br>Koristi ; (Windows) ili : (Linux, Mac) za odvajanje unosa.<br>Putanje koje nisu apsolutne, biti \u0107e usmjerene na korisni\u010dku mapu Freeplane (.freeplane).</html>
+OptionPanel.script_user_key_name_for_signing = Neobavezni korisni\u010dki klju\u010d (pseudonim) za potpisivanje
+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.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
+OptionPanel.selection_method_delayed = Zaka\u0161njelo
+OptionPanel.selection_method_direct = Direktno
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Uzorci
+OptionPanel.separator.anti_alias = Zagla\u0111ivanje
+OptionPanel.separator.attributes = Svojstva
+OptionPanel.separator.automatic_save = Automatsko spremanje
+OptionPanel.separator.behaviour = Karakteristike
+OptionPanel.separator.browser = Preglednik
+OptionPanel.separator.cache = Pri\u010duvna memorija
+OptionPanel.separator.CloudControls = Obla\u010di\u0107i
+OptionPanel.separator.commands_for_the_program = Naredbe programa
+OptionPanel.separator.connectors = Poveznici
+OptionPanel.separator.data_formats = Oblikovanje i analiziranje podataka
+OptionPanel.separator.default_colors = Zadane boje
+OptionPanel.separator.default_fonts = Zadani oblik slova
+OptionPanel.separator.default_styles = Zadani stilovi
+OptionPanel.separator.EdgeControls = Rub
+OptionPanel.separator.edit_long_node_window = Postavke prozora za bolje oblikovanje teksta \u010dvora
+OptionPanel.separator.editing = Postavke ure\u0111iva\u010da
+OptionPanel.separator.files = Datoteke
+OptionPanel.separator.formula = Formula
+OptionPanel.separator.General = Op\u0107enito
+OptionPanel.separator.html_export = HTML izvoz
+OptionPanel.separator.html_import = HTML Uvoz
+OptionPanel.separator.hyperlink_types = Vrste hiperveza
+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.key_typing = Tipkanje
+OptionPanel.separator.language = Jezik
+OptionPanel.separator.load = U\u010ditavanje
+OptionPanel.separator.look_and_feel = Izgled i ugo\u0111aj
+OptionPanel.separator.mouse_wheel = Kota\u010di\u0107 mi\u0161a
+OptionPanel.separator.new_node_commands = Naredbe novog \u010dvora
+OptionPanel.separator.node_editing_commands = Naredbe ure\u0111ivanja \u010dvora
+OptionPanel.separator.node_navigation_commands = Naredbe navigacije \u010dvora
+OptionPanel.separator.NodeColors = Boje teksta \u010dvora
+OptionPanel.separator.NodeFont = Font \u010dvora
+OptionPanel.separator.NodeShape = Oblik \u010dvora
+OptionPanel.separator.NodeStyle = Stil \u010dvora
+OptionPanel.separator.NodeText = Tekst \u010dvora
+OptionPanel.separator.notifications = Potvrde
+OptionPanel.separator.org.freeplane.plugin.bugreport = Automatski izvje\u0161taj o gre\u0161ki
+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.RichTextEditor = Ure\u0111iva\u010d teksta
+OptionPanel.separator.root_node_appearance = Izgled korijenskog \u010dvora
+OptionPanel.separator.save = Spremi
+OptionPanel.separator.scripting = Dozvole za izvo\u0111enje skripta
+OptionPanel.separator.scrollbar = Kliza\u010d
+OptionPanel.separator.search = Tra\u017ei
+OptionPanel.separator.selection_colors = Boje odabira
+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.status = Statusna traka
+OptionPanel.separator.tooltip = Vrijeme prikaza opisa alata
+OptionPanel.separator.undo = Poni\u0161ti
+OptionPanel.separator.updates = Nadogradnja programa
+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.sharp_bezier = Grubo bezier
+OptionPanel.sharp_linear = Grubo linearno
+OptionPanel.show_icon_for_attributes = Prika\u017ei ikone obilje\u017eja
+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
+OptionPanel.signed_script_are_trusted = Omogu\u0107i izvo\u0111enje potpisanih skripta (preporu\u010deno)
+OptionPanel.signed_script_are_trusted.tooltip = Ako skripte imaju povjerljiv potpis (npr. autora Freeplanea ili su vlastite), izvodit \u0107e se bez ograni\u010denja.
+OptionPanel.simplyhtml.default_paste_mode = Zadani na\u010din lijepljenja
+OptionPanel.single_backup_directory = Koristi jedanu mapu (direktorij) za sigurnosne kopije
+OptionPanel.single_backup_directory.tooltip = <html>Spremanje sigurnosnih kopija u korisni\u010dki definiranu mapu (direktorij), ako nije aktivirano, sigurnosne kopije biti \u0107e spremljene u podmapu (.backup) mape u kojoj se nalazi .mm datoteka .</html>
+OptionPanel.single_backup_directory_path = Mapa (direktorij) sigornosnih kopija (ako je aktivirana opcija iznad)
+OptionPanel.single_backup_directory_path.tooltip = <html>Promijenite zadanu putanju <freeplaneuserdir>/.backup</html>
+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.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.standard_template = Datoteka predlo\u0161ka
+OptionPanel.standardbackgroundcolor = Boja pozadine mape
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standardna boja pozadine mape u HTML zapisu </html>
+OptionPanel.standardcloudcolor = Boja obla\u010di\u0107a
+OptionPanel.standardcloudcolor.tooltip = <html>Standardna boja obla\u010di\u0107a u HTML zapisu </html>
+OptionPanel.standardcloudestyle = Stil obla\u010di\u0107a
+OptionPanel.standardcloudestyle.tooltip = <html>Standardni stil obla\u010di\u0107a. Trenutno je podr\u017ean samo 'bezier' </html>
+OptionPanel.standarddrawrectangleforselection = Prika\u017ei okvir za odabir \u010dvora.
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Odabrani \u010dvor ima okvir sa zaobljenim uglovima oko sebe .</html>
+OptionPanel.standardlinkcolor = Boja veze sa strelicom
+OptionPanel.standardlinkcolor.tooltip = <html>Standardna boja veze sa strelicom u HTML zapisu </html>
+OptionPanel.standardlinkestyle = Stil veze
+OptionPanel.standardlinkestyle.tooltip = <html>Standardni stil veze. Trenutno je podr\u017ean samo 'bezier' </html>
+OptionPanel.standardselectednodecolor = Boja odabranog \u010dvora
+OptionPanel.standardselectednodecolor.tooltip = <html>Standardna boja odabranog \u010dvora. U HTML zapisu (#RRGGBB u heksadecimalnoj vrijednosti) </html>
+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.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.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.reshowDelay = Vrijeme ponovnog prikaza, ms
+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.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
+OptionPanel.use_tabbed_pane.tooltip = Ako je aktivno mape \u0107e se prikazivati u tabovima (kao u FireFox-u :-) )
+OptionPanel.user_defined_screen_resolution = Korisni\u010dki definirana razlu\u010divost zaslona (dpi)
+OptionPanel.validate_classpath_needs_readaccess = Izvo\u0111enje skripti: Kada su postavljene putanje \u010ditanja JAR i .class datoteka morate omogu\u0107iti \u010ditanje datoteka.
+OptionPanel.validate_invalid_date_format = Une\u0161en je neva\u017ee\u0107i oblik datuma
+OptionPanel.validate_invalid_datetime_format = Une\u0161en je neva\u017ee\u0107i oblik datuma-vremena
+OptionPanel.validate_invalid_number_format = Une\u0161en je neva\u017ee\u0107i oblik broja
+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.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.windows = Windows
+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
+org.freeplane.plugin.bugreport.deny = Ne \u0161alji
+org.freeplane.plugin.bugreport.dialog.title = Automatski izvje\u0161taj o gre\u0161ki
+org.freeplane.plugin.bugreport.freeplane_team = Poruka Freeplane tima
+org.freeplane.plugin.bugreport.lastreport = Primljeni izvje\u0161taj
+org.freeplane.plugin.bugreport.never = Nikad ne pitaj za pomo\u0107
+org.freeplane.plugin.bugreport.question = Freeplane ima ugra\u0111en automatski sustav pra\u0107enja gre\u0161aka
+org.freeplane.plugin.bugreport.report = Aktualni izvje\u0161taj
+org.freeplane.plugin.bugreport.wanted_bug = Pojavila se interna pogre\u0161ka i automatski je poslan izvje\u0161taj o pogre\u0161ci.
+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...
+password_is_not_ascii = Lozinka nije ASCII kod
+PasteAction.text = Zalijepi
+PasteAttributes.text = Zalijepi obilje\u017eje
+PatternNewNameProperty = Novi uzorak
+PatternToString.backgroundColor = Boja pozadine
+PatternToString.Child = Stil \u010dvora Dijete
+PatternToString.color = Boje
+PatternToString.EdgeColor = Boja ruba
+PatternToString.EdgeStyle = Stil ruba
+PatternToString.EdgeWidth = \u0160irina ruba
+PatternToString.FontBold = Podebljano
+PatternToString.FontItalic = Uko\u0161eno
+PatternToString.FontName = Ime oblika slova
+PatternToString.Icon = Ikona
+PatternToString.NodeFontSize = Veli\u010dina fonta
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = dani
+PeriodUnit.HOUR = sati
+PeriodUnit.MINUTE = minute
+PeriodUnit.MONTH = mjeseci
+PeriodUnit.WEEK = tjedni
+PeriodUnit.YEAR = godine
+plugins/latex/LatexNodeHook.editorTitle = Uredi Latex
+plugins/script_filter = Filtar skripte {0}
+plugins/script_filter_error = {0} je morao vratiti logi\u010dki rezultat na {1}, ali je vratio {2}
+plugins/ScriptEditor.cancel = &Otka\u017ei promjene i iza\u0111i
+plugins/ScriptEditor.exit = &Spremi i iza\u0111i
+plugins/ScriptEditor.FORBIDDEN_ACTION = Izvr\u0161avanje Freeplane groovy skripta je zaustavljeno. Zabranjene su {0,choice,0#File|1#Network|2#Exec} sljede\u0107e operacije: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write} {2}.Zabrane mo\u017eete promijeniti u postavkama programa.
+plugins/ScriptEditor.menu_actions = &Akcije
+plugins/ScriptEditor.new_script = Nova skripta
+plugins/ScriptEditor.run = &Izvodi
+plugins/ScriptEditor.sign = Potpisivanje skripte...
+plugins/ScriptEditor/window.Result = Rezultat:
+plugins/ScriptEditor/window.title = Ure\u0111iva\u010d skripta
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Nedozvoljeni pristup internim API ( paket {0}). - Molim kontaktirajte Freeplane tim ako API skripte nisu dovoljno podr\u017eane.
+plugins/TimeList.xml_Created = Kreirano
+plugins/TimeList.xml_Date = Datum
+plugins/TimeList.xml_Icons = Ikone
+plugins/TimeList.xml_Modified = Izmijenjeno
+plugins/TimeList.xml_Notes = Bilje\u0161ke
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Umetni datum
+plugins/TimeManagement.xml_Cancel = Odustani
+plugins/TimeManagement.xml_cancelButton = Odustani
+plugins/TimeManagement.xml_closeButton = Zatvori
+plugins/TimeManagement.xml_Export = Izvoz odabranih \u010dvorova
+plugins/TimeManagement.xml_Find = Tra\u017ei
+plugins/TimeManagement.xml_Goto = Idi na
+plugins/TimeManagement.xml_hour = Sat:
+plugins/TimeManagement.xml_menu_actions = Akcije
+plugins/TimeManagement.xml_minute = Minuta:
+plugins/TimeManagement.xml_reminderButton = Sjeti me na taj dan
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Nakon klika zapo\u010dinje vremensko odbrojavanje prema dodijeljenom datumu. Nakon isteka vremena trepere\u0107a ikona daje znak o isteku.<br> Ako zatvorite Mentalnu mapu, odbrojavanje se ponovno aktivira kod otvaranja Mentalne mape.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Trenutno je mogu\u0107 jedan podsjetnik po \u010dvoru. <br>Trenutni podsjetnik je pode\u0161en je na {0,date} {0,time}, va\u0161 izbor je bio {1,date} {1,time}. <br><br>\u017delite li promijeniti vrijeme aktiviranja podsjetnika (Da) <br>ili \u017eelite zadr\u017eati staro vrijeme (Ne)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Podsjetnik zadatka pode\u0161en na {0,date} {0,time}.
+plugins/TimeManagement.xml_remindLaterButton = Podsjeti kasnije
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Podsjeti kasnije
+plugins/TimeManagement.xml_removeReminderButton = Ukloni podsjetnik
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Ukloni sve podsjetnike koji su povezani s odabranim \u010dvorovima.
+plugins/TimeManagement.xml_Replace = Zamijeni
+plugins/TimeManagement.xml_Replace_All = Zamijeni sve
+plugins/TimeManagement.xml_Replace_Selected = Zamijeni odabrano
+plugins/TimeManagement.xml_Select = Odaberi
+plugins/TimeManagement.xml_todayButton = Osvje\u017ei kalendar
+plugins/TimeManagement.xml_WindowTitle = Upravljanje kalendarom
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Pretra\u017ei i zamijeni
+preferences = Postavke
+print_preview_title = Pregled ispisa
+PrintAction.text = Ispis...
+PrintDirectAction.text = Ispis
+printing_settings = Skaliranje ispisa
+PrintPreviewAction.text = &Pregled ispisa...
+PropertyAction.dialog = Postavke
+PropertyAction.text = Postavke ...
+QuickFilterAction.text = Brzi filtar
+QuickFindAction.BACK.text = Tra\u017ei prethodni
+QuickFindAction.FORWARD.text = Tra\u017ei sljede\u0107e
+QuickFindAllAction.text = Ozna\u010di sve prona\u0111ene \u010dvorove
+QuickHighlightAction.text = Osvijetli sve odgovaraju\u0107e \u010dvorove
+QuitAction.text = Izlaz
+read_only = Samo za \u010ditanje
+ReadScriptError.text = Gre\u0161ka kod \u010ditanja skripte
+really_convert_to_current_version = <html>Mapa je kreirana sa starijom verzijom programa Freeplane. <br>\u017delite li ih prevesti na novu verziju (preporu\u010da se)? <br> (U suprotnom treba uzeti kakvo je, bez ikakve garancije.) </html>
+really_cut_node = \u017deli\u0161 li stvarno izrezati \u010dvor(ove)?
+really_execute_script = \u017delite li stvarno izvoditi skripte uklju\u010dene u ovoj mapi? Postoji opasnost nastanka \u0161tete na ra\u010dunalu?
+really_remove_node = \u017deli\u0161 li stvarno obrisati \u010dvor(ove)?
+really_remove_notes = Stvarno \u017eelite obrisati bilje\u0161ku(e)?
+ReapplyFilterAction.text = Ponovno primijeni
+red = Crveno
+RedefineStyleAction.text = Ponovno odre\u0111ivanje stila
+RedoAction.text = Ponovi
+RedoFilterAction.text = Ponovi
+regular_expressions = Regularni izraz
+ReminderHookAction.text = Ukloni podsjetnik
+ReminderHookAction.tooltip = Ukloni podsjetnik s \u010dvora.
+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?
+RemoveAllIconsAction.text = Ukloni sve ikone
+RemoveConnectorAction.text = Obri\u0161i poveznik
+RemoveEncryption.text = Ukloni \u0161ifriranje
+RemoveFormatAction.text = Ukloni oblikovanja
+RemoveIcon_0_Action.text = Ukloni prvu ikonu
+RemoveIconAction.text = Ukloni posljednju ikonu
+RemoveNoteAction.text = Obri\u0161i bilje\u0161ke
+RemoveNoteAction.tooltip = <html>Obri\u0161i sadr\u017eaj bilje\u017eaka .</html>
+rename = &Preimenuj
+repair_link = Popravi vezu
+repair_link_question = Ne mogu u\u010ditati povezanu mapu. \u017delite li popraviti vezu ru\u010dno?
+replace = Zamijeni
+replace_shortcut_question = Ova tipkovni\u010dka kratica trenutno je dodijeljena \n {0}.\n\u017delite li je zamijeniti?
+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
+ResetStyleAction.text = Vrati izvorni stil \u010dvora
+RevertAction.text = O&tvori ponovno
+RevisionPluginAction.text = Prika\u017ei promijenjen \u010dvor u &boji
+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
+SaveAction.text = &Spremi
+SaveAll.text = Spremi &sve
+SaveAll.tooltip = Spremi sve otvorene mape.
+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.tooltip = Omogu\u0107ava pisanje velikih skripta unutar Freeplanea.
+ScriptEditorPanel.changed_cancel = Skripta je promijenjena. Stvarno \u017eelite otkazati promjene?
+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
+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
+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 = Kliknite na bilo koju stavku izbornika za dodjelu nove tipkovni\u010dke kratice
+SetAcceleratorOnNextClickAction.text = Pridru\u017ei tipkovni\u010dku kraticu
+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).
+SetLinkAnchorAction.tooltip_anchored = <html>postavi ozna\u010deni \u010dvor kao sidro za budu\u0107e <br/>stvaranje lokalnih ili globalnih veza (linkova). Aktualno sidro:{0}
+SetLinkByFileChooserAction.text = Hiperveze (Pretra\u017eiva\u010d datoteka)...
+SetLinkByTextFieldAction.text = Dodaj ili promijeni hipervezu (Polje s tekstom)...
+SetNodeLink.text = Postavi vezu \u010dvora
+SetNoteWindowPosition.bottom.text = Dolje
+SetNoteWindowPosition.left.text = Lijevo
+SetNoteWindowPosition.right.text = Desno
+SetNoteWindowPosition.top.text = Gore
+SetShortenerStateAction.text = Reducirani prikaz \u010dvora
+sf_login_required = Potrebno je prijavljivanje na Source Forge. \u017delite li nastaviti?
+ShowAllAttributesAction.text = Prika\u017ei sva obilje\u017eja
+ShowAncestorsAction.text = Prika\u017ei pretke (prethodnike)
+ShowAttributeDialogAction.text = Upravljanje o&bilje\u017ejima
+ShowDescendantsAction.text = Prika\u017ei potomke (nasljednike)
+ShowFilterToolbarAction.text = Filtar traka
+ShowFormatPanel.text = Plo\u010da oblikovanja
+ShowFormatPanel.tooltip = Prikazuje dijalog u kojem oblici \u010dvorova i rubova mogu mijenjati odjednom.
+ShowHideNoteAction.text = Bilje\u0161ke
+ShowHideNoteAction.tooltip = Uklju\u010divanje ili isklju\u010divanje prozora s bilje\u0161kama
+ShowNextChildAction.text = Prika\u017ei slijede\u0107i \u010dvor
+ShowNotesInMapAction.text = Prika\u017ei bilje\u0161ke u prozoru mape
+ShowSelectedAttributesAction.text = Prika\u017ei odabrana obilje\u017eja
+ShowSelectionAsRectangleAction.text = Prika\u017ei okvir za odabir \u010dvora
+simplyhtml.aboutFrameTitle = O programu
+simplyhtml.aboutLabel = O SimplyHTML...
+simplyhtml.alignCenter = Sredina
+simplyhtml.alignLabel = Poravnavanje:
+simplyhtml.alignLeft = Lijevo
+simplyhtml.alignRight = Desno
+simplyhtml.allCellsRangeLabel = sve \u0107elije
+simplyhtml.allOccurrencesReplaced = Sve podudarnosti su zamijenjene
+simplyhtml.appendTableColLabel = Dodaj stupac pokraj
+simplyhtml.appendTableRowLabel = Dodaj red ispod
+simplyhtml.applyCellAttrLabel = Primijeni na
+simplyhtml.backgroundLabel = Boja pozadine:
+simplyhtml.boldItalicName = Uko\u0161/Podebljano
+simplyhtml.boldName = Podebljano
+simplyhtml.borderColorLabel = Boja:
+simplyhtml.borderWidthLabel = \u0160irine
+simplyhtml.bottomLabel = Dolje:
+simplyhtml.cancelBtnName = Odustani
+simplyhtml.cellBorderTabLabel = Obrub
+simplyhtml.cellGenTabLabel = Op\u0107enito
+simplyhtml.cellMarginTabLabel = Margine
+simplyhtml.cellPanelTitle = Oblik \u0107elije
+simplyhtml.clearFormatLabel = Ukloni oblikovanje
+simplyhtml.clearFormatTip = Ukloni oblikovanje
+simplyhtml.close = Zatvori
+simplyhtml.closeBtnName = Zatvori
+simplyhtml.colorLabel = Boja
+simplyhtml.copyLabel = Kopiraj
+simplyhtml.copyTip = Kopiraj
+simplyhtml.cTagNameHead1 = Naslov 1
+simplyhtml.cTagNameHead2 = Naslov 2
+simplyhtml.cTagNameHead3 = Naslov 3
+simplyhtml.cTagNameHead4 = Naslov 4
+simplyhtml.cTagNameHead5 = Naslov 5
+simplyhtml.cTagNameHead6 = Naslov 6
+simplyhtml.cTagNameLink = Veza
+simplyhtml.cTagNameOL = Ure\u0111en popis
+simplyhtml.cTagNamePara = Odlomak
+simplyhtml.cTagNameUL = Neure\u0111en popis
+simplyhtml.cutLabel = Izre\u017ei
+simplyhtml.cutTip = Izre\u017ei
+simplyhtml.defaultDocName = Bez naslova
+simplyhtml.deleteTableColLabel = Obri\u0161i stupac
+simplyhtml.deleteTableRowLabel = Obri\u0161i red
+simplyhtml.docTitleQuery = Postavi naslov kao:
+simplyhtml.docTitleTitle = Uredi naslov dokumenta
+simplyhtml.editLabel = Uredi
+simplyhtml.effectLabel = Efekti
+simplyhtml.familyLabel = Oblik
+simplyhtml.findNext = Tra\u017ei sljede\u0107e...
+simplyhtml.findReplaceDialogTitle = Tra\u017ei i zamijeni
+simplyhtml.findReplaceLabel = Tra\u017ei i zamijeni
+simplyhtml.findReplaceTip = Tra\u017ei i zamijeni
+simplyhtml.fontBoldLabel = Podebljano
+simplyhtml.fontBoldTip = Uklju\u010di/isklju\u010di podebljano
+simplyhtml.fontColorLabel = Boja teksta
+simplyhtml.fontColorTip = Boja teksta
+simplyhtml.fontDialogTitle = Oblik slova
+simplyhtml.fontItalicLabel = Uko\u0161eno
+simplyhtml.fontItalicTip = Isklju\u010di/uklju\u010di uko\u0161eno
+simplyhtml.fontLabel = Slova...
+simplyhtml.fontTabLabel = Slova
+simplyhtml.fontTip = Oblik slova...
+simplyhtml.fontUnderlineLabel = Podcrtano
+simplyhtml.fontUnderlineTip = Uklju\u010di/isklju\u010di podcrtano
+simplyhtml.foregroundLabel = Boja fonta:
+simplyhtml.formatLabel = Oblikovanje
+simplyhtml.formatListLabel = Popis...
+simplyhtml.formatListTip = Promijeni oblik popisa
+simplyhtml.formatParaLabel = Odlomak...
+simplyhtml.formatParaTip = Promijeni oblik odlomka
+simplyhtml.formatTableLabel = Tabela...
+simplyhtml.formatTableTip = Oblikovanje tabele
+simplyhtml.helpLabel = Pomo\u0107
+simplyhtml.htmlTabTitle = HTML prikaz
+simplyhtml.imageFileDesc = Slikovne datoteke
+simplyhtml.insertTableColLabel = Umetni stupac
+simplyhtml.insertTableLabel = Tabela...
+simplyhtml.insertTableMsg = Broj kolona
+simplyhtml.insertTableRowLabel = Umetni red
+simplyhtml.insertTableTitle = Umetni tabelu
+simplyhtml.italicName = Uko\u0161eno
+simplyhtml.layoutTabTitle = Osnovni prikaz
+simplyhtml.leftLabel = Lijevo:
+simplyhtml.listDialogTitle = Oblik popisa
+simplyhtml.listIndentTitle = Uvlaka:
+simplyhtml.listPosInside = Iznutra
+simplyhtml.listPositionLabel = Pozicija:
+simplyhtml.listPosOutside = Izvana
+simplyhtml.listTypeCircle = Kru\u017ei\u0107
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = simbol datoteke kao graf.oznake
+simplyhtml.listTypeLabel = Tip:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = Ni\u0161ta
+simplyhtml.listTypeSquare = Kvadrat
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Izvana
+simplyhtml.matchApproximately = &Pribli\u017eno
+simplyhtml.matchApproximately.tooltip = <html>Omogu\u0107i pribli\u017eno uspore\u0111ivanje,<br/>primjer, pretra\u017eivanje "bakar" prona\u0107i \u0107e i "bakra".</html>
+simplyhtml.matchCase = Razlikuj velika i mala slova
+simplyhtml.matchCase.tooltip = Omogu\u0107i razlikovanje velikih i malih slova kod uspore\u0111ivanja.
+simplyhtml.newStyleDefaultName = Novi stil
+simplyhtml.nextTableCellLabel = Sljede\u0107a \u0107elija
+simplyhtml.noLineLabel = Ni\u0161ta
+simplyhtml.noMoreOccurrencesFound = nema vi\u0161e podudarnosti
+simplyhtml.okBtnName = Uredu
+simplyhtml.paddingLabel = Unutra
+simplyhtml.paraAlignCenterLabel = Poravnaj u sredinu
+simplyhtml.paraAlignCenterTip = Poravnavanje odlomka u sredinu
+simplyhtml.paraAlignLeftLabel = Poravnaj lijevo
+simplyhtml.paraAlignLeftTip = Poravnavanje odlomka ulijevo
+simplyhtml.paraAlignRightLabel = Poravnaj desno
+simplyhtml.paraAlignRightTip = Poravnavanje odlomka udesno
+simplyhtml.paraStyleDialogTitle = Stil odlomka
+simplyhtml.paraTabLabel = Odlomak
+simplyhtml.pasteHTMLLabel = Zalijepi HTML
+simplyhtml.pasteLabel = Zalijepi
+simplyhtml.pastePlainTextLabel = Zalijepi obi\u010dni tekst
+simplyhtml.pasteTip = Zalijepi
+simplyhtml.plainName = Obi\u010dan
+simplyhtml.previewLabel = Pretpregled
+simplyhtml.previewText = Tekst pretpregleda
+simplyhtml.prevTableCellLabel = Prethodna \u0107elija
+simplyhtml.printLabel = Ispis...
+simplyhtml.redoLabel = Ponovi
+simplyhtml.redoTip = Ponovi
+simplyhtml.replace = Zamijeni...
+simplyhtml.replaceAll = Sve
+simplyhtml.replaceDone = Gotovo
+simplyhtml.replaceNo = Ne
+simplyhtml.replaceThisQuery = Zamijeniti podudarnost s obzirom na
+simplyhtml.replaceWith = Zamijeni s:
+simplyhtml.replaceYes = Da
+simplyhtml.rightLabel = Desno:
+simplyhtml.searchDown = Tra\u017ei prema dolje
+simplyhtml.searchDown.tooltip = Tra\u017ei od vrha prema dnu.
+simplyhtml.searchFromStart = Tra\u017ei od po\u010detka
+simplyhtml.searchFromStart.tooltip = Po\u010dni tra\u017eiti od vrha, bez obzira na poziciju pokaziva\u010da na zaslonu.
+simplyhtml.searchUp = Tra\u017ei prema gore
+simplyhtml.searchUp.tooltip = Tra\u017ei od dna prema vrhu.
+simplyhtml.selectAllLabel = Odaberi sve
+simplyhtml.sizeLabel = Veli\u010dina
+simplyhtml.standardStyleName = Standardno
+simplyhtml.strikeLabel = Precrtano
+simplyhtml.styleLabel = Stil
+simplyhtml.styleNameInputText = Naziv novog stila?
+simplyhtml.styleNameInputTitle = Spremi stil
+simplyhtml.tableBgColLabel = Pozadinska boja:
+simplyhtml.tableDialogTitle = Oblik tabele
+simplyhtml.tableLabel = Tabela
+simplyhtml.tablePanelTitle = Oblik tabele
+simplyhtml.tableWidthLabel = \u0160irina:
+simplyhtml.textIndentLabel = Uvlaka:
+simplyhtml.textToFind = Tra\u017ei ovo:
+simplyhtml.thisCellRangeLabel = aktiv.\u0107elija
+simplyhtml.thisColRangeLabel = aktiv.stupac
+simplyhtml.thisRowRangeLabel = aktiv.red
+simplyhtml.toggleBulletsLabel = Uklju\u010di/ Isklju\u010di popis s oznakama
+simplyhtml.toggleBulletsTip = Uklju\u010di/ Isklju\u010di popis s oznakam
+simplyhtml.toggleNumbersLabel = Uklju\u010di/ Isklju\u010di broj\u010dani popis
+simplyhtml.toggleNumbersTip = Uklju\u010di/ Isklju\u010di broj\u010dani popis
+simplyhtml.topLabel = Gore:
+simplyhtml.uLineLabel = Podcrtano
+simplyhtml.unableToOpenFileError = Datoteka se ne mo\u017ee otvoriti
+simplyhtml.unableToRedoError = Ne mogu ponoviti:
+simplyhtml.unableToUndoError = Ne mogu poni\u0161titi:
+simplyhtml.undoLabel = Poni\u0161ti
+simplyhtml.undoTip = Poni\u0161ti
+simplyhtml.valignBaseline = Osnovna crta
+simplyhtml.valignBottom = Dolje
+simplyhtml.valignLabel = Okom.poravn.:
+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.tooltip = Razvrstavanje svih \u010dvora Djece abecednim redom.
+split = &Razdijeli
+SplitConditionAction.text = Razdijeli
+SplitNode.text = &Podijeli \u010dvor
+SplitNode.tooltip = <html>Dijeli trenutni \u010dvor na poziciji pokaziva\u010da mi\u0161a</html>
+STANDARD_FORMAT = Standard
+stop_processing = Stop
+StringFlavorHandler = Obi\u010dan tekst kao hijerarhija \u010dvorova
+StructuredHtmlFlavorHandler = HTML kao hijerarhija \u010dvorova
+style = Stil
+style_already_exists = Stil ve\u0107 postoji!
+styledialog.cancel.text = Otka\u017ei
+styledialog.ok.text = U redu
+styles = St&ilovi
+styles.AutomaticLayout = Automatsko oblikovanje
+styles.connection = Povezanost
+styles.date = Datum
+styles.definition = Definicija
+styles.description = Opis
+styles.floating_node = Slobodan \u010dvor
+styles.idea = Ideja
+styles.important = Va\u017eno
+styles.key = Klju\u010d
+styles.list = Popis
+styles.needs_action = Aktiviraj se
+styles.note = Bilje\u0161ka
+styles.ok = U redu
+styles.pending = Nerije\u0161eno
+styles.predefined = Unaprijed definirani stilovi
+styles.question = Pitanje
+styles.quotation = Citat
+styles.root_node = Stilovi
+styles.subsubtopic = Pod-podtema
+styles.subtopic = Podtema
+styles.topic = Glavna tema
+styles.user-defined = Korisni\u010dki definirani stilovi
+styles.website = WEB stranica
+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
+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>
+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
+ToggleStatusAction.text = Prika\u017ei statusnu traku
+ToggleToolbarAction.text = &Alatna traka
+undefined_error = Do\u0161lo je do neo\u010dekivane gre\u0161ke. Molim poku\u0161ajte poslati poruku o gre\u0161ci.
+underline = Podcrtano
+UnderlineAction.text = Podcrtano
+underlined = Podcrtano
+UndoAction.text = Poni\u0161ti
+UndoFilterAction.text = Poni\u0161ti
+unfold = Otvori \u010dvor
+UnfoldAllAction.text = Rasklopi sve
+UnfoldAllAction.tooltip = <html> Rasklopi sve odabrane \u010dvorove i njihovu Djecu.</html>
+UnfoldOneLevelAction.text = Rasklopi jednu razinu
+UnfoldOneLevelAction.tooltip = <html> Rasklopi odabrane \u010dvorove za jednu razinu.</html>
+up = &Gore
+update_failed = Nadogradnja neuspjela s porukom {0}
+UpdateCheckAction.text = Provjeri za nadogradnju
+updatecheckdialog = Dijalog provjere nadogradnje
+url_error = Ovaj URL je nepravilno oblikovan!
+url_open_error = Nemog otvoriti URL vezu {0}.
+used_in_menu = Ova tipkovni\u010dka kratica ne mo\u017ee biti postavljena jer se koristi kao kratica glavnog izbornika.
+UsePlainTextAction.text = Koristi jednostavan tekst
+user_config_folder = Konfiguracijska mapa korisnika: {0}
+user_defined_scale = Korisni\u010dki definirani omjer
+user_defined_zoom = Korisni\u010dki definirano.
+user_defined_zoom_status_bar = Izmjena pove\u0107anja na korisni\u010dki definiranu vrijednost {0}%.
+user_icon = Korisni\u010dka ikona "{0}"
+user_template_dir = Korisni\u010dki predlo\u0161ci
+user_zoom = Faktor pove\u0107anja ispisa (0.0 - 2.0):
+value_format = Oblik vrijednost
+version_up_to_date = Trenutno koristite najnoviju verziju programa
+ViewerControllerAction.text = Vanjski objekt...
+ViewLayoutTypeAction.OUTLINE.text = Op\u0107i pregled
+WebDocuAction.text = Web dokumentacija
+width = \u0160irina
+wrong_regexp = Pogre\u0161an RegEx "{0}", gre\u0161ka {1}
+xslt_export.html = HTML dokument
+xslt_export.latex = Latex dokument
+xslt_export.latexbook = Latex Knjigu
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 i vi\u0161i) XML format
+xslt_export.ms_project = MS Project (2003 i vi\u0161i) XML format
+xslt_export.ms_word = Word (2003 i vi\u0161i) XML format
+xslt_export.text = Jednostavan tekst
+xslt_export_not_possible = Freeplane XSLT izvoz nije mogu\u0107
+yes = &Da
+ZoomInAction.text = Pove\u0107aj
+ZoomOutAction.text = Smanji
diff --git a/freeplane/resources/translations/Resources_hu.properties b/freeplane/resources/translations/Resources_hu.properties
new file mode 100644
index 0000000..a684bf9
--- /dev/null
+++ b/freeplane/resources/translations/Resources_hu.properties
@@ -0,0 +1,390 @@
+AboutAction.text = N\u00E9vjegy
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/EncryptNode.properties_3 = Re-enter Password\:[translate me]
+accessories/plugins/EncryptNode.properties_6 = Rendben
+accessories/plugins/ExportWithXSLT.tooltip = Ez egy egyedi export\u00E1l\u00E1si lehet\u00F5s\u00E9g XSLT szkriptek haszn\u00E1lat\u00E1val.
+accessories/plugins/ExportWithXSLT_HTML.text = Export\u00E1l\u00E1s XHTML-k\u00E9nt (JavaScript verzi\u00F3)
+accessories/plugins/ExportWithXSLT_HTML3.text = Export\u00E1l\u00E1s XHTML-k\u00E9nt (m\u00E1sik verzi\u00F3, felh\u00F5kkel \u00E9s linkekkel)
+AddConnectorAction.text = Add Connector[translate me]
+AddLocalLinkAction.text = Helyi hiperlink hozz\u00E1ad\u00E1sa
+antialias_all = Mindent sim\u00EDtson
+antialias_edges = Sim\u00EDtsa az \u00E9leket
+antialias_none = Ne sim\u00EDtson
+as_parent = Sz\u00FCl\u0151k\u00E9nt
+attribute_delete_value = Delete this Value[translate me]
+attributes_dialog_title = Attribute Manager[translate me]
+attributes_edit_tooltip = Edit Set[translate me]
+attributes_skip_root = Skip Root Node[translate me]
+AutomaticLayoutAction.text = Automatikus megjelen\u00EDt\u00E9s
+AutomaticLayoutAction.tooltip = <html>A t\u00E9rk\u00E9p megjelen\u00E9s\u00E9t jav\u00EDtja. <br>K\u00E9rlek, ezt csak a gy\u00F6k\u00E9r elemen alkalmazd \u00E9s ut\u00E1n pr\u00F3b\u00E1lj n\u00E9h\u00E1ny gyerek elemet hozz\u00E1adni a t\u00E9rk\u00E9phez.<br> Az els\u0151 szint fekete, a m\u00E1sodik k\u00E9k lesz, stb..</html>
+BackAction.text = Vissza
+background = H\u00E1tt\u00E9r
+BlinkingNodeHookAction.text = Villog\u00F3 m\u00F3d
+BlinkingNodeHookAction.tooltip = <html>Ez egy dem\u00F3 c\u00E9lokat szolg\u00E1l\u00F3 java b\u0151v\u00EDtm\u00E9ny. L\u00E9gy \u00F3vatos. Ne alkalmazd t\u00FAls\u00E1gosan sok elemen, \u00E9s <strong>ne haszn\u00E1ld k\u00E9tszer vagy m\u00E1s b\u0151v\u00EDtm\u00E9nyekkel egy\u00FCtt ugyanazon az elemen.</strong></html>
+BoldAction.text = F\u00E9lk\u00F6v\u00E9r
+boldify_branch = F\u00E9lk\u00F6v\u00E9r\u00EDt\u00E9s
+branch = \u00C1g
+cancel = M\u00E9gsem
+CancelAction.text = M\u00E9gsem
+cannot_add_parent_diff_parents = Ehhez a funkci\u00F3hoz az elemeknek k\u00F6z\u00F6s sz\u00FCl\u00F5j\u00FCk kell hogy legyen.
+cannot_add_parent_to_root = A gy\u00F6k\u00E9r elem nem adhat\u00F3 hozz\u00E1 egy \u00FAj sz\u00FCl\u00F5h\u00F6z.
+cannot_join_nodes_with_children = Az elemeket nem lehet a gyermekeikkel egyes\u00EDteni
+cannot_move_to_child = Egy elemet nem lehet a gyerekei k\u00F6z\u00E9 \u00E1thelyezni.
+CenterAction.text = K\u00F6z\u00E9pre
+ChangeConnectorArrowsAction.backward.text = Vissza
+ChangeConnectorArrowsAction.forward.text = El\u0151re
+choose_background_color = V\u00E1laszd ki a h\u00E1tt\u00E9rsz\u00EDnt:
+choose_cloud_color = V\u00E1laszd ki a felh\u00F5sz\u00EDnt:
+choose_edge_color = V\u00E1laszd ki a keret sz\u00EDn\u00E9t:
+choose_node_background_color = V\u00E1laszd ki az elem h\u00E1tt\u00E9rsz\u00EDn\u00E9t:
+choose_node_color = V\u00E1laszd ki az elem sz\u00EDn\u00E9t:
+CloseAction.text = Bez\u00E1r\u00E1s
+CloudAction.text = Felh\u0151
+CloudColorAction.text = Felh\u0151 Sz\u00EDne
+combined = Kombin\u00E1lt
+connector_label = Connector Label[translate me]
+CopyAction.text = M\u00E1sol\u00E1s
+CopyIDAction.text = Copy Node ID[translate me]
+CopySingleAction.text = Egyetlen m\u00E1sol\u00E1sa
+CreationModificationPluginAction.text = M\u00F3dos\u00EDt\u00E1si id\u00F5k megjelen\u00EDt\u00E9se
+CreationModificationPluginAction.tooltip = <html>Ez egy jython b\u00F5v\u00EDtm\u00E9ny, amely folyamatosan figyeli az elemek l\u00E9trehoz\u00E1si \u00E9s m\u00F3dos\u00EDt\u00E1si idej\u00E9t.</html>
+CutAction.text = Kiv\u00E1g\u00E1s
+decrease_branch_font_size = Kisebb bet\u0171
+DecreaseNodeFontAction.text = Kisebb bet\u0171
+delete_child = Elem t\u00F6rl\u00E9se
+DeleteAction.text = Elem elt\u00E1vol\u00EDt\u00E1sa
+DocumentationAction.text = Dokument\u00E1ci\u00F3
+edge = Keret
+edge_style = Keret st\u00EDlusa
+edge_width = Keret sz\u00E9less\u00E9ge
+EdgeColorAction.text = Keret sz\u00EDne
+EdgeStyleAction.bezier.text = B\u00E9zier
+EdgeStyleAction.hide_edge.text = Hide Edge[translate me]
+EdgeStyleAction.linear.text = V\u00EDzszintes
+EdgeStyleAction.sharp_bezier.text = \u00C9les b\u00E9zier
+EdgeStyleAction.sharp_linear.text = \u00C9les line\u00E1ris
+EdgeStyleAsParentAction.text = Sz\u00FCl\u0151k\u00E9nt
+EdgeWidthAction_width_parent.text = Sz\u00FCl\u0151
+EdgeWidthAction_width_thin.text = V\u00E9kony
+edit = Szerkeszt\u00E9s
+edit_link_manually = Link szerkeszt\u00E9se k\u00E9zileg
+edit_long_node = Edit Long Node[translate me]
+edit_source_label = Edit Source Label[translate me]
+edit_target_label = Edit Target Label[translate me]
+EditAction.text = Elem szerkeszt\u00E9se
+EditLongAction.text = Hossz\u00FA elem szerkeszt\u00E9se
+enter_base_url = Most relat\u00EDv linkeket fogok beilleszteni. K\u00E9rlek, add meg a b\u00E1zis URL-t.
+enter_confirms = Az Enterrel meger\u00F5s\u00EDted
+error_creating_directory = Nem lehetett l\u00E9trehozni a k\u00F6nyvt\u00E1rat az export\u00E1l\u00E1shoz.
+export_pdf_text = Portable document format (PDF)
+export_svg_text = Scalable vector graphic (SVG)
+ExportAction.text = Export\u00E1l\u00E1s
+ExportBranchToHTMLAction.text = \u00C1g Export\u00E1l\u00E1sa HTML-k\u00E9nt
+ExportPdf.text = PDF-Export\u00E1l\u00E1s
+ExportSvg.text = SVG-Export\u00E1l\u00E1s
+ExportToHTMLAction.text = Export\u00E1l\u00E1s HTML-k\u00E9nt
+ExportToImage.jpg.text = JPEG-Export\u00E1l\u00E1s
+ExportToImage.png.text = PNG-Export\u00E1l\u00E1s
+extension_menu = Fizikai St\u00EDlus
+f_button_unassigned = <no action>[translate me]
+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_not_found = A(z) {0} f\u00E1jl nem tal\u00E1lhat\u00F3
+filter_contains = Contains[translate me]
+filter_exist = Exists[translate me]
+find_what = Keresend\u0151
+FindAction.text = Keres\u00E9s
+fit_map_to_page = F\u00E9rjen el egy oldalon
+FitToPage.text = Igaz\u00EDt\u00E1s az oldal m\u00E9ret\u00E9hez
+FitToPage.tooltip = Ez egy egyszer\u00FB java oszt\u00E1ly, ami teszteli a t\u00E9rk\u00E9p egyes lehet\u00F5s\u00E9geit
+fold = Behajt\u00E1s
+FoldAllAction.text = Minden behajt\u00E1sa
+FoldAllAction.tooltip = <html>Behajtja a kijel\u00F6lt elemeket a gyerekeikkel egy\u00FCtt.</html>
+FoldOneLevelAction.text = Egy szint behajt\u00E1sa
+FoldOneLevelAction.tooltip = <html>A kijel\u00F6lt elemeket hajtja be egy szinttel beljebb.</html>
+follow_graphical_link = Go to\:[translate me]
+font = Bet\u0171
+FontFamilyAction.text = bet\u0171csal\u00E1d
+FontSizeAction.text = bet\u0171m\u00E9ret
+format_menu_edge_styles = Edge Styles[translate me]
+FormatCopy.text = Form\u00E1tum m\u00E1sol\u00E1sa
+FormatCopy.tooltip = <html>Kim\u00E1solja egy elem form\u00E1tum\u00E1t.</html>
+FormatPaste.text = Form\u00E1tum beilleszt\u00E9se
+FormatPaste.tooltip = <html>Beilleszti a kim\u00E1solt form\u00E1tumot.</html>
+ForwardAction.text = El\u0151re
+freeplane_reverted = Freeplane_Reverted_[translate me]
+FreeplaneHelpStarter.text = Online S\u00FAg\u00F3
+FreeplaneHelpStarter.tooltip = Freeplane s\u00FAg\u00F3
+GotoLinkNodeAction.text = Ugr\u00E1s linkre
+GrabKeyDialog.common.ok = Rendben
+help = S\u00FAg\u00F3
+HotKeyInfoAction.text = Key Reference[translate me]
+html_export_based_on_headings = HTML Export\u00E1l\u00E1s - A fejl\u00E9cek alapj\u00E1n
+html_export_fold_all = HTML Export\u00E1l\u00E1s - Mindet behajtva
+html_export_fold_currently_folded = HTML Export\u00E1l\u00E1s - A jelenlegi hajt\u00E1sok alapj\u00E1n
+html_export_no_folding = HTML Export\u00E1l\u00E1s - Behajt\u00E1s n\u00E9lk\u00FCl
+icon_100% = 100%[translate me]
+icon_25% = 25%[translate me]
+icon_50% = 50%[translate me]
+icon_75% = 75%[translate me]
+icon_attach = N\u00E9zz ide
+icon_back = Vissza
+icon_bee = Freeplane[translate me]
+icon_bell = Eml\u00E9keztet\u0151
+icon_bookmark = Kiv\u00E1l\u00F3
+icon_button_cancel = Nincs Rendben
+icon_button_ok = Rendben
+icon_clanbomber = Vesz\u00E9lyes
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Nem elfelejteni
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Z\u00E1szl\u00F3
+icon_flag-black = Black Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_forward = El\u0151re
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-7 = Priority 7[translate me]
+icon_full-8 = Priority 8[translate me]
+icon_gohome = Otthon
+icon_help = K\u00E9rd\u00E9s
+icon_idea = \u00D6tlet
+icon_kaddressbook = Telefon
+icon_kmail = E-Mail[translate me]
+icon_knotify = Zene
+icon_korn = Postal\u00E1da
+icon_ksmiletris = Boldog vagyok
+icon_licq = Sz\u00E9p
+icon_Mail = Posta
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Ikonok
+icon_messagebox_warning = Fontos
+icon_password = Kulcs
+icon_pencil = Jobban kidolgozni
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smiley-oh = Surprising[translate me]
+icon_stop = Meg\u00E1llj
+icon_stop-sign = Stop[translate me]
+icon_wizard = Var\u00E1zslat
+icon_xmag = Megbesz\u00E9lni
+icon_yes = Fontos
+IconSelectionPlugin.text = Ikon kiv\u00E1laszt\u00E1sa
+IconSelectionPlugin.tooltip = <html>Ez egy java b\u00F5v\u00EDtm\u00E9ny az ikon kiv\u00E1laszt\u00E1shoz.</html>
+import = Import\u00E1l\u00E1s
+import_linked_branch_no_link = A kijel\u00F6lt elemek nem tartalmaznak export\u00E1lhat\u00F3 linkeket.
+ImportBranchAction.text = \u00C1g import\u00E1l\u00E1sa
+ImportExplorerFavoritesAction.text = A b\u00F6ng\u00E9sz\u00F5 kedvenceinek import\u00E1l\u00E1sa
+ImportFolderStructureAction.text = K\u00F6nyvt\u00E1rszerkezet import\u00E1l\u00E1sa
+ImportLinkedBranchAction.text = Linkelt \u00E1g import\u00E1l\u00E1sa
+ImportLinkedBranchWithoutRootAction.text = Import\u00E1l\u00E1s gy\u00F6k\u00E9relem n\u00E9lk\u00FCl
+increase_branch_font_size = Nagyobb bet\u0171
+IncreaseNodeFontAction.text = Nagyobb bet\u0171
+ItalicAction.text = D\u0151lt
+italicise_branch = D\u0151ltt\u00E9
+JoinNodesAction.text = Elemek egyes\u00EDt\u00E9se
+less_than_two_selected_nodes = Linkek l\u00E9trehoz\u00E1s\u00E1hoz legal\u00E1bb k\u00E9t elemet kell kijel\u00F6ln\u00F6d.
+link_not_available_any_more = A link m\u00E1r nem \u00E9rv\u00E9nyes. A k\u00F6zbens\u0151 elem t\u00F6r\u00F6lve lett.
+locking_failed_by_open = A(z) {0} t\u00E9rk\u00E9p lez\u00E1r\u00E1sa sikertelen volt. Megnyitom csak-olvashat\u00F3k\u00E9nt.
+locking_failed_by_save_as = A(z) {0} t\u00E9rk\u00E9p lez\u00E1r\u00E1sa sikertelen volt. A Ment\u00E9s ez\u00E9rt le lett \u00E1ll\u00EDtva.
+locking_old_lock_removed = A(z) {0} t\u00E9rk\u00E9pet {1} m\u00E1r lez\u00E1rta. A z\u00E1r el lett t\u00E1vol\u00EDtva, mivel m\u00E1r nem \u00E9rv\u00E9nyes.
+long_node_changed_cancel = Megv\u00E1ltoztattad az elemet. Szeretn\u00E9d elvetni a v\u00E1ltoztat\u00E1sokat?
+lots_of_links_warning = Egyszerre sok linket szeretn\u00E9l l\u00E9trehozni egy adott elemhez. T\u00E9nyleg szeretn\u00E9d l\u00E9trehozni ezeket a linkeket?
+map_already_exists = A t\u00E9rk\u00E9p m\u00E1r l\u00E9tezik. Szeretn\u00E9d fel\u00FCl\u00EDrni?
+map_corrupted = A t\u00E9rk\u00E9p hib\u00E1s. \u00C9rdekelnek a r\u00E9szletek?
+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.
+menu_extras = Eszk\u00F6z\u00F6k
+menu_file_import = Import\u00E1l\u00E1s
+menu_format = Form\u00E1tum
+menu_insert = Beilleszt\u00E9s
+menu_navigate = Navig\u00E1l\u00E1s
+menu_view = N\u00E9zet
+mindmap = T\u00E9rk\u00E9p
+mindmaps = T\u00E9rk\u00E9pek
+mindmaps_desc = T\u00E9rk\u00E9pek (*.mm)
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Az \u00FCzemm\u00F3d nem el\u00E9rhet\u00F5
+mode_status = Az \u00FCzemm\u00F3d \u00E1t lett \u00E1ll\u00EDtva - {0} \u00FCzemm\u00F3d
+mode_title = Freeplane - {0} \u00FCzemm\u00F3d
+modes = M\u00F3dok
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Legut\u00F3bbi f\u00E1jlok
+MoveToRootAction.text = \u00C1thelyez\u00E9s a gy\u00F6k\u00E9rhez
+NavigationNextMapAction.text = K\u00F6vetkez\u0151 t\u00E9rk\u00E9p
+NavigationPreviousMapAction.text = El\u00F5z\u00F5 T\u00E9rk\u00E9p
+new_mindmap = \u00DAj Elmet\u00E9rk\u00E9p
+new_node = \u00DAj elem
+new_node_as_sibling_not_possible_for_the_root = A gy\u00F6k\u00E9r elemnek nem hozhat\u00F3 l\u00E9tre testv\u00E9r eleme
+NewChildAction.text = \u00DAj gyerek elem
+NewMapAction.text = \u00DAj
+NewParentNode.text = \u00DAj sz\u00FCl\u00F5 elem
+NewParentNode.tooltip = <html>Minden kijel\u00F6lt elem \u00FAj sz\u00FCl\u00F5 al\u00E1 ker\u00FCl.</html>
+NewPreviousSiblingAction.text = \u00DAj el\u00F5z\u00F5 testv\u00E9r elem
+NewSiblingAction.text = \u00DAj testv\u00E9r elem
+no = Nem
+no_format_copy_before_format_paste = Nem tudsz form\u00E1tumot beilleszteni, am\u00EDg nem m\u00E1solt\u00E1l ki egyet.
+no_found_from = Nem tal\u00E1lhat\u00F3 "{0}" itt: "{1}".
+no_more_found_from = Nem tal\u00E1lhat\u00F3 t\u00F6bb "{0}" itt: "{1}".
+no_previous_find = Nem tal\u00E1lhat\u00F3 el\u00F5z\u00F5.
+node = Elem
+node_changed_discard_changes = Megv\u00E1ltoztattad az elemet. Szeretn\u00E9d elvetni a v\u00E1ltoztat\u00E1sokat?
+NodeBackgroundColorAction.text = Elem h\u00E1tt\u00E9rsz\u00EDne
+NodeColorAction.text = Elem Sz\u00EDne
+NodeColorBlendAction.text = Kit\u00F6lt\u00E9s sz\u00EDne
+NodeDownAction.text = Elem le
+NodeShapeAction.bubble.text = Bubor\u00E9k
+NodeShapeAction.fork.text = El\u00E1gaz\u00E1s
+NodeUpAction.text = Elem fel
+nonboldify_branch = F\u00E9lk\u00F6v\u00E9r ki
+nonitalicise_branch = D\u00F5lt ki
+normal = Norm\u00E1l
+not_saved_for_link_error = Miel\u00F5tt linket v\u00E1laszthatn\u00E1l a f\u00E1jlv\u00E1laszt\u00F3b\u00F3l, a t\u00E9rk\u00E9pet el kell menteni!
+ok = Rendben
+OKAction.text = Rendben
+OpenAction.text = Megnyit\u00E1s
+OpenFreeplaneSiteAction.text = Freeplane's Homepage[translate me]
+OpenPathAction.text = Open File[translate me]
+OptionPanel.antialias = Antialias[translate me]
+OptionPanel.antialias_all = Mindent sim\u00EDtson
+OptionPanel.antialias_edges = Sim\u00EDtsa az \u00E9leket
+OptionPanel.ar = Ar[translate me]
+OptionPanel.automatic = Automatic[translate me]
+OptionPanel.automaticFormat_level1 = Root Node Format[translate me]
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.clear_all_setters = Switch all[translate me]
+OptionPanel.combined = Kombin\u00E1lt
+OptionPanel.de = De[translate me]
+OptionPanel.default_browser_command_mac = Default Browser Command Mac[translate me]
+OptionPanel.default_browser_command_windows_9x = Default Browser Command Windows 9x[translate me]
+OptionPanel.edgecolor = Edge color[translate me]
+OptionPanel.edgestyle = Edge style[translate me]
+OptionPanel.edgewidth = Edge width[translate me]
+OptionPanel.el = El[translate me]
+OptionPanel.el__max_default_window_height = Max Default Window Height[translate me]
+OptionPanel.el__max_default_window_width = Max Default Window Width[translate me]
+OptionPanel.el__min_default_window_height = Min Default Window Height[translate me]
+OptionPanel.el__min_default_window_width = Min Default Window Width[translate me]
+OptionPanel.HTML = HTML[translate me]
+OptionPanel.html_export_fold_all = Minden behajt\u00E1sa
+OptionPanel.html_export_folding = Html Export Folding[translate me]
+OptionPanel.nn = Nn[translate me]
+OptionPanel.nodetext = Node text[translate me]
+OptionPanel.pt_BR = Pt BR[translate me]
+OptionPanel.pt_PT = Pt PT[translate me]
+OptionPanel.relative = Relative[translate me]
+OptionPanel.revision_color = Revision Color[translate me]
+OptionPanel.separator.anti_alias = Antialias[translate me]
+OptionPanel.separator.html_export = Html Export[translate me]
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.inline_editor = In-line node editor[translate me]
+OptionPanel.separator.key_typing = Key Typing[translate me]
+OptionPanel.separator.NodeFont = Node Font[translate me]
+OptionPanel.separator.undo = Visszavon\u00E1s
+OptionPanel.standardcloudcolor = Standard Cloud Color[translate me]
+OptionPanel.standardcloudestyle = Standard Cloud Style[translate me]
+OptionPanel.standardlinkestyle = Standard Link Style[translate me]
+OptionPanel.standardselectednodecolor = Standard Selected Node Color[translate me]
+OptionPanel.sv = Se[translate me]
+OptionPanel.undefined_font = Undefined font[translate me]
+OptionPanel.undo_levels = Undo Levels[translate me]
+OptionPanel.use_tabbed_pane = Use Tabs[translate me]
+OptionPanel.zh_CN = Zh CN[translate me]
+OptionPanel.zh_TW = Zh[translate me]
+PageAction.text = Oldalbe\u00E1ll\u00EDt\u00E1s...
+PasteAction.text = Beilleszt\u00E9s
+PatternToString.Child = Child Node Style[translate me]
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Keret st\u00EDlusa
+PatternToString.EdgeWidth = Keret sz\u00E9less\u00E9ge
+PatternToString.FontBold = F\u00E9lk\u00F6v\u00E9r
+plugins/ScriptEditor/window.title = Script Editor[translate me]
+plugins/TimeManagement.xml_Goto = Goto[translate me]
+plugins/TimeManagement.xml_WindowTitle = Time Management[translate me]
+preferences = Be\u00E1ll\u00EDt\u00E1sok
+PrintAction.text = Nyomtat\u00E1s...
+PrintDirectAction.text = Nyomtat\u00E1s
+printing_settings = Nyomtat\u00E1s m\u00E9retez\u00E9se
+PropertyAction.text = Preferences ...[translate me]
+QuitAction.text = Kil\u00E9p\u00E9s
+read_only = Csak olvashat\u00F3
+RedoAction.text = \u00DAjra
+RedoFilterAction.text = \u00DAjra
+RemoveAllIconsAction.text = \u00D6sszes ikon elt\u00E1vol\u00EDt\u00E1sa
+RemoveIconAction.text = Utols\u00F3 ikon elt\u00E1vol\u00EDt\u00E1sa
+repair_link = Link jav\u00EDt\u00E1sa
+repair_link_question = Nem lehet bet\u00F6lteni a linkelt t\u00E9rk\u00E9pet. Kijav\u00EDtod a linket k\u00E9zileg?
+RequestFeatureAction.text = Request a Feature[translate me]
+ResetNodeLocationAction.text = Reset Position[translate me]
+save_failed = A(z) {0} t\u00E9rk\u00E9p ment\u00E9se sikertelen volt.
+save_unsaved = Ments\u00FCk a k\u00F6vetkez\u00F5 elmet\u00E9rk\u00E9pet? :
+SaveAction.text = Ment\u00E9s
+SaveAsAction.text = Ment\u00E9s mint
+saved = Mentve
+saving_canceled = Saving canceled[translate me]
+scheme_evaluate = Hozz\u00E1rendel!
+select_favorites_folder = V\u00E1laszd ki a mapp\u00E1t, ahol a kedvencek tal\u00E1lhat\u00F3ak
+select_folder_for_importing = V\u00E1laszd ki az import\u00E1land\u00F3 mapp\u00E1t
+selection_method_by_click = Klikk a kijel\u00F6l\u00E9shez
+selection_method_direct = R\u00E1mutat\u00E1s a kijel\u00F6l\u00E9shez
+SetImageByFileChooserAction.text = K\u00E9p be\u00E1ll\u00EDt\u00E1sa (F\u00E1jl#v\u00E1laszt\u00F3 vagy Link)
+SetLinkByFileChooserAction.text = Link be\u00E1ll\u00EDt\u00E1sa (F\u00E1jlv\u00E1laszt\u00F3)
+SetLinkByTextFieldAction.text = Link be\u00E1ll\u00EDt\u00E1sa (Sz\u00F6vegmez\u00F5)
+simplyhtml.appendTableColLabel = Append col[translate me]
+simplyhtml.borderWidthLabel = Sz\u00E9less\u00E9g
+simplyhtml.copyLabel = M\u00E1sol\u00E1s
+simplyhtml.cTagNameHead3 = Heading 3[translate me]
+simplyhtml.cTagNameHead4 = Heading 4[translate me]
+simplyhtml.cutLabel = Kiv\u00E1g\u00E1s
+simplyhtml.fontBoldLabel = F\u00E9lk\u00F6v\u00E9r
+simplyhtml.fontItalicLabel = D\u0151lt
+simplyhtml.fontTabLabel = Bet\u0171
+simplyhtml.fontUnderlineLabel = Al\u00E1h\u00FAz\u00E1s
+simplyhtml.helpLabel = S\u00FAg\u00F3
+simplyhtml.nextTableCellLabel = Next cell[translate me]
+simplyhtml.okBtnName = Rendben
+simplyhtml.pasteLabel = Beilleszt\u00E9s
+simplyhtml.redoLabel = \u00DAjra
+simplyhtml.replaceNo = Nem
+simplyhtml.replaceYes = Igen
+simplyhtml.styleLabel = St\u00EDlus
+simplyhtml.tableDialogTitle = Format Table[translate me]
+simplyhtml.topLabel = top\:[translate me]
+simplyhtml.uLineLabel = Al\u00E1h\u00FAz\u00E1s
+simplyhtml.undoLabel = Visszavon\u00E1s
+split = Sz\u00E9tv\u00E1g\u00E1s
+SplitNode.text = Split Node[translate me]
+style = St\u00EDlus
+svg = SVG[translate me]
+ToggleChildrenFoldedAction.text = Gyerek (Ki/be)hajt\u00E1sa
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Behajt\u00E1s ki/be
+ToggleLeftToolbarAction.text = Baloldali eszk\u00F6zt\u00E1r ki/be
+ToggleMenubarAction.text = Men\u00FCsor ki/be
+ToggleToolbarAction.text = Eszk\u00F6zt\u00E1r ki/be
+undefined_error = V\u00E1ratlan hiba l\u00E9pett fel. K\u00E9rlek, pr\u00F3b\u00E1ld meg jelenteni a hib\u00E1t.
+underline = Al\u00E1h\u00FAz\u00E1s
+underlined = Al\u00E1h\u00FAz\u00E1s
+UndoAction.text = Visszavon\u00E1s
+UndoFilterAction.text = Visszavon\u00E1s
+unfold = Kihajt\u00E1s
+UnfoldAllAction.text = Minden kihajt\u00E1sa
+UnfoldAllAction.tooltip = <html>Kihajtja a kijel\u00F6lt elemeket a gyerekeikkel egy\u00FCtt.</html>
+UnfoldOneLevelAction.text = Egy szint kihajt\u00E1sa
+UnfoldOneLevelAction.tooltip = <html>A kijel\u00F6lt elemeket hajtja ki egy szinttel kijjebb.</html>
+url_error = Az URL hib\u00E1s form\u00E1tum\u00FA!
+url_load_error = Nem lehet a t\u00E9rk\u00E9pet err\u00F5l az URL-r\u00F5l bet\u00F6lteni:
+user_defined_zoom = Tetsz\u00F5leges.
+user_defined_zoom_status_bar = A nagy\u00EDt\u00E1si \u00E9rt\u00E9k az \u00E1ltalad v\u00E1lasztott {0}%-ra lett \u00E1ll\u00EDtva.
+user_zoom = Nyomtatand\u00F3 nagy\u00EDt\u00E1si \u00E9rt\u00E9k (0.0 - 2.0):
+width = Sz\u00E9less\u00E9g
+yes = Igen
+ZoomInAction.text = Nagy\u00EDt\u00E9s
+ZoomOutAction.text = Kicsiny\u00EDt\u00E9s
diff --git a/freeplane/resources/translations/Resources_id.properties b/freeplane/resources/translations/Resources_id.properties
new file mode 100644
index 0000000..211c5de
--- /dev/null
+++ b/freeplane/resources/translations/Resources_id.properties
@@ -0,0 +1,973 @@
+AboutAction.text = Tentang
+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.
+accessories/plugins/EncryptNode.properties_1 = Kata sandi tidak sama atau terlalu pendek.
+accessories/plugins/EncryptNode.properties_2 = Ketikkan Kata Sandi:
+accessories/plugins/EncryptNode.properties_3 = Ketikkan lagi Kata Sandi:
+accessories/plugins/EncryptNode.properties_4 = Ketikkan kata sandi Anda.
+accessories/plugins/EncryptNode.properties_5 = <html>Ingat, keamanan enkripsi bergantung hampir<br> sepenuhnya pada kualitas kata sandi Anda.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Batal
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Operasi ini hanya dapat dilakukan pada node yang terenkripsi. Mohon sisipkan node terenkripsi dari menu Alat.
+accessories/plugins/EncryptNode.properties_select_me = Pilih saya untuk melanjutkan!
+accessories/plugins/EncryptNode.properties_wrong_password = Kata Sandi tidak benar.
+accessories/plugins/ExportWithTWiki.text = Sebagai TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Ekspor peta sebagai dokumen TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Metode ekspor universal menggunakan skrip XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Sebagai Applet Java...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Ekspor peta sebagai applet Java
+accessories/plugins/ExportWithXSLT_Flash.text = Sebagai Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Ekspor peta sebagai aplikasi Flash
+accessories/plugins/ExportWithXSLT_HTML.text = Sebagai XHTML (versi JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Sebagai XHTML (versi gambar peta yang dapat diklik)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Sumberdaya dari SUMBERDAYA ke berkas Pemutar Tugas...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Ekspor sumberdaya dari node SUMBERDAYA ke modul Pemutar Tugas. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tugas dari TUGAS ke berkas Pemutar Tugas...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Ekspor tugas dari node TUGAS ke modul Pemutar Tugas. </html>
+add = Tambah
+AddLocalLinkAction.text = Tambahkan Hipertaut Lokal
+antialias_all = Antialias Semua
+antialias_edges = Antialias Tangkai
+antialias_none = Tanpa Antialias
+apply = Terapkan
+ApplyAction.text = Terapkan
+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...
+attribute_delete = Hapus Semua Nilai
+attribute_delete_value = Hapus Nilai Ini
+attribute_font_size_tooltip = Atribut Ukuran Font
+attribute_list_box_label_text = Nilai yang Telah Ada
+attribute_replace = Ganti dengan
+attribute_top = Semua Atribut untuk Peta Termuat
+attributes_adding_empty_attribute_error = String kosong tidak dapat digunakan sebagai nama atribut
+attributes_all = Semua Atribut
+attributes_attribute = Atribut
+attributes_close = Tutup
+attributes_deselect_all = Nihil
+attributes_dialog_title = Kelola Atribut
+attributes_edit = Edit
+attributes_edit_tooltip = Edit Set
+attributes_for_selected = Node Terpilih
+attributes_for_visible = Semua Node Terlihat
+attributes_import = Impor
+attributes_import_tooltip = Impor atribut dari peta lain yang termuat.
+attributes_no_import_candidates_found = Atribut baru tidak ditemukan
+attributes_popup_delete = Hapus
+attributes_popup_down = Turun
+attributes_popup_edit = Edit
+attributes_popup_hide = Sembunyikan
+attributes_popup_new = Atribut Baru
+attributes_popup_optimal_width = Lebar Optimal
+attributes_popup_up = Naik
+attributes_refresh = Segarkan
+attributes_restricted_attributes_tooltip = Batasi Set Atribut
+attributes_restricted_values_tooltip = Batasi Set Nilai-nilai untuk Atribut Ini
+attributes_restriction = Set Terbatas
+attributes_select_all = Semua
+attributes_select_all_tooltip = Pilih/Batal Pilih
+attributes_show = Tampilkan
+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.tooltip = <html>Menetapkan atak peta. <br>Level pertama hitam, kedua biru, dst.</html>
+BackAction.text = Mundur
+BackAction.tooltip = Lompat ke belakang dalam rantai terpilih
+background = Latar Belakang
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = Node Berkedip
+BlinkingNodeHookAction.tooltip = <html>Buat node berkedip. Hati-hati. Jangan gunakan pada banyak node, dan <strong> jangan gunakan sekaligus dengan pemformatan otomatis yang lain.</strong></html>
+BoldAction.text = Tebal
+boldify_branch = Tebalkan
+branch = Cabang
+cancel = Batal
+CancelAction.text = Batal
+cannot_add_parent_diff_parents = Semua node harus memiliki induk yang sama untuk fungsi ini.
+cannot_add_parent_to_root = Node akar tidak dapat ditambahkan ke induk baru.
+cannot_delete_root = Node akar tidak dapat dicopot atau dipotong.
+cannot_join_nodes_with_children = Node yang punya anak tidak dapat digabung
+cannot_move_to_child = Node tidak dapat dipindahkan ke bawah anaknya sendiri.
+CenterAction.text = Tengah
+ChangeConnectorArrowsAction.backward.text = Mundur
+ChangeConnectorArrowsAction.forward.text = Maju
+ChangeNodeLevelLeftsAction.text = Node ke kiri
+ChangeNodeLevelLeftsAction.tooltip = Di sebelah kiri akar, node digeser ke bawah. Mereka menjadi anak dari saudaranya sendiri. Di sebelah kanan akar, node digeser ke atas. Tepat di akar, node bertukar sisi.
+ChangeNodeLevelRightsAction.text = Node ke kanan
+ChangeNodeLevelRightsAction.tooltip = Di sebelah kanan akar, node digeser ke bawah. Mereka menjadi anak dari saudaranya sendiri. Di sebelah kiri akar, node digeser ke atas. Tepat di akar, node bertukar sisi.
+choose_background_color = Pilih Warna Latar Belakang:
+choose_cloud_color = Pilih Warna Awan:
+choose_edge_color = Pilih Warna Tangkai
+choose_node_background_color = Pilih Warna Latar Belakang Node:
+choose_node_color = Pilih Warna Node:
+CloseAction.text = Tutup
+CloudAction.text = Awan
+CloudColorAction.text = Warna Awan...
+ColorProperty.ResetColor = Tata-ulang Warna
+combined = Gabungan
+confirmation = Konfirmasi
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Salin
+CopySingleAction.text = Salin Tunggal
+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
+DecreaseNodeFontAction.text = Perkecil Font
+delete = Hapus
+delete_child = Hapus Node
+DeleteAction.text = Copot Node
+DeleteConditionAction.text = Hapus
+DocumentationAction.text = Dokumentasi
+edge = Tangkai
+edge_style = Gaya Tangkai
+edge_width = Lebar Tangkai
+EdgeColorAction.text = Warna Tangkai...
+EdgeStyleAction.bezier.text = Kurva Bezier
+EdgeStyleAction.horizontal.text = Horizontal[translate me]
+EdgeStyleAction.linear.text = Garis Lurus
+EdgeStyleAction.sharp_bezier.text = Kurva Bezier Tajam
+EdgeStyleAction.sharp_linear.text = Garis Lurus Tajam
+EdgeStyleAsParentAction.text = Seperti Induknya
+EdgeWidthAction_width_parent.text = Induk
+EdgeWidthAction_width_thin.text = Tipis
+edit = &Edit
+edit.decision = Editor HTML
+edit.edit_rich_text = Apakah Anda ingin menggunakan pemformatan seperti tebal atau miring?
+edit_link_manually = Edit Hipertaut secara Manual
+edit_long_node = Edit Long Node[translate me]
+edit_source_label = Edit Source Label[translate me]
+edit_target_label = Edit Target Label[translate me]
+EditAction.text = Edit Node
+EditAttributesAction.text = Edit Atribut
+EditFilterAction.text = Edit
+EditLongAction.text = Edit Node Panjang
+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
+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
+ExportBranchToHTMLAction.text = Cabang sebagai HTML
+ExportPdf.text = Sebagai PDF...
+ExportSvg.text = Sebagai SVG...
+ExportToHTMLAction.text = Sebagai HTML
+ExportToImage.jpg.text = Sebagai JPEG...
+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
+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_add = Tambah
+filter_and = And (Dan)
+filter_conditions = Filter
+filter_contains = Mengandung
+filter_delete = Hapus
+filter_dialog = Penyusun Filter
+filter_does_not_exist = Tak Ada
+filter_edit_description = Edit Senarai Filter
+filter_enter_value = Ketikkan Nilai
+filter_exist = Ada
+filter_icon = Ikon
+filter_is_equal_to = Sama dengan
+filter_is_not_equal_to = Tak sama dengan
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Tanpa Filter
+filter_node = Teks Node
+filter_not = Not (Negasi)
+filter_or = Or (Atau)
+filter_select = Pilih
+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.tooltip = Sesuaikan zum hingga seluruh peta tertampilkan dalam jendela ini.
+fold = Lipat
+FoldAllAction.text = Lipat Semua
+FoldAllAction.tooltip = <html>Lipat node terpilih dan semua anaknya..</html>
+FoldOneLevelAction.text = Lipat Satu Level
+FoldOneLevelAction.tooltip = <html>Lipat node terpilih satu level.</html>
+follow_graphical_link = Pergi ke:
+FollowLinkAction.text = Buka Hipertaut
+font = Font
+FontFamilyAction.text = font
+FontSizeAction.text = ukuran font
+format_menu_edge_styles = Gaya &Tangkai
+format_menu_edge_widths = &Lebar Tangkai
+FormatCopy.text = Salin Format
+FormatCopy.tooltip = <html>Menyalin pemformatan node.</html>
+FormatPaste.text = Tempel Format
+FormatPaste.tooltip = <html>Menempelkan pemformatan node.</html>
+ForwardAction.text = Maju
+ForwardAction.tooltip = Lompat ke depan dalam rantai terpilih
+Freeplane.progress.buildScreen = Bangun Layar...
+Freeplane.progress.createController = Buat Pengendali...
+Freeplane.progress.createInitialMode = Buat Modus Inisial...
+Freeplane.progress.endStartup = Proses Memulai Selesai.
+Freeplane.progress.gettingPreferenceDirectories = Mengambil Direktori Preferensi...
+Freeplane.progress.gettingPreferences = Mengambil Preferensi...
+Freeplane.progress.loadMaps = Muat Peta...
+Freeplane.progress.propagateLookAndFeel = Terapkan Cita dan Rasa secara Menyeluruh...
+Freeplane.progress.settingPreferences = Setel Preferensi...
+Freeplane.progress.startCreateController = Mulai Buat Pengendali...
+Freeplane.progress.updateLookAndFeel = Mutakhirkan Cita dan Rasa...
+freeplane_reverted = Freeplane Dimuat Ulang
+FreeplaneHelpStarter.text = Bantuan...
+FreeplaneHelpStarter.tooltip = Bantuan Lebih Jauh Freeplane
+GotoLinkNodeAction.text = Pergi ke Taut
+GrabKeyDialog.common.cancel = Batal
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Dipasangkan ke
+GrabKeyDialog.grab-key.assigned-to.none = Saat ini tidak dipasangkan
+GrabKeyDialog.grab-key.clear = Bersihkan
+GrabKeyDialog.grab-key.remove = Copot
+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.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
+html_export_fold_all = Ekspor HTML - Tutup Semua Lipatan
+html_export_fold_currently_folded = Ekspor HTML - Biarkan Lipatan Apa Adanya
+html_export_no_folding = Ekspor HTML - Tanpa Lipatan
+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]
+icon_attach = Lihat sini
+icon_back = Mundur
+icon_bee = Freeplane[translate me]
+icon_bell = Pengingat
+icon_bookmark = Sangat bagus
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Batal
+icon_button_ok = OK
+icon_calendar = Tanggal
+icon_clanbomber = Bahaya
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Jangan lupa
+icon_down = Turun
+icon_edit = Refine[translate me]
+icon_family = Keluarga
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Bendera
+icon_flag-black = Black Flag[translate me]
+icon_flag-blue = Blue Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_forward = Maju
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioritas 1
+icon_full-2 = Prioritas 2
+icon_full-3 = Prioritas 3
+icon_full-4 = Prioritas 4
+icon_full-5 = Prioritas 5
+icon_full-6 = Prioritas 6
+icon_full-7 = Prioritas 7
+icon_gohome = Rumah
+icon_group = Group[translate me]
+icon_help = Pertanyaan
+icon_idea = Ide
+icon_info = Info[translate me]
+icon_kaddressbook = Telepon
+icon_kmail = E-Mail[translate me]
+icon_knotify = Musik
+icon_korn = Kotak surat
+icon_ksmiletris = Saya senang
+icon_licq = Bagus
+icon_Mail = Surat
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = I&kon
+icon_messagebox_warning = Penting
+icon_password = Kunci
+icon_pencil = Untuk diperbaiki
+icon_penguin = Linux
+icon_smily_bad = Saya tidak senang
+icon_stop = Stop
+icon_up = Naik
+icon_wizard = Ajaib
+icon_xmag = Untuk dibicarakan
+icon_yes = Penting
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+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_linked_branch_no_link = Node terpilih tidak bertaut pada sesuatu yang dapat diimpor.
+ImportAction.text = Impor
+ImportBranchAction.text = Cabang...
+ImportExplorerFavoritesAction.text = Favorit dari Explorer...
+ImportFolderStructureAction.text = Struktur Map...
+ImportLinkedBranchAction.text = Cabang Bertaut
+ImportLinkedBranchWithoutRootAction.text = (Cabang Bertaut) Tanpa Akarnya
+ImportMindmanagerFiles.text = Peta MindManager X5...
+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
+load = Muat
+locking_failed_by_open = Penguncian peta {0} gagal. Dibuka untuk baca-saja.
+locking_failed_by_save_as = Penguncian peta {0} gagal. Perintah Simpan Sebagai dibatalkan.
+locking_old_lock_removed = Peta {0} dikunci oleh pemakai {1}. Penguncian dilepaskan karena sudah usang.
+long_node_changed_cancel = Node telah diubah. Anda ingin membatalkan perintah ini?
+long_node_changed_submit = Node telah diubah. Anda ingin menyimpan perubahannya?
+lots_of_links_warning = Anda akan membuat banyak sekali tautan ke node yang sama. Benarkah Anda menghendaki tautan-tautan ini?
+map_already_exists = Peta sudah ada. Anda ingin menimpanya?
+map_corrupted = Peta rusak. Lihat detail?
+map_locked_by_open = Peta {0} sedang diedit oleh pemakai {1}. Dibuka untuk baca-saja.
+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)
+mindmaps_filter_desc = Filter (*.mmfilter)
+mode_Browse = Browse Mode[translate me]
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Modus tak tersedia
+mode_status = Modus diubah ke Modus {0}
+mode_title = Freeplane - Modus {0}
+modes = Modus
+ModesMenuAction.File.text = File Explorer[translate me]
+most_recent_files = Be&rkas Terkini
+MoveToRootAction.text = Pergi ke Akar
+NavigationNextMapAction.text = Peta Berikutnya
+NavigationPreviousMapAction.text = Peta Sebelumnya
+new_mindmap = Peta Baru
+new_node = Node Baru
+new_node_as_sibling_not_possible_for_the_root = Node baru sebagai kakak/adik tidak dimungkinkan untuk node akar
+NewChildAction.text = Node Anak Baru
+NewMapAction.text = Baru
+NewParentNode.text = Node Induk Baru
+NewParentNode.tooltip = <html>Semua node terpilih dipindahkan ke induk yang baru.</html>
+NewPreviousSiblingAction.text = Node Kakak Baru
+NewSiblingAction.text = Node Adik Baru
+NextNodeAction.FORWARD.text = Next node[translate me]
+no = Tidak
+no_format_copy_before_format_paste = Format tidak dapat ditempelkan sebelum disalin dari node yang lain.
+no_found_from = <html><b>{0}</b> tidak ditemukan dalam <b>{1}</b>.
+no_more_found_from = <html><b>{0}</b> tidak ditemukan lagi dalam <b>{1}</b>.
+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...
+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
+NodeUpAction.text = Node ke Atas
+nonboldify_branch = Tak-tebalkan
+nonitalicise_branch = Tak-miringkan
+normal = Normal
+not_saved_for_link_error = Peta harus disimpan sebelum mengeset hipertaut melalui pemilih berkas.
+ok = OK
+OKAction.text = OK
+OpenAction.text = Buka...
+OpenFreeplaneSiteAction.text = Freeplane's Homepage[translate me]
+option_changes_may_require_restart = Untuk melihat efek perubahan setelah, Anda mungkin harus memulai ulang Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &Tidak
+OptionalDontShowMeAgainDialog.dontShowAgain = &Jangan tanya saya lagi.
+OptionalDontShowMeAgainDialog.ok = &Ya
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Ingat keputusan saya.
+OptionPanel.absolute = Absolut
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Pola atak otomatis
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Tentukan kuaitas peta. Lebih banyak antialias membutuhkan lebih banyak waktu.</html>
+OptionPanel.antialias_all = Antialias Semua
+OptionPanel.antialias_edges = Antialias Tangkai
+OptionPanel.antialias_none = Tanpa Antialias
+OptionPanel.Appearance = Penampilan
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Induk
+OptionPanel.ask = Tanya
+OptionPanel.automatic = Otomatis
+OptionPanel.automaticFormat_level = Gaya Atak Otomatis
+OptionPanel.automaticFormat_level1 = Format Node Akar
+OptionPanel.automaticFormat_level2 = Format Node Level 1
+OptionPanel.Behaviour = Tingkah Laku
+OptionPanel.bezier = bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.ca = Catalan, Valencian / Catal\u00E0[translate me]
+OptionPanel.Cancel = Batal
+OptionPanel.childpattern = Pola Anak
+OptionPanel.childpattern.tooltip = Pola terpilih diterapkan ke semua anak.
+OptionPanel.clear_all_setters = Tukar semua
+OptionPanel.clear_all_setters.tooltip = Aktifkan/matikan semua indikator perubahan.
+OptionPanel.combined = Gabungan
+OptionPanel.convert_to_current_version = <html>Konversikan peta Freeplane lama secara otomatis <br>ke versi sekarang?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>Hanya untuk peta-peta sangat besar yang tidak perlu dikonversikan. <br>(Butuh pengetahuan ahli) Anda dapat membuka peta tanpa konversi.</html>
+OptionPanel.cs = Cs
+OptionPanel.cut_nodes_without_question = Potong node tanpa konfirmasi?
+OptionPanel.cut_nodes_without_question.tooltip = Bila kotak cek ini dipilih, node dipotong tanpa konfirmasi. Hal ini dapat menyebabkan kehilangan data bila tidak berhati-hati.
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Bawaan
+OptionPanel.default_browser_command_mac = Baris Perintah Bawaan Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> dan Mac: (terimakasih Nick!)</html>
+OptionPanel.default_browser_command_other_os = Baris Perintah Bawaan SO Lain
+OptionPanel.default_browser_command_other_os.tooltip = <html> Ini biasanya untuk Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Baris Perintah Bawaan Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Untuk Windows (tanda "" dibutuhkan untuk URL yang memiliki "=" di dalamnya).</html>
+OptionPanel.default_browser_command_windows_nt = Baris Perintah Jelajah Bawaan Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Untuk Windows (tanda "" dibutuhkan untuk URL yang memiliki "=" di dalamnya).</html>
+OptionPanel.default_charset = Charset[translate me]
+OptionPanel.Defaults = Bawaan
+OptionPanel.delete_automatic_saves_at_exit = Hapus Simpanan Otomatis Saat Keluar
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Setel ke 'true' agar berkas simpanan otomatis dihapus manakala Freeplane dimatikan secara normal.</html>
+OptionPanel.delete_nodes_without_question = Hapus node tanpa konfirmasi?
+OptionPanel.delete_nodes_without_question.tooltip = Bila kotak cek ini dipilih, node dihapus tanpa konfirmasi. Hal ini dapat menyebabkan hilangnya data bila tidak hati-hati digunakan.
+OptionPanel.disable_cursor_move_paper = Nonaktifkan Kursor Pemindah Kertas
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Jangan tampilkan kursor pemindah saat menyeret kertas</html>
+OptionPanel.edgecolor = Warna tangkai
+OptionPanel.edgecolor.tooltip = Atribut tangkai yang mengarah ke node orangtua (juga diterapkan ke semua node anak)
+OptionPanel.edgestyle = Gaya tangkai
+OptionPanel.edgestyle.tooltip = Atribut tangkai yang mengarah ke node orangtua (juga diterapkan ke semua node anak)
+OptionPanel.edgewidth = Lebar tangkai
+OptionPanel.edgewidth.tooltip = Atribut tangkai yang mengarah ke node orangtua (juga diterapkan ke semua node anak)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Bawaannya, Enter Menerapkan
+OptionPanel.el__max_default_window_height = Tinggi Jendela Maks Bawaan
+OptionPanel.el__max_default_window_width = Lebar Jendela Maks Bawaan
+OptionPanel.el__min_default_window_height = Tinggi Jendela Min Bawaan
+OptionPanel.el__min_default_window_width = Lebar Jendela Min Bawaan
+OptionPanel.el__position_window_below_node = Posisi Jendela Di Bawah Node
+OptionPanel.en = En
+OptionPanel.Environment = Lingkungan
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.execute_scripts_without_asking = Skrip akan dijalankan tanpa konfirmasi?
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Skrip Freeplane pada prinsipnya dapat melakukan apa saja pada komputer Anda. <br>Jadi, skrip yang tidak diketahui aman jangan dijalankan.</html>
+OptionPanel.execute_scripts_without_exec_restriction = Ijinkan Eksekusi Aplikasi Lain (TIDAK dianjurkan)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>Bila skrip Groovy Anda perlu mengeksekusi aplikasi lain (seperti penjelajah) tanpa bertanya(!)),<br>Anda perlu mengaktifkan opsi ini. <br>Gunakan dengan hati-hati, karena kini skrip yang jahat dapat membahayakan komputer Andar!</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Ijinkan Operasi Berkas (TIDAK dianjurkan)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Bila skrip Groovy Anda perlu mengeksekusi operasi berkas (buka, tutup, baca, tulis, hapus(!)),<br>Anda perlu mengaktifkan opsi ini. <br>Gunakan dengan hati-hati, karena kini skrip yang jahat dapat membahayakan komputer Andar!</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Ijinkan Operasi Jaringan (TIDAK disarankan)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Bila skrip Groovy Anda perlu mengeksekusi operasi jaringan,<br>Anda perlu mengaktifkan opsi ini. <br>Gunakan dengan hati-hati, karena kini skrip yang jahat dapat membuka rahasia Andar!</body></html>
+OptionPanel.experimental_file_locking_on = Penguncian Berkas Eksperimental
+OptionPanel.experimental_file_locking_on.tooltip = <html> Fitur ini masih dalam percobaan</html>
+OptionPanel.export_icons_in_html = Ekspor Ikon dalam HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Tentukan apakah hasil ekspor HTML dari Freeplane mengandung ikon. Masalahnya, dalam peta yang dihasilkan, acuan ke ikon-ikon tersebut bisa hilang atau salah.</html>
+OptionPanel.Files = Berkas
+OptionPanel.first = Pertama
+OptionPanel.foldingsymbolwidth = Lebar Simbol Pelipatan
+OptionPanel.foldingsymbolwidth.tooltip = <html>Lebar lingkaran penanda lipatan</html>
+OptionPanel.fork = Ranting
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Berdasarkan Tajuk
+OptionPanel.html_export_fold_all = Lipat Semua
+OptionPanel.html_export_fold_currently_folded = Biarkan Lipatan Apa Adanya
+OptionPanel.html_export_folding = Ekspor HTML Terlipat
+OptionPanel.html_export_no_folding = Tanpa Lipatan
+OptionPanel.hu = Hu
+OptionPanel.icon = Ikon
+OptionPanel.icon.tooltip = Bila diterapkan, node akan memakai ikon ini saja.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Papan Ketik
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Ukuran Font
+OptionPanel.language = Bahasa
+OptionPanel.language.tooltip = <html>Memilih bahasa yang hendak digunakan oleh program. Setel ke 'automatic' untuk mencoba mengambil pilihan ini dari sistem milik pemakai. </html>
+OptionPanel.last = Terakhir
+OptionPanel.last_opened_list_length = Panjang Senarai Berkas-Terakhir-Dibuka
+OptionPanel.linear = Linear[translate me]
+OptionPanel.links = Taut
+OptionPanel.links.tooltip = <html>Pilih taut relatif atau absolut </html>
+OptionPanel.load_folding = On Load[translate me]
+OptionPanel.load_last_map = Otomatis buka peta terakhir
+OptionPanel.load_last_map.tooltip = <html>Bila dipilih, maka ketika Freeplane dimulai, ambil peta yang terakhir dibuka secara otomatis.</html>
+OptionPanel.lookandfeel = Cita dan Rasa
+OptionPanel.lookandfeel.tooltip = <html>Cita rasa tampilan: pilihannya adalah: 'metal', 'windows', 'motif', dan 'gtk', ditambah 'mac' khusus untuk MacOS. Bawaan artinya cita rasa tampilan bawaan sistem yang dipakai. Bila Anda menghendaki cita rasa tampilan yang lain, ketikkan nama kelas Java-nya di sini dan pastikan berkas JAR-nya tersedia. Bila ada masalah, pilih 'tiada' di sini, misalnya untuk applet</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Lebar Node Maksimum
+OptionPanel.max_node_width.tooltip = <html>Lebar node maksimal bawaan dalam piksel.</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Warna Latar Belakang Node
+OptionPanel.nodebackgroundcolor.tooltip = Warna Latar Belakang Node
+OptionPanel.nodecolor = Warna Node
+OptionPanel.nodecolor.tooltip = Warna Node
+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
+OptionPanel.number_of_different_files_for_automatic_save = Jumlah Berkas Berbeda untuk Penyimpanan Otomatis
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Sejumlah n berkas berbeda untuk menyimpan peta. Penyimpanan otomatis pertama menggunakan berkas pertama, dan seterusnya, hingga yang ke-n+1 kembali menggunakan berkas pertama (siklik)</html>
+OptionPanel.OK = Simpan
+OptionPanel.patternname = Nama
+OptionPanel.patternname.tooltip = Nama unik pola
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Penempatan Cabang Baru
+OptionPanel.placenewbranches.tooltip = <html>Tempatkan di mana cabang-cabang baru? Pilihannya:'pertama' and 'terakhir' </html>
+OptionPanel.printonwhitebackground = <html>Latar belakang putih untuk mencetak </html>
+OptionPanel.printonwhitebackground.tooltip = <html>Selalu gunakan latar belakang putih saat mencetak</html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relatif
+OptionPanel.ru = Ru
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = Metode Pemilihan
+OptionPanel.selection_method.tooltip = <html>Dengan pilihan ini Anda dapat mengaktifkan atau mematikan skema pemilihan tertunda. Jangan ubah nilai ini karena akan disimpan di auto.properties.</html>
+OptionPanel.selection_method_by_click = Dengan Klik
+OptionPanel.selection_method_delayed = Tertunda
+OptionPanel.selection_method_direct = Langsung
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Pola
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Atribut
+OptionPanel.separator.automatic_save = Simpan Otomatis
+OptionPanel.separator.behaviour = Tingkah Laku
+OptionPanel.separator.browser = Penjelajah
+OptionPanel.separator.commands_for_the_program = Perintah-perintah untuk Program
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Warna Bawaan
+OptionPanel.separator.default_fonts = Font Bawaan
+OptionPanel.separator.default_styles = Gaya Bawaan
+OptionPanel.separator.EdgeControls = Tangkai
+OptionPanel.separator.edit_long_node_window = Jendela Edit Node Panjang
+OptionPanel.separator.files = Berkas
+OptionPanel.separator.General = Umum
+OptionPanel.separator.html_export = Ekspor HTML
+OptionPanel.separator.hyperlink_types = Tipe Hipertaut
+OptionPanel.separator.icon_properties = Ikon
+OptionPanel.separator.icons = Ikon untuk "Pilih Ikon"
+OptionPanel.separator.initial_map_size = Ukuran Peta Awal
+OptionPanel.separator.inline_editor = In-line node editor[translate me]
+OptionPanel.separator.key_typing = Pengetikan
+OptionPanel.separator.language = Bahasa
+OptionPanel.separator.look_and_feel = Cita dan Rasa
+OptionPanel.separator.mouse_wheel = Roda Tetikus
+OptionPanel.separator.new_node_commands = Perintah Node Baru
+OptionPanel.separator.node_editing_commands = Perintah Edit Node
+OptionPanel.separator.node_navigation_commands = Perintah Navigasi Node
+OptionPanel.separator.NodeColors = Warna Node
+OptionPanel.separator.NodeFont = Font untuk Node
+OptionPanel.separator.notifications = Konfirmasi
+OptionPanel.separator.other_defaults = Bawaan-bawaan Lainnya
+OptionPanel.separator.others = Kunci lain
+OptionPanel.separator.patterns = Pola
+OptionPanel.separator.root_node_appearance = Tampilan Node Akar
+OptionPanel.separator.save = Simpan
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_colors = Warna Pilihan
+OptionPanel.separator.selection_method = Metode Pemilihan
+OptionPanel.separator.undo = Urungkan
+OptionPanel.set_property_text = Ubah
+OptionPanel.set_property_text.tooltip = Kosong: Biarkan; Minus: Hapus properti (setel nilai bawaan); Plus: Ubah properti
+OptionPanel.setscript = Ubah?
+OptionPanel.setscript.tooltip = Skrip dapat diasosiasikan pada gaya.
+OptionPanel.sharp_bezier = bezier tajam
+OptionPanel.sharp_linear = garis lurus tajam
+OptionPanel.show_icon_for_attributes = Tampilkan Ikon untuk Atribut
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Warna Latar Belakang Bawaan
+OptionPanel.standardbackgroundcolor.tooltip = <html>Warna latar belakang bawaan dalam notasi HTML </html>
+OptionPanel.standardcloudcolor = Warna Awan Bawaan
+OptionPanel.standardcloudcolor.tooltip = <html>Warna awan bawaan dalam notasi HTML </html>
+OptionPanel.standardcloudestyle = Gaya Awan Bawaan
+OptionPanel.standardcloudestyle.tooltip = <html>Gaya awan bawaan. Saat ini pilihannya hanya Bezier </html>
+OptionPanel.standarddrawrectangleforselection = Tandai Node Terpilih dengan Balon
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Lingkari node terpilih dengan balon. </html>
+OptionPanel.standardlinkcolor = Warna Taut Bawaan
+OptionPanel.standardlinkcolor.tooltip = <html>Warna taut bawaan dalam notasi HTML </html>
+OptionPanel.standardlinkestyle = Gaya Taut Bawaan
+OptionPanel.standardlinkestyle.tooltip = <html>Gaya taut bawaan. Saat ini pilihannya hanya Bezier </html>
+OptionPanel.standardselectednodecolor = Warna Node Terpilih Bawaan
+OptionPanel.standardselectednodecolor.tooltip = <html>Warna bawaan untuk node terpilih, dalam notasi HTML (#RRGGBB heksadesimal) </html>
+OptionPanel.standardselectednoderectanglecolor = Warna Balon Node Terpilih
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>Warna balon yang menandai pilihan node, dalam notasi HTML (#RRGGBB heksadesimal) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Waktu saat Penyimpanan Otomatis
+OptionPanel.time_for_automatic_save.tooltip = <html> Masa antar waktu penyimpanan otomatis (dalam ms): Untuk menonaktifkan penyimpanan otomatis, setel ke 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Waktu untuk Pemilihan Tertunda
+OptionPanel.time_for_delayed_selection.tooltip = <html> Waktu yang dibutuhkan untuk menunjuk node dengan tetikus sampai node tersebut terpilih. Angka 1 berarti node langsung terpilih.</html>
+OptionPanel.toolTipManager.initialDelay = Initial delay, ms[translate me]
+OptionPanel.toolTipManager.max_tooltip_width = Lebar Tip
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Lebar tip bawaan dalam piksel.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = garis bawah
+OptionPanel.undo_levels = Urungkan Berapa Langkah
+OptionPanel.undo_levels.tooltip = <html>Tentukan berapa langkah harus disimpan agar bisa diurungkan lewat perintah "Urungkan".</html>
+OptionPanel.unfold_on_paste = Buka node saat ditempel
+OptionPanel.unfold_on_paste.tooltip = Buka node saat ditempel atau di-seret-dan-jatuhkan
+OptionPanel.use_common_out_point_for_root_node = Tangkai dimulai dari suatu titik pada node akar
+OptionPanel.use_common_out_point_for_root_node.tooltip = Tangkai dimulai dari suatu titik pada node akar
+OptionPanel.use_tabbed_pane = Gunakan Tab
+OptionPanel.use_tabbed_pane.tooltip = Bila peta terpilih ditampilkan dalam tab (misalnya dalam FireFox :-) ).
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Kecepatan
+OptionPanel.wheel_velocity.tooltip = Nilai yang lebih tinggi berakibat pada gerakan tetikus yang cepat dalam peta.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+out_of_memory = Out of memory.[translate me]
+PageAction.text = &Penataan Halaman...
+PasteAction.text = Tempel
+PatternNewNameProperty = Pola Baru
+PatternToString.backgroundColor = Warna Latar Belakang
+PatternToString.Child = Gaya Node Anak
+PatternToString.color = Warna
+PatternToString.EdgeColor = Warna Tangkai
+PatternToString.EdgeStyle = Gaya Tangkai
+PatternToString.EdgeWidth = Lebar Tangkai
+PatternToString.FontBold = Tebal
+PatternToString.FontItalic = Miring
+PatternToString.FontName = Nama Font
+PatternToString.Icon = Ikon
+PatternToString.NodeFontSize = Ukuran Font
+plugins/ScriptEditor.cancel = &Abaikan Perubahan dan Keluar
+plugins/ScriptEditor.exit = &Simpan dan Keluar
+plugins/ScriptEditor.FORBIDDEN_ACTION = Skrip Groovy Freeplane terbatas. Operasi {0,choice,0#Berkas|1#Jaringan|2#Eksekusi} berikut ini dilarang: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}.
+plugins/ScriptEditor.menu_actions = &Aksi
+plugins/ScriptEditor.new_script = Skrip Baru
+plugins/ScriptEditor.run = Jalankan
+plugins/ScriptEditor/window.Result = Hasil:
+plugins/ScriptEditor/window.title = Editor Skrip
+plugins/TimeList.xml_Created = Dibuat
+plugins/TimeList.xml_Date = Tanggal
+plugins/TimeList.xml_Icons = Ikon
+plugins/TimeList.xml_Modified = Diubah
+plugins/TimeList.xml_Notes = Catatan
+plugins/TimeList.xml_Text = Teks
+plugins/TimeManagement.xml_appendButton = Bubuhkan Tanggal Pada Node Terpilih
+plugins/TimeManagement.xml_Cancel = Batal
+plugins/TimeManagement.xml_cancelButton = Batal
+plugins/TimeManagement.xml_closeButton = Tutup
+plugins/TimeManagement.xml_Export = Ekspor Node Terpilih
+plugins/TimeManagement.xml_Find = Cari
+plugins/TimeManagement.xml_Goto = Pergi Ke
+plugins/TimeManagement.xml_hour = Jam:
+plugins/TimeManagement.xml_menu_actions = Aksi
+plugins/TimeManagement.xml_minute = Menit:
+plugins/TimeManagement.xml_reminderButton = Ingatkan Saya Pada Tanggal Ini
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Bila ditekan, pencatat waktu akan menjadualkan waktu yang diberikan. Lalu, ikon akan berkedip pada saat itu.<br>Bila peta ditutup, catatan waktu akan diaktifkan ulang ketika peta dibuka kembali.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Untuk saat ini, satu node hanya bisa punya satu pengingat. <br>Pengingat saat ini terjadual untuk {0,date} {0,time}, Anda memilih {1,date} {1,time}. <br><br>Apakah Anda hendak mengganti waktu pengingat node ini (YES) <br>atau tetap memakai yang lama (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Pengingat dijadualkan pada {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Copot Pengingat
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Copot semua pengingat yang diasosiasikan dengan node terpilih.
+plugins/TimeManagement.xml_Replace = Ganti
+plugins/TimeManagement.xml_Replace_All = Ganti Semua
+plugins/TimeManagement.xml_Replace_Selected = Ganti Terpilih
+plugins/TimeManagement.xml_Select = Pilih
+plugins/TimeManagement.xml_todayButton = Hari Ini
+plugins/TimeManagement.xml_WindowTitle = Manajemen Waktu
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Cari dan Ganti
+preferences = Preferensi
+print_preview_title = Tampakan Awal
+PrintAction.text = Cetak...
+PrintDirectAction.text = Cetak
+printing_settings = Skala Cetak
+PrintPreviewAction.text = Cetak Tampakan A&wal...
+PropertyAction.text = Preferensi...
+QuitAction.text = Keluar
+read_only = Baca Saja
+really_convert_to_current_version = <html>Peta ini dibuat dengan versi Freeplane lama. <br>Apakah hendak dikonversi (dianjurkan)? <br>(Bila tidak, akan diambil apa adanya, tanpa jaminan.) </html>
+really_cut_node = Benar potong node?
+really_execute_script = Anda benar-benar ingin menjalankan skrip yang terkandung dalam peta ini? Hal ini mungkin saja membahayakan komputer Anda.
+really_remove_node = Benar hapus node?
+RedoAction.text = Ulangi
+RedoFilterAction.text = Ulangi
+ReminderHookAction.text = Copot Pengingat
+ReminderHookAction.tooltip = Copot Pengingat dari Node
+RemoveAllIconsAction.text = Copot Semua Ikon
+RemoveIconAction.text = Copot Ikon Terakhir
+RemoveNoteAction.text = Copot Catatan
+RemoveNoteAction.tooltip = <html>Menghapus isi catatan dari satu atau lebih catatan.</html>
+rename = Rename[translate me]
+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
+save_failed = Usaha menyimpan peta {0} gagal
+save_unsaved = Simpan peta berikut?
+SaveAction.text = Simpan
+SaveAll.text = Simpan Semu&a
+SaveAll.tooltip = Simpan semua peta terbuka
+SaveAsAction.text = Simpan Sebagai
+saved = Tersimpan
+scheme_evaluate = Evaluasi!
+ScriptEditor.text = Editor Skrip...
+ScriptEditor.tooltip = Mungkinkan penulisan skrip yang lebih besar di dalam Freeplane.
+ScriptEditorPanel.changed_cancel = Skrip diubah. Apakah Anda benar hendak mengabaikan perubahannya?
+select_favorites_folder = Pilih map tempat Favorit Anda berada
+select_folder_for_importing = Pilih map yang hendak diimpor
+SelectAllAction.text = Pilih Semua yang Terlihat
+SelectBranchAction.text = Pilih Cabang yang Terlihat
+selection_method_by_click = Klik-sekali untuk Memilih
+selection_method_delayed = Pilihan Otomatis Tertunda
+selection_method_direct = Tunjuk untuk Memilih
+SelectNoteAction.text = Tukar Editor Catatan
+SelectNoteAction.tooltip = Switch to resp. from note window
+SetImageByFileChooserAction.text = Gambar (Pemilih Berkas atau Taut)...
+SetLinkByFileChooserAction.text = Hipertaut (Pemilih Berkas)
+SetLinkByTextFieldAction.text = Hipertaut (Kolom Teks)
+ShowAllAttributesAction.text = Tampilkan Semua Atribut
+ShowAncestorsAction.text = Tampilkan Moyangnya
+ShowAttributeDialogAction.text = Kelola &Atribut...
+ShowDescendantsAction.text = Tunjukkan Keturunannya
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+ShowHideNoteAction.text = Jendela Catatan
+ShowHideNoteAction.tooltip = Membuat jendela catatan muncul atau hilang.
+ShowSelectedAttributesAction.text = Tampilkan Atribut Terpilih
+ShowSelectionAsRectangleAction.text = Pemilih Segiempat
+simplyhtml.aboutFrameTitle = Tentang aplikasi ini
+simplyhtml.aboutLabel = Tentang SimplyHTML...
+simplyhtml.alignCenter = tengah
+simplyhtml.alignLabel = Perataan
+simplyhtml.alignLeft = kiri
+simplyhtml.alignRight = kanan
+simplyhtml.allCellsRangeLabel = semua sel
+simplyhtml.allOccurrencesReplaced = Semua kemunculan diganti
+simplyhtml.appendTableColLabel = Tambahkan kolom
+simplyhtml.appendTableRowLabel = Tambahkan baris
+simplyhtml.applyCellAttrLabel = Terapkan pada
+simplyhtml.backgroundLabel = Latar Belakang
+simplyhtml.boldItalicName = tebal miring
+simplyhtml.boldName = tebal
+simplyhtml.borderColorLabel = Warna:
+simplyhtml.borderWidthLabel = Lebar
+simplyhtml.bottomLabel = bawah
+simplyhtml.cancelBtnName = Batal
+simplyhtml.cellBorderTabLabel = Sempadan
+simplyhtml.cellGenTabLabel = Umum
+simplyhtml.cellMarginTabLabel = Pias
+simplyhtml.cellPanelTitle = Format Sel
+simplyhtml.clearFormatLabel = Copot Pemformatan
+simplyhtml.clearFormatTip = Copot Pemformatan
+simplyhtml.close = Tutup
+simplyhtml.closeBtnName = Tutup
+simplyhtml.colorLabel = Warna
+simplyhtml.copyLabel = Salin
+simplyhtml.copyTip = salin
+simplyhtml.cTagNameHead1 = Tajuk 1
+simplyhtml.cTagNameHead2 = Tajuk 2
+simplyhtml.cTagNameHead3 = Tajuk 3
+simplyhtml.cTagNameHead4 = Tajuk 4
+simplyhtml.cTagNameHead5 = Tajuk 5
+simplyhtml.cTagNameHead6 = Tajuk 6
+simplyhtml.cTagNameLink = Taut
+simplyhtml.cTagNameOL = Senarai Berurut
+simplyhtml.cTagNamePara = Paragraph
+simplyhtml.cTagNameUL = Senarai Tak-urut
+simplyhtml.cutLabel = Potong
+simplyhtml.cutTip = potong
+simplyhtml.defaultDocName = Nirjudul
+simplyhtml.deleteTableColLabel = Hapus kolom
+simplyhtml.deleteTableRowLabel = Hapus baris
+simplyhtml.docTitleQuery = Setel judul menjadi:
+simplyhtml.docTitleTitle = Edit Judul Dokumen
+simplyhtml.editLabel = Edit
+simplyhtml.effectLabel = Efek
+simplyhtml.familyLabel = Keluarga
+simplyhtml.findNext = Temukan berikutnya...
+simplyhtml.findReplaceDialogTitle = Temukan dan Ganti
+simplyhtml.findReplaceLabel = Temukan dan Ganti
+simplyhtml.findReplaceTip = cari dan ganti
+simplyhtml.fontBoldLabel = Tebal
+simplyhtml.fontBoldTip = Mati-hidupkan Tebal
+simplyhtml.fontDialogTitle = Format Font
+simplyhtml.fontItalicLabel = Miring
+simplyhtml.fontItalicTip = Mati-hidupkan Miring
+simplyhtml.fontLabel = Font...
+simplyhtml.fontTabLabel = Font
+simplyhtml.fontTip = Format font...
+simplyhtml.fontUnderlineLabel = Garis Bawah
+simplyhtml.fontUnderlineTip = Mati-hidupkan Garis Bawah
+simplyhtml.foregroundLabel = Latar Depan
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = Senarai...
+simplyhtml.formatListTip = Ubah format senarai
+simplyhtml.formatParaLabel = Paragraf...
+simplyhtml.formatParaTip = Ubah format paragraph
+simplyhtml.formatTableLabel = Tabel...
+simplyhtml.formatTableTip = Format tabel
+simplyhtml.helpLabel = Bantuan
+simplyhtml.htmlTabTitle = Tampilan Kode HTML
+simplyhtml.imageFileDesc = Berkas gambar
+simplyhtml.insertTableColLabel = Sisipkan kolom
+simplyhtml.insertTableLabel = Tabel...
+simplyhtml.insertTableMsg = Berapa Kolom?
+simplyhtml.insertTableRowLabel = Sisipkan baris
+simplyhtml.insertTableTitle = Sisipkan Tabel
+simplyhtml.italicName = miring
+simplyhtml.layoutTabTitle = Tampilan Atak
+simplyhtml.leftLabel = kiri
+simplyhtml.listDialogTitle = Format Senarai
+simplyhtml.listIndentTitle = Indentasi:
+simplyhtml.listPosInside = di dalam
+simplyhtml.listPositionLabel = Posisi:
+simplyhtml.listPosOutside = di luar
+simplyhtml.listTypeCircle = bulir bundar
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = simbol berkas sebagai bulir
+simplyhtml.listTypeLabel = Tipe:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = nihil
+simplyhtml.listTypeSquare = bulir persegi
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = luar
+simplyhtml.matchCase = Cocokkan huruf besar/kecil
+simplyhtml.newStyleDefaultName = gaya baru
+simplyhtml.nextTableCellLabel = Sel berikutnya
+simplyhtml.noLineLabel = nihil
+simplyhtml.noMoreOccurrencesFound = tidak ditemukan (lagi)
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = dalam
+simplyhtml.paraAlignCenterLabel = Rata tengah
+simplyhtml.paraAlignCenterTip = Setel paragraf rata tengah
+simplyhtml.paraAlignLeftLabel = Rata kiri
+simplyhtml.paraAlignLeftTip = Setel paragraf rata kiri
+simplyhtml.paraAlignRightLabel = Rata kanan
+simplyhtml.paraAlignRightTip = Setel paragraf rata kanan
+simplyhtml.paraStyleDialogTitle = Gaya Paragraf
+simplyhtml.paraTabLabel = Paragraph
+simplyhtml.pasteLabel = Tempel
+simplyhtml.pasteTip = tempel
+simplyhtml.plainName = polos
+simplyhtml.previewLabel = Pratinjau
+simplyhtml.previewText = Teks Pratinjau
+simplyhtml.prevTableCellLabel = Sel sebelumnya
+simplyhtml.redoLabel = Ulangi
+simplyhtml.redoTip = ulangi
+simplyhtml.replace = Ganti...
+simplyhtml.replaceAll = Semua
+simplyhtml.replaceDone = Sudah
+simplyhtml.replaceNo = Tidak
+simplyhtml.replaceThisQuery = ganti tiap kemunculan
+simplyhtml.replaceWith = Ganti dengan
+simplyhtml.replaceYes = Ya
+simplyhtml.rightLabel = kanan
+simplyhtml.searchDown = Cari ke bawah
+simplyhtml.searchFromStart = Cari dari mula
+simplyhtml.searchUp = Cari ke atas
+simplyhtml.selectAllLabel = Pilih semua
+simplyhtml.sizeLabel = Ukuran
+simplyhtml.standardStyleName = bawaan
+simplyhtml.strikeLabel = Coret
+simplyhtml.styleLabel = Gaya
+simplyhtml.styleNameInputText = Nama gaya baru?
+simplyhtml.styleNameInputTitle = Simpan gaya
+simplyhtml.tableBgColLabel = Warna Latar Belakang:
+simplyhtml.tableDialogTitle = Format Tabel
+simplyhtml.tableLabel = Tabel
+simplyhtml.tablePanelTitle = Format Tabel
+simplyhtml.tableWidthLabel = Lebar:
+simplyhtml.textIndentLabel = Indentasi:
+simplyhtml.textToFind = Teks yang dicari:
+simplyhtml.thisCellRangeLabel = sel ini
+simplyhtml.thisColRangeLabel = kolom ini
+simplyhtml.thisRowRangeLabel = baris ini
+simplyhtml.toggleBulletsLabel = Senarai berbulir mati/hidup
+simplyhtml.toggleBulletsTip = senarai berbulir mati/hidup
+simplyhtml.toggleNumbersLabel = Senarai bernomor mati/hidup
+simplyhtml.toggleNumbersTip = senarai bernomor mati/hidup
+simplyhtml.topLabel = atas
+simplyhtml.uLineLabel = Garis Bawah
+simplyhtml.unableToOpenFileError = Berkas tidak bisa dibuka
+simplyhtml.unableToRedoError = Tak bisa ulangi:
+simplyhtml.unableToUndoError = Tak bisa urungkan:
+simplyhtml.undoLabel = Urungkan
+simplyhtml.undoTip = urungkan
+simplyhtml.valignBaseline = garis dasar
+simplyhtml.valignBottom = bawah
+simplyhtml.valignLabel = Perataan Vertikal
+simplyhtml.valignMiddle = tengah
+simplyhtml.valignTop = atas
+simplyhtml.wholeWordsOnly = Hanya kata seutuhnya
+SortNodes.text = &Urutkan Anak-anak
+SortNodes.tooltip = Urutkan semua anak dari node menurut abjad.
+split = Pisahkan
+SplitNode.text = &Pisahkan Node
+SplitNode.tooltip = <html>Node dipisahkan</html>
+style = Gaya
+svg = SVG[translate me]
+TimeListAction.text = Tampilkan Senarai Jadual Waktu
+TimeListAction.tooltip = Tampilkan semua waktu terjadual dan node yang bersangkutan.
+TimeManagementAction.text = Tunjukkan Kalender...
+TimeManagementAction.tooltip = <html>Tunjukkan modul Kalender buatan Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Buka/Tutup Lipatan Anak
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Buka/Tutup Lipatan
+ToggleLeftToolbarAction.text = Luntang &Kedua
+ToggleMenubarAction.text = Bilah Menu
+ToggleToolbarAction.text = &Luntang
+undefined_error = Galat yang tidak diharapkan terjadi. Tolong coba aporkan sebagai bug.
+underline = Garis Bawah
+underlined = Garis Bawah
+UndoAction.text = Urungkan
+UndoFilterAction.text = Urungkan
+unfold = Buka Lipatan
+UnfoldAllAction.text = Buka Semua
+UnfoldAllAction.tooltip = <html>Buka lipatan node terpilih dan semua anaknya.</html>
+UnfoldOneLevelAction.text = Buka Satu Level
+UnfoldOneLevelAction.tooltip = <html>Buka lipatan node terpilih satu level.</html>
+UpdateCheckAction.text = Check for Updates[translate me]
+url_error = URL ini salah formatnya!
+url_load_error = Peta yang diacu URL tidak dapat dimuat.
+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):
+WebDocuAction.text = Dokumentasi Web
+width = Lebar
+yes = Ya
+ZoomInAction.text = Zum Mendekat
+ZoomOutAction.text = Zum Menjauh
diff --git a/freeplane/resources/translations/Resources_it.properties b/freeplane/resources/translations/Resources_it.properties
new file mode 100644
index 0000000..fa2dbe8
--- /dev/null
+++ b/freeplane/resources/translations/Resources_it.properties
@@ -0,0 +1,1769 @@
+about_text = Joerg Mueller's Freeplane\nRealizzazione di un'interfaccia uomo-macchina del concetto di "Mappatura Mentale".\nCopyright (C) 2000-2008 Joerg Mueller <joemuell at informatik.uni-freiburg.de>\nQuesto programma \u00E8 "Free Software" (GPL)\nSito: http://freeplane.sourceforge.net/\nVersion:
+AboutAction.text = Informazioni su
+acceleratorPresets = Preset Tasti Rapidi
+accelerators_loading_error = Impossibile caricare acceleratori da {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Cambia il formato dei nodi
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Cambia schema
+accessories/plugins/EncryptNode.properties_0 = Scegli una password per i nodi cifrati
+accessories/plugins/EncryptNode.properties_1 = Le password sono diverse o troppo corte
+accessories/plugins/EncryptNode.properties_2 = Inserisci password:
+accessories/plugins/EncryptNode.properties_3 = Inserisci di nuovo la password:
+accessories/plugins/EncryptNode.properties_4 = Inserisci la password.
+accessories/plugins/EncryptNode.properties_5 = <html>Ricorda che l'inviolabilit\u00E0 della cifratura<br> dipende quasi completamente dalla qualit\u00E0 della password inserita.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Cancella
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = E' possibile modificare lo stato di criptatura di un nodo criptato. Inserire almeno un nodo usando il menu Strumenti.
+accessories/plugins/EncryptNode.properties_select_me = Selezionami per continuare!
+accessories/plugins/EncryptNode.properties_wrong_password = La password non \u00E8 corretta.
+accessories/plugins/ExportWithTWiki.text = Come TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Esporta la mappa come documento TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Questo \u00E8 un metodo di esportazione uniforme che usa scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Come Applet Java...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Esporta la mappa come "applet java".
+accessories/plugins/ExportWithXSLT_Flash.text = In Flash
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Esporta la mappa come applicazione Flash
+accessories/plugins/ExportWithXSLT_HTML.text = In XHTML (versione JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = In XHTML (mappa cliccabile)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Risorse dal nodo RISORSE al file Gestore dei processi...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Esporta le risorse dal nodo RISORSE al modulo Gestore dei processi. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Compiti dal nodo PROCESSI al file Gestore dei processi...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Esporta i compiti dal nodo PROCESSI al modulo Gestore dei processi. </html>
+action_keystroke_in_use_error = Il tasto rapido {0} richiesto per l''azione {1} \u00e8 gi\u00e0 in uso per l''azione {2}
+active = Attivo
+actual_map_styles = Stile condizionale della mappa, applicato
+actual_node_styles = Stile condizionale del nodo, applicato
+add = &Aggiungi
+AddConnectorAction.text = Aggiungere Collegamento Grafico
+AddElementaryConditionAction.text = Aggiungere
+AddLocalLinkAction.text = Aggiungere Collegamento Locale
+AddMenuItemLinkAction.text = Comando Menu Programma
+AddOnDetailsPanel.authored.by = Da {0}
+AddOnDetailsPanel.header.function = Funzione
+AddOnDetailsPanel.header.menu = Posizione Menu
+AddOnDetailsPanel.header.shortcut = Scorciatoia
+AddOnDetailsPanel.homepage = Homepage:
+addons.installer.canceled = Installazione annullata
+addons.installer.confirm.licence = <html><body><h1>Licenza</h1>{0}<p><p><em>Accettare questa Licenza?</em></p></body></html>
+addons.installer.failed = Installazione fallita: {0}
+addons.installer.freeplaneversion.format.error = Formato errato in {0} (valore: {1})
+addons.installer.groovy.script.name = Nome Script {0} non termina con ".groovy"
+addons.installer.html.script = Il corpo dello Script non deve essere formattato come HTML
+addons.installer.install = Installa
+addons.installer.invalid.keyboard.shortcut = Scorciatoia non valida {0}
+addons.installer.licence.unchanged = Licenza non cambiata
+addons.installer.map.structure = Errore nella struttura della mappa: {0}
+addons.installer.missing.child.nodes = Nodo Figlio mancante: {0}
+addons.installer.missing.permission.attribute = Script {0}: Permessi attributi mancanti {1}
+addons.installer.missing.properties = Propriet\u00e0 mancanti: {0}
+addons.installer.missing.translation = Traduzione mancante di {0} per {1}
+addons.installer.no.scripts = Nessun Script trovato
+addons.installer.no.zipdata = Dati zip non trovati
+addons.installer.nonstandard.permissions = Lo Script richiede i seguenti permessi che attualmente non sono abilitati: {0}.\nDevono essere aggiunti ai permessi standard ?
+addons.installer.one.child.expected = Atteso esattamente un figlio di {0}.
+addons.installer.script.no.execution_mode = Nessun attributo "execution_mode" definito per {0}
+addons.installer.script.no.menulocation = Nessun attributo "menuLocation" definito per {0}
+addons.installer.script.no.menutitle = Nessun attributo "menuTitleKey" definito per {0}
+addons.installer.script.no.permissions = Nessun permesso definito per {0}
+addons.installer.success = Installazione riuscita.\nIl nuovo add-on sar\u00e0 disponibile dopo il riavvio.
+addons.installer.success.update = Aggiornamento da {0} a {1} eseguito correttamente.\nAlcune funzioni saranno disponibili solo dopo il riavvio.
+addons.installer.title = Installazione Add-on
+addons.installer.too.new = La versione attuale di Freeplane {0} \u00e8 troppo nuova. Questo add-on \u00e8 supportato fino alla versione {1}
+addons.installer.too.old = La versione attuale di Freeplane {0} \u00e8 troppo vecchia. Questo add-on richiede almeno la versione {1}
+addons.installer.unknown.deinstallation.rules = Regole di disinstallazione sconosciute {0}
+addons.installer.update = Aggiornamento dalla versione {0}
+addons.installer.warning = <html><body><em>Si consiglia di installare add-on solo da fonti che ritenete affidabili. Programmi maligni possono causare danni ai vostri dati o violare la vostra privacy.</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = Aggiungere Stile Attributi
+AddStyleAttributes.tooltip = Aggiungere Attributi dallo stile del nodo
+AllMapsNodeListAction.text = Trova e Sostituisci in tutte le mappe
+always = Sempre
+AlwaysUnfoldedNodeAction.text = Espandere sempre i nodi (Abilita/Disabilita)
+antialias_all = Antialias tutto
+antialias_edges = Antialias Collegamenti
+antialias_none = Antialias niente
+apply = &Applica
+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
+ApplyToVisibleAction.text = Applica ai nodi filtrati
+as_parent = Come Genitore
+AskForHelp.text = Chiedere Aiuto
+AssignAttributesAction.text = Assegna Attributi
+attribute_delete = Cancella tutti i valori
+attribute_delete_value = Cancella questo valore
+attribute_font_size_tooltip = Attributo grandezza carattere
+attribute_list_box_label_text = Valori esistenti
+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_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
+attributes_attribute = Attributi
+attributes_close = Chiudi
+attributes_deselect_all = Nulla
+attributes_dialog_title = Gestione Attributi
+attributes_edit = Modifica
+attributes_edit_tooltip = Modifica set
+attributes_for_selected = Nodi selezionati
+attributes_for_visible = Tutti i nodi visibili
+attributes_import = &Importa
+attributes_import_tooltip = Importa Attributi dalle altre mappe caricate
+attributes_no_import_candidates_found = Nessun nuovo attributo trovato
+attributes_popup_delete = Cancella
+attributes_popup_down = Sotto
+attributes_popup_edit = Modifica
+attributes_popup_hide = Nascondi
+attributes_popup_new = Nuovo attributo
+attributes_popup_optimal_width = Larghezza ottimale
+attributes_popup_up = Sopra
+attributes_refresh = Aggiorna
+attributes_RemoveAllAttributesAction.text = Rimuovi tutti gli Attributi
+attributes_RemoveFirstAttributeAction.text = Rimuovi primo Attributo
+attributes_RemoveLastAttributeAction.text = Rimuovi ultimo Attributo
+attributes_restricted_attributes_tooltip = Set ristretto di Attributi
+attributes_restricted_values_tooltip = Set ristretto di valori per l'attributo corrente
+attributes_restriction = Set ristretto
+attributes_select_all = Tutti
+attributes_select_all_tooltip = Seleziona / Deseleziona tutti
+attributes_show = Visualizza
+attributes_skip_root = Salta il nodo radice
+attributes_visible = Seleziona visibili
+attributes_visible_tooltip = Seleziona visibili
+automatic_layout = Formato Automatico
+automatic_layout_disabled = Disabilitato
+automatically_save_message = La mappa \u00E8 stata salvata automaticamente (usando il nome {0})...
+AutomaticEdgeColorHookAction.text = Colore Auto Collegamenti
+AutomaticLayout.ALL = Per tutti
+AutomaticLayout.HEADINGS = Per le intestazioni
+AutomaticLayout.level = Livello {0}
+AutomaticLayout.level.root = Nodo Principale
+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
+AutomaticLayoutControllerAction.null.text = disabilitato
+BackAction.text = Indietro
+BackAction.tooltip = Retrocedi nella cronologia dei nodi selezionati
+background = Sfondo
+bitmaps = Immagini Bitmap
+black = Nero
+BlinkingNodeHookAction.text = Nodo lampeggiante
+BlinkingNodeHookAction.tooltip = <html>Questo fa lampeggiare il nodo. Attenzione!!! Non associarlo a molti nodi e <strong> non con altre formattazioni automatiche allo stesso nodo</strong></html>
+blue = Blu
+BoldAction.text = Grassetto
+boldify_branch = Metti in grassetto
+branch = Ramo
+browse = Esplora...
+calendar_attributes_panel = Calendario e Attributi
+calendar_panel = Calendario
+can_not_connect_to_info_server = Connessione al server delle informazioni non riuscita
+can_not_delete_predefined_style = Non si pu\u00f2 cancellare lo stile predefinito
+can_not_delete_root_style = Non si pu\u00f2 cancellare lo stile del nodo Principale
+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
+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.
+cannot_join_nodes_with_children = Impossibile collegare i nodi con i figli
+cannot_move_to_child = Impossibile spostare un nodo ad uno dei figli
+CenterAction.text = Centra
+CenterSelectedNodeAction.text = Centra il nodo selezionato
+ChangeConnectorArrowsAction.backward.text = Indietro
+ChangeConnectorArrowsAction.both.text = Entrambe
+ChangeConnectorArrowsAction.forward.text = Avanti
+ChangeConnectorArrowsAction.none.text = Nessuno
+ChangeConnectorArrowsAction.text = Cambia la freccia del collegamento grafico
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Curva
+ChangeConnectorShapeAction.EDGE_LIKE.text = Simula Angolo
+ChangeConnectorShapeAction.LINE.text = Linea
+ChangeConnectorShapeAction.LINEAR_PATH.text = Percorso Lineare
+ChangeNodeLevelLeftsAction.text = Sposta nodo a sinistra
+ChangeNodeLevelLeftsAction.tooltip = I nodi che si trovano alla sinistra del nodo centrale, verranno spostati in basso; diventeranno nodi figli del fratello superiore. I nodi che si trovano alla destra del nodo centrale, verranno spostati in alto; I nodi collegati direttamente alla radice, camberanno lato.
+ChangeNodeLevelRightsAction.text = Sposta nodo a destra
+ChangeNodeLevelRightsAction.tooltip = I nodi che si trovano alla destra del nodo centrale, verranno spostati in basso; diventeranno nodi figli del fratello superiore. I nodi che si trovano alla sinistra del nodo centrale, verranno spostati in alto. I nodi collegati direttamente alla radice, cambieranno lato.
+choose_background_color = Scegliere il colore di sfondo
+choose_cloud_color = Scegliere il colore della nuvola:
+choose_edge_color = Scegliere il colore collegamento
+choose_map_background_color = Scegliere il colore di sfondo della mappa
+choose_node_background_color = Scegliere il colore di sfondo del nodo
+choose_node_color = Scegliere il colore del nodo
+ClearLinkAnchorAction.text = Cancella link \u00e0ncora
+ClearLinkAnchorAction.tooltip = <html>cancella il link \u00e0ncora precedentemente creato</html>
+close_btn = &Chiudi
+CloseAction.text = Chiudi
+CloudAction.text = Nuvola
+CloudColorAction.text = Colore nuvola
+CloudShapeAction.ARC.text = Arco
+CloudShapeAction.RECT.text = Rettangolo
+CloudShapeAction.ROUND_RECT.text = Rettangolo Arrotondato
+CloudShapeAction.STAR.text = Stella
+ColorProperty.ResetColor = Ripristina colore
+combined = Combinato
+condition = Condizione
+confirmation = Conferma
+connector = Collegamento grafico
+connector_arrows = Frecce del Collegamento grafico
+connector_label = Etichetta del Collegamento grafico
+connector_lines = Linea del Collegamento grafico
+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
+CopyIDAction.text = Copia l'ID del nodo
+CopyMapStylesAction.text = Copia lo stile della mappa...
+CopyNodeURIAction.text = Copiare URI del Nodo
+copyright = Copyright \u00a9 2000-2012 Freeplane team and others
+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
+CreateConjunctConditionAction.text = E
+CreateDisjunctConditionAction.text = O
+CreateNotSatisfiedConditionAction.text = Non
+CreationModificationPluginAction.text = Visualizza i tempi di modifica
+CreationModificationPluginAction.tooltip = <html>Questa funzione tiene traccia dei tempi di modifica e creazione dei nodi.</html>
+current_dir = Mappe
+CutAction.text = Taglia
+decrease_branch_font_size = Diminuisci carattere
+DecreaseNodeFontAction.text = Diminuisci carattere
+default = Predefinito
+DefaultColorAction.text = Colore predefinito
+defaultstyle.details = Dettagli
+defaultstyle.floating = Nodo Flottante
+defaultstyle.note = Note
+delete = &Elimina
+delete_child = Cancella nodo
+DeleteAction.text = Rimuovi nodo
+DeleteConditionAction.text = Cancella
+DeleteDetailsAction.text = Cancella Dettagli
+DeleteLevelStyleAction.text = Rimuovere lo stile di layout automatico
+DeleteStyleAction.text = Rimuovere Stile
+DeleteUserStyleAction.text = Rimuovere lo stile definito dall'utente
+dialect_info.app = La Mappa {0} \u00e8 stata creata col programma {1}.
+dialect_info.unknownApp = La mappa caricata \u00e8 stata creata con un programma sconosciuto.
+dialect_info.unknownURL = Sito internet non conosciuto.
+dialect_info.url = Visitare il sito {0} del programma, per maggiori informazioni.
+dialect_info.warning = Freeplane pu\u00f2 aprire, visualizzare o salvare non correttamente.
+DirectHtmlFlavorHandler = HTML come nodo singolo
+DocumentationAction.text = Documentazione
+down = G&i\u00f9
+download = Scarica
+dropped_file_error = Impossibile aprire i file mancanti. Motivo: {0}
+edge = Collegamenti
+edge_is_formatted_by_style = Il colore dei Collegamenti \u00e8 controllato dallo Stile. Modificare lo Stile relativo, se necessario.
+edge_style = Stile Collegamenti
+edge_width = Spessore Collegamenti
+EdgeColorAction.text = Colore Collegamenti
+EdgeStyleAction.bezier.text = Curve arrotondate (bezier)
+EdgeStyleAction.bezier.tooltip = <html>Visualizza i collegamenti in modo arrotondatto.</html>
+EdgeStyleAction.hide_edge.text = Nascondi i Collegamenti
+EdgeStyleAction.hide_edge.tooltip = <html>Per i nodi selezionati, visualizza i collegamenti ai nodi genitori come <br> linee punteggiate; per gli altri nascondi i collegamenti.</html>
+EdgeStyleAction.horizontal.text = Squadrato
+EdgeStyleAction.horizontal.tooltip = <html>Usa linee perpendicolari diritte per i collegamenti.</html>
+EdgeStyleAction.linear.text = Lineare
+EdgeStyleAction.linear.tooltip = <html>Visualizza i collegamenti come linee diritte.</html>
+EdgeStyleAction.sharp_bezier.text = Bezier sfumato
+EdgeStyleAction.sharp_bezier.tooltip = <html>Visualizza i collegamenti tramite linne arrotondate, con le estremit\u00e0 assottigliate.</html>
+EdgeStyleAction.sharp_linear.text = Lineare sfumato
+EdgeStyleAction.sharp_linear.tooltip = <html>Visualizza i collegamenti tramite linee diritte, con le estremit\u00e0 assottigliate.</html>
+EdgeStyleAsParentAction.text = Come Genitore
+EdgeStyleAsParentAction.tooltip = <html>Usa lo stile dei collegamenti, come quello dei genitori.</html>[obsolete]
+EdgeWidthAction_width_parent.text = Come Genitore
+EdgeWidthAction_width_thin.text = Sottile
+edit = &Modifica
+edit.decision = Editor Html
+edit.edit_rich_text = Vuoi utilizzare la formattazione tipo grassetto o corsivo?
+edit_details = Modifica Dettagli del nodo
+edit_end_label = <html>Etichetta<br>Collegamento Grafico
+edit_label_font_family = Carattere
+edit_label_font_size = Dimensione Carattere
+edit_link_manually = Inserire manualmente il collegamento ipertestuale (es. http://www.google.com)
+edit_long_node = Modifica nodo avanzata
+edit_middle_label = <html>Etichetta<br>Centrale
+edit_note = Modifica Note
+edit_source_label = <html>Etichetta<br>Sorgente
+edit_target_label = <html>Etichetta<br>Destinatario
+edit_transparency_label = Trasparenza
+edit_width_label = Spessore
+EditAction.text = Modifica nodo
+EditAttributesAction.text = Modifica Attributi
+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...
+EditScript = Modifica Script...
+EditStylesAction.text = Modifica Stili
+EncryptedMap.text = Crea mappa criptata ...
+EncryptedMap.tooltip = Crea una nuova mappa criptata
+enter_base_url = Sto incollando i collegamenti relativi. Immetti l'URL di base.
+enter_condition_name = Inserire nuovo nome condizione
+enter_confirms = &Inserisci conferma
+enter_keyset_name = Inserire il nome del set di Tasti Rapidi
+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
+error = Errore
+error_applying_template = Errore nell'applicazione del modello XSL
+error_creating_directory = Impossibile creare directory per esportare.
+error_in_template = Errore nel modello della mappa di default {0}. Provare a rimuovere questo file.
+errornumber = {0} errori
+ExecuteScriptError.text = Errore eseguendo lo script:\n {0}\nControllare il file di Log per i dettagli.
+ExecuteScriptForAllNodes.text = Eseguire tutti gli script
+ExecuteScriptForSelectionAction.text = Eseguire script nodo selezionato
+ExecuteScriptOnSelectedNode.text = Eseguire {0} su tutti i nodi selezionati
+ExecuteScriptOnSelectedNodeRecursively.text = Eseguire {0} sui nodi selezionati, ricorsivamente
+ExecuteScriptOnSingleNode.text = Eseguire {0} su un nodo selezionato
+ExecuteScripts.noScriptsAvailable = Nessuno disponibile
+ExecuteScripts.text = Script
+ExecuteScriptSecurityError.text = E'' accaduto un errore durante l''esecuzione dello script: {0}
+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
+ExportBranchAction.text = Ramifica come nuova mappa...
+ExportBranchToHTMLAction.text = Esporta ramo in HTML
+exported_file = {0} file
+ExportPdf.text = In PDF...
+ExportSvg.text = In SVG...
+ExportToHTMLAction.text = Come HTML
+ExportToImage.jpg.text = In JPEG...
+ExportToImage.png.text = In PNG...
+ExportToOoWriter.text = Documento di testo Open Office Writer...
+extension_menu = Stile fisico
+ExternalImage_popupMenu_Change = Cambia...
+ExternalImage_popupMenu_Open = Apri nel Visualizzatore
+ExternalImage_popupMenu_Remove = Rimuovi
+ExternalImage_popupMenu_ResetZoom = Ripristina Dimensione Reale
+ExternalImageAddAction.text = Aggiungi Immagine Esterna...
+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
+f_button_unassigned = <nessuna azione>
+FaqOpenURLAction.text = FAQ
+file = &File
+file_already_exists = Il file {0} esiste gi\u00e0. Sovrascriverlo?
+file_not_found = File {0} non trovato
+FileListFlavorHandler = Collegamenti ai files
+FileProperties_BranchLeafCount = Numero di nodi finali nei rami selezionati:
+FileProperties_BranchNodeCount = Numero di nodi nei rami selezionati:
+FileProperties_ChangesSinceLastSave = Cambiamenti dall'ultimo salvataggio:
+FileProperties_FileName = Nome del File:
+FileProperties_FileSaved = File Salvato:
+FileProperties_FileSize = Dimensione del File:
+FileProperties_MainBranchCount = Numero di rami principali:
+FileProperties_NeverSaved = Mai salvato
+FileProperties_NodeChildCount = Numero di figli dei nodi selezionati:
+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...
+FileRevisionsDialog.cancel = &Annulla
+FileRevisionsDialog.file_last_modified = Marca Temporale "Timestamp"
+FileRevisionsDialog.file_name = File
+FileRevisionsDialog.file_size = Bytes
+FileRevisionsDialog.open = &Apri
+FileRevisionsDialog.open.tooltip = Aprire i file anche se sembrano obsoleti
+FileRevisionsDialog.question = Trovate revisioni di {0}
+FileRevisionsDialog.restore = Riprist&ina
+FileRevisionsDialog.restore.tooltip = Rimpiazzare {0} con {1}
+FileRevisionsDialog.title = Revisioni File
+filter = Filtro
+filter_add = &Aggiungi
+filter_and = E
+filter_any_text = Cuore, dettagli o note
+filter_conditions = Filtri
+filter_contains = Contiene
+filter_created_after = Creato dopo
+filter_created_before = Creato prima
+filter_delete = Elimina
+filter_details = Dettagli
+filter_dialog = Filtro composto
+filter_does_not_exist = Non esiste
+filter_edit_description = Modifica lista filtri
+filter_enter_value = Inserire valore
+filter_even_level = Nodo di livello dispari
+filter_exist = Esiste
+filter_icon = Icona
+filter_is_equal_to = E' uguale a
+filter_is_not_equal_to = Non \u00E8 uguale a
+filter_leaf = Nodo Finale
+filter_link = Collegamento Ipertestuale
+filter_match_approximately = &Approssima
+filter_match_approximately_tooltip = <html>Ricerca approssimata,<br/>ad esempio cercando 'casa' trover\u00e0 anche 'case'.</html>
+filter_match_case = &Maiuscole/minuscole
+filter_match_case_tooltip = Verifica la corrispondenza Maiuscole e minuscole
+filter_modified_after = Modificato dopo
+filter_modified_before = Modificato prima
+filter_no_filtering = Nessun filtro
+filter_node = Nodo di testo
+filter_node_level = Livello Nodo
+filter_not = &Non
+filter_note = Note
+filter_odd_level = Nodo di livello Pari
+filter_or = O&
+filter_parent = Testo Genitore
+filter_periodic_level = Periodico
+filter_priority = Priorit\u00e0
+filter_regexp_matches = Combacia Espressione Regolare
+filter_reminder = Promemoria
+filter_reminder_after = schedulato dopo
+filter_reminder_before = schedulato prima
+filter_reminder_executed = gi\u00e0 accaduto
+filter_reminder_later = non scaduto
+filter_root = Nodo Principale
+filter_script = Filtro Script
+filter_select = &Seleziona
+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
+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
+FitToPage.text = Adatta alla pagina
+FitToPage.tooltip = Regola lo zoom in modo che tutta la mappa sia contenuta nella finestra attiva.
+fold = Collassa
+FoldAllAction.text = Collassa tutti
+FoldAllAction.tooltip = <html>Collassa il nodo selezionato e tutti i suoi figli.</html>
+FoldOneLevelAction.text = Collassa di un livello
+FoldOneLevelAction.tooltip = <html>Collassa i nodi selezionati di un livello.</html>
+follow_graphical_link = Vai a:
+FollowLinkAction.text = Segui collegamento
+font = Carattere
+FontFamilyAction.text = Tipo Carattere
+FontSizeAction.text = Dimensione carattere
+format_invalid_pattern = Schema non valido
+format_menu_cloud_shapes = Nuvola
+format_menu_edge_styles = &Stile dei collegamenti
+format_menu_edge_widths = Spessore dei collegamenti
+format_panel = Formato
+FormatCopy.text = Copia formattazione
+FormatCopy.tooltip = <html>Copia il formato di un nodo.</html>
+FormatPaste.text = Incolla formattazione
+FormatPaste.tooltip = <html>Incolla la formattazione di un nodo.</html>
+formats_not_loaded = La formattazione non pu\u00f2 essere caricata, file corrotto.
+formula.error.attributeValueIsNull = Valore Attributo ''{0}'' \u00e8 nullo dopo la valutazione.
+formula.error.circularReference = Riferimento Circolare: La formula nel nodo ''{0}'' \u00e8 riferita a se stessa.
+formula.EvaluateAllAction.text = Valuta tutto
+formula.EvaluateAllAction.tooltip = Valuta tutte le formule della mappa attuale
+formula.menuname = Formule
+formula_editor = Modifica Formula
+ForwardAction.text = Avanti
+ForwardAction.tooltip = Avanza nella cronologia dei nodi selezionati
+FreeNodeAction.text = Nodi posizionati liberamente (Abilita/Disabilita)
+Freeplane.progress.buildScreen = Costruisci schermo...
+Freeplane.progress.createController = Crea Controllore...
+Freeplane.progress.createInitialMode = Crea modello iniziale...
+Freeplane.progress.endStartup = Termina avvio.
+Freeplane.progress.gettingPreferenceDirectories = Prendi directory preferenze
+Freeplane.progress.gettingPreferences = Prendi preferenze
+Freeplane.progress.loadMaps = Carica Mappe...
+Freeplane.progress.propagateLookAndFeel = Propaga Aspetto del programma
+Freeplane.progress.settingPreferences = Imposta Preferenze...
+Freeplane.progress.startCreateController = Avvia creazione Controller...
+Freeplane.progress.updateLookAndFeel = Aggiorna Aspetto del programma
+freeplane_reverted = Freeplane_Ritorno_
+FreeplaneHelpStarter.text = Aiuto...
+FreeplaneHelpStarter.tooltip = Aiuto esteso di Freeplane
+GettingStartedAction.text = Per Iniziare
+GotoLinkNodeAction.text = Vai al collegamento
+GotoNodeAction.text = Vai al nodo con ID...
+GrabKeyDialog.common.cancel = Cancella
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Assegnata a
+GrabKeyDialog.grab-key.assigned-to.none = Correntemente non assegnata
+GrabKeyDialog.grab-key.clear = Annulla
+GrabKeyDialog.grab-key.remove = Elimina
+GrabKeyDialog.grab-key.remove-ask = Sei sicuro di volere rimuovere questa combinazione tasti?
+GrabKeyDialog.grab-key.title = Inserisci nuovo tasto
+green = Verde
+help = &?
+HideableAction.tooltip = <html>Segnala lo sfondo di ogni nodo modificato.</html>
+HideAllAttributesAction.text = Nascondi tutti gli Attributi
+HierarchicalIcons2Action.text = Visualizza le Icone in modo gerarchico AND
+HierarchicalIconsAction.text = Visualizza le icone in modo gerarchico OR
+HierarchicalIconsAction.tooltip = Visualizza le icone dei nodi figli, anche nei nodi genitori, se presenti anche in un solo nodo
+hot_keys = Tasti rapidi
+hot_keys_table = Tabella dei tasti rapidi
+HotKeyInfoAction.text = Elenco funzioni tasti
+html_export_based_on_headings = Esporta ad HTML - Basato su intestazioni
+html_export_fold_all = Esporta ad HTML - Collassa tutto
+html_export_fold_currently_folded = Esporta in HTML - Collassa i collassati
+html_export_no_folding = Esporta ad HTML- Nessun collasso
+html_problem = <html>Non \u00e8 possibile tradurre html<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Addizione
+icon_attach = Guarda qui
+icon_audio = Audio
+icon_back = Indietro
+icon_bee = Freeplane
+icon_bell = Ricorda
+icon_bookmark = Eccellente
+icon_broken-line = Rotto
+icon_button_cancel = Non OK
+icon_button_ok = OK
+icon_calendar = Data
+icon_checked = Verificato
+icon_clanbomber = Pericoloso
+icon_clock = Tempo
+icon_clock2 = Promemoria
+icon_closed = Nessuna voce
+icon_decrypted = Sbloccato
+icon_desktop_new = Non dimenticare
+icon_division = Divisione
+icon_down = Sotto
+icon_edit = Affina
+icon_encrypted = Bloccato
+icon_executable = Eseguibile
+icon_family = Famiglia
+icon_fema = Maschio e Femmina
+icon_female1 = Femmina1
+icon_female2 = Femmina2
+icon_females = Femmine
+icon_flag = Bandiera rossa
+icon_flag-black = Badiera nera
+icon_flag-blue = Bandiera blu
+icon_flag-green = Bandiera verde
+icon_flag-orange = Bandiera arancione
+icon_flag-pink = Bandiera rosa
+icon_flag-yellow = Bandiera gialla
+icon_folder = Cartella
+icon_forward = Avanti
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Priorit\u00e0 0
+icon_full-1 = Priorit\u00E0 1
+icon_full-2 = Priorit\u00E0 2
+icon_full-3 = Priorit\u00E0 3
+icon_full-4 = Priorit\u00E0 4
+icon_full-5 = Priorit\u00E0 5
+icon_full-6 = Priorit\u00E0 6
+icon_full-7 = Priorit\u00E0 7
+icon_full-8 = Priorit\u00e0 8
+icon_full-9 = Priorit\u00e0 9
+icon_go = Semaforo Verde
+icon_gohome = Casa
+icon_group = Gruppo
+icon_help = Domanda
+icon_hourglass = In attesa
+icon_icon_not_found = Icona non trovata
+icon_idea = Idea
+icon_image = Immagine
+icon_info = Informazioni
+icon_internet = Internet
+icon_internet_warning = Avviso Internet
+icon_kaddressbook = Telefono
+icon_kmail = E-Mail
+icon_knotify = Musica
+icon_korn = Casella postale
+icon_ksmiletris = Sono felice
+icon_launch = Lancio
+icon_licq = Buono
+icon_list = Lista
+icon_Mail = Posta
+icon_male1 = Maschio1
+icon_male2 = Maschio2
+icon_males = Maschi
+icon_menu = I&cone
+icon_messagebox_warning = Importante
+icon_mindmap = Mappa Mentale
+icon_multiplication = Moltiplicazione
+icon_narrative = Narrazione
+icon_negative = Negativo
+icon_neutral = Neutrale
+icon_password = Chiave
+icon_pencil = Da raffinare
+icon_penguin = Linux
+icon_positive = Positivo
+icon_prepare = Semaforo Giallo
+icon_revision = Revisione
+icon_smiley-angry = Arrabbiato
+icon_smiley-neutral = Nessuna idea
+icon_smiley-oh = Sorpresa
+icon_smily_bad = Non sono contento
+icon_stop = Semaforo Rosso
+icon_stop-sign = Stop
+icon_subtraction = Sottrazione
+icon_unchecked = Non Verificato
+icon_up = Sopra
+icon_user_icon = Icone Utente
+icon_very_negative = Molto Negativo
+icon_very_positive = Molto Positivo
+icon_video = Video
+icon_wizard = Magico
+icon_xmag = Da discutere
+icon_yes = Importante
+IconGroupPopupAction.arrows.text = Frecce
+IconGroupPopupAction.docs_folders.text = Documenti e Cartelle
+IconGroupPopupAction.flags.text = Bandiere
+IconGroupPopupAction.math.text = Matematica
+IconGroupPopupAction.media.text = Media
+IconGroupPopupAction.miscellaneous.text = Varie
+IconGroupPopupAction.nature.text = Natura
+IconGroupPopupAction.numbers.text = Numeri
+IconGroupPopupAction.office.text = Ufficio
+IconGroupPopupAction.people.text = Persone
+IconGroupPopupAction.rating.text = Valutazione
+IconGroupPopupAction.signs.text = Segnali
+IconGroupPopupAction.smiley.text = Faccine
+IconGroupPopupAction.time.text = Tempo
+IconGroupPopupAction.user.text = Icone utente
+IconProgressExtended10Action.text = Icona Avanzamento Estesa, STEP 10%
+IconProgressExtended10Action.tooltip = <html>Aggiunge un indicatore di avanzamento che si incrementa con passi del 10%, col tasto destro del mouse.<br>Ctrl + tasto destro, decrementa fino a rimuovere l'indicatore.</html>
+IconProgressExtended25Action.text = Icona Avanzamento Estesa, STEP 25%
+IconProgressExtended25Action.tooltip = <html>Aggiunge un indicatore di avanzamento che si incrementa con passi del 25%, col tasto destro del mouse.<br>Ctrl + tasto destro, decrementa fino a rimuovere l'indicatore.</html>
+IconProgressIconDownAction.text = Decrementa Avanzamento
+IconProgressIconDownAction.tooltip = Decrementa / inserisci Icona di Avanzamento (100% -> 75% -> 50% -> 25% -> 0% -> rimuovi).
+IconProgressIconUpAction.text = Incrementa Avanzamento
+IconProgressIconUpAction.tooltip = Decrementa / inserisci Icona di Avanzamento (0% -> 25% -> 50% -> 75% -> 100% + OK).
+IconProgressRemoveAction.text = Rimuovi indicatore Avanzamento
+IconProgressRemoveAction.tooltip = Rimuove l'icona di avanzamento e l'icona estesa
+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_linked_branch_no_link = Il seguente nodo non ha link da cui importare.
+ImportAction.text = &Importa
+ImportBranchAction.text = Importa ramo...
+ImportExplorerFavoritesAction.text = Importa preferiti di Internet Explorer...
+ImportFolderStructureAction.text = Importa struttura cartella...
+ImportLinkedBranchAction.text = Importa ramo collegato
+ImportLinkedBranchWithoutRootAction.text = Importa senza radice
+ImportMindmanagerFiles.text = MindManager X5 Map...
+increase_branch_font_size = Aumenta carattere
+IncreaseNodeFontAction.text = Aumenta carattere
+internal_error_tooltip = Errore interno. Consultare l''ultimo log file in {0} per maggiori informazioni.
+invalid_export_file = Nome del file di esportazione non valido
+invalid_file_msg = File non trovato per {0}
+invalid_uri = URI non valido {0}
+invalid_url = Impossibile creare URL valido
+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...
+less_than_two_selected_nodes = Seleziona almeno due nodi per collegarli
+license = Licenza
+license_text = Freeplane - Un programma per creare e visualizzare Mappe mentali\nCopyright (C) 2000-2010 Joerg Mueller <joergmueller at bigfoot.com>\nVedere COPYING per Dettagli\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 WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = &Carica
+load_accelerator_presets = Carica
+LoadAcceleratorPresetsAction.textPatterns.text = Schemi di testo
+locking_failed_by_open = Blocco della mappa {0} fallito. Apertura in sola lettura.
+locking_failed_by_save_as = Blocco della mappa {0} fallito. Azione "Salva come" annullata.
+locking_old_lock_removed = La mappa {0} era in uso dall''utente {1}. Il blocco \u00e8 stato rimosso in quanto vecchio.
+long_node_changed_cancel = Sono stati apportati cambiamenti al nodo, annullare i cambiamenti ?
+long_node_changed_submit = Sono stati apportati cambiamenti al nodo, salvare i cambiamenti ?
+lots_of_links_warning = Si stanno per creare molti collegamenti allo stesso nodo, proseguire ?
+main_resource_directory = Risorse installazione: {0}
+MainView.errorUpdateText = Errore impostando il testo per il seguente input: {0}.
+MakeLinkFromAnchorAction.text = Crea collegamento da \u00e0ncora
+MakeLinkFromAnchorAction.tooltip = <html>crea un collegamento locale o globale<br/>dal nodo \u00e0ncora verso il nodo selezionato</html>
+MakeLinkToAnchorAction.text = Crea collegamento all'\u00e0ncora
+MakeLinkToAnchorAction.tooltip = <html>crea un collegamento locale o globale<br/>dal nodo selezionato verso il nodo \u00e0ncora</html>
+ManageAddOnsAction.text = Add-on
+ManageAddOnsDialog.activate = Attiva
+ManageAddOnsDialog.activation.success = {0} sar\u00e0 attivato dopo il riavvio.
+ManageAddOnsDialog.authored.by = da {0}
+ManageAddOnsDialog.cannot.activate = Non attivabile: {0} \u00e8 gi\u00e0 attivo.
+ManageAddOnsDialog.cannot.configure = Non configurato {0}.
+ManageAddOnsDialog.cannot.deactivate = Non disattivato: {0} non \u00e8 attivo.
+ManageAddOnsDialog.cannot.deinstall = Non disinstallato {0}.
+ManageAddOnsDialog.configure = Configurare
+ManageAddOnsDialog.deactivate = Disattiva
+ManageAddOnsDialog.deactivation.success = {0} sar\u00e0 disattivato dopo il riavvio.
+ManageAddOnsDialog.deinstall = Disinstalla
+ManageAddOnsDialog.deinstallation.success = {0} sar\u00e0 disinstallato dopo il riavvio.
+ManageAddOnsDialog.error = Errore durante l''installazione: {0}.
+ManageAddOnsDialog.install = &Installa
+ManageAddOnsDialog.install.from.known.location = Installare add-on da una posizine conosciuta
+ManageAddOnsDialog.install.tooltip = Inserire qui un URL del file di installazione di un add-on
+ManageAddOnsDialog.map.not.opened = La mappa {0} non sembra aprirsi.
+ManageAddOnsDialog.really.deinstall = Disinstallare veramente {0}?
+ManageAddOnsDialog.search = Ricerca add-on
+ManageAddOnsDialog.search.file = Ricerca
+ManageAddOnsDialog.select.tooltip = Seleziona File
+ManageAddOnsDialog.status.downloading = Downloading file...
+ManageAddOnsDialog.status.installing = Installazione add-on...
+ManageAddOnsDialog.status.success = Installato correttamente {0}.
+ManageAddOnsDialog.tab.install = Cerca e installa
+ManageAddOnsDialog.tab.install.tooltip = Cerca e installa nuovi add-on
+ManageAddOnsDialog.tab.manage = Add-on
+ManageAddOnsDialog.tab.manage.themes = Temi
+ManageAddOnsDialog.tab.manage.themes.tooltip = Gestione temi installati
+ManageAddOnsDialog.tab.manage.tooltip = Gestione add-on installati
+ManageAddOnsDialog.visit.addon.page = Visitare la pagina add-on...
+ManageConditionalStylesAction.text = Gestione Stili Condizionali per le Mappe
+ManageNodeConditionalStylesAction.text = Gestione Stili Condizionali per i Nodi
+map_already_exists = La mappa esiste gi\u00e0. Sovrascriverla ?
+map_corrupted = Mappa corrotta. Vedere dettagli?
+map_load_error = Non \u00e8 stato possibile caricare la mappa {0}
+map_locked_by_open = La mappa {0} \u00e8 utilizzata dall''utente {1}. Apertura in sola lettura.
+map_locked_by_save_as = La mappa {0} \u00e8 utilizzata dall''utente {1}. Azione "Salva come" annullata.
+map_not_saved = La mappa non \u00E8 stata salvata precedentemente
+MapBackgroundColorAction.text = Colore Sfondo Mappa
+MaxNodeWidth.text = Impostare la massima larghezza del nodo
+menu_applyStyle = Applica Stile
+menu_attributes = &Attributi
+menu_clouds = Nuvole
+menu_copy = Copia
+menu_coreFormat = Cuore del nodo
+menu_details = Dettagli
+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...
+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
+MindMapNodesFlavorHandler = Nodi in modo gerarchico
+mindmaps = Mappe
+mindmaps_desc = Mappe (*.mm)
+mindmaps_filter_desc = Filtri (*.mmfilter)
+MinNodeWidth.text = Impostare la minima larghezza del nodo
+mode_Browse = Modalit\u00e0 Visualizzazione
+mode_File = Modalit\u00e0 File
+mode_MindMap = Modalit\u00e0 MindMap
+mode_na = Modalit\u00E0 non disponibile
+mode_status = Modalit\u00E0 cambiata a {0}
+mode_title = Freeplane - {0}
+modes = Modalit\u00E0
+ModesMenuAction.Browse.text = Mappa del Browser
+ModesMenuAction.File.text = Esplora file
+ModesMenuAction.MindMap.text = Editor mappe mentali
+most_recent_files = &File recenti
+MoveToRootAction.text = Vai al nodo centrale
+NameConditionAction.text = Imposta nome
+NavigationNextMapAction.text = Mappa successiva
+NavigationPreviousMapAction.text = Mappa precedente
+new = &Nuovo
+new_map_from_user_templates.text = Nuova Mappa da Modello...
+new_mindmap = Nuova mappa
+new_node = Nuovo nodo
+new_node_as_sibling_not_possible_for_the_root = Non \u00E8 possibile creare fratelli del nodo radice
+new_version_available = Nuova versione ''{0}'' disponibile
+NewChildAction.text = Nuovo nodo figlio
+NewerFileRevisionsFoundDialog.cancel = &Salta
+NewerFileRevisionsFoundDialog.cancel.tooltip = Non aprire questo file
+NewerFileRevisionsFoundDialog.file_last_modified = Data/Ora
+NewerFileRevisionsFoundDialog.file_name = File
+NewerFileRevisionsFoundDialog.file_size = Bytes
+NewerFileRevisionsFoundDialog.open = &Apri
+NewerFileRevisionsFoundDialog.open.tooltip = Apri file anche se potrebbero essere obsoleti
+NewerFileRevisionsFoundDialog.question = Trovata nuova versione di {0}!\nSi vuole aprire lo stesso {0} (guardare la prima riga) ?\nPer rimpiazzare {0} da un file di salvataggio automatico dalla lista\nselezionarlo e cliccare su ''Ripristina''.
+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 ?
+NewMapAction.text = Nuova Mappa
+NewMapViewAction.text = Nuova Vista Mappa
+NewParentNode.text = Nuovo nodo genitore
+NewParentNode.tooltip = <html>Tutti i nodi selezionati sono inviati a un nuovo genitore.</html>
+NewPreviousSiblingAction.text = Nuovo nodo fratello, sopra
+NewSiblingAction.text = Nuovo nodo fratello
+NewSummaryAction.text = Gruppo Nodi - Nuovo Nodo
+NewUserStyleAction.text = Nuovo Stile dalla selezione
+NextNodeAction.BACK.text = Nodo precedente
+NextNodeAction.BACK_N_FOLD.text = Nodo precedente (collassa)
+NextNodeAction.FORWARD.text = Nodo successivo
+NextNodeAction.FORWARD_N_FOLD.text = Nodo successivo (espandi)
+NextPresentationItemAction.text = Espandi il prossimo elemento della presentazione
+no = No
+no_copy_attributes_before_paste_attributes = Non si possono incollare Attributi, finch\u00e8 non vengono copiati prima.
+NO_FORMAT = Testo
+no_format_copy_before_format_paste = Non \u00e8 possibile incollare un formato finch\u00e9 non ne viene copiato uno.
+no_found_from = <html>Nessun <u>{0}</u> trovato da "{1}".
+no_more_found_from = <html>Non \u00e8 stato trovato nessun altro <u>{0}</u> a partire dal nodo "{1}".
+no_previous_find = Nessun precedente trovato.
+no_styles_found_in_map = Non sono stati trovati stili nella mappa
+node = Nodo
+node_changed_discard_changes = Il nodo \u00e8 stato modificato, si vuole abbandonare le modifiche?
+node_is_write_protected = Il nodo destinatario \u00e8 protetto da scrittura.
+node_location_help = Trascinare per cambiare la posizione del nodo, ctrl+trascina cambia le distanze di tutti i nodi fratelli, doppio click e ctrl+doppio click ripristina la posizione standard.
+node_selector = Selezione Nodo
+node_selector_message = Doppio Click seleziona Nodo
+node_styles = Stili Nodo
+NodeBackgroundColorAction.text = &Colore sfondo nodo...
+NodeColorAction.text = Colore testo nodo...
+NodeColorBlendAction.text = Miscela colore con sfondo mappa
+NodeDownAction.text = Sposta Nodo sotto
+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
+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
+ok = &OK
+OKAction.text = &OK
+OnlineReference.text = Mappa documentazione Online
+open_asMindMap = Mappa Mentale
+OpenAction.text = &Apri mappa salvata...
+OpenFreeplaneSiteAction.text = Homepage di Freeplane
+OpenPathAction.text = Apri File
+OpenURLMapAction.text = Apri mappa dall'indirizzo...
+OpenUserDirAction.text = Apri la cartella utente
+option_changes_may_require_restart = Per visualizzare alcuni cambiamenti \u00e8 necessario riavviare Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &No
+OptionalDontShowMeAgainDialog.dontShowAgain = &Non chiedere pi\u00F9.
+OptionalDontShowMeAgainDialog.ok = &Si
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Ricorda la mia scelta.
+OptionPanel.absolute = Assoluto
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Formattazione automatica
+OptionPanel.ADD_CHILD = Aggiungi Nodo Figlio
+OptionPanel.ADD_SIBLING = Aggiungi Nodo Fratello
+OptionPanel.addons = Add-on
+OptionPanel.always_fold_all_after_load = Collassa Tutto
+OptionPanel.always_load_last_maps = Apri sempre le ultime e le nuove mappe
+OptionPanel.always_load_last_maps.tooltip = Apri gli ultimi file come da opzioni precedenti, anche avviando Freeplane con doppio click su un file mappa
+OptionPanel.always_save_folding = sempre
+OptionPanel.always_save_folding_state = Salva sempre i cambiamenti allo stato di espansione/collasso
+OptionPanel.always_save_folding_state.tooltip = Se impostato, anche per la sola azione di espansione/collasso verr\u00e0 richiesto il salvataggio della mappa.
+OptionPanel.always_unfold_all_after_load = Espandi tutto
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html> Determina la qualit\u00E0 della mappa. Un antialias pi\u00F9 accurato richiede pi\u00F9 tempo.</html>
+OptionPanel.antialias_all = Antialias tutto
+OptionPanel.antialias_edges = Antialias collegamenti
+OptionPanel.antialias_none = No antialias
+OptionPanel.Appearance = Visualizzazione
+OptionPanel.apply_system_screen_resolution = Applica la risoluzione standard dello schermo
+OptionPanel.approximate_search_threshold = Soglia di approssimazione
+OptionPanel.approximate_search_threshold.tooltip = <html>Soglia di approssimazione per il confronto<br/><font size="2">vedere http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(pi\u00f9 alto \u00e8 il valore, minore \u00e8 la tolleranza<br/>per i termini riconosciuti)</html>
+OptionPanel.ar = Arabo / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ARC = Arco
+OptionPanel.as_parent = Come genitore
+OptionPanel.ask = Chiedi
+OptionPanel.automatic = Automatico
+OptionPanel.automaticFormat_level = Stile Formattazione Automatico
+OptionPanel.automaticFormat_level1 = Formato del nodo radice
+OptionPanel.automaticFormat_level2 = 1. Livello, Formato del nodo
+OptionPanel.backup_file_number = Numero di file di Backup mantenuti
+OptionPanel.Behaviour = Comportamento
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Bolla
+OptionPanel.ca = Catalano, Valenziano / Catal\u00e0
+OptionPanel.Cancel = Cancella
+OptionPanel.center_selected_node = Centra i nodi selezionati
+OptionPanel.check_updates_automatically = Controlla aggiornamenti all'avvio del programma
+OptionPanel.childpattern = Schema dei figli
+OptionPanel.childpattern.tooltip = Lo schema selezionato \u00E8 applicato a tutti i figli
+OptionPanel.clear_all_setters = Cambia tutto
+OptionPanel.clear_all_setters.tooltip = Abilita o disabilita tutti i cambiamenti indicati.
+OptionPanel.cloud = Nuvola
+OptionPanel.cloudcolor = Colore
+OptionPanel.cloudshape = Forma
+OptionPanel.combined = Combinato
+OptionPanel.compare_as_number = Confronta come Numeri
+OptionPanel.convert_to_current_version = <html>Convertire automaticamente le mappe create con vecchie versioni di Freeplane <br>alla versione attuale?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>Solo per mappe molto grandi che non richiedono di essere convertite <br>(per utenti esperti) \u00e8 possibile aprire le mappe senza conversione.</html>
+OptionPanel.cs = Ceco / \u010desky
+OptionPanel.cut_nodes_without_question = Tagliare i nodi senza conferma?
+OptionPanel.cut_nodes_without_question.tooltip = Se selezionato, i nodi verranno tagliati senza richiesta di conferma. Questo pu\u00f2 causare perdita di dati, tagliando accidentalmente.
+OptionPanel.da = Danese / dansk
+OptionPanel.date_format = Formato data Standard
+OptionPanel.date_format.tooltip = Formati: "SHORT","MEDIUM","LONG","FULL" o una stringa tipo "MM/dd/yyyy"
+OptionPanel.datetime_format = Formato data-ora standard
+OptionPanel.datetime_format.tooltip = Entrambe <stile data> e <stile ora> con i formati: "SHORT","MEDIUM","LONG","FULL" o una stringa tipo "M/dd/yyyy hh:mm"
+OptionPanel.de = Tedesco / Deutsch
+OptionPanel.default = Predefinito
+OptionPanel.default_attribute_key_column_width = Larghezza attributo chiave predefinita
+OptionPanel.default_attribute_value_column_width = Larghezza attributo valore predefinita
+OptionPanel.default_browser_command_mac = Comando sfoglia predefinito Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> e MAC: </html>
+OptionPanel.default_browser_command_other_os = Comando Sfoglia predefinito per gli altri sistemi operativi
+OptionPanel.default_browser_command_other_os.tooltip = <html> Questo \u00E8 tipico Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Comando sfoglia predefinito Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Per Windows (il segno "" \u00E8 necessario a causa del collegamento, c'\u00E8 un "=" nel loro URL).</html>
+OptionPanel.default_browser_command_windows_nt = Comando sfoglia predefinito Windows Nt
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Per Windows (il segno "" \u00E8 necessario a causa del collegamento, c'\u00E8 un "=" nel loro URL).</html>
+OptionPanel.default_charset = Codifica dei caratteri
+OptionPanel.Defaults = Predefiniti
+OptionPanel.delete_automatic_saves_at_exit = Elimina i salvataggi automatici in uscita
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Se i file devono essere cancellati automaticamente in chiusura normale di Freeplane imposta le variabili seguenti a 'vero'</html>
+OptionPanel.delete_nodes_without_question = Eliminare i nodi senza conferma?
+OptionPanel.delete_nodes_without_question.tooltip = Se questo comando \u00E8 selezionato, i nodi vengono eliminati senza conferma. Se premuto inavvertitamente, ci\u00F2 pu\u00F2 causare perdita di informazioni.
+OptionPanel.disable_cursor_move_paper = Disabilita il cursore "muovi" sulla pagina
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Non visualizzare il cursore 'muovi' durante il trascinamento del foglio</html>
+OptionPanel.display_inline_editor_for_all_new_nodes = Visualizza l'editor in linea per tutti i nuovi nodi
+OptionPanel.display_node_id = Visualizza l'ID del nodo
+OptionPanel.edgecolor = Colore
+OptionPanel.edgecolor.tooltip = Propriet\u00E0 del collegamento al nodo genitore (viene applicato anche a tutti i figli)
+OptionPanel.edgestyle = Stile
+OptionPanel.edgestyle.tooltip = Propriet\u00E0 del collegamento al nodo genitore (viene applicato anche a tutti i figli)
+OptionPanel.edgewidth = Spessore
+OptionPanel.edgewidth.tooltip = Propriet\u00E0 del collegamento al nodo genitore (viene applicato anche a tutti i figli)
+OptionPanel.EDIT_CURRENT = Sovrascrivi Contenuto
+OptionPanel.edit_on_double_click = Modifica con doppio click
+OptionPanel.editor_extra_width = Passo incremento Spessore
+OptionPanel.editor_extra_width.tooltip = <html>Imposta di quanti pixel incrementare la larghezza di un nodo, se il testo va oltre la larghezza attuale.</html>
+OptionPanel.el = Greco / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__buttons_above = Pulsanti in alto
+OptionPanel.el__enter_confirms_by_default = Invia conferma automaticamente
+OptionPanel.el__max_default_window_height = Altezza predefinita massima della finestra
+OptionPanel.el__max_default_window_width = Larghezza predefinita massima della finestra
+OptionPanel.el__min_default_window_height = Altezza predefinita minima della finestra
+OptionPanel.el__min_default_window_width = Larghezza predefinita minima della finestra
+OptionPanel.el__position_window_below_node = Posiziona la finestra sotto il nodo
+OptionPanel.en = Inglese / English
+OptionPanel.Environment = Ambiente
+OptionPanel.es = Spagnolo, Castiliano / espa\u00f1ol, castellano
+OptionPanel.et = Estone / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking = Abilitazione esecuzione script
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Gli script di Freeplane sono principalmente in grado di effettuare qualsiasi azione sul computer. <br>Perci\u00f2, non eseguire script se non si \u00e8 sicuri di ci\u00f2 che si fa.
+OptionPanel.execute_scripts_without_exec_restriction = Permetti di eseguire altre applicazioni (SCONSIGLIATO)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>Se i vostri script Groovy richiedono di eseguire altre applicazioni speciali (come un browser) senza chiedere(\!),<br>\u00e8 necessario abilitare questa opzione. <br>Ma usarla con cautela, in quanto script maligni possono danneggiare il computer\!</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Permetti operazioni sui file (SCONSIGLIATO)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Se i vostri Groovy script richiedono di eseguire azioni speciali sui file (apri, chiudi, leggi, scrivi, cancella(\!)),<br>\u00e8 necessario abilitare questa opzione. <br>Ma usarla con cautela, in quanto script maligni possono danneggiare il computer\!</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Permetti operazioni di rete (SCONSIGLIATO)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Se i vostri script Groovy richiedono di eseguire azioni particolari in rete,<br>\u00e8 necessario abilitare questa opzione. <br>Ma usarla con cautela, in quanto script maligni possono rivelare anche i dati riservati\!</body></html>
+OptionPanel.execute_scripts_without_write_restriction = Permetti operazioni di Scrittura File (NON raccomandato)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>Se i vostri Groovy Script necessitano di scrivere files (Scrivere e Cancellare(!)),<br>\u00e8 necessario abilitare questa opzione. <br>Normalmente si usa la lettura.<br>Usare con attenzione, script maligni potrebbero danneggiare il computer!</body></html>
+OptionPanel.experimental_file_locking_on = Blocco file aperti da altri utenti
+OptionPanel.experimental_file_locking_on.tooltip = <html> Se una mappa \u00e8 gi\u00e0 aperta da un utente, impedisce ad altri utenti di modificarla </html>
+OptionPanel.export_icons_in_html = Esporta icone in Html
+OptionPanel.export_icons_in_html.tooltip = <html> Imposta se l'Html esportato da Freeplane pu\u00f2 contenere icone.<br> Il problema con le icone \u00e8 che spesso i collegamenti non vengono trovati nell'Html esportato.</html>
+OptionPanel.Files = Files
+OptionPanel.first = Primo
+OptionPanel.fold_on_click_inside = Espandi/Collassa con click all'interno del nodo
+OptionPanel.foldingsymbolwidth = Contrai larghezza simboli
+OptionPanel.foldingsymbolwidth.tooltip = <html>Larghezza del cerchio di contrazione</html>
+OptionPanel.fork = Biforcazione
+OptionPanel.format_locale = Formato locale
+OptionPanel.format_locale.tooltip = Impostazione formati date e numeri
+OptionPanel.formula_disable_caching = Disabilita la memoria di valutazione per "Formula"
+OptionPanel.formula_disable_plugin = Disabilita il Plugin "Formula"
+OptionPanel.fr = Francese / Fran\u00e7ais
+OptionPanel.gl = Gallico / Galego
+OptionPanel.goto_note_end_on_edit = Posizionare il cursore alla fine, quando si modifica una nota.
+OptionPanel.grid_size = Dimensione intervallo Griglia
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Nascondi Collegamenti
+OptionPanel.highlight_formulas = Evidenzia Formule
+OptionPanel.horizontal = Orizzontale
+OptionPanel.hr = Croato / hrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Basato sull'intestazione
+OptionPanel.html_export_fold_all = Contrai tutti
+OptionPanel.html_export_fold_currently_folded = Contrai i rami correntemente contratti
+OptionPanel.html_export_folding = Contrazione esportazione Html
+OptionPanel.html_export_no_folding = Nessuna contrazione
+OptionPanel.hu = Ungherese / Magyar
+OptionPanel.ic_disable = Disabilita
+OptionPanel.ic_file = Usa il disco
+OptionPanel.ic_ram = In RAM
+OptionPanel.icon = Icona
+OptionPanel.icon.tooltip = Se applicato, il nodo avr\u00e0 esattamente questa icona.
+OptionPanel.icons.list = Lista delle icone standard visualizzate
+OptionPanel.icons.list.tooltip = Qui \u00e8 possibile ordinare o disabilitare le icone standard. Le icone devono essere separate dal carattere ";"
+OptionPanel.id = Indonese / Bahasa Indonesia
+OptionPanel.IGNORE = Non fare Nulla
+OptionPanel.il__enter_confirms_by_default = Conferma con il tasto Invio
+OptionPanel.image_cache = per le immagini
+OptionPanel.it = Italiano / Italiano
+OptionPanel.ja = Giapponese / \u65e5\u672c\u8a9e
+OptionPanel.key_type_action = Scrivendo con la tastiera
+OptionPanel.Keystrokes = Tasti Rapidi
+OptionPanel.ko = Coreano / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.label_font_family = Tipo Carattere
+OptionPanel.label_font_size = Dimensione Carattere
+OptionPanel.language = Lingua
+OptionPanel.language.tooltip = <html>Questa \u00e8 la lingua che verr\u00e0 utilizzata nel programma. 'automatico' carica la lingua standard dell'utente. </html>
+OptionPanel.last = Ultimo
+OptionPanel.last_opened_list_length = Lunghezza lista file recenti
+OptionPanel.layout_map_on_text_change = Ridisegna Mappa durante la modifica del nodo
+OptionPanel.layout_map_on_text_change.tooltip = Disabilitare per migliorare le prestazioni
+OptionPanel.linear = Lineare
+OptionPanel.links = Collegamenti
+OptionPanel.links.tooltip = <html>Imposta i collegamenti relativi o assoluti </html>
+OptionPanel.load_folding = Stato di Espansione/Collasso
+OptionPanel.load_folding_from_map_default_fold_all = Carica dalla mappa, eventualmente collassa tutto
+OptionPanel.load_folding_from_map_default_unfold_all = Carica dalla mappa, eventualmente espandi tutto
+OptionPanel.load_last_map = Apri automaticamente l'ultima mappa
+OptionPanel.load_last_map.tooltip = <html>Se selezioni questa opzione, all'apertura di Freeplane si aprir\u00E0 automaticamente l'ultima mappa utilizzata.</html>
+OptionPanel.load_last_maps = Carica tutte le ultime mappe
+OptionPanel.lookandfeel = Aspetto del programma
+OptionPanel.lookandfeel.tooltip = <html> Per inserire un aspetto personalizzato, inserire qui il nome della classe e assicurarsi che i corrispondenti file jar siano caricati. <br>Se ci sono problemi con l'apetto, sceglere "nulls" qui. Questo funziona per gli applet.<br> Attenzione 'mac' \u00e8 disponibile solo su MacOS.</html>
+OptionPanel.lt = Lituano / kalba
+OptionPanel.max_displayed_node_count = Numero massimo di nodi visualizzati
+OptionPanel.max_image_width = Larghezza iniziale massima dell'immagine
+OptionPanel.max_image_width.tooltip = Le nuove immagini verranno scalate a questa larghezza
+OptionPanel.max_menu_item_count = Numero massimo di elementi del menu
+OptionPanel.max_menu_item_count.tooltip = Limita il numero di elementi in un sottomenu, almeno 10
+OptionPanel.max_node_width = Largh.max.
+OptionPanel.max_shortened_text_length = Lunghezza massima dei nodi accorciati
+OptionPanel.metal = Metallo
+OptionPanel.min_node_width = Largh.min.
+OptionPanel.motif = Motivo
+OptionPanel.nb = Norvegese Bokm\u00e5l/ Norsk bokm\u00e5l
+OptionPanel.never_save_folding = mai
+OptionPanel.nl = Olandese / Nederlands, Vlaams
+OptionPanel.nn = Norvegese Nynorsk / Norsk nynorsk
+OptionPanel.nodebackgroundcolor = Sfondo
+OptionPanel.nodebackgroundcolor.tooltip = Colore di sfondo del nodo.
+OptionPanel.nodecolor = Carattere
+OptionPanel.nodecolor.tooltip = Colore del carattere del nodo.
+OptionPanel.nodefontbold = Grassetto
+OptionPanel.nodefonthyperlink = Link
+OptionPanel.nodefontitalic = Corsivo
+OptionPanel.nodefontname = Font
+OptionPanel.nodefontsize = Dim.
+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
+OptionPanel.number_format = Formato standard per i numeri
+OptionPanel.number_format.tooltip = Una stringa con i simboli '#' per i le cifre optional o '0' per quelle obbligatorie. Esempio: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = Numero di file per il salvataggio automatico
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Numero di file differenti in cui salvare la mappa. Il primo salvataggio automatico viene effettuato sul primo file e cos\u00EC via al salvataggio n+1, fino a tornare al primo (ciclico)</html>
+OptionPanel.OK = Salva
+OptionPanel.org.freeplane.plugin.bugreport = Comportamento
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Inviare sempre
+OptionPanel.org.freeplane.plugin.bugreport.ask = Mostra la finestra del report
+OptionPanel.org.freeplane.plugin.bugreport.denied = Non inviare mai
+OptionPanel.org.freeplane.plugin.bugreport.userid = Identificativo opzionale da inviare
+OptionPanel.outline_hgap = Distanza orizzontale
+OptionPanel.outline_vgap = Distanza verticale
+OptionPanel.paint_connectors_behind = Disegna i connettori dietro ai nodi
+OptionPanel.parse_data = Riconoscimento automatico dei numeri e delle date-orari digitati
+OptionPanel.parse_data.tooltip = Riconosce date e numeri inseriti, ed applica i formati standard. Esempio: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.PASTE_HTML = Incolla come HTML
+OptionPanel.PASTE_PLAIN_TEXT = Incolla come testo semplice
+OptionPanel.path_property_may_not_be_empty = Il percorso non pu\u00f2 essere vuoto! La modifica \u00e8 stata annullata.
+OptionPanel.patternname = Nome
+OptionPanel.patternname.tooltip = Nome univoco dello schema univoco
+OptionPanel.pl = Polacco / polski
+OptionPanel.placenewbranches = Inserisci nuovo ramo
+OptionPanel.placenewbranches.tooltip = <html>Quando inserisci un nuovo ramo i valori validi sono 'primo' e 'ultimo' </html>
+OptionPanel.plugin.tooltip = Plugin secondari
+OptionPanel.plugins = Plugin
+OptionPanel.presentation_dimmer_transparency = Sfumatura trasparenza Presentazione
+OptionPanel.presentation_mode = Modo Presentazione
+OptionPanel.printonwhitebackground = <html>Sfondo bianco per la stampa</html>
+OptionPanel.printonwhitebackground.tooltip = <html>Usa sempre lo sfondo bianco per la stampa</html>
+OptionPanel.pt_BR = Portoghese (Brasile) / Portugu\u00eas (Brasil)
+OptionPanel.pt_PT = Portoghese (Portogallo) / Portugu\u00eas (Portugal)
+OptionPanel.RECT = Rettangolo
+OptionPanel.relative = Relativo
+OptionPanel.remind_type_of_new_nodes.tooltip = <html>"Chiedi" chieder\u00e0 (usare se si \u00e8 nel dubbio).<br>"Si" visualizzer\u00e0 la finestra di modifica testo avanzato.<br>"No" visualizzer\u00e0 la finestra di modifica testo semplice.</html>
+OptionPanel.remind_use_rich_text_in_new_nodes = Usa formattazione testo avanzata (RTF) per i nodi Incollati
+OptionPanel.remove_notes_without_question = Rimuovere le note senza conferma?
+OptionPanel.remove_notes_without_question.tooltip = Se selezionato, le note appartenenti ai nodi selezionati saranno rimosse senza richiesta di conferma. Questo pu\u00f2 causare perdita di informazioni se premuto accidentalmente.
+OptionPanel.resources_use_default_font_for_notes_too = Usa i caratteri predefiniti anche per le note
+OptionPanel.resources_use_margin_top_zero_for_notes = Rimuovi il margine superiore per le note
+OptionPanel.revision_color = Colore Revisione
+OptionPanel.revision_color.tooltip = Colore di sfondo per i nodi modificati.
+OptionPanel.ROUND_RECT = Rettangolo Arrotondato
+OptionPanel.ru = Russo / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a
+OptionPanel.save_folding = Salva stato Espansione/Collasso
+OptionPanel.save_folding_if_map_is_changed = Se la mappa \u00e8 cambiata
+OptionPanel.save_modification_times = Salva i tempi di modifica
+OptionPanel.script_classpath = Script classpath: Cartella contenente le classi e JARs
+OptionPanel.script_classpath.tooltip = <html>Una lista di JARs e cartelle da aggiungere alle classpath degli script e delle formule. <br>Usare ; (Windows) or : (Linux, Mac) per separare le voci.<br>Le cartelle saranno utilizzate per i JARs e per i file .class<br>I percorsi che non sono assoluti saranno considerati relativi alla cartella utente di Freeplane.<br>Impostando la classpath \u00e8 necessario permettere anche l'accesso in lettura!</html>
+OptionPanel.script_directories = Percorsi di ricerca degli script (separati dal simbolo ;;)
+OptionPanel.script_directories.tooltip = <html>Una lista di cartelle. <br>Usare ; (Windows) o : (Linux, Mac) per separare le voci.<br>I percorsi non assoluti saranno considerati relativi alla cartella utente di Freeplane.</html>
+OptionPanel.script_user_key_name_for_signing = Chiave alias utente facoltativa per la firma
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>Per firmare i tuoi script, inserisci il nome della chiave qui. <br>La chiave risiede nelle impostazioni dei tasti standard. <br>La password segreta deve coincidere con la password digitata (standard).</html>
+OptionPanel.scrollbar_increment = Velocit\u00e0
+OptionPanel.scrolling_speed = Velocit\u00e0 automatica di scorrimento mappa
+OptionPanel.selection_method = Seleziona metodo
+OptionPanel.selection_method.tooltip = <html> Con la seguente opzione \u00e8 possibile attivare/disattivare la selezione ritardata. Opzione automatica. Non modificare, poich\u00e9 verranno salvati comunque in auto.properties.</html>
+OptionPanel.selection_method_by_click = Click del mouse
+OptionPanel.selection_method_delayed = Ritardata
+OptionPanel.selection_method_direct = Immediata
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Schemi
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Attributi
+OptionPanel.separator.automatic_save = Salvataggio automatico
+OptionPanel.separator.behaviour = Comportamento
+OptionPanel.separator.browser = Sfoglia
+OptionPanel.separator.cache = Cache
+OptionPanel.separator.CloudControls = Nuvole
+OptionPanel.separator.commands_for_the_program = Comandi per il programma
+OptionPanel.separator.connectors = Collegamenti Grafici
+OptionPanel.separator.data_formats = Formattazione e interpretazione data
+OptionPanel.separator.default_colors = Colori predefiniti
+OptionPanel.separator.default_fonts = Caratteri predefiniti
+OptionPanel.separator.default_styles = Stili predefiniti
+OptionPanel.separator.EdgeControls = Collegamenti
+OptionPanel.separator.edit_long_node_window = Finestra modifica nodo avanzata
+OptionPanel.separator.editing = Impostazioni dell'editor
+OptionPanel.separator.files = Files
+OptionPanel.separator.formula = Plugin "Formula"
+OptionPanel.separator.General = Generale
+OptionPanel.separator.html_export = Esporta Html
+OptionPanel.separator.html_import = Importazione Html
+OptionPanel.separator.hyperlink_types = Tipi di collegamento
+OptionPanel.separator.icon_properties = Icone
+OptionPanel.separator.icons = Icone in "Seleziona Icona..."
+OptionPanel.separator.initial_map_size = Dimensione iniziale mappa
+OptionPanel.separator.inline_editor = Editor semplice del nodo
+OptionPanel.separator.key_typing = Scrivi chiave
+OptionPanel.separator.language = Lingua
+OptionPanel.separator.load = Carica
+OptionPanel.separator.look_and_feel = Aspetto del programma
+OptionPanel.separator.mouse_wheel = Rotella del mouse
+OptionPanel.separator.new_node_commands = Nuovo comando nodo
+OptionPanel.separator.node_editing_commands = Comandi modifica nodi
+OptionPanel.separator.node_navigation_commands = Comandi navigazione nodi
+OptionPanel.separator.NodeColors = Colore del nodo
+OptionPanel.separator.NodeFont = Carattere dei nodi
+OptionPanel.separator.NodeShape = Forma del nodo
+OptionPanel.separator.NodeStyle = Stile del nodo
+OptionPanel.separator.NodeText = Test del nodo
+OptionPanel.separator.notifications = Conferme
+OptionPanel.separator.org.freeplane.plugin.bugreport = Rapporto errori automatico
+OptionPanel.separator.other_defaults = Altro predefinito
+OptionPanel.separator.others = Altre chiavi dipendenti
+OptionPanel.separator.outline_view = Visualizzazione lineare ad albero
+OptionPanel.separator.patterns = Schemi
+OptionPanel.separator.RichTextEditor = Editor testo Avanzato
+OptionPanel.separator.root_node_appearance = Aspetto nodo radice
+OptionPanel.separator.save = Salva
+OptionPanel.separator.scripting = Permessi degli Script
+OptionPanel.separator.scrollbar = Barra di scorrimento
+OptionPanel.separator.search = Cerca
+OptionPanel.separator.selection_colors = Colori per indicare la Selezione
+OptionPanel.separator.selection_method = Metodo di selezione
+OptionPanel.separator.single_instance_mode = Unica finestra di Programma
+OptionPanel.separator.size_limits = Limite di dimensione
+OptionPanel.separator.spelling = Opzioni di controllo ortografico
+OptionPanel.separator.status = Linea di Stato
+OptionPanel.separator.tooltip = Tempi dei Suggerimenti Tooltip
+OptionPanel.separator.undo = Annulla
+OptionPanel.separator.updates = Aggiornamenti Programma
+OptionPanel.set_property_text = Modifica
+OptionPanel.set_property_text.tooltip = Vuoto: non modificare; Meno: rimuovi propriet\u00e0 (imposta valori predefiniti); Pi\u00f9: cambia propriet\u00e0
+OptionPanel.setscript = Modificare?
+OptionPanel.setscript.tooltip = Uno script pu\u00F2 essere associato allo stile.
+OptionPanel.sharp_bezier = bezier leggero
+OptionPanel.sharp_linear = lineare leggero
+OptionPanel.show_icon_for_attributes = Visualizza l'icona per indicare la presenza di attributi del nodo
+OptionPanel.show_node_tooltips = Visualizza i suggerimenti "ToolTip" per i Nodi
+OptionPanel.show_note_icons = Mostra le icone delle note
+OptionPanel.show_styles_in_tooltip = Visualizza gli stili dei nodi nel "ToolTip"
+OptionPanel.signed_script_are_trusted = Script con firma affidabile (raccomandato).
+OptionPanel.signed_script_are_trusted.tooltip = Se gli script sono firmati da autori attendibili (per esempio da Freeplane o da te stesso), verranno eseguiti senza restrizioni.
+OptionPanel.simplyhtml.default_paste_mode = Modalit\u00e0 Standard per "incollare"
+OptionPanel.single_backup_directory = Usare una cartella unica per i file di Backup
+OptionPanel.single_backup_directory.tooltip = <html> Imposta se i file di backup ed i file del salvataggio automatico, saranno salvati in una cartella unica al posto di una sotto-cartella del percorso della mappa stessa</html>
+OptionPanel.single_backup_directory_path = Cartella di Backup (se l'opzione precedente \u00e8 selezionata)
+OptionPanel.single_backup_directory_path.tooltip = <html>Sostituisce default <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance = Apre le mappe nella finestra di programma gi\u00e0 in esecuzione
+OptionPanel.single_instance_force = Evita una seconda finestra di programma in ogni caso
+OptionPanel.single_instance_force.tooltip = Evita una seconda finestra del programma, anche se non c'\u00e8 nessun file da caricare.
+OptionPanel.sk = Slovacco / sloven\u010dina
+OptionPanel.sl = Sloveno / sloven\u0161\u010dina
+OptionPanel.spelling_opt_case_sensitive = Maiuscole e minuscole
+OptionPanel.spelling_opt_ignore_all_caps_words = Ignorare tutte le parole maiuscole
+OptionPanel.spelling_opt_ignore_capitalization = Ignorare le lettere maiuscole a inizio parola
+OptionPanel.spelling_opt_ignore_words_with_numbers = Ignorare parole con numeri
+OptionPanel.spelling_opt_suggestions_limit_dialog = Numero massimo di suggerimenti nella finestra di dialogo
+OptionPanel.spelling_opt_suggestions_limit_menu = Numero massimo di suggerimenti nel menu
+OptionPanel.sr = Serbo / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = File Modello Standard
+OptionPanel.standardbackgroundcolor = <html>Imposta il colore predefinito di sfondo</html>
+OptionPanel.standardbackgroundcolor.tooltip = <html>Il colore di sfondo predefinito in notazione html </html>
+OptionPanel.standardcloudcolor = Colore predefinito nuvola
+OptionPanel.standardcloudcolor.tooltip = <html>Seleziona il colore standard delle nuvole</html>
+OptionPanel.standardcloudestyle = Stile predefinito nuvole
+OptionPanel.standardcloudestyle.tooltip = <html>Lo stile predefinito delle nuvole. Al momento \u00E8 supportato solo lo stile 'bezier'</html>
+OptionPanel.standarddrawrectangleforselection = Visualizza i nodi selezionati con delle bolle
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Evidenzia i nodi selezionati circoscrivendoli con delle bolle.</html>
+OptionPanel.standardlinkcolor = Colore predefinito dei Collegamenti Grafici
+OptionPanel.standardlinkcolor.tooltip = <html>Seleziona il colore predefinito dei collegamenti Grafici</html>
+OptionPanel.standardlinkestyle = Stile predefinito collegamenti
+OptionPanel.standardlinkestyle.tooltip = <html>Lo stile predefinito del nodo. Al momento \u00E8 supportato solo lo stile 'bezier'</html>
+OptionPanel.standardselectednodecolor = Colore di sfondo per la selezione
+OptionPanel.standardselectednodecolor.tooltip = <html>Colore usato per indicare il nodo selezionato</html>
+OptionPanel.standardselectednoderectanglecolor = Colore della Bolla di selezione
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>Seleziona il colore della bolla che indica i nodi selezionati</html>
+OptionPanel.STAR = Stella
+OptionPanel.structured_html_import = Importa HTML come struttura nodo
+OptionPanel.structured_icon_toolbar = Barra delle icone strutturata
+OptionPanel.summary = Sommario
+OptionPanel.sv = Svedese / svenska
+OptionPanel.text.use_ctrl_key = E' anche possibile assegnare i Tasti Rapidi, cliccando sui predefiniti del menu Stili, tenendo premuto CTRL
+OptionPanel.time_for_automatic_save = Intervallo salvataggio automatico
+OptionPanel.time_for_automatic_save.tooltip = <html> Tempo che intercorre tra due azioni automatiche di salvataggio (in msec): Per disabilitare il salvataggio automatico imposta il numero a 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tempo di attesa per la selezione posticipata, ms
+OptionPanel.time_for_delayed_selection.tooltip = <html> Selezionare il tempo di ritardo affinch\u00e8 il nodo venga selezionato, quando il mouse si porta sopra di esso (in msec).</html>
+OptionPanel.toolTipManager.dismissDelay = Tempo di permanenza, ms
+OptionPanel.toolTipManager.initialDelay = Ritardo iniziale, ms
+OptionPanel.toolTipManager.max_tooltip_width = Larghezza suggerimenti
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>La larghezza predefinita dei suggerimenti in pixel.</html>
+OptionPanel.toolTipManager.reshowDelay = Tempo di ripetizione, ms
+OptionPanel.tr = Turco / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+OptionPanel.uk_UA = Ucraino / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
+OptionPanel.undefined_font = Carattere non definito
+OptionPanel.undo_levels = Azioni memorizzate per il comando "Annulla"
+OptionPanel.undo_levels.tooltip = <html>Imposta quanti passaggi vengono salvati per la funzione "Annulla".</html>
+OptionPanel.unfold_on_paste = Espandi nodo quando si "incolla"
+OptionPanel.unfold_on_paste.tooltip = Espandi i nodi quando si Incolla o si sposta, Drag-And-Drop
+OptionPanel.use_common_out_point_for_root_node = I collegamenti iniziano da un punto del nodo radice
+OptionPanel.use_common_out_point_for_root_node.tooltip = In uscita al nodo principale, i collegamenti iniziano da un punto a destra e uno a sinistra, poi si diramano.
+OptionPanel.use_tabbed_pane = Usa schede per indicare le mappe aperte
+OptionPanel.use_tabbed_pane.tooltip = Se selezionato, le mappe sono visualizzate in schede (come in FireFox ) ).
+OptionPanel.user_defined_screen_resolution = Risoluzione schermo definita dall'utente (DPI)
+OptionPanel.validate_classpath_needs_readaccess = Script: Quando si setta la classpath, \u00e8 necessario permettere l'accesso in lettura ai file!
+OptionPanel.validate_invalid_date_format = Formato data non valido
+OptionPanel.validate_invalid_datetime_format = Formato data-ora non valido
+OptionPanel.validate_invalid_number_format = Formato numero non valido
+OptionPanel.validate_write_without_read = Script: Considera di aggiungere ai file in Scrittura anche la Lettura
+OptionPanel.validation_error = <html><body>Errore di Validazione:<p><em>{0}</em><p>Cambiare le preferenze per risolvere il problema.</body></html>
+OptionPanel.validation_warning = <html><body>Avviso di Validazione:<p><em>{0}</em></body></html>
+OptionPanel.vi = Vietnamita / Ti\u1ebfng Vi\u1ec7t
+OptionPanel.wheel_velocity = Velocit\u00E0
+OptionPanel.wheel_velocity.tooltip = Un valore pi\u00F9 alto fa s\u00EC che la rotella del mouse muova pi\u00F9 velocemente la mappa.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Cinese semplificato / \u7b80\u4f53\u5b57
+OptionPanel.zh_TW = Cinese tradizionale / \u7e41\u9ad4\u5b57
+org.freeplane.plugin.bugreport.agree = Invia
+org.freeplane.plugin.bugreport.always_agree = Invia sempre
+org.freeplane.plugin.bugreport.always_deny = Non inviare mai
+org.freeplane.plugin.bugreport.deny = Non inviare
+org.freeplane.plugin.bugreport.dialog.title = Rapporto errori automatico
+org.freeplane.plugin.bugreport.freeplane_team = Messaggio del team di Freeplane
+org.freeplane.plugin.bugreport.lastreport = I report raccolti
+org.freeplane.plugin.bugreport.never = Non chiedere mai per l'aiuto
+org.freeplane.plugin.bugreport.question = <html>Freeplane ha un motore automatico per il tracciamento degli errori.<br>Nessun dato personale o contenuto delle mappe sar\u00e0 mai trasmesso.<br>Il rapporto errori ci aiuta a migliorare il programma.
+org.freeplane.plugin.bugreport.report = Rapporto attuale
+org.freeplane.plugin.bugreport.wanted_bug = E' accaduto un errore interno ed \u00e8 stato automaticamente riportato.\nCi sono necessarie maggiori informazioni per riprodurre il comportamento inaspettato.\nPer favore aiutateci inviando il rapporto degli errori nel nostro sistema Mantis:\nexplain descrivendo quello che \u00e8 successo, in modo che noi possiamo riprodurre l'errore.\n\n Premere OK per aprire la pagina web.\n\nGrazie.
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = Il Nodo {0} non \u00e8 definito
+out_of_memory = Memoria massima superata.
+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
+PatternNewNameProperty = Nuovo schema
+PatternToString.backgroundColor = Colore di sfondo
+PatternToString.Child = Stile nodo figlio
+PatternToString.color = Colore
+PatternToString.EdgeColor = Colore collegamento
+PatternToString.EdgeStyle = Stile collegamento
+PatternToString.EdgeWidth = Spessore collegamento
+PatternToString.FontBold = Grassetto
+PatternToString.FontItalic = Corsivo
+PatternToString.FontName = Tipo carattere
+PatternToString.Icon = Icona
+PatternToString.NodeFontSize = Dimensione carattere
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = giorni
+PeriodUnit.HOUR = ore
+PeriodUnit.MINUTE = minuti
+PeriodUnit.MONTH = mesi
+PeriodUnit.WEEK = settimane
+PeriodUnit.YEAR = anni
+plugins/latex/LatexNodeHook.editorTitle = Modifica Testo Latex
+plugins/script_filter = Filtro Script {0}
+plugins/script_filter_error = {0} doveva tornare un risultato booleano su {1} ma ha tornato {2}
+plugins/ScriptEditor.cancel = &Annulla modifiche ed esci
+plugins/ScriptEditor.exit = &Salva ed Esci
+plugins/ScriptEditor.FORBIDDEN_ACTION = Gli script groovy di Freeplane sono stati limitati. L'operazione seguente {0,choice,0\#File|1\#Network|2\#Exec} \u00e8 proibita\: {1,choice,0\#Accept|1\#Connect|2\#Listen|3\#Multicast|4\#SetFactory|5\#Exec|6\#Link|7\#Delete|8\#Read|9\#Write}. E' possibile cambiare l'impostazione di restrizione nelle opzioni.
+plugins/ScriptEditor.menu_actions = &Azioni
+plugins/ScriptEditor.new_script = Nuovo script
+plugins/ScriptEditor.run = Avvia
+plugins/ScriptEditor.sign = Firma script...
+plugins/ScriptEditor/window.Result = Risultati:
+plugins/ScriptEditor/window.title = Editor Script
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Accesso illegale alla API interna (pacchetto {0}). - Per favore contattare il team di Freeplane se lo script API non \u00e8 sufficentemente potente.
+plugins/TimeList.xml_Created = Creato
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = Icone
+plugins/TimeList.xml_Modified = Modificato
+plugins/TimeList.xml_Notes = Note
+plugins/TimeList.xml_Text = Testo
+plugins/TimeManagement.xml_appendButton = Aggiungi la data ai nodi selezionati
+plugins/TimeManagement.xml_Cancel = Cancella
+plugins/TimeManagement.xml_cancelButton = Cancella
+plugins/TimeManagement.xml_closeButton = Chiudi
+plugins/TimeManagement.xml_Export = Esporta nodi selezionati
+plugins/TimeManagement.xml_Find = Trova
+plugins/TimeManagement.xml_Goto = Vai a
+plugins/TimeManagement.xml_hour = Ora:
+plugins/TimeManagement.xml_menu_actions = Azioni
+plugins/TimeManagement.xml_minute = Minuto:
+plugins/TimeManagement.xml_reminderButton = Promemoria in questa data
+plugins/TimeManagement.xml_reminderButton_tooltip = <html> Imposta un Promemoria alla data indicata. L'icona lampeggiante richiamer\u00e0 l' attenzione.<br> Chiudendo la mappa, i Promemoria vengono riattivati quando la mappa viene riaperta.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Ci pu\u00f2 essere solo un promemoria per nodo. <br>Il promemoria attaule \u00e8 previsto il {0,date} {0,time}<br>il nuovo \u00e8 il {1,date} {1,time}. <br><br>Cambiare il promemoria del nodo (SI) <br> o conservare il vecchio (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Promemoria il {0,date} {0,time}.
+plugins/TimeManagement.xml_remindLaterButton = Posticipa
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Ricorda dopo
+plugins/TimeManagement.xml_removeReminderButton = Togli Promemoria
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Togli tutti i Promemoria associati a questi nodi.
+plugins/TimeManagement.xml_Replace = Sostituisci
+plugins/TimeManagement.xml_Replace_All = Sostituisci tutti
+plugins/TimeManagement.xml_Replace_Selected = Sostituisci selezionati
+plugins/TimeManagement.xml_Select = Seleziona
+plugins/TimeManagement.xml_todayButton = Oggi
+plugins/TimeManagement.xml_WindowTitle = Gestione della data
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Trova e sostituisci
+preferences = Preferenze
+print_preview_title = Anteprima di stampa
+PrintAction.text = Stampa...
+PrintDirectAction.text = Stampa
+printing_settings = Scalatura stampa
+PrintPreviewAction.text = Anteprima di stampa...
+PropertyAction.dialog = Preferenze
+PropertyAction.text = Preferenze...
+QuickFilterAction.text = Filtro Veloce
+QuickFindAction.BACK.text = Trova precedente
+QuickFindAction.FORWARD.text = Trova successivo
+QuickFindAllAction.text = Seleziona tutti i combacianti
+QuickHighlightAction.text = Evidenzia tutti i nodi combacianti
+QuitAction.text = Esci
+read_only = Solo lettura
+ReadScriptError.text = Errore leggendo lo script
+really_convert_to_current_version = <html>Questa mappa \u00e8 stata creata con una versione vecchia di Freeplane. <br>Convertirla (raccomandato)? <br>(Altrimenti verr\u00e0 caricata come \u00e8) </html>
+really_cut_node = Tagliare davvero i nodi?
+really_execute_script = Vuoi veramente eseguire gli script inclusi in questa mappa? E' possibile che danneggino il computer.
+really_remove_node = Rimuovere i nodi ?
+really_remove_notes = Rimuovere davvero la/le nota/e?
+ReapplyFilterAction.text = Riapplica
+red = Rosso
+RedefineStyleAction.text = Ridefinisci Stile
+RedoAction.text = Ripristina
+RedoFilterAction.text = Ripristina
+regular_expressions = Espressione Regolare
+ReminderHookAction.text = Togli Promemoria
+ReminderHookAction.tooltip = Rimuovi un promemoria da un nodo.
+remove_file_from_list_on_error = File {0} non trovato. Rimuoverlo dall''elenco dei file recenti ?
+remove_shortcut_question = Sostituire il tasto?
+RemoveAllIconsAction.text = Rimuovi tutte le icone
+RemoveConnectorAction.text = Rimuovi Collegamenti Grafici
+RemoveEncryption.text = Rimuovi Criptatura
+RemoveFormatAction.text = Rimuovi Formato
+RemoveIcon_0_Action.text = Rimuovere la prima icona
+RemoveIconAction.text = Rimuovi ultima icona
+RemoveNoteAction.text = Rimuovi Note
+RemoveNoteAction.tooltip = <html>E' possibile che venga rimosso il contenuto delle note, anche a molte note.</html>
+rename = &Rinomina
+repair_link = Ripara collegamento
+repair_link_question = Impossibile caricare la mappa collegata. Riparare il collegamento manualmente?
+replace = Sostituisci
+replace_shortcut_question = Questo tasto rapido \u00e8 attualmente assegnato a\n {0}.\nRimpiazzarlo?
+replace_shortcut_title = Rimpiazzare scorciatoia ?
+ReportBugAction.text = Segnalare un errore
+RequestFeatureAction.text = Richiedere una funzione
+reset_to_default = Usa predefinito
+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_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
+SaveAll.tooltip = Salva tutte le mappe aperte.
+SaveAsAction.text = Salva con nome
+saved = Salvata
+saving_canceled = Salvataggio annullato
+scanners_not_loaded = Impossibile caricare Scanners, file corrotto
+scheme_evaluate = Valuta!
+script_execution_disabled = Esecuzione degli script disabilitata
+ScriptEditor.text = Editor Script...
+ScriptEditor.tooltip = Strumento per scrivere script estesi di Freeplane.
+ScriptEditorPanel.changed_cancel = Gli script sono stati cambiati. Vuoi veramente annullare questi cambiamenti?
+scripting_api_generator_legend = Legenda
+scripting_api_generator_proxy = Proxy
+scripting_api_generator_title = API Script
+scripting_api_generator_utilities = Utilit\u00e0
+scripting_api_generator_web = Risorse Web
+select_favorites_folder = Seleziona la cartella dei Preferiti
+select_file_export_to = Seleziona il file da esportare
+select_folder_for_importing = Seleziona la cartella da importare
+select_icon = Selezionare una Icona
+select_menu_item_dialog = Selezionare un elemento del menu
+select_menu_item_root_node = Menu
+SelectAllAction.text = Seleziona tutto il visibile
+SelectBranchAction.text = Seleziona rami visibili
+SelectedPasteAction.text = Incolla come...
+selection_method_by_click = Clic singolo per selezionare
+selection_method_delayed = Sezione ritardi automatici.
+selection_method_direct = Puntare per selezionare
+SelectNoteAction.text = Modifica note
+SelectNoteAction.tooltip = Commuta tra la finestra principale e la finestra delle note
+set_accelerator_on_next_click_action = Cliccare su qualsiasi elemento del menu, per assegnare una nuova scorciatoia
+SetAcceleratorOnNextClickAction.text = Assegna scorciatoia
+SetImageByFileChooserAction.text = Immagini
+SetLinkAnchorAction.text = Imposta collegamento \u00e0ncora
+SetLinkAnchorAction.tooltip = <html>imposta il nodo selezionato come \u00e0ncora per la successiva<br/>creazione di un collegamento locale o globale.
+SetLinkAnchorAction.tooltip_anchored = <html>imposta il nodo selezionato come \u00e0ncora per la successiva<br/>creazione di un collegamento locale o globale. Attuale \u00e0ncora:<br/>{0}
+SetLinkByFileChooserAction.text = Collegamento a file
+SetLinkByTextFieldAction.text = Collegamento ipertestuale web
+SetNodeLink.text = Imposta Collegamento del Nodo
+SetNoteWindowPosition.bottom.text = Basso
+SetNoteWindowPosition.left.text = Sinistra
+SetNoteWindowPosition.right.text = Destra
+SetNoteWindowPosition.top.text = Alto
+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
+ShowDescendantsAction.text = Visualizza discendenti
+ShowFilterToolbarAction.text = Barra del Filtro
+ShowFormatPanel.text = Pannello di Formattazione
+ShowFormatPanel.tooltip = Presenta un pannello in cui gli attributi dei nodi e dei collegamenti, possono essere modificati.
+ShowHideNoteAction.text = Finestra delle note
+ShowHideNoteAction.tooltip = Mostra o nasconde la finestra delle note.
+ShowNextChildAction.text = Visualizza nodo figlio successivo
+ShowNotesInMapAction.text = Visualizza le note nella Mappa
+ShowSelectedAttributesAction.text = Visualizza attributi selezionati
+ShowSelectionAsRectangleAction.text = Riquadra nodo selezionato
+simplyhtml.aboutFrameTitle = Informazioni sull'applicazione
+simplyhtml.aboutLabel = Informazioni su SimplyHTML...
+simplyhtml.alignCenter = Centra
+simplyhtml.alignLabel = Allineamento:
+simplyhtml.alignLeft = sinistra
+simplyhtml.alignRight = destra
+simplyhtml.allCellsRangeLabel = tutte le celle
+simplyhtml.allOccurrencesReplaced = Tutte le occorrenze sostituite
+simplyhtml.appendTableColLabel = Aggiungi colonna, sotto
+simplyhtml.appendTableRowLabel = Aggiungi riga, sotto
+simplyhtml.applyCellAttrLabel = Applica a
+simplyhtml.backgroundLabel = Sfondo:
+simplyhtml.boldItalicName = corsivo grassetto
+simplyhtml.boldName = grassetto
+simplyhtml.borderColorLabel = Colore:
+simplyhtml.borderWidthLabel = Spessore
+simplyhtml.bottomLabel = dietro:
+simplyhtml.cancelBtnName = Cancella
+simplyhtml.cellBorderTabLabel = Collegamenti
+simplyhtml.cellGenTabLabel = Generale
+simplyhtml.cellMarginTabLabel = Margine
+simplyhtml.cellPanelTitle = Formato delle celle
+simplyhtml.clearFormatLabel = Rimuovi formattazione
+simplyhtml.clearFormatTip = Rimuovi formattazione
+simplyhtml.close = Chiudi
+simplyhtml.closeBtnName = Chiudi
+simplyhtml.colorLabel = Colore
+simplyhtml.copyLabel = Copia
+simplyhtml.copyTip = copia
+simplyhtml.cTagNameHead1 = Intestazione 1
+simplyhtml.cTagNameHead2 = Intestazione 2
+simplyhtml.cTagNameHead3 = Intestazione 3
+simplyhtml.cTagNameHead4 = Intestazione 4
+simplyhtml.cTagNameHead5 = Intestazione 5
+simplyhtml.cTagNameHead6 = Intestazione 6
+simplyhtml.cTagNameLink = Collegamento
+simplyhtml.cTagNameOL = Lista ordinata
+simplyhtml.cTagNamePara = Paragrafo
+simplyhtml.cTagNameUL = Lista non ordinata
+simplyhtml.cutLabel = Taglia
+simplyhtml.cutTip = taglia
+simplyhtml.defaultDocName = Senza titolo
+simplyhtml.deleteTableColLabel = Cancella colonna
+simplyhtml.deleteTableRowLabel = Cancella riga
+simplyhtml.docTitleQuery = Imposta titolo a:
+simplyhtml.docTitleTitle = Modifica il titolo del documento
+simplyhtml.editLabel = Modifica
+simplyhtml.effectLabel = Effetto
+simplyhtml.familyLabel = Famiglia
+simplyhtml.findNext = Trova successivo...
+simplyhtml.findReplaceDialogTitle = Trova e sostituisci
+simplyhtml.findReplaceLabel = Trova e sostituisci
+simplyhtml.findReplaceTip = Trova e sostituisci
+simplyhtml.fontBoldLabel = Grassetto
+simplyhtml.fontBoldTip = commuta Grassetto on/off
+simplyhtml.fontColorLabel = Colore del Testo
+simplyhtml.fontColorTip = Colore del Testo
+simplyhtml.fontDialogTitle = Formato carattere
+simplyhtml.fontItalicLabel = Corsivo
+simplyhtml.fontItalicTip = commuta Corsivo on/off
+simplyhtml.fontLabel = Carattere...
+simplyhtml.fontTabLabel = Carattere
+simplyhtml.fontTip = Formato carattere...
+simplyhtml.fontUnderlineLabel = Sottolinea
+simplyhtml.fontUnderlineTip = commuta Sottolineato on/off
+simplyhtml.foregroundLabel = Primo piano:
+simplyhtml.formatLabel = Formato
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = Cambia formato lista
+simplyhtml.formatParaLabel = Paragrafo...
+simplyhtml.formatParaTip = Cambia formato paragrafo
+simplyhtml.formatTableLabel = Tabella...
+simplyhtml.formatTableTip = Formato tabella
+simplyhtml.helpLabel = Aiuto
+simplyhtml.htmlTabTitle = Visualizzatore codice HTML
+simplyhtml.imageFileDesc = Immagine da file
+simplyhtml.insertTableColLabel = Aggiungi colonna, sopra
+simplyhtml.insertTableLabel = Tabella...
+simplyhtml.insertTableMsg = Quante colonne?
+simplyhtml.insertTableRowLabel = Aggiungi riga, sopra
+simplyhtml.insertTableTitle = Inserisci tabella
+simplyhtml.italicName = corsivo
+simplyhtml.layoutTabTitle = Visualizza Formattazione
+simplyhtml.leftLabel = sinistra:
+simplyhtml.listDialogTitle = Formato lista
+simplyhtml.listIndentTitle = Indentazione:
+simplyhtml.listPosInside = dentro
+simplyhtml.listPositionLabel = Posizione:
+simplyhtml.listPosOutside = fuori
+simplyhtml.listTypeCircle = Cerchio
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = Punto
+simplyhtml.listTypeLabel = Tipo:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = nessuno
+simplyhtml.listTypeSquare = Punto squadrato
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Esterno
+simplyhtml.matchApproximately = Verifica Approssimata
+simplyhtml.matchApproximately.tooltip = <html>Consente il confronto approssimato,<br/>es. cercando 'casa' accetter\u00e0 anche 'case'.</html>
+simplyhtml.matchCase = Compara maiuscolo
+simplyhtml.matchCase.tooltip = Se verificare maiuscole/minuscole.
+simplyhtml.newStyleDefaultName = nuovo stile
+simplyhtml.nextTableCellLabel = Cella successiva
+simplyhtml.noLineLabel = nessuno
+simplyhtml.noMoreOccurrencesFound = nessun'altra occorrenza trovata
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Interno
+simplyhtml.paraAlignCenterLabel = Allinea centro
+simplyhtml.paraAlignCenterTip = Imposta l'allineamento centrato al paragrafo
+simplyhtml.paraAlignLeftLabel = Allinea a sinistra
+simplyhtml.paraAlignLeftTip = Imposta l'allineamento a sinistra al paragrafo
+simplyhtml.paraAlignRightLabel = Allinea a destra
+simplyhtml.paraAlignRightTip = Imposta l'allineamento a destra al paragrafo
+simplyhtml.paraStyleDialogTitle = Stile paragrafo
+simplyhtml.paraTabLabel = Paragrafo
+simplyhtml.pasteHTMLLabel = Incolla HTML
+simplyhtml.pasteLabel = Incolla
+simplyhtml.pastePlainTextLabel = Incolla testo semplice
+simplyhtml.pasteTip = incolla
+simplyhtml.plainName = Piano
+simplyhtml.previewLabel = Anteprima
+simplyhtml.previewText = Anteprima testuale
+simplyhtml.prevTableCellLabel = Cella precedente
+simplyhtml.printLabel = Stampa...
+simplyhtml.redoLabel = Ripeti
+simplyhtml.redoTip = ripeti
+simplyhtml.replace = Sostituisci...
+simplyhtml.replaceAll = Tutti
+simplyhtml.replaceDone = Fatto
+simplyhtml.replaceNo = No
+simplyhtml.replaceThisQuery = cambia questa occorrenza di
+simplyhtml.replaceWith = Cambia con:
+simplyhtml.replaceYes = S\u00EC
+simplyhtml.rightLabel = destra:
+simplyhtml.searchDown = Cerca gi\u00F9
+simplyhtml.searchDown.tooltip = Cerca dall'alto al basso
+simplyhtml.searchFromStart = Cerca dall'inizio
+simplyhtml.searchFromStart.tooltip = Inizia a cercare dall'alto al posto di iniziare dalla posizione del cursore
+simplyhtml.searchUp = Cerca su
+simplyhtml.searchUp.tooltip = Cerca dal basso all'alto
+simplyhtml.selectAllLabel = Seleziona tutto
+simplyhtml.sizeLabel = Dimensione
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Barrato
+simplyhtml.styleLabel = Stile
+simplyhtml.styleNameInputText = Nome del nuovo stile?
+simplyhtml.styleNameInputTitle = Salva stile
+simplyhtml.tableBgColLabel = Colore di sfondo:
+simplyhtml.tableDialogTitle = Formatta tabella
+simplyhtml.tableLabel = Tabella
+simplyhtml.tablePanelTitle = Formato tabella
+simplyhtml.tableWidthLabel = Larghezza
+simplyhtml.textIndentLabel = Rientro:
+simplyhtml.textToFind = Testo da trovare:
+simplyhtml.thisCellRangeLabel = questa cella
+simplyhtml.thisColRangeLabel = questa colonna
+simplyhtml.thisRowRangeLabel = questa riga
+simplyhtml.toggleBulletsLabel = Lista puntata on/off
+simplyhtml.toggleBulletsTip = lista puntata on/off
+simplyhtml.toggleNumbersLabel = Lista numerata on/off
+simplyhtml.toggleNumbersTip = lista numerata on/off
+simplyhtml.topLabel = sopra:
+simplyhtml.uLineLabel = Sottolinea
+simplyhtml.unableToOpenFileError = Il file non pu\u00F2 essere aperto
+simplyhtml.unableToRedoError = Impossibile ripristinare:
+simplyhtml.unableToUndoError = Impossibile annullare:
+simplyhtml.undoLabel = Annulla
+simplyhtml.undoTip = annulla
+simplyhtml.valignBaseline = linea inferiore
+simplyhtml.valignBottom = sotto
+simplyhtml.valignLabel = Allineamento vert.:
+simplyhtml.valignMiddle = centro
+simplyhtml.valignTop = sopra
+simplyhtml.wholeWordsOnly = Solo tutte le parole
+simplyhtml.wholeWordsOnly.tooltip = Restringi confronto alle parole intere.
+SortNodes.text = Ordina alfabeticamente i figli
+SortNodes.tooltip = Ordinamento alfabetico dei figli del nodo
+split = &Dividi
+SplitConditionAction.text = Dividi
+SplitNode.text = Dividi nodo
+SplitNode.tooltip = <html>Crea un nuovo nodo, per ogni riga del nodo originario</html>
+STANDARD_FORMAT = Standard
+stop_processing = Stop
+StringFlavorHandler = Nodi gerarchici, formato testo semplice
+StructuredHtmlFlavorHandler = Nodi Html in modo gerarchico
+style = Stile
+style_already_exists = Lo stile esite gi\u00e0.
+styledialog.cancel.text = Annulla
+styledialog.ok.text = OK
+styles = St&ili
+styles.AutomaticLayout = Formattazione Automatica
+styles.connection = Connessione
+styles.date = Data
+styles.definition = Definizione
+styles.description = Descrizione
+styles.floating_node = Nodo Fluttuante
+styles.idea = Idea
+styles.important = Importante
+styles.key = Chiave
+styles.list = Lista
+styles.needs_action = Richiede Azione
+styles.note = Note
+styles.ok = OK
+styles.pending = Pendente
+styles.predefined = Stili Predefiniti
+styles.question = Domanda
+styles.quotation = Quotazione
+styles.root_node = Stili
+styles.subsubtopic = Subsubtopic
+styles.subtopic = Subtopic
+styles.topic = Topic
+styles.user-defined = Stili definiti dall'utente
+styles.website = Sito Internet
+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
+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>
+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
+ToggleMenubarAction.text = Barra dei menu
+ToggleStatusAction.text = Visualizza la Linea di Stato
+ToggleToolbarAction.text = &Barra degli strumenti
+undefined_error = Si \u00e8 verificato un errore imprevisto. Inviare un rapporto errori, grazie.
+underline = Sottolinea
+UnderlineAction.text = Sottolinea
+underlined = Sottolineato
+UndoAction.text = Annulla
+UndoFilterAction.text = Annulla
+unfold = Espandi
+UnfoldAllAction.text = Espandi tutti
+UnfoldAllAction.tooltip = <html>Espandi i nodi selezionati e tutti i loro figli.</html>
+UnfoldOneLevelAction.text = Espandi di un livello
+UnfoldOneLevelAction.tooltip = <html>Espandi il nodo selezionato di un livello.</html>
+up = &Su
+update_failed = Aggiornamento fallito con messaggio {0}
+UpdateCheckAction.text = Controllo Aggiornamenti
+updatecheckdialog = Aggiorna finestra controllo
+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.
+UsePlainTextAction.text = Usa formattazione testo semplice
+user_config_folder = Cartella configurazione utente: {0}
+user_defined_scale = Scala definita dall'utente
+user_defined_zoom = Definito dall'utente.
+user_defined_zoom_status_bar = Impostato il livello di zoom definito dall''utente di {0}%.
+user_icon = Icona utente "{0}"
+user_template_dir = Modelli Utente
+user_zoom = Fattore ingradimento stampa (0.0 - 2.0):
+value_format = Formato valore
+version_up_to_date = E' gi\u00e0 in uso la versione pi\u00f9 aggiornata
+ViewerControllerAction.text = Immagini Ridimensionabili
+ViewLayoutTypeAction.OUTLINE.text = Visualizzazione lineare ad albero
+WebDocuAction.text = Documentazione web
+width = Spessore
+wrong_regexp = Errata espressione regolare "{0}", errore {1}
+xslt_export.html = Documento HTML
+xslt_export.latex = Documento LaTeX
+xslt_export.latexbook = Libro LaTeX
+xslt_export.mediawiki = MediaWiki
+xslt_export.ms_excel = Excel (2003 e successivi) formato XML
+xslt_export.ms_project = MS Project (2003 e successivi) formato XML
+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
+ZoomInAction.text = Zoom avanti
+ZoomOutAction.text = Zoom indietro
diff --git a/freeplane/resources/translations/Resources_ja.properties b/freeplane/resources/translations/Resources_ja.properties
new file mode 100644
index 0000000..0c2f0c9
--- /dev/null
+++ b/freeplane/resources/translations/Resources_ja.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane \uff0d \u30d5\u30ea\u30fc\uff08\u81ea\u7531\uff06\u7121\u6599\uff09\u306e\u30de\u30a4\u30f3\u30c9\u30de\u30c3\u30d7\u4f5c\u6210\u3068\u77e5\u8b58\u5275\u9020\u306e\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2
+AboutAction.text = Freeplane \u306b\u3064\u3044\u3066
+acceleratorPresets = \u30db\u30c3\u30c8\u30ad\u30fc\u306e\u30d7\u30ea\u30bb\u30c3\u30c8
+accelerators_loading_error = {0} \u304b\u3089\u30db\u30c3\u30c8\u30ad\u30fc\u3092\u8aad\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+accessories/plugins/ApplyFormatPlugin.dialog.title = \u9078\u629e\u30ce\u30fc\u30c9\u306e\u66f8\u5f0f\u3092\u5909\u66f4
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = \u30d1\u30bf\u30fc\u30f3\u306e\u5909\u66f4
+accessories/plugins/EncryptNode.properties_0 = \u4fdd\u8b77\uff08\u6697\u8a3c\uff09\u4ed8\u304d\u30ce\u30fc\u30c9\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+accessories/plugins/EncryptNode.properties_1 = \u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u306a\u3044\u304b\u3001\u77ed\u3059\u304e\u307e\u3059\u3002
+accessories/plugins/EncryptNode.properties_2 = \u30d1\u30b9\u30ef\u30fc\u30c9
+accessories/plugins/EncryptNode.properties_3 = \u3082\u3046\u4e00\u5ea6
+accessories/plugins/EncryptNode.properties_4 = \u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+accessories/plugins/EncryptNode.properties_5 = \u6ce8\u610f\uff1a\u79d8\u533f\u306e\u5f37\u5ea6\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u9069\u5426\u306b\u304b\u304b\u3063\u3066\u3044\u307e\u3059\u3002
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = \u30ad\u30e3\u30f3\u30bb\u30eb
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = \u3053\u306e\u30b3\u30de\u30f3\u30c9\u3067\u306f\u3001\u6697\u8a3c\u4ed8\u304d\u30ce\u30fc\u30c9\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u4fdd\u8b77\u306e\u8a2d\u5b9a\u3068\u89e3\u9664\u306e\u5207\u308a\u66ff\u3048\u3057\u304b\u3067\u304d\u307e\u305b\u3093\u3002\n\u79d8\u533f\u30ce\u30fc\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u306b\u306f\u3001\u30c4\u30fc\u30eb\u30e1\u30cb\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+accessories/plugins/EncryptNode.properties_select_me = \u3053\u3053\u3092\u9078\u629e\u3057\u3066\u4f5c\u696d\u3092\u7d99\u7d9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+accessories/plugins/EncryptNode.properties_wrong_password = \u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002
+accessories/plugins/ExportWithTWiki.text = TWiki \u306b
+accessories/plugins/ExportWithTWiki.tooltip = TWiki \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5f62\u5f0f\u3067\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002
+accessories/plugins/ExportWithXSLT.tooltip = \u5171\u901a\u4ed5\u69d8\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u624b\u6bb5\u3067\u3059\u3002
+accessories/plugins/ExportWithXSLT_Applet.text = Java \u30a2\u30d7\u30ec\u30c3\u30c8\u306b
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Java \u30d6\u30e9\u30a6\u30b6\u30a2\u30d7\u30ec\u30c3\u30c8\u5f62\u5f0f\u3067\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002
+accessories/plugins/ExportWithXSLT_Flash.text = Flash \u306b
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Flash \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5f62\u5f0f\u3067\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML\uff08JavaScript\u7248\uff09\u306b
+accessories/plugins/ExportWithXSLT_HTML3.text = XHTML\uff08\u30af\u30ea\u30c3\u30ab\u30d6\u30eb\u30de\u30c3\u30d7\u7248\uff09\u306b...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = \u30ea\u30bd\u30fc\u30b9\u3092 RESOURCES \u30ce\u30fc\u30c9\u304b\u3089 Taskjuggler \u30d5\u30a1\u30a4\u30eb\u306b
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = \u30ea\u30bd\u30fc\u30b9\u3092 RESOURCES \u30ce\u30fc\u30c9\u304b\u3089 Taskjuggler \u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = \u30bf\u30b9\u30af\u3092 TASKS \u30ce\u30fc\u30c9\u304b\u3089 TaskJuggler \u30d5\u30a1\u30a4\u30eb\u306b
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = \u30bf\u30b9\u30af\u3092 TASKS \u30ce\u30fc\u30c9\u304b\u3089 Taskjuggler \u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002
+action_keystroke_in_use_error = {1} \u306e\u52d5\u4f5c\u7528\u306e\u30ad\u30fc\u8a2d\u5b9a {0} \u306f\u3001\u3059\u3067\u306b {2} \u306e\u52d5\u4f5c\u7528\u306b\u4f7f\u308f\u308c\u3066\u3044\u307e\u3059\u3002
+active = \u6709\u52b9\uff0f\u7121\u52b9
+actual_map_styles = \u30de\u30c3\u30d7\u7528\u6761\u4ef6\u5bfe\u5fdc\u30ce\u30fc\u30c9\u30b9\u30bf\u30a4\u30eb\u3092\u8a2d\u5b9a
+actual_node_styles = \u30ce\u30fc\u30c9\u7528\u6761\u4ef6\u5bfe\u5fdc\u30ce\u30fc\u30c9\u30b9\u30bf\u30a4\u30eb\u3092\u8a2d\u5b9a
+add = \u8ffd\u52a0(&A)
+AddConnectorAction.text = \u30b3\u30cd\u30af\u30bf\u3092\u4ed8\u52a0
+AddElementaryConditionAction.text = \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
+AddOnDetailsPanel.header.function = \u6a5f\u80fd
+AddOnDetailsPanel.header.menu = \u30e1\u30cb\u30e5\u30fc\u306e\u4f4d\u7f6e
+AddOnDetailsPanel.header.shortcut = \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8
+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.groovy.script.name = \u30b9\u30af\u30ea\u30d7\u30c8\u540d {0} \u306f\u3001".groovy" \u3067\u7d42\u308f\u3063\u3066\u3044\u307e\u305b\u3093\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
+addons.installer.licence.unchanged = \u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u5909\u66f4\u306a\u3057
+addons.installer.map.structure = \u30de\u30c3\u30d7\u69cb\u9020\u306b\u30a8\u30e9\u30fc\u304c\u3042\u308a\u307e\u3059\uff1a{0}
+addons.installer.missing.child.nodes = \u5b50\u30ce\u30fc\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\uff1a{0}
+addons.installer.missing.permission.attribute = \u30b9\u30af\u30ea\u30d7\u30c8 {0} \uff1a\u8a31\u8afe\u5c5e\u6027 {1} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+addons.installer.missing.properties = \u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\uff1a{0}
+addons.installer.missing.translation = {0} \u306e \u30ed\u30b1\u30fc\u30eb {1} \u3078\u306e\u7ffb\u8a33\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+addons.installer.no.scripts = \u30b9\u30af\u30ea\u30d7\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+addons.installer.no.zipdata = ZIP \u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+addons.installer.nonstandard.permissions = \u3053\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u5b9f\u884c\u306b\u306f\u3001\u53f3\u306e\u8a31\u8afe\u304c\u5fc5\u8981\u3067\u3059\u304c\u3001\u73fe\u5728\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff1a{0}\n\u3053\u308c\u3089\u306e\u8a31\u8afe\u3092\u6a19\u6e96\u8a2d\u5b9a\u306b\u52a0\u3048\u307e\u3059\u304b\u3002
+addons.installer.one.child.expected = {0} \u306b\u4ed8\u3051\u3089\u308c\u308b\u5b50\u30ce\u30fc\u30c9\u306f\uff11\u3064\u3060\u3051\u3067\u3059\u304c\u3001{1} \u500b\u3001\u4ed8\u3044\u3066\u3044\u307e\u3059\u3002
+addons.installer.script.no.execution_mode = {0} \u306e\u300c\u5b9f\u884c\u30e2\u30fc\u30c9\u300d\u5c5e\u6027\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+addons.installer.script.no.menulocation = {0} \u306e\u300c\u30e1\u30cb\u30e5\u30fc\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u300d\u5c5e\u6027\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+addons.installer.script.no.menutitle = {0} \u306e\u300c\u30e1\u30cb\u30e5\u30fc\u30bf\u30a4\u30c8\u30eb\u30ad\u30fc\u300d\u5c5e\u6027\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+addons.installer.script.no.permissions = {0} \u306b\u306f\u3001\u8a31\u8afe\u304c\u4e00\u5207\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+addons.installer.success = \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6210\u529f\u3002\n\u65b0\u898f\u30a2\u30c9\u30aa\u30f3\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+addons.installer.success.update = {0} \u304b\u3089 {1} \u3078\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306b\u6210\u529f\u3057\u307e\u3057\u305f\u3002\n\u3044\u304f\u3064\u304b\u306e\u6a5f\u80fd\u306b\u3064\u3044\u3066\u306f\u3001\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+addons.installer.title = \u30a2\u30c9\u30aa\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9
+addons.installer.too.new = <html>\u3053\u306e Freeplane \u30d0\u30fc\u30b8\u30e7\u30f3 {0} \u306f\u3001\u65b0\u3057\u3059\u304e\u307e\u3059\u3002<br>\u3053\u306e\u30a2\u30c9\u30aa\u30f3\u306f\u3001\u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u307e\u3067\u3057\u304b\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002</html>
+addons.installer.too.old = <html>\u3053\u306e Freeplane \u30d0\u30fc\u30b8\u30e7\u30f3 {0} \u306f\u3001\u53e4\u3059\u304e\u307e\u3059\u3002<br>\u3053\u306e\u30a2\u30c9\u30aa\u30f3\u3092\u7d44\u307f\u8fbc\u3080\u306b\u306f\u3001\u5c11\u306a\u304f\u3068\u3082 {1} \u4ee5\u4e0a\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u5fc5\u8981\u3067\u3059\u3002</html>
+addons.installer.unknown.deinstallation.rules = \u672a\u77e5\u306e\u53d6\u308a\u5916\u3057\u30eb\u30fc\u30eb\uff1a {0}
+addons.installer.update = \u30d0\u30fc\u30b8\u30e7\u30f3 {0} \u304b\u3089\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8
+addons.installer.warning = <html><body><em>\u4fe1\u983c\u3067\u304d\u308b\u30bd\u30fc\u30b9\u4ee5\u5916\u304b\u3089\u306e\u30a2\u30c9\u30aa\u30f3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u907f\u3051\u307e\u3057\u3087\u3046\u3002\u60aa\u610f\u306e\u3042\u308b\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306b\u3088\u308b\u3001\u30c7\u30fc\u30bf\u306e\u7834\u58ca\u3084\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u306e\u4fb5\u5bb3\u306e\u6050\u308c\u304c\u3042\u308a\u307e\u3059\u3002</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = \u30b9\u30bf\u30a4\u30eb\u304b\u3089\u5c5e\u6027\u3092\u30b3\u30d4\u30fc
+AddStyleAttributes.tooltip = \u9078\u629e\u30ce\u30fc\u30c9\u306b\u3001\u5f53\u8a72\u30ce\u30fc\u30c9\u306b\u9069\u7528\u3055\u308c\u305f\u30b9\u30bf\u30a4\u30eb\u306b\u542b\u307e\u308c\u308b\u5c5e\u6027\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3059\u3002.\uff3b\u8a33\u6ce8\uff1a\u30de\u30cb\u30e5\u30a2\u30eb\u304b\u3089\u610f\u8a33\uff3d
+AllMapsNodeListAction.text = \u3059\u3079\u3066\u306e\u30de\u30c3\u30d7\u3067\u691c\u7d22\uff06\u7f6e\u63db...
+always = \u5e38\u306b
+AlwaysUnfoldedNodeAction.text = \u5e38\u306b\u30ce\u30fc\u30c9\u3092\u5c55\u958b\uff08\u30aa\u30f3\uff0f\u30aa\u30d5\uff09
+antialias_all = \u3059\u3079\u3066\u306b\u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9
+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) ...
+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
+ApplyToVisibleAction.text = \u30d5\u30a3\u30eb\u30bf\u4e2d\u306e\u30ce\u30fc\u30c9\u306b\u9069\u7528\uff08\u7d5e\u308a\u8fbc\u307f\uff09
+as_parent = \u89aa\u3068\u540c\u3058
+AskForHelp.text = \u30cd\u30c3\u30c8\u3067\u52a9\u8a00\u3092\u8981\u8acb
+AssignAttributesAction.text = \u62e1\u5f35\u5c5e\u6027\u30a8\u30c7\u30a3\u30bf...
+attribute_delete = \u5024\u306b\u95a2\u4fc2\u306a\u304f\u5c5e\u6027\u3092\u524a\u9664
+attribute_delete_value = \u5024\u304c\u4e00\u81f4\u3059\u308b\u5c5e\u6027\u3092\u524a\u9664
+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_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
+attributes_AddAttributeAction.text = \u5c5e\u6027\u3092\u4ed8\u52a0...
+attributes_adding_empty_attribute_error = \u5c5e\u6027\u540d\u306b\u7a7a\u6587\u5b57\u5217\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+attributes_all = \u3059\u3079\u3066\u306e\u5c5e\u6027
+attributes_assign_dialog = \u62e1\u5f35\u5c5e\u6027\u30a8\u30c7\u30a3\u30bf
+attributes_attribute = \u5c5e\u3000\u6027
+attributes_close = \u9589\u3058\u308b
+attributes_deselect_all = \u306a\u3057
+attributes_dialog_title = \u5c5e\u6027\u30de\u30cd\u30fc\u30b8\u30e3
+attributes_edit = \u5c5e\u6027\u540d\u30fb\u5024\u3092\u7de8\u96c6
+attributes_edit_tooltip = \u3053\u306e\u5c5e\u6027\u540d\u3067\u4f7f\u7528\u3067\u304d\u308b\u5c5e\u6027\u5024\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
+attributes_for_selected = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9
+attributes_for_visible = \u8868\u793a\u4e2d\u306e\u3059\u3079\u3066\u306e\u30ce\u30fc\u30c9
+attributes_import = \u30a4\u30f3\u30dd\u30fc\u30c8(&I)
+attributes_import_tooltip = \u5225\u306e\u8aad\u307f\u8fbc\u307f\u6e08\u307f\u30de\u30c3\u30d7\u304b\u3089\u5c5e\u6027\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002
+attributes_no_import_candidates_found = \u65b0\u898f\u5c5e\u6027\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+attributes_popup_delete = \u524a\u9664
+attributes_popup_down = \u4e0b\u3052\u308b
+attributes_popup_edit = \u7de8\u96c6
+attributes_popup_hide = \u96a0\u3059
+attributes_popup_new = \u65b0\u898f\u5c5e\u6027
+attributes_popup_optimal_width = \u8868\u793a\u5e45\u3092\u9069\u6b63\u5316
+attributes_popup_up = \u4e0a\u3052\u308b
+attributes_refresh = \u66f4\u65b0
+attributes_RemoveAllAttributesAction.text = \u3059\u3079\u3066\u306e\u5c5e\u6027\u3092\u524a\u9664
+attributes_RemoveFirstAttributeAction.text = \u6700\u521d\u306e\u5c5e\u6027\u3092\u524a\u9664
+attributes_RemoveLastAttributeAction.text = \u6700\u5f8c\u306e\u5c5e\u6027\u3092\u524a\u9664
+attributes_restricted_attributes_tooltip = \u4f7f\u7528\u3067\u304d\u308b\u5c5e\u6027\u540d\u3092\u3001\u300c\u5c5e\u6027\u540d\u30fb\u5024\u306e\u7de8\u96c6\u300d\u3067\u6307\u5b9a\u3057\u305f\u5019\u88dc\u5024\u306b\u5236\u9650\u3057\u307e\u3059\u3002
+attributes_restricted_values_tooltip = \u3053\u306e\u5c5e\u6027\u540d\u3067\u4f7f\u7528\u3067\u304d\u308b\u5c5e\u6027\u5024\u3092\u3001\u300c\u5c5e\u6027\u540d\u30fb\u5024\u306e\u7de8\u96c6\u300d\u3067\u6307\u5b9a\u3057\u305f\u5019\u88dc\u5024\u306b\u5236\u9650\u3057\u307e\u3059\u3002
+attributes_restriction = \u5c5e\u6027\u540d\u30fb\u5024\u3092\u5236\u9650
+attributes_select_all = \u3059\u3079\u3066
+attributes_select_all_tooltip = \u300c\u8868\u793a\u3059\u308b\u5c5e\u6027\u3092\u9650\u5b9a\u300d\u3057\u3066\u3044\u308b\u5834\u5408\u306b\u5c5e\u6027\u3092\u8868\u793a\u3059\u308b\u304b\u3001\u3057\u306a\u3044\u304b\u3092\u3001\u4e00\u5ea6\u306b\u6307\u5b9a\u3057\u307e\u3059\u3002
+attributes_show = \u8868\u793a
+attributes_skip_root = \u30eb\u30fc\u30c8\u30ce\u30fc\u30c9\u3092\u30b9\u30ad\u30c3\u30d7
+attributes_visible = \u9650\u5b9a\u8868\u793a\u306e\u5bfe\u8c61
+attributes_visible_tooltip = \u30c1\u30a7\u30c3\u30af\u3059\u308b\u3068\u3001\u300c\u8868\u793a\u3059\u308b\u5c5e\u6027\u3092\u9650\u5b9a\u300d\u3057\u3066\u3044\u308b\u5834\u5408\u306b\u5c5e\u6027\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+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}) ...
+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.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
+AutomaticLayoutControllerAction.null.text = \u9069\u7528\u3057\u306a\u3044
+BackAction.text = \u9078\u629e\u5c65\u6b74\u3092\u9061\u308b
+BackAction.tooltip = \u9078\u629e\u5c65\u6b74\u3092\u9061\u3063\u3066\u30b8\u30e3\u30f3\u30d7\u3057\u307e\u3059\u3002
+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>
+blue = \u9752
+BoldAction.text = \u592a\u5b57
+boldify_branch = \u592a\u5b57\u5316
+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_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_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)
+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_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
+ChangeConnectorArrowsAction.backward.text = \u5f8c\u65b9
+ChangeConnectorArrowsAction.both.text = \u4e21\u65b9
+ChangeConnectorArrowsAction.forward.text = \u524d\u65b9
+ChangeConnectorArrowsAction.none.text = \u306a\u3057
+ChangeConnectorArrowsAction.text = \u30b3\u30cd\u30af\u30bf\u306e\u77e2\u5370\u5909\u66f4
+ChangeConnectorShapeAction.CUBIC_CURVE.text = \u66f2\u7dda
+ChangeConnectorShapeAction.EDGE_LIKE.text = \u30a8\u30c3\u30b8\u306e\u7dda\u306b\u64ec\u3059\u308b
+ChangeConnectorShapeAction.LINE.text = \u76f4\u7dda\uff08\u76f4\u7d50\uff09
+ChangeConnectorShapeAction.LINEAR_PATH.text = \u76f4\u7dda\uff08\u89d2\u4ed8\u304d\uff09
+ChangeNodeLevelLeftsAction.text = \u30ce\u30fc\u30c9\u3092\u79fb\u52d5\uff08\u89aa\u306e\u5f1f\u3078\uff09
+ChangeNodeLevelLeftsAction.tooltip = <html>\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304c\u30eb\u30fc\u30c8\u306e\u5de6\u5074\u306b\u3042\u308b\u5834\u5408\u306f\u3001\u30ce\u30fc\u30c9\u3092\u4e0b\u4f4d\u306b\u79fb\u52d5\u3057\u3001\u5144\u5f1f\u30ce\u30fc\u30c9\u306e\u5b50\u306b<br>\u79fb\u3057\u307e\u3059\u3002\u30eb\u30fc\u30c8\u306e\u53f3\u5074\u306e\u5834\u5408\u306f\u3001\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u3092\u4e0a\u4f4d\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002\u305d\u306e\u969b\u3001\u30eb\u30fc\u30c8<br>\u76f4\u4e0b\u306e\u30ce\u30fc\u30c9\u306f\u53cd\u5bfe\u5074\uff08\u5de6\u5074\uff09\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002</html>
+ChangeNodeLevelRightsAction.text = \u30ce\u30fc\u30c9\u3092\u79fb\u52d5\uff08\u5144\u306e\u672b\u5b50\u3078\uff09
+ChangeNodeLevelRightsAction.tooltip = <html>\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304c\u30eb\u30fc\u30c8\u306e\u53f3\u5074\u306b\u3042\u308b\u5834\u5408\u306f\u3001\u30ce\u30fc\u30c9\u3092\u4e0b\u4f4d\u306b\u79fb\u52d5\u3057\u3001\u5144\u5f1f\u30ce\u30fc\u30c9\u306e\u5b50\u306b<br>\u79fb\u3057\u307e\u3059\u3002\u30eb\u30fc\u30c8\u306e\u5de6\u5074\u306e\u5834\u5408\u306f\u3001\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u3092\u4e0a\u4f4d\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002\u305d\u306e\u969b\u3001\u30eb\u30fc\u30c8<br>\u76f4\u4e0b\u306e\u30ce\u30fc\u30c9\u306f\u53cd\u5bfe\u5074\uff08\u53f3\u5074\uff09\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002</html>
+choose_background_color = \u80CC\u666F\u8272\u3092\u9078\u3076...
+choose_cloud_color = \u96F2\u306E\u8272\u3092\u9078\u3076...
+choose_edge_color = \u7DDA\u306E\u8272\u3092\u9078\u3076
+choose_map_background_color = \u30de\u30c3\u30d7\u306e\u80cc\u666f\u8272\u3092\u9078\u3076
+choose_node_background_color = \u30ce\u30fc\u30c9\u306e\u80cc\u666f\u8272\u3092\u9078\u3076...
+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>
+close_btn = \u9589\u3058\u308b(&C)
+CloseAction.text = \u8868\u793a\u4e2d\u306e\u30de\u30c3\u30d7\u3092\u9589\u3058\u308b(&C)
+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
+CloudShapeAction.RECT.text = \u77e9\u5f62
+CloudShapeAction.ROUND_RECT.text = \u4e38\u89d2\u77e9\u5f62
+CloudShapeAction.STAR.text = \u30c8\u30f3\u30ac\u30ea
+ColorProperty.ResetColor = \u30ea\u30bb\u30c3\u30c8\u6642\u306e\u8272
+combined = \u8907\u5408
+condition = \u6761\u4ef6
+confirmation = \u78ba\u8a8d
+connector = \u30b3\u30cd\u30af\u30bf
+connector_arrows = \u77e2\u3000 \u5370
+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)
+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)
+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-2012 Freeplane team and others
+CopySingleAction.text = \u9078\u629e\u30ce\u30fc\u30c9\u306e\u307f\u30b3\u30d4\u30fc(&S)
+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
+current_dir = \u30de\u30c3\u30d7
+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
+DefaultColorAction.text = \u6a19\u6e96\u8272
+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)
+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
+DeleteStyleAction.text = \u30b9\u30bf\u30a4\u30eb\u3092\u524a\u9664
+DeleteUserStyleAction.text = \u30e6\u30fc\u30b6\u5b9a\u7fa9\u30b9\u30bf\u30a4\u30eb\u3092\u524a\u9664
+dialect_info.app = \u30de\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb {0} \u306f {1} \u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3088\u3063\u3066\u4f5c\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002
+dialect_info.unknownApp = \u8aad\u307f\u8fbc\u307e\u308c\u305f\u30de\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u4f5c\u6210\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u4e0d\u660e\u3067\u3059\u3002
+dialect_info.unknownURL = \u6307\u5b9a\u3055\u308c\u305f WEB \u30b5\u30a4\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+dialect_info.url = \u8a73\u7d30\u306f\u3001\u30d7\u30ed\u30b0\u30e9\u30e0 WEB \u30b5\u30a4\u30c8 {0} \u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002
+dialect_info.warning = Freeplane \u306b\u3088\u308b\u30de\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u8fbc\u307f\u3001\u8868\u793a\u3001\u53c8\u306f\u4fdd\u5b58\u304c\u6b63\u3057\u304f\u884c\u306a\u308f\u308c\u3066\u3044\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
+DirectHtmlFlavorHandler = HTML \u30d5\u30a9\u30fc\u30de\u30c3\u30c8\uff1a\u5358\u4e00\u30ce\u30fc\u30c9\u306b\u5909\u63db
+DocumentationAction.text = \u30de\u30cb\u30e5\u30a2\u30eb
+down = \u4e0b\u3078(&O)
+download = \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
+dropped_file_error = <html>\u30c9\u30e9\u30b0\uff06\u30c9\u30ed\u30c3\u30d7\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<br>\u7406\u7531\uff1a{0}<html>
+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
+EdgeColorAction.text = \u7dda\u306e\u8272...
+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.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.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
+EdgeStyleAction.sharp_bezier.tooltip = \u7dda\u3092\u5148\u304c\u7d30\u304f\u306a\u308b\u306a\u3060\u3089\u304b\u306a\u66f2\u7dda\u3067\u8868\u793a\u3057\u307e\u3059\u3002
+EdgeStyleAction.sharp_linear.text = \u5148\u7d30\u76f4\u7dda
+EdgeStyleAction.sharp_linear.tooltip = \u7dda\u3092\u5148\u304c\u7d30\u304f\u306a\u308b\u76f4\u7dda\u3067\u8868\u793a\u3057\u307e\u3059\u3002
+EdgeStyleAsParentAction.text = \u89aa\u3068\u540c\u3058
+EdgeStyleAsParentAction.tooltip = <html>\u89aa\u30ce\u30fc\u30c9\u3068\u540c\u3058\u7dda\u306e\u5f62\u72b6\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002</html>[obsolete]
+EdgeWidthAction_width_parent.text = \u89aa\u3068\u540c\u3058
+EdgeWidthAction_width_thin.text = \u7d30\u3044\u7dda
+edit = \u7de8\u96c6(&E)
+edit.decision = HTML \u30a8\u30c7\u30a3\u30bf
+edit.edit_rich_text = \u592a\u5b57\u3001\u659c\u4f53\u306a\u3069\u306e\u66f8\u5f0f\u3092\u4f7f\u7528\u3057\u307e\u3059\u304b\uff1f
+edit_details = \u30ce\u30fc\u30c9\u306e\u8a73\u7d30\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6...
+edit_end_label = <html>\u30b3\u30cd\u30af\u30bf<br>\u30e9\u30d9\u30eb\uff1a
+edit_label_font_family = \u30d5\u30a9\u30f3\u30c8 \u540d
+edit_label_font_size = \u6587\u5b57\u30b5\u30a4\u30ba
+edit_link_manually = \u30ea\u30f3\u30af\u5148\u3092\u6307\u5b9a...
+edit_long_node = \u30ce\u30fc\u30c9\u30b3\u30a2\u3092\u30c0\u30a4\u30a2\u30ed\u30b0\u7de8\u96c6
+edit_middle_label = <html>\u4e2d\u9593\u70b9<br>\u30e9\u30d9\u30eb\uff1a
+edit_note = \u30ce\u30fc\u30c8\u3092\u7de8\u96c6
+edit_source_label = <html>\u59cb\u3000 \u70b9<br>\u30e9\u30d9\u30eb\uff1a
+edit_target_label = <html>\u7d42\u3000 \u70b9<br>\u30e9\u30d9\u30eb\uff1a
+edit_transparency_label = \u900f\u904e\u6027
+edit_width_label = \u592a\u3000 \u3055
+EditAction.text = \u30ce\u30fc\u30c9\u30b3\u30a2\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6...
+EditAttributesAction.text = \u5c5e\u6027\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6...
+EditDetailsAction.text = \u30ce\u30fc\u30c9\u306e\u8a73\u7d30\u3092\u30a4\u30f3\u30e9\u30a4\u30f3\u7de8\u96c6...
+EditDetailsInDialogAction.text = \u30ce\u30fc\u30c9\u306e\u8a73\u7d30\u3092\u30c0\u30a4\u30a2\u30ed\u30b0\u7de8\u96c6...
+EditFilterAction.text = \u30d5\u30a3\u30eb\u30bf\u6761\u4ef6\u3092\u6307\u5b9a...
+EditLongAction.text = \u30ce\u30fc\u30c9\u30b3\u30a2\u3092\u30c0\u30a4\u30a2\u30ed\u30b0\u7de8\u96c6...
+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.tooltip = \u65b0\u3057\u3044\u6697\u8a3c\u4ed8\u304d\u79d8\u533f\u30de\u30c3\u30d7\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
+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_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
+enter_map_url = \u30de\u30c3\u30d7\u306e URL \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+enter_new_style_name = \u65b0\u898f\u30b9\u30bf\u30a4\u30eb\u306e\u540d\u79f0\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+enter_node_id = \u30ce\u30fc\u30c9 ID \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+enter_zoom = \u8868\u793a\u500d\u7387\uff08\uff05\uff09\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+EnterPassword.text = \u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u60c5\u5831\u4fdd\u8b77\uff0f\u95b2\u89a7
+error = \u30a8\u30e9\u30fc\u304c\u8d77\u304d\u307e\u3057\u305f\u3002
+error_applying_template = XSL \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9069\u7528\u3067\u30a8\u30e9\u30fc\u304c\u8d77\u304d\u307e\u3057\u305f\u3002
+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
+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
+ExecuteScriptOnSelectedNode.text = {0} \u3092\u9078\u629e\u30ce\u30fc\u30c9\uff08\u3059\u3079\u3066\uff09\u3067\u5b9f\u884c
+ExecuteScriptOnSelectedNodeRecursively.text = {0} \u3092\u9078\u629e\u30ce\u30fc\u30c9\u3067\u518d\u5e30\u7684\u306b\u5b9f\u884c
+ExecuteScriptOnSingleNode.text = {0} \u3092\u9078\u629e\u30ce\u30fc\u30c9\uff08\u5358\u4e00\uff09\u3067\u5b9f\u884c
+ExecuteScripts.noScriptsAvailable = \u4f7f\u7528\u53ef\u80fd\u30b9\u30af\u30ea\u30d7\u30c8\u306a\u3057
+ExecuteScripts.text = \u30b9\u30af\u30ea\u30d7\u30c8\u3092\u9078\u3093\u3067\u5b9f\u884c
+ExecuteScriptSecurityError.text = \u30b9\u30af\u30ea\u30d7\u30c8\uff1a {0} \n\u3000\u3000\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+export_failed = \u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+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)
+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
+ExportPdf.text = PDF \u30d5\u30a1\u30a4\u30eb\u306b
+ExportSvg.text = SVG \u753b\u50cf\u306b
+ExportToHTMLAction.text = HTML \u30d5\u30a1\u30a4\u30eb\u306b
+ExportToImage.jpg.text = JPEG \u753b\u50cf\u306b
+ExportToImage.png.text = PNG \u753b\u50cf\u306b
+ExportToOoWriter.text = Open Office Writer \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b
+extension_menu = \u30b9\u30bf\u30a4\u30eb
+ExternalImage_popupMenu_Change = \u753b\u50cf\u3092\u5909\u66f4...
+ExternalImage_popupMenu_Open = \u753b\u50cf\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
+ExternalImage_popupMenu_Remove = \u753b\u50cf\u3092\u524a\u9664
+ExternalImage_popupMenu_ResetZoom = \u62e1\u5927\u30fb\u7e2e\u5c0f\u3092\u30ea\u30bb\u30c3\u30c8
+ExternalImageAddAction.text = \u753b\u50cf\u3092\u4ed8\u52a0...
+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
+f_button_unassigned = \uff1c\u672a\u5b9a\u7fa9\uff1e
+FaqOpenURLAction.text = \u3088\u304f\u3042\u308b\u8cea\u554f
+file = \u30d5\u30a1\u30a4\u30eb(&F)
+file_already_exists = \u540C\u3058\u30D5\u30A1\u30A4\u30EB {0} \u304C\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u3066\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F
+file_not_found = \u30d5\u30a1\u30a4\u30eb {0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+FileListFlavorHandler = \u30d5\u30a1\u30a4\u30eb\u306b\u30ea\u30f3\u30af
+FileProperties_BranchLeafCount = \u9078\u629e\u4e2d\u306e\u679d\u306e\u672b\u7aef\u30ce\u30fc\u30c9\u6570\uff1a
+FileProperties_BranchNodeCount = \u9078\u629e\u4e2d\u306e\u679d\u306e\u30ce\u30fc\u30c9\u6570\uff1a
+FileProperties_ChangesSinceLastSave = \u76f4\u8fd1\u306e\u4fdd\u5b58\u4ee5\u964d\u306e\u5909\u66f4\uff1a
+FileProperties_FileName = \u30d5\u30a1\u30a4\u30eb\u540d\uff1a
+FileProperties_FileSaved = \u30d5\u30a1\u30a4\u30eb\u4fdd\u5b58\u6642\u9593\uff1a
+FileProperties_FileSize = \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\uff1a
+FileProperties_MainBranchCount = \u5927\u679d\u306e\u6570\uff1a
+FileProperties_NeverSaved = \u672a\u4fdd\u5b58
+FileProperties_NodeChildCount = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u306e\u5b50\u30ce\u30fc\u30c9\u6570\uff1a
+FileProperties_NodeSelectionCount = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u6570\uff1a
+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)
+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
+FileRevisionsDialog.file_size = \u30d0\u30a4\u30c8
+FileRevisionsDialog.open = \u958b\u304f(&O)
+FileRevisionsDialog.open.tooltip = \u65e5\u4ed8\u304c\u53e4\u304f\u3066\u3082\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304d\u307e\u3059\u3002
+FileRevisionsDialog.question = {0} \u306e\u66f4\u65b0\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u3059\u3002
+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_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_conditions = \u30d5\u30a3\u30eb\u30bf
+filter_contains = \u2283(\u542b\u3080)
+filter_created_after = \u4ee5\u964d\u306b\u4f5c\u6210\u3055\u308c\u305f
+filter_created_before = \u4ee5\u524d\u306b\u4f5c\u6210\u3055\u308c\u305f
+filter_delete = \u524a\u9664(&D)
+filter_details = \u8a73\u7d30
+filter_dialog = \u30d5\u30a3\u30eb\u30bf\u306e\u6761\u4ef6\u3092\u6307\u5b9a
+filter_does_not_exist = \u5b58\u5728\u3057\u307e\u305b\u3093
+filter_edit_description = \u30d5\u30a3\u30eb\u30bf\u30ea\u30b9\u30c8\u3092\u7de8\u96c6
+filter_enter_value = \u5024\u3092\u5165\u529b
+filter_even_level = \u5947\u6570\u968e\u5c64\u30ce\u30fc\u30c9
+filter_exist = \u4ed8\u304d
+filter_icon = \u30a2\u30a4\u30b3\u30f3
+filter_is_equal_to = \uff1d
+filter_is_not_equal_to = \u2260
+filter_leaf = \u672b\u7aef\u30ce\u30fc\u30c9
+filter_link = \u30cf\u30a4\u30d1\u30fc\u30ea\u30f3\u30af
+filter_match_approximately = \u66d6\u6627(&A)
+filter_match_approximately_tooltip = <html>\u66d6\u6627\u691c\u7d22\u306e\u30aa\u30f3\uff0f\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059\u3002<br/>\u4f8b\u3048\u3070\u3001'files' \u306e\u691c\u7d22\u6642\u306b 'flies' \u306a\u3069\u3082\u30de\u30c3\u30c1\u3057\u305f\u3068\u307f\u306a\u3057\u307e\u3059\u3002</html>
+filter_match_case = \u5927\u6587\u5b57\uff0f\u5c0f\u6587\u5b57\u3092\u533a\u5225(&C)
+filter_match_case_tooltip = \u30d5\u30a3\u30eb\u30bf\u9069\u7528\u6642\u306b\u3001\u5927\u6587\u5b57\uff0f\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u307e\u3059\u3002
+filter_modified_after = \u4ee5\u964d\u306b\u5909\u66f4\u3055\u308c\u305f
+filter_modified_before = \u4ee5\u524d\u306b\u5909\u66f4\u3055\u308c\u305f
+filter_no_filtering = \u30d5\u30a3\u30eb\u30bf\u7121\u3057
+filter_node = \u30b3\u30a2\u30c6\u30ad\u30b9\u30c8
+filter_node_level = \u30ce\u30fc\u30c9\u968e\u5c64
+filter_not = Not(&N)
+filter_note = \u30ce\u30fc\u30c8
+filter_odd_level = \u5076\u6570\u968e\u5c64\u30ce\u30fc\u30c9
+filter_or = Or(&R)
+filter_parent = \u89aa\u30ce\u30fc\u30c9\u306e\u30c6\u30ad\u30b9\u30c8
+filter_periodic_level = \u968e\u5c64\u5468\u671f
+filter_priority = \u512a\u5148\u9806\u4f4d
+filter_regexp_matches = \u6b63\u898f\u8868\u73fe\u306b\u30de\u30c3\u30c1\u3059\u308b
+filter_reminder = \u30ea\u30de\u30a4\u30f3\u30c0
+filter_reminder_after = \u53f3\u8a18\u306e\u65e5\u6642\u4ee5\u964d\u306b\u8a2d\u5b9a
+filter_reminder_before = \u53f3\u8a18\u306e\u65e5\u6642\u4ee5\u524d\u306b\u8a2d\u5b9a
+filter_reminder_executed = \u671f\u9650\u5207\u308c\u306e\u3082\u306e
+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_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)
+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_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
+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.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
+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_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)
+format_menu_edge_widths = \u7dda\u306e\u592a\u3055(&W)
+format_panel = \u66f8\u5f0f
+FormatCopy.text = \u66f8\u5f0f\u306e\u307f\u30b3\u30d4\u30fc
+FormatCopy.tooltip = \u30ce\u30fc\u30c9\u306e\u66f8\u5f0f\u3060\u3051\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3059\u3002
+FormatPaste.text = \u66f8\u5f0f\u306e\u307f\u8cbc\u308a\u4ed8\u3051
+FormatPaste.tooltip = \u30ce\u30fc\u30c9\u306e\u66f8\u5f0f\u3060\u3051\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059\u3002
+formats_not_loaded = \u66f8\u5f0f\u3092\u8aad\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d5\u30a1\u30a4\u30eb\u304c\u58ca\u308c\u3066\u3044\u307e\u3059\u3002
+formula.error.attributeValueIsNull = \u8a08\u7b97\u5f0f\u5b9f\u884c\u5f8c\u306e\u5c5e\u6027\u5024 ''{0}'' \u306f\u7a7a\u5024\u3067\u3059\u3002
+formula.error.circularReference = \u5faa\u74b0\u53c2\u7167\uff1a\u30ce\u30fc\u30c9 "{0}" \u306e\u8a08\u7b97\u5f0f\u306f\u3001\u81ea\u5df1\u306e\u5024\u3092\u53c2\u7167\u3057\u3066\u3044\u307e\u3059\u3002.
+formula.EvaluateAllAction.text = \u3059\u3079\u3066\u306e\u8a08\u7b97\u5f0f\u3092\u5b9f\u884c
+formula.EvaluateAllAction.tooltip = \u7de8\u96c6\u4e2d\u306e\u30de\u30c3\u30d7\u306e\u3059\u3079\u3066\u306e\u8a08\u7b97\u5f0f\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
+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
+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...
+Freeplane.progress.createInitialMode = \u521d\u671f\u30e2\u30fc\u30c9\u3092\u4f5c\u6210\u4e2d...
+Freeplane.progress.endStartup = \u30b9\u30bf\u30fc\u30c8\u30a2\u30c3\u30d7\u3092\u5b8c\u4e86
+Freeplane.progress.gettingPreferenceDirectories = \u74b0\u5883\u8a2d\u5b9a\u30d5\u30a9\u30eb\u30c0\u3092\u8aad\u307f\u8fbc\u307f\u4e2d...
+Freeplane.progress.gettingPreferences = \u74b0\u5883\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u307f\u4e2d...
+Freeplane.progress.loadMaps = \u30de\u30c3\u30d7\u3092\u8aad\u307f\u8fbc\u307f\u4e2d...
+Freeplane.progress.propagateLookAndFeel = \u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb\u3092\u4f1d\u9054\u4e2d...
+Freeplane.progress.settingPreferences = \u74b0\u5883\u8a2d\u5b9a...
+Freeplane.progress.startCreateController = \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u4f5c\u6210\u958b\u59cb...
+Freeplane.progress.updateLookAndFeel = \u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb\u3092\u66f4\u65b0\u4e2d...
+freeplane_reverted = Freeplane \u306f\u6700\u5f8c\u306b\u624b\u52d5\u4fdd\u5b58\u3057\u305f\u3068\u304d\u306e\u72b6\u614b\u306b\u623b\u308a\u307e\u3057\u305f\u3002
+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
+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
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = \u5272\u308a\u5f53\u3066\uff1a
+GrabKeyDialog.grab-key.assigned-to.none = \u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+GrabKeyDialog.grab-key.clear = \u6d88\u53bb
+GrabKeyDialog.grab-key.remove = \u524a\u9664
+GrabKeyDialog.grab-key.remove-ask = \u3053\u306e\u30ad\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3044\u3044\u3067\u3059\u304b\uff1f
+GrabKeyDialog.grab-key.title = \u65b0\u3057\u3044\u30ad\u30fc\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+green = \u7dd1
+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.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
+HotKeyInfoAction.text = \u30db\u30c3\u30c8\u30ad\u30fc\u4e00\u89a7
+html_export_based_on_headings = HTML\u66f8\u304d\u51fa\u3057 - \u968e\u5c64\u3092\u898b\u51fa\u3057\u306b\u3059\u308b
+html_export_fold_all = HTML\u66f8\u304d\u51fa\u3057 - \u3059\u3079\u3066\u6298\u308a\u7573\u3093\u3067
+html_export_fold_currently_folded = HTML\u66f8\u304d\u51fa\u3057 - \u6298\u308a\u7573\u307f\u306f\u73fe\u72b6\u306e\u307e\u307e
+html_export_no_folding = HTML\u66f8\u304d\u51fa\u3057 - \u6298\u308a\u7573\u307f\u306f\u5c55\u958b
+html_problem = <html>{0} \u306e<br><br> html \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002</html>
+icon_0% = 0\uff05
+icon_100% = 100\uff05
+icon_25% = 25\uff05
+icon_50% = 50\uff05
+icon_75% = 75\uff05
+icon_addition = \u8db3\u3059
+icon_attach = \u6ce8\u76ee
+icon_audio = \u30aa\u30fc\u30c7\u30a3\u30aa
+icon_back = \u5de6\u5411\u304d
+icon_bee = Freeplane
+icon_bell = \u8981\u8a18\u61b6
+icon_bookmark = \u304a\u6c17\u306b\u5165\u308a
+icon_broken-line = \u4e2d\u65ad
+icon_button_cancel = \u30c0\u30e1
+icon_button_ok = \u4e86\u89e3
+icon_calendar = \u671f\u65e5
+icon_checked = \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9(ON)
+icon_clanbomber = \u3084\u3070\u3044
+icon_clock = \u6642\u523b
+icon_clock2 = \u30ea\u30de\u30a4\u30f3\u30c0
+icon_closed = \u7acb\u5165\u7981\u6b62
+icon_decrypted = \u79d8\u533f\u89e3\u9664
+icon_desktop_new = \u8981\u63aa\u7f6e
+icon_division = \u5272\u308b
+icon_down = \u4e0b\u5411\u304d
+icon_edit = \u6587\u66f8\u5316
+icon_encrypted = \u79d8\u533f\u4e2d
+icon_executable = \u5b9f\u884c\u30d5\u30a1\u30a4\u30eb
+icon_family = \u5bb6\u65cf
+icon_fema = \u7537\u5973
+icon_female1 = \u5973\u6027 1
+icon_female2 = \u5973\u6027 2
+icon_females = \u5973\u6027(\u8907\u6570)
+icon_flag = \u8d64\u3044\u65d7
+icon_flag-black = \u9ed2\u3044\u65d7
+icon_flag-blue = \u9752\u3044\u65d7
+icon_flag-green = \u7dd1\u306e\u65d7
+icon_flag-orange = \u30aa\u30ec\u30f3\u30b8\u306e\u65d7
+icon_flag-pink = \u30d4\u30f3\u30af\u306e\u65d7
+icon_flag-yellow = \u9ec4\u8272\u306e\u65d7
+icon_folder = \u30d5\u30a9\u30eb\u30c0
+icon_forward = \u53f3\u5411\u304d
+icon_freemind_butterfly = FreeMind
+icon_full-0 = \u512a\u5148\u5ea6 0
+icon_full-1 = \u512a\u5148\u5ea6 1
+icon_full-2 = \u512a\u5148\u5ea6 2
+icon_full-3 = \u512a\u5148\u5ea6 3
+icon_full-4 = \u512a\u5148\u5ea6 4
+icon_full-5 = \u512a\u5148\u5ea6 5
+icon_full-6 = \u512a\u5148\u5ea6 6
+icon_full-7 = \u512a\u5148\u5ea6 7
+icon_full-8 = \u512a\u5148\u5ea6 8
+icon_full-9 = \u512a\u5148\u5ea6 9
+icon_go = \u9752\u4fe1\u53f7
+icon_gohome = \u30db\u30fc\u30e0
+icon_group = \u30b0\u30eb\u30fc\u30d7
+icon_help = \u7591\u554f\uff1f
+icon_hourglass = \u5f85\u6a5f
+icon_icon_not_found = \u30a2\u30a4\u30b3\u30f3\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+icon_idea = \u6c17\u3065\u304d
+icon_image = \u753b\u50cf
+icon_info = \u53c2\u8003\u60c5\u5831
+icon_internet = \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8
+icon_internet_warning = \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8(\u8981\u6ce8\u610f)
+icon_kaddressbook = \u96fb\u8a71
+icon_kmail = E \u30e1\u30fc\u30eb
+icon_knotify = \u97f3\u697d
+icon_korn = \u30e1\u30fc\u30eb\u30dc\u30c3\u30af\u30b9
+icon_ksmiletris = \u3054\u6a5f\u5acc
+icon_launch = \u958b\u59cb
+icon_licq = Licq
+icon_list = \u30ea\u30b9\u30c8
+icon_Mail = \u624b\u7d19
+icon_male1 = \u7537\u6027 1
+icon_male2 = \u7537\u6027 2
+icon_males = \u7537\u6027(\u8907\u6570)
+icon_menu = \u30a2\u30a4\u30b3\u30f3(&C)
+icon_messagebox_warning = \u91cd\u8981
+icon_mindmap = \u30de\u30a4\u30f3\u30c9\u30de\u30c3\u30d7
+icon_multiplication = \u639b\u3051\u308b
+icon_narrative = \u7269\u8a9e
+icon_negative = \u60aa\u3044
+icon_neutral = \u666e\u901a
+icon_password = \u30ab\u30ae
+icon_pencil = \u6731\u7b46
+icon_penguin = Linux
+icon_positive = \u826f\u3044
+icon_prepare = \u9ec4\u4fe1\u53f7
+icon_revision = \u30ea\u30d3\u30b8\u30e7\u30f3
+icon_smiley-angry = \u6012\u308a
+icon_smiley-neutral = \u5e73\u9759
+icon_smiley-oh = \u9a5a\u304d
+icon_smily_bad = \u4e0d\u6a5f\u5acc
+icon_stop = \u8d64\u4fe1\u53f7
+icon_stop-sign = \u4e2d\u6b62
+icon_subtraction = \u5f15\u304f
+icon_unchecked = \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9(OFF)
+icon_up = \u4e0a\u5411\u304d
+icon_user_icon = \u30e6\u30fc\u30b6\u30a2\u30a4\u30b3\u30f3
+icon_very_negative = \u975e\u5e38\u306b\u60aa\u3044
+icon_very_positive = \u975e\u5e38\u306b\u826f\u3044
+icon_video = \u30d3\u30c7\u30aa
+icon_wizard = \u4e0d\u601d\u8b70
+icon_xmag = \u8981\u691c\u8a0e
+icon_yes = \u7d0d\u5f97\uff01
+IconGroupPopupAction.arrows.text = \u77e2\u5370
+IconGroupPopupAction.docs_folders.text = \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\uff06\u30d5\u30a9\u30eb\u30c0
+IconGroupPopupAction.flags.text = \u65d7
+IconGroupPopupAction.math.text = \u8a08\u7b97\u8a18\u53f7
+IconGroupPopupAction.media.text = \u30e1\u30c7\u30a3\u30a2
+IconGroupPopupAction.miscellaneous.text = \u8272\u3005
+IconGroupPopupAction.nature.text = OS \uff06MM \u30a2\u30d7\u30ea etc.
+IconGroupPopupAction.numbers.text = \u756a\u53f7
+IconGroupPopupAction.office.text = \u30aa\u30d5\u30a3\u30b9
+IconGroupPopupAction.people.text = \u4eba\u3005
+IconGroupPopupAction.rating.text = \u8a55\u4fa1
+IconGroupPopupAction.signs.text = \u6a19\u8b58\uff06\u8a18\u53f7
+IconGroupPopupAction.smiley.text = \u30b9\u30de\u30a4\u30ea\u30fc
+IconGroupPopupAction.time.text = \u6642\u523b
+IconGroupPopupAction.user.text = \u30e6\u30fc\u30b6\u30a2\u30a4\u30b3\u30f3
+IconProgressExtended10Action.text = \u5927\u304d\u3044\u56f3\u3092\u4ed8\u52a0\uff0810 \uff05\u523b\u307f\uff09
+IconProgressExtended10Action.tooltip = <html>\u5de6\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067 10 \uff05\u305a\u3064\u4e0a\u6607\u3059\u308b\u9032\u6357\u5ea6\u6307\u6a19\u3092\u4ed8\u52a0\u3057\u307e\u3059\u3002<br>\u300cCtrl + \u5de6\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u300d\u3067\u3001\u4f4e\u4e0b\uff0f\u524a\u9664\u3057\u307e\u3059\u3002</html>
+IconProgressExtended25Action.text = \u5927\u304d\u3044\u56f3\u3092\u4ed8\u52a0\uff0825 \uff05\u523b\u307f\uff09
+IconProgressExtended25Action.tooltip = <html>\u5de6\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067 25 \uff05\u305a\u3064\u4e0a\u6607\u3059\u308b\u9032\u6357\u5ea6\u6307\u6a19\u3092\u4ed8\u52a0\u3057\u307e\u3059\u3002<br>\u300cCtrl + \u5de6\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u300d\u3067\u3001\u4f4e\u4e0b\uff0f\u524a\u9664\u3057\u307e\u3059\u3002</html>
+IconProgressIconDownAction.text = \u9032\u6357\u5ea6\u3092\u4e0b\u3052\u308b
+IconProgressIconDownAction.tooltip = \u8868\u793a\u3059\u308b\u9032\u6357\u5ea6\u30a2\u30a4\u30b3\u30f3\u306e\u5024\u3092\u5f15\u304d\u4e0b\u3052\u307e\u3059\u3002 (100% -> 75% -> 50% -> 25% -> 0% -> \u524a\u9664).
+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
+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_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)...
+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
+invalid_export_file = \u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u540d\u304c\u7121\u52b9\u3067\u3059\u3002
+invalid_file_msg = {0} \u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+invalid_uri = URI {0} \u306f\u7121\u52b9\u3067\u3059\u3002
+invalid_url = \u6709\u52b9\u306a URL \u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+invalid_url_msg = {0} \u306b\u95a2\u3057\u3066\u6709\u52b9\u306a URL \u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ItalicAction.text = \u659c\u4f53
+italicise_branch = \u659c\u4f53\u5316
+java_version = Java version: {0}
+JoinNodesAction.text = \u30ce\u30fc\u30c9\u3092\u7d71\u5408
+LatexDeleteLatexAction.text = LaTeX \u6570\u5f0f\u3092\u524a\u9664(&X)
+LatexEditLatexAction.text = LaTeX \u6570\u5f0f\u3092\u7de8\u96c6(&L)...
+LatexInsertLatexAction.text = LaTeX \u6570\u5f0f\u3092\u4ed8\u52a0(&L)...
+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
+license_text = Freeplane - \u30de\u30a4\u30f3\u30c9\u30de\u30c3\u30d7\u4f5c\u6210\u30fb\u8868\u793a\u7528\u30d7\u30ed\u30b0\u30e9\u30e0
+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
+load = \u8aad\u307f\u8fbc\u307f(&L)
+load_accelerator_presets = \u8aad\u307f\u8fbc\u307f
+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
+locking_old_lock_removed = <html>\u30de\u30c3\u30d7 {0} \u306f<br>\u30e6\u30fc\u30b6 {1} \u306b\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002<br>\u30ed\u30c3\u30af\u6307\u5b9a\u304c\u53e4\u3044\u306e\u3067\u3001\u30ed\u30c3\u30af\u3092\u89e3\u9664\u3057\u307e\u3059\u304b\uff1f</html>
+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_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
+MakeLinkFromAnchorAction.tooltip = <html>\u30a2\u30f3\u30ab\u30fc\u30ce\u30fc\u30c9\u304b\u3089\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u884c\u304d\u306e<br/>\u30ed\u30fc\u30ab\u30eb\u30ea\u30f3\u30af\u306a\u3044\u3057\u30b0\u30ed\u30fc\u30d0\u30eb\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002</html>
+MakeLinkToAnchorAction.text = \u30a2\u30f3\u30ab\u30fc\u3078\u306e\u30ea\u30f3\u30af\u3092\u4f5c\u6210
+MakeLinkToAnchorAction.tooltip = <html>\u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304b\u3089\u30a2\u30f3\u30ab\u30fc\u30ce\u30fc\u30c9\u884c\u304d\u306e<br/>\u30ed\u30fc\u30ab\u30eb\u30ea\u30f3\u30af\u306a\u3044\u3057\u30b0\u30ed\u30fc\u30d0\u30eb\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002</html>
+ManageAddOnsAction.text = \u30a2\u30c9\u30aa\u30f3
+ManageAddOnsDialog.activate = \u4f5c\u52d5\u3055\u305b\u308b
+ManageAddOnsDialog.activation.success = {0} \u3092\u4f5c\u52d5\u3055\u305b\u308b\u306b\u306f\u3001\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+ManageAddOnsDialog.authored.by = {0} \u4f5c
+ManageAddOnsDialog.cannot.activate = \u4f5c\u52d5\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\uff1a{0} \u306f\u65e2\u306b\u4f5c\u52d5\u4e2d\u3067\u3059\u3002
+ManageAddOnsDialog.cannot.configure = {0} \u3092\u8a2d\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002
+ManageAddOnsDialog.cannot.deactivate = \u4f5c\u52d5\u3092\u505c\u6b62\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\uff1a{0} \u306f\u4f5c\u52d5\u3057\u3066\u3044\u307e\u305b\u3093\u3002
+ManageAddOnsDialog.cannot.deinstall = {0} \u3092\u53d6\u308a\u5916\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+ManageAddOnsDialog.configure = \u30a2\u30c9\u30aa\u30f3\u3092\u69cb\u6210
+ManageAddOnsDialog.deactivate = \u4f5c\u52d5\u3092\u505c\u6b62
+ManageAddOnsDialog.deactivation.success = {0} \u306e\u4f5c\u52d5\u3092\u505c\u6b62\u3059\u308b\u306b\u306f\u3001\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+ManageAddOnsDialog.deinstall = \u53d6\u308a\u5916\u3059
+ManageAddOnsDialog.deinstallation.success = {0} \u3092\u53d6\u308a\u5916\u3059\u306b\u306f\u3001\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+ManageAddOnsDialog.error = \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30a8\u30e9\u30fc\uff1a{0}
+ManageAddOnsDialog.install = \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb(&I)
+ManageAddOnsDialog.install.from.known.location = \u65e2\u77e5\u306e\u5834\u6240\u304b\u3089\u30a2\u30c9\u30aa\u30f3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb
+ManageAddOnsDialog.install.tooltip = \u3053\u3053\u306b\u3001\u30a2\u30c9\u30aa\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30d5\u30a1\u30a4\u30eb\u306e URL \u3092\u633f\u5165\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ManageAddOnsDialog.map.not.opened = \u30de\u30c3\u30d7 {0}\u306f\u3001\u958b\u304b\u308c\u3066\u3044\u306a\u3044\u3088\u3046\u3067\u3059\u3002
+ManageAddOnsDialog.really.deinstall = \u672c\u5f53\u306b {0} \u3092\u53d6\u308a\u5916\u3057\u307e\u3059\u304b\uff1f
+ManageAddOnsDialog.search = \u30a2\u30c9\u30aa\u30f3\u3092\u691c\u7d22
+ManageAddOnsDialog.search.file = \u691c\u7d22
+ManageAddOnsDialog.select.tooltip = \u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ManageAddOnsDialog.status.downloading = \u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u4e2d...
+ManageAddOnsDialog.status.installing = \u30a2\u30c9\u30aa\u30f3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e2d...
+ManageAddOnsDialog.status.success = {0} \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002
+ManageAddOnsDialog.tab.install = \u691c\u7d22\u3068\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb
+ManageAddOnsDialog.tab.install.tooltip = \u30a2\u30c9\u30aa\u30f3\u3092\u691c\u7d22\u3057\u3001\u65b0\u898f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002
+ManageAddOnsDialog.tab.manage = \u30a2\u30c9\u30aa\u30f3\u7ba1\u7406
+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)
+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_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...
+MaxNodeWidth.text = \u6700\u5927\u8868\u793a\u5e45
+menu_applyStyle = \u30b9\u30bf\u30a4\u30eb\u3092\u9069\u7528
+menu_attributes = \u5c5e\u6027(&A)
+menu_clouds = \u96f2
+menu_copy = \u30b3\u30d4\u30fc
+menu_coreFormat = \u30ce\u30fc\u30c9\u30b3\u30a2\u95a2\u9023
+menu_details = \u8a73\u7d30
+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
+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_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
+MindMapNodesFlavorHandler = \u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\uff1a\u30ce\u30fc\u30c9\u968e\u5c64\u4ed8\u304d\uff08\u5c55\u958b\u3059\u308b\uff09
+mindmaps = \u30de\u30c3\u30d7(&M)
+mindmaps_desc = \u30de\u30a4\u30f3\u30c9\u30de\u30c3\u30d7 (*.mm)
+mindmaps_filter_desc = \u30d5\u30a3\u30eb\u30bf(*.mmfilter)
+MinNodeWidth.text = \u6700\u5c0f\u8868\u793a\u5e45
+mode_Browse = \u30de\u30c3\u30d7\u95b2\u89a7
+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_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
+MoveToRootAction.text = \u30eb\u30fc\u30c8\u30ce\u30fc\u30c9\u3078\u30b8\u30e3\u30f3\u30d7
+NameConditionAction.text = \u540d\u79f0\u3092\u6307\u5b9a
+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_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
+new_version_available = \u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3 '{0}' \u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002
+NewChildAction.text = \u65b0\u898f\u5b50\u30ce\u30fc\u30c9
+NewerFileRevisionsFoundDialog.cancel = \u30b9\u30ad\u30c3\u30d7(&S)
+NewerFileRevisionsFoundDialog.cancel.tooltip = \u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304b\u305a\u306b\u6b21\u306e\u4f5c\u696d\u3078\u79fb\u308a\u307e\u3059\u3002
+NewerFileRevisionsFoundDialog.file_last_modified = \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
+NewerFileRevisionsFoundDialog.file_name = \u30d5\u30a1\u30a4\u30eb\u540d
+NewerFileRevisionsFoundDialog.file_size = \u30d0\u30a4\u30c8
+NewerFileRevisionsFoundDialog.open = \u958b\u304f(&O)
+NewerFileRevisionsFoundDialog.open.tooltip = \u30d5\u30a1\u30a4\u30eb\u306e\u65e5\u4ed8\u304c\u53e4\u304f\u3066\u3082\u958b\u304f\u3002
+NewerFileRevisionsFoundDialog.question = {0} \u306e\u65b0\u3057\u3044\u4fee\u6b63\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u3059\u304c\u3001\n\u4e0a\u8a18\uff08\uff11\u884c\u76ee\uff09\u306e {0} \u3092\u958b\u304d\u307e\u3059\u304b\u3002\n {0} \u3092\u81ea\u52d5\u4fdd\u5b58\u30d5\u30a1\u30a4\u30eb\u306b\u7f6e\u304d\u63db\u3048\u308b\u5834\u5408\u306f\u3001\n\u4e00\u89a7\u304b\u3089\u8a72\u5f53\u306e\u3082\u306e\u3092\u9078\u3093\u3067\u3001\u300c\u5fa9\u5143\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+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
+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)
+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
+NewPreviousSiblingAction.text = \u65b0\u898f\u5144\u30ce\u30fc\u30c9
+NewSiblingAction.text = \u65b0\u898f\u5f1f\u30ce\u30fc\u30c9
+NewSummaryAction.text = \u65b0\u898f\u307e\u3068\u3081\u30ce\u30fc\u30c9\uff08\u9078\u629e\u30ce\u30fc\u30c9\u7fa4\uff09
+NewUserStyleAction.text = \u9078\u629e\u30ce\u30fc\u30c9\u304b\u3089\u65b0\u30b9\u30bf\u30a4\u30eb\u3092\u4f5c\u6210
+NextNodeAction.BACK.text = \u524d\u306e\u30ce\u30fc\u30c9
+NextNodeAction.BACK_N_FOLD.text = \u524d\u306e\u30ce\u30fc\u30c9\uff08\u6298\u308a\u7573\u3080\uff09
+NextNodeAction.FORWARD.text = \u6b21\u306e\u30ce\u30fc\u30c9
+NextNodeAction.FORWARD_N_FOLD.text = \u6b21\u306e\u30ce\u30fc\u30c9\uff08\u6298\u308a\u7573\u3080\uff09
+NextPresentationItemAction.text = \u6b21\u306e\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u30a2\u30a4\u30c6\u30e0\u3092\u5c55\u958b
+no = \u3044\u3044\u3048
+no_copy_attributes_before_paste_attributes = \u5c5e\u6027\u306f\u3001\u4e8b\u524d\u306b\u30b3\u30d4\u30fc\u3057\u3066\u304a\u304b\u306a\u3051\u308c\u3070\u3001\u8cbc\u308a\u4ed8\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+NO_FORMAT = \u30c6\u30ad\u30b9\u30c8\u306e\u307f
+no_format_copy_before_format_paste = \u66f8\u5f0f\u3092\u3042\u3089\u304b\u3058\u3081\u30b3\u30d4\u30fc\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+no_found_from = <html>"{1}" \u306e\u679d\u306b <u>{0}</u> \u306f\u3042\u308a\u307e\u305b\u3093\u3002</html>
+no_more_found_from = <html>"{1}" \u306e\u679d\u306b \u3053\u308c\u4ee5\u4e0a <u>{0}</u> \u306f\u3042\u308a\u307e\u305b\u3093\u3002</html>
+no_previous_find = \u524d\u56de\u306e\u691c\u7d22\u6761\u4ef6\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+no_styles_found_in_map = \u30de\u30c3\u30d7\u306b\u30b9\u30bf\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+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_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)...
+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
+NodeExtensions.EditNodeExtensions = \u62e1\u5f35\u30ce\u30fc\u30c9\u30c7\u30fc\u30bf\u3092\u7de8\u96c6
+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)
+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
+ok = 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)...
+OpenFreeplaneSiteAction.text = Freeplane \u30db\u30fc\u30e0\u30da\u30fc\u30b8
+OpenPathAction.text = \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f
+OpenURLMapAction.text = URL \u304b\u3089\u30de\u30c3\u30d7\u3092\u958b\u304f...
+OpenUserDirAction.text = \u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u958b\u304f
+option_changes_may_require_restart = \u8a2d\u5b9a\u3092\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002\u9805\u76ee\u306b\u3088\u3063\u3066\u306f Freeplane \u3092\u518d\u8d77\u52d5\u3059\u308b\u307e\u3067\u53cd\u6620\u3055\u308c\u307e\u305b\u3093\u3002
+OptionalDontShowMeAgainDialog.cancel = \u3044\u3044\u3048(&N)
+OptionalDontShowMeAgainDialog.dontShowAgain = \u4eca\u5f8c\u78ba\u8a8d\u3057\u306a\u3044(&D)
+OptionalDontShowMeAgainDialog.ok = \u306f\u3044(&Y)
+OptionalDontShowMeAgainDialog.rememberMyDescision = \u3053\u306e\u8a2d\u5b9a\u3092\u7dad\u6301(&R)
+OptionPanel.absolute = \u7d76\u5bfe\u7684
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = \u968e\u5c64\u5225\u30b9\u30bf\u30a4\u30eb\u3092\u9069\u7528
+OptionPanel.ADD_CHILD = \u5b50\u30ce\u30fc\u30c9\u3092\u4ed8\u52a0
+OptionPanel.ADD_SIBLING = \u5144\u5f1f\u30ce\u30fc\u30c9\u3092\u4ed8\u52a0
+OptionPanel.addons = \u30a2\u30c9\u30aa\u30f3
+OptionPanel.always_fold_all_after_load = \u3059\u3079\u3066\u6298\u308a\u7573\u3080
+OptionPanel.always_load_last_maps = \u8d77\u52d5\u6642\u306b\u3001\u5e38\u306b\u4e0a\u8a18\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u5c0a\u91cd
+OptionPanel.always_load_last_maps.tooltip = <html>\u30de\u30c3\u30d7\u3092\u6307\u5b9a\u3057\u3066 FP \u3092\u8d77\u52d5\u3059\u308b\u5834\u5408\u3067\u3082\u3001\u4e0a\u8a18\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u53cd\u6620\u3057\u307e\u3059\u3002<br>\uff08\u30de\u30c3\u30d7\u3092\u6307\u5b9a\u3057\u3066 FP \u3092\u8d77\u52d5\u3059\u308b\u5834\u5408\u3001\u901a\u5e38\u3001\u524d\u56de\u7d42\u4e86\u6642\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u72b6\u614b\u3092\u7121\u8996\u3057\u307e\u3059\u3002\uff09</html>
+OptionPanel.always_save_folding = \u5e38\u306b\u4fdd\u5b58\u3059\u308b
+OptionPanel.always_save_folding_state = \u6298\u308a\u7573\u307f\u72b6\u614b\u306e\u5909\u66f4\u3092\u5e38\u306b\u4fdd\u5b58\u3059\u308b
+OptionPanel.always_save_folding_state.tooltip = \u30c1\u30a7\u30c3\u30af\u3059\u308b\u3068\u3001\u6298\u308a\u7573\u307f\u72b6\u614b\u3092\u4fdd\u5b58\u3059\u308b\u304b\u3069\u3046\u304b\u3001\u78ba\u8a8d\u3057\u307e\u3059\u3002
+OptionPanel.always_unfold_all_after_load = \u3059\u3079\u3066\u5c55\u958b\u3059\u308b
+OptionPanel.antialias = \u753b\u9762\u8868\u793a\u306e\u54c1\u8cea
+OptionPanel.antialias.tooltip = <html>\u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9\u3092\u7528\u3044\u308b\u3068\u30de\u30c3\u30d7\u306e\u8868\u793a\u54c1\u8cea\u304c\u5411\u4e0a\u3057\u307e\u3059\u304c\u3001\u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9\u304c\u591a\u304f<br>\u306a\u308b\u3068\u8868\u793a\u306b\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3059\u3002</html>
+OptionPanel.antialias_all = \u3059\u3079\u3066\u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9
+OptionPanel.antialias_edges = \u7dda\u3060\u3051\u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9
+OptionPanel.antialias_none = \u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9\u306a\u3057
+OptionPanel.Appearance = \u753b\u9762\u8868\u793a
+OptionPanel.apply_system_screen_resolution = \u30b7\u30b9\u30c6\u30e0\u306e\u753b\u9762\u89e3\u50cf\u5ea6\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u3068\u3057\u3066\u9069\u7528
+OptionPanel.approximate_search_threshold = \u66d6\u6627\u691c\u7d22\u306e\u95be\u5024
+OptionPanel.approximate_search_threshold.tooltip = <html>\u66d6\u6627\u691c\u7d22\u3067\u30de\u30c3\u30c1\u3057\u305f\u3068\u307f\u306a\u3059\u95be\u5024\u3067\u3059\u3002<br/><font size="2">http://freeplane.sf.net/wiki/index.php/Approximate_search \u3092\u53c2\u7167\u3002</font><br/>\uff08\u5024\u304c\u5927\u304d\u3044\u307b\u3069\u3001\u691c\u7d22\u6761\u4ef6\u306b\u30de\u30c3\u30c1\u3059\u308b\u3082\u306e\u304c\u5c11\u306a\u304f\u306a\u308a\u307e\u3059\u3002\uff09</html>
+OptionPanel.ar = \u30a2\u30e9\u30d3\u30a2\u8a9e\uff0f\u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ARC = \u30e2\u30af\u30e2\u30af
+OptionPanel.as_parent = \u89aa\u3068\u540c\u3058
+OptionPanel.ask = \u78ba\u8a8d\u3059\u308b
+OptionPanel.automatic = \u81ea\u52d5\u9078\u629e\uff0fAutomatic
+OptionPanel.automaticFormat_level = \u968e\u5c64\u5225\u30b9\u30bf\u30a4\u30eb\u3092\u9069\u7528
+OptionPanel.automaticFormat_level1 = \u30eb\u30fc\u30c8\u30ce\u30fc\u30c9\u66f8\u5f0f
+OptionPanel.automaticFormat_level2 = \u7b2c\uff11\u968e\u5c64\u30ce\u30fc\u30c9\u66f8\u5f0f
+OptionPanel.backup_file_number = \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u306e\u4fdd\u6301\u6570
+OptionPanel.Behaviour = \u52d5\u4f5c\u8a2d\u5b9a
+OptionPanel.bezier = \u30d9\u30b8\u30a7\u66f2\u7dda
+OptionPanel.bubble = \u56f2\u307f
+OptionPanel.ca = \u30ab\u30bf\u30ed\u30cb\u30a2\u8a9e\uff08\u30d0\u30ec\u30f3\u30b7\u30a2\uff09\uff0fCatal\u00e0
+OptionPanel.Cancel = \u30ad\u30e3\u30f3\u30bb\u30eb
+OptionPanel.center_selected_node = \u9078\u629e\u30ce\u30fc\u30c9\u3092\u4e2d\u592e\u3078
+OptionPanel.check_updates_automatically = \u8d77\u52d5\u6642\u306b\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u30c1\u30a7\u30c3\u30af
+OptionPanel.childpattern = \u5b50\u30ce\u30fc\u30c9\u30d1\u30bf\u30fc\u30f3
+OptionPanel.childpattern.tooltip = \u9078\u629e\u3055\u308c\u305f\u30d1\u30bf\u30fc\u30f3\u306f\u3059\u3079\u3066\u306e\u5b50\u30ce\u30fc\u30c9\u306b\u9069\u7528\u3055\u308c\u307e\u3059\u3002
+OptionPanel.clear_all_setters = \u3059\u3079\u3066\u5207\u308a\u66ff\u3048
+OptionPanel.clear_all_setters.tooltip = \u3059\u3079\u3066\u306e\u5909\u66f4\u8868\u793a\u306e\u6709\u52b9\uff0f\u7121\u52b9\u3092\u5207\u308a\u66ff\u3048\u307e\u3059\u3002
+OptionPanel.cloud = \u96f2\u3000\u3000
+OptionPanel.cloudcolor = \u96f2\u306e\u8272
+OptionPanel.cloudshape = \u96f2\u306e\u5f62
+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.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>
+OptionPanel.da = \u30c7\u30f3\u30de\u30fc\u30af\u8a9e\uff0fdansk
+OptionPanel.date_format = \u65e5\u4ed8\u306e\u6a19\u6e96\u66f8\u5f0f
+OptionPanel.date_format.tooltip = SHORT \u3084 MEDIUM\u3001 LONG\u3001FULL \u3092\u9078\u3076\u304b\u3001"MM/dd/yyyy" \u306e\u3088\u3046\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OptionPanel.datetime_format = \u6642\u523b\u4ed8\u304d\u65e5\u4ed8\u306e\u6a19\u6e96\u66f8\u5f0f
+OptionPanel.datetime_format.tooltip = '<datestyle>,<timestyle>' \u306e\u5f62\u3067 SHORT \u3084 MEDIUM\u3001 LONG\u3001FULL \u306e\u30b9\u30bf\u30a4\u30eb\u3092\u6307\u5b9a\u3059\u308b\u304b\u3001"MM/dd/yyyy hh/mm" \u306e\u3088\u3046\u306a\u5b8c\u5168\u30d1\u30bf\u30fc\u30f3\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OptionPanel.de = \u30c9\u30a4\u30c4\u8a9e\uff0fDeutsch
+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_other_os = \u305d\u306e\u4ed6\u306eOS
+OptionPanel.default_browser_command_other_os.tooltip = \u4e3b\u306b Linux \u306e\u5834\u5408
+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_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_charset = \u6587\u5b57\u30b3\u30fc\u30c9
+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<br>\u30d5\u30a1\u30a4\u30eb\u300d\u306f\u524a\u9664\u3055\u308c\u307e\u305b\u3093\u3002</html>
+OptionPanel.delete_nodes_without_question = \u30ce\u30fc\u30c9\u524a\u9664\u6642\u306b\u78ba\u8a8d\u3092\u7701\u7565
+OptionPanel.delete_nodes_without_question.tooltip = \u30c1\u30a7\u30c3\u30af\u3059\u308b\u3068\u3001\u30ce\u30fc\u30c9\u524a\u9664\u6642\u306b\u78ba\u8a8d\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u8868\u793a\u3057\u307e\u305b\u3093\u3002\u8aa4\u64cd\u4f5c\u306b\u3088\u308a\u60c5\u5831\u304c\u5931\u308f\u308c\u308b\u6050\u308c\u304c\u3042\u308a\u307e\u3059\u3002
+OptionPanel.disable_cursor_move_paper = \u30de\u30c3\u30d7\u30b9\u30af\u30ed\u30fc\u30eb\u6642\u306b\u30de\u30a6\u30b9\u30ab\u30fc\u30bd\u30eb\u3092\u96a0\u3059
+OptionPanel.disable_cursor_move_paper.tooltip = \u30de\u30c3\u30d7\u30b9\u30af\u30ed\u30fc\u30eb\u6642\u306b\u300c\u79fb\u52d5\u300d\u30ab\u30fc\u30bd\u30eb\u3092\u8868\u793a\u3057\u307e\u305b\u3093\u3002
+OptionPanel.display_inline_editor_for_all_new_nodes = <html>\u3059\u3079\u3066\u306e\u65b0\u898f\u30ce\u30fc\u30c9\u306b\u3000\u3000\u3000<br>\u3000\u30a4\u30f3\u30e9\u30a4\u30f3\u30a8\u30c7\u30a3\u30bf\u3092\u8868\u793a</html>
+OptionPanel.display_node_id = \u30ce\u30fc\u30c9 ID \u3092\u8868\u793a
+OptionPanel.edgecolor = \u7dda\u306e\u8272
+OptionPanel.edgecolor.tooltip = \u89aa\u30ce\u30fc\u30c9\u306b\u3064\u306a\u304c\u308b\u7dda\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 (\u3059\u3079\u3066\u306e\u5b50\u30ce\u30fc\u30c9\u306b\u9069\u7528\u3055\u308c\u307e\u3059)
+OptionPanel.edgestyle = \u7dda\u306e\u5f62\u72b6
+OptionPanel.edgestyle.tooltip = \u89aa\u30ce\u30fc\u30c9\u306b\u3064\u306a\u304c\u308b\u7dda\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 (\u3059\u3079\u3066\u306e\u5b50\u30ce\u30fc\u30c9\u306b\u9069\u7528\u3055\u308c\u307e\u3059)
+OptionPanel.edgewidth = \u7dda\u306e\u592a\u3055
+OptionPanel.edgewidth.tooltip = \u89aa\u30ce\u30fc\u30c9\u306b\u3064\u306a\u304c\u308b\u7dda\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 (\u3059\u3079\u3066\u306e\u5b50\u30ce\u30fc\u30c9\u306b\u9069\u7528\u3055\u308c\u307e\u3059)\u3002
+OptionPanel.EDIT_CURRENT = \u5185\u5bb9\u3092\u4e0a\u66f8\u304d
+OptionPanel.edit_on_double_click = \u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067\u7de8\u96c6
+OptionPanel.editor_extra_width = \u5165\u529b\u6b04\u306e\u8ffd\u52a0\u5e45(\u30d4\u30af\u30bb\u30eb)
+OptionPanel.editor_extra_width.tooltip = \u30c6\u30ad\u30b9\u30c8\u304c\u73fe\u5728\u306e\u30ce\u30fc\u30c9\u5e45\u4ee5\u4e0a\u306b\u306a\u3063\u305f\u5834\u5408\u306b\u3001\u62e1\u5927\u3059\u308b\u5e45\u306e\u30d4\u30af\u30bb\u30eb\u6570\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002
+OptionPanel.el = \u30ae\u30ea\u30b7\u30e3\u8a9e\uff0f\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__buttons_above = \u30dc\u30bf\u30f3\u3092\u4e0a\u65b9\u306b\u8868\u793a
+OptionPanel.el__enter_confirms_by_default = Enter \u3067\u78ba\u5b9a
+OptionPanel.el__max_default_window_height = \u6a19\u6e96\u306e\u6700\u5927\u7e26\u5e45(\u30d4\u30af\u30bb\u30eb)
+OptionPanel.el__max_default_window_width = \u6a19\u6e96\u306e\u6700\u5927\u6a2a\u5e45(\u30d4\u30af\u30bb\u30eb)
+OptionPanel.el__min_default_window_height = \u6a19\u6e96\u306e\u6700\u5c0f\u7e26\u5e45(\u30d4\u30af\u30bb\u30eb)
+OptionPanel.el__min_default_window_width = \u6a19\u6e96\u306e\u6700\u5c0f\u6a2a\u5e45(\u30d4\u30af\u30bb\u30eb)
+OptionPanel.el__position_window_below_node = \u30a6\u30a4\u30f3\u30c9\u30a6\u3092\u30ce\u30fc\u30c9\u306e\u4e0b\u306b\u8868\u793a
+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.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>
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>Groovy \u30b9\u30af\u30ea\u30d7\u30c8\u3067\u4ed6\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\uff08\u4f8b\u3048\u3070\u30d6\u30e9\u30a6\u30b6\uff09\u3092\u78ba\u8a8d\u306a\u3057\u3067\u4f5c\u52d5\u3055\u305b\u308b\u5fc5<br>\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30f3\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5834\u5408\u3001\u60aa\u8cea\u306a\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u3088<br>\u308a\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u304c\u88ab\u5bb3\u3092\u53d7\u3051\u308b\u6050\u308c\u3082\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4f7f\u7528\u306f\u614e\u91cd\u306b\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002</body></html>
+OptionPanel.execute_scripts_without_file_restriction = <html>\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u64cd\u4f5c\u3092\u8a31\u53ef<br>\uff08\u63a8\u5968\u3057\u307e\u305b\u3093\uff09</html>
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>Groovy \u30b9\u30af\u30ea\u30d7\u30c8\u3067\u3001\u4e00\u5b9a\u306e\u30d5\u30a1\u30a4\u30eb\u95a2\u9023\u52d5\u4f5c\uff08\u958b\u304f\u3001\u9589\u3058\u308b\u3001\u8aad\u307f\u8fbc\u3080\u3001\u66f8\u304d\u51fa\u3059\u3001\u524a<br>\u9664\u3059\u308b\uff09\u3092\u884c\u3046\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5834\u5408\u3001\u60aa\u8cea<br>\u306a\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u3088\u3063\u3066\u3001\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306b\u88ab\u5bb3\u3092\u53d7\u3051\u308b\u6050\u308c\u3082\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4f7f\u7528\u306f\u614e\u91cd\u306b<br>\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002</body></html>
+OptionPanel.execute_scripts_without_network_restriction = <html>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u64cd\u4f5c\u3092\u8a31\u53ef<br>\uff08\u63a8\u5968\u3057\u307e\u305b\u3093\uff09 </html>
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>Groovy \u30b9\u30af\u30ea\u30d7\u30c8\u3067\u3001\u7279\u5b9a\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u95a2\u9023\u52d5\u4f5c\u3092\u884c\u3046\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7<br>\u30b7\u30e7\u30f3\u306b\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5834\u5408\u3001\u60aa\u8cea\u306a\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u3088\u3063\u3066\u79d8\u5bc6\u60c5\u5831\u304c\u66b4\u9732\u3055<br>\u308c\u308b\u6050\u308c\u304c\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4f7f\u7528\u306f\u614e\u91cd\u306b\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002</body></html>
+OptionPanel.execute_scripts_without_write_restriction = <html>\u30d5\u30a1\u30a4\u30eb\u306e\u66f8\u304d\u8fbc\u307f\u64cd\u4f5c\u3092\u8a31\u53ef<br>\uff08\u63a8\u5968\u3057\u307e\u305b\u3093\uff09</html>
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>\u4f5c\u6210\u3057\u305f Groovy \u30b9\u30af\u30ea\u30d7\u30c8\u3067\u30d5\u30a1\u30a4\u30eb\u3078\u306e\u66f8\u8fbc\u307f\u30a2\u30af\u30bb\u30b9\uff08\u66f8\u8fbc\u307f\u3001\u524a\u9664(!)\uff09\u3092\u884c\u3046\u3053\u3068\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001<br>\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u304a\u304b\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002<br>\u3057\u304b\u3057\u3001\u60aa\u610f\u306e\u3042\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u3088\u3063\u3066\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u304c\u88ab\u5bb3\u3092\u53d7\u3051\u308b\u6050\u308c\u3082\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4f7f\u7528\u306b\u5f53\u305f\u3063\u3066\u306f\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002</body></html>
+OptionPanel.experimental_file_locking_on = <html>\u4ed6\u8005\u3068\u540c\u6642\u7de8\u96c6\u6642\u306f\u30d5\u30a1\u30a4\u30eb\u3092<br>\u8aad\u307f\u8fbc\u307f\u5c02\u7528\u306b</html>
+OptionPanel.experimental_file_locking_on.tooltip = <html>\u30d5\u30a1\u30a4\u30eb\u30ed\u30c3\u30af\u306f\u3001\u8907\u6570\u306e\u30e6\u30fc\u30b6\u304c\u8aa4\u3063\u3066\u304a\u4e92\u3044\u306e\u60c5\u5831\u3092\u91cd\u8907\u66f8\u304d\u8fbc\u307f\u3057\u306a\u3044\u3088\u3046\u306b\u3001\u540c<br>\u6642\u306b\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3067\u304d\u306a\u304f\u3059\u308b\u3082\u306e\u3067\u3059\u3002\uff3b\u8a33\u8005\u6ce8\uff3d</html>
+OptionPanel.export_icons_in_html = \u30a2\u30a4\u30b3\u30f3\u3082\u66f8\u304d\u51fa\u3059
+OptionPanel.export_icons_in_html.tooltip = <html>Freeplane \u304b\u3089\u66f8\u304d\u51fa\u3059 HTML \u30d5\u30a1\u30a4\u30eb\u306b\u3001\u30a2\u30a4\u30b3\u30f3\u3092\u542b\u3081\u308b\u3069\u3046\u304b\u6307\u5b9a\u3057\u307e\u3059\u3002\u66f8\u304d\u51fa<br>\u3055\u308c\u305f HTML \u5185\u306b\u30a2\u30a4\u30b3\u30f3\u3078\u306e\u30ea\u30f3\u30af\u304c\u306a\u3044\u3068\u3044\u3046\u30c8\u30e9\u30d6\u30eb\u304c\u3057\u3070\u3057\u3070\u8d77\u3053\u308a\u307e\u3059\u3002</html>
+OptionPanel.Files = \u30d5\u30a1\u30a4\u30eb
+OptionPanel.first = \u5192\u982d
+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
+OptionPanel.fork = \u30d5\u30a9\u30fc\u30af
+OptionPanel.format_locale = \u66f8\u5f0f\u306e\u30ed\u30b1\u30fc\u30eb
+OptionPanel.format_locale.tooltip = \u66f8\u5f0f\u8a2d\u5b9a\u3068\u30c7\u30fc\u30bf\u89e3\u6790\u306b\u7528\u3044\u308b\u5730\u57df\u8a00\u8a9e\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002
+OptionPanel.formula_disable_caching = \u8a08\u7b97\u5f0f\u306e\u5b9f\u884c\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u7121\u52b9\u306b
+OptionPanel.formula_disable_plugin = \u8a08\u7b97\u5f0f\u306e\u5b9f\u884c\u3092\u7121\u52b9\u306b
+OptionPanel.fr = \u30d5\u30e9\u30f3\u30b9\u8a9e\uff0fFran\u00e7ais
+OptionPanel.gl = \u30b0\u30eb\u30b8\u30a2\u8a9e\uff0fGalego
+OptionPanel.goto_note_end_on_edit = \u30ce\u30fc\u30c8\u30d1\u30cd\u30eb\u306e\u30ab\u30fc\u30bd\u30eb\u3092\u672b\u5c3e\u306b\u79fb\u52d5
+OptionPanel.grid_size = \uff08\u30ce\u30fc\u30c9\u4f4d\u7f6e\u79fb\u52d5\u6642\u306e\uff09\u30b0\u30ea\u30c3\u30c9\u306e\u9593\u9694
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = \u7dda\u3092\u96a0\u3059
+OptionPanel.highlight_formulas = \u8a08\u7b97\u5f0f\u30ce\u30fc\u30c9\u3092\u67a0\u56f2\u3044\u8868\u793a
+OptionPanel.horizontal = \u76f4\u89d2\u66f2\u304c\u308a
+OptionPanel.hr = \u30af\u30ed\u30a2\u30c1\u30a2\u8a9e\uff0fhrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = \u968e\u5c64\u3092\u898b\u51fa\u3057\u306b\u3059\u308b
+OptionPanel.html_export_fold_all = \u3059\u3079\u3066\u6298\u308a\u7573\u3093\u3067\u66f8\u304d\u51fa\u3059
+OptionPanel.html_export_fold_currently_folded = \u73fe\u72b6\u306e\u307e\u307e\u66f8\u304d\u51fa\u3059
+OptionPanel.html_export_folding = \u6298\u308a\u7573\u307f\u306e\u6271\u3044
+OptionPanel.html_export_no_folding = \u3059\u3079\u3066\u5c55\u958b\u3057\u3066\u66f8\u304d\u51fa\u3059
+OptionPanel.hu = \u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e\uff0fMagyar
+OptionPanel.ic_disable = \u4f5c\u6210\u3057\u306a\u3044
+OptionPanel.ic_file = \u30cf\u30fc\u30c9\u30c7\u30a3\u30b9\u30af\u306b\u4f5c\u6210
+OptionPanel.ic_ram = \u30e1\u30e2\u30ea\u306b\u4f5c\u6210
+OptionPanel.icon = \u30a2\u30a4\u30b3\u30f3
+OptionPanel.icon.tooltip = \u9069\u7528\u3059\u308b\u3068\u3001\u30ce\u30fc\u30c9\u306b\u3053\u306e\u30a2\u30a4\u30b3\u30f3\u304c\u4ed8\u304d\u307e\u3059\u3002
+OptionPanel.icons.list = \u6a19\u6e96\u7684\u306a\u8868\u793a\u30a2\u30a4\u30b3\u30f3\u4e00\u89a7
+OptionPanel.icons.list.tooltip = <html>\u3053\u3053\u3067\u6a19\u6e96\u306e\u30a2\u30a4\u30b3\u30f3\u306e\u9806\u5e8f\u3092\u5165\u308c\u66ff\u3048\u305f\u308a\u3001\u4f7f\u7528\u4e2d\u6b62\u306b\u3057\u305f\u308a\u3067\u304d\u307e\u3059\u3002\u30a2\u30a4\u30b3\u30f3\u306f '\uff1b'<br>\uff08\u30bb\u30df\u30b3\u30ed\u30f3\uff09\u3067\u5206\u3051\u3066\u304f\u3060\u3055\u3044\u3002</html>
+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.it = \u30a4\u30bf\u30ea\u30a2\u8a9e\uff0fItaliano
+OptionPanel.ja = \u65e5\u672c\u8a9e\uff0f\u65e5\u672c\u8a9e
+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)
+OptionPanel.label_font_family = \u30d5\u30a9\u30f3\u30c8\u540d
+OptionPanel.label_font_size = \u6587\u5b57\u30b5\u30a4\u30ba
+OptionPanel.language = \u8a00\u8a9e
+OptionPanel.language.tooltip = \u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u4f7f\u7528\u3059\u308b\u8a00\u8a9e\u3067\u3059\u3002\u300c\u81ea\u52d5\u9078\u629e\uff0fautomatic\u300d\u306f\u30e6\u30fc\u30b6\u304c\u73fe\u5728\u4f7f\u7528\u4e2d\u306e\u8a00\u8a9e\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002
+OptionPanel.last = \u672b\u5c3e
+OptionPanel.last_opened_list_length = \u6700\u8fd1\u4f7f\u3063\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u8868\u793a\u6570
+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
+OptionPanel.links = \u30ea\u30f3\u30af
+OptionPanel.links.tooltip = \u30ea\u30f3\u30af\u65b9\u5f0f\u3092\u76f8\u5bfe\u30a2\u30c9\u30ec\u30b9\u3067\u6307\u5b9a\u3059\u308b\u304b\u3001\u7d76\u5bfe\u30a2\u30c9\u30ec\u30b9\u3067\u6307\u5b9a\u3059\u308b\u304b\u3001\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OptionPanel.load_folding = \u8aad\u307f\u8fbc\u307f\u6642\u306e\u6298\u308a\u7573\u307f\u306e\u6271\u3044
+OptionPanel.load_folding_from_map_default_fold_all = \u3059\u3079\u3066\u306e\u30ce\u30fc\u30c9\u304c\u5c55\u958b\u72b6\u614b\u306a\u3089\u3001\u6298\u308a\u7573\u3080
+OptionPanel.load_folding_from_map_default_unfold_all = \u4fdd\u5b58\u6642\u306e\u72b6\u614b\u3067\u8aad\u307f\u8fbc\u3080
+OptionPanel.load_last_map = \u524d\u56de\u7d42\u4e86\u6642\u306e\u30de\u30c3\u30d7\u3092\u81ea\u52d5\u7684\u306b\u958b\u304f
+OptionPanel.load_last_map.tooltip = \u30c1\u30a7\u30c3\u30af\u3059\u308b\u3068\u3001Freeplane \u306e\u30b9\u30bf\u30fc\u30c8\u6642\u306b\u3001\u524d\u56de\u7d42\u4e86\u6642\u306e\u30de\u30c3\u30d7\u3092\u81ea\u52d5\u7684\u306b\u958b\u304d\u307e\u3059\u3002
+OptionPanel.load_last_maps = \u524d\u56de\u7d42\u4e86\u6642\u306e\u30de\u30c3\u30d7\u3092\u3059\u3079\u3066\u958b\u304f
+OptionPanel.lookandfeel = \u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb
+OptionPanel.lookandfeel.tooltip = <html>\u4f7f\u7528\u3059\u308b\u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002'metal' 'windows' 'motif' 'gtk'\u3092\u30b5\u30dd<br>\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002'mac' \u306f\u3001MacOS \u4e0a\u3067 \u3057\u304b\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f\u3001\u6a19\u6e96\u7684\u306a<br>\u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u72ec\u81ea\u306e\u30eb\u30c3\u30af\uff06\u30d5\u30a3\u30fc\u30eb\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001 \u3053\u3053\u306b\u30af\u30e9<br>\u30b9\u540d\u3092\u5165\u529b\u3057\u3001\u76f8\u5fdc\u306e jar \u30d5\u30a1\u30a4\u30eb\u304c\u8aad\u307f\u8fbc\u307e\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30eb\u30c3\u30af\uff06\u30d5<br>\u30a3\u30fc\u30eb\u306b\u554f\u984c\u304c\u8d77\u304d\u305f\u5834\u5408\u306f\u300c\u306a\u3057\u300d \u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u6307\u5b9a\u306f\u3001\u30a2\u30d7\u30ec\u30c3\u30c8\u306b\u3082\u9069\u7528<br>\u3055\u308c\u307e\u3059\u3002</html>
+OptionPanel.lt = \u30ea\u30c8\u30a2\u30cb\u30a2\u8a9e\uff0fkalba
+OptionPanel.max_displayed_node_count = \u30ce\u30fc\u30c9\u306e\u6700\u5927\u8868\u793a\u6570
+OptionPanel.max_image_width = \u65b0\u898f\u753b\u50cf\u306e\u6700\u5927\u8868\u793a\u5e45
+OptionPanel.max_image_width.tooltip = \u65b0\u898f\u753b\u50cf\u304c\u5927\u304d\u3044\u5834\u5408\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b\u6a2a\u5e45\u306b\u5408\u308f\u305b\u3066\u7e2e\u5c0f\u8868\u793a\u3057\u307e\u3059\u3002
+OptionPanel.max_menu_item_count = \u6700\u5927\u30e1\u30cb\u30e5\u30fc\u9805\u76ee\u6570
+OptionPanel.max_menu_item_count.tooltip = \u5404\u30b5\u30d6\u30e1\u30cb\u30e5\u30fc\u306b\u542b\u3081\u3089\u308c\u308b\u6a5f\u80fd\u9805\u76ee\u6570\u306e\u4e0a\u9650\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u6700\u5c0f\u5024\u306f10\u3067\u3059\u3002
+OptionPanel.max_node_width = \u30ce\u30fc\u30c9\u306e\u6700\u5927\u8868\u793a\u5e45
+OptionPanel.max_shortened_text_length = \u30c6\u30ad\u30b9\u30c8\u306e\u6700\u5927\u8868\u793a\u5e45
+OptionPanel.metal = Metal
+OptionPanel.min_node_width = \u30ce\u30fc\u30c9\u306e\u6700\u5c0f\u8868\u793a\u5e45
+OptionPanel.motif = Motif
+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
+OptionPanel.nn = \u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e (\u30cb\u30e5\u30fc\u30ce\u30eb\u30b9\u30af)\uff0fNorsk nynorsk
+OptionPanel.nodebackgroundcolor = \u80cc\u666f\u8272
+OptionPanel.nodebackgroundcolor.tooltip = \u975e\u9078\u629e\u6642\u306e\u30ce\u30fc\u30c9\u306e\u80cc\u666f\u8272\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
+OptionPanel.nodecolor = \u6587\u5b57\u8272
+OptionPanel.nodecolor.tooltip = \u975e\u9078\u629e\u6642\u306e\u30ce\u30fc\u30c9\u306e\u6587\u5b57\u8272\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
+OptionPanel.nodefontbold = \u592a\u5b57
+OptionPanel.nodefonthyperlink = \u30cf\u30a4\u30d1\u30fc\u30ea\u30f3\u30af
+OptionPanel.nodefontitalic = \u659c\u4f53
+OptionPanel.nodefontname = \u30d5\u30a9\u30f3\u30c8\u540d
+OptionPanel.nodefontsize = \u6587\u5b57\u30b5\u30a4\u30ba
+OptionPanel.nodeformat = \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\uff0f\u66f8\u5f0f
+OptionPanel.nodeformat.tooltip = <html>\u30c6\u30ad\u30b9\u30c8\u306e\u7f6e\u63db\u3068\u66f8\u5f0f\u6307\u5b9a\uff1a<ul><li><em>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5c55\u958b\u306e\u4f8b</em> (<tt>%s</tt> \u3092\u5143\u306e\u30c6\u30ad\u30b9\u30c8\u3068\u3059\u308b) - <tt>\u7559\u610f\u70b9: %s</tt><li><em>\u65e5\u4ed8\u3068\u6570\u5b57\u306e\u66f8\u5f0f</em> - \u9078\u629e\u30dc\u30c3\u30af\u30b9\u306e\u8a18\u8f09\u4f8b\u3092\u53c2\u7167</ul></html>
+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\u3044\u306e\u4ed8\u3044\u305f\u30ce\u30fc\u30c9\u3067\u3059\u3002</td></tr><tr><td> \u89aa\u3068\u540c\u3058 </td><td> \u89aa\u30ce\u30fc\u30c9\u306e\u5f62\u3092\u5f15\u304d\u7d99\u304e\u307e\u3059\u3002<br>\u30eb\u30fc\u30c8\u30ce\u30fc\u30c9\u306e\u5834\u5408\u306f\u3001\u6a19\u6e96\u7684\u306a\u30eb\u30fc\u30c8\u30ce\u30fc\u30c9\u306e\u5f62\u3068\u306a\u308a\u307e\u3059\u3002</td></tr><tr><td> \u8907\u5408 </td><td> \u30ce\u30fc\u30c9\u304c\u6298\u308a\u7573\u307e\u308c\u3066\u3044\u308b\u5834\u5408\u306f\uff62\u56f2\u307f\uff63\u3001\u305d\u306e\u4ed6\u306e\u5834\u5408\u306f\uff62\u30d5\u30a9\u30fc\u30af\uff63\u306e\u5f62\u3068\u306a\u308a\u307e\u3059\u3002</td></tr></table></html>
+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
+OptionPanel.number_format = \u6570\u5024\u306e\u6a19\u6e96\u66f8\u5f0f
+OptionPanel.number_format.tooltip = <html>'#' \u3067\u6307\u5b9a\u3055\u308c\u305f\u6841\u306f\u8a72\u5f53\u6570\u5024\u306e\u6709\u7121\u306b\u5fdc\u3058\u3066\u8868\u793a\uff0f\u975e\u8868\u793a\u3001'0' \u306e\u6841\u306f\u5f37\u5236\u8868\u793a\u3068\u306a\u308a\u307e\u3059\u3002<br>\u3000\u3000\u4e8b\u4f8b\uff1a"0.00"\u3001"0.0%"\u3001"$#.00"\u3001"#0"</html>
+OptionPanel.number_of_different_files_for_automatic_save = \u30d5\u30a1\u30a4\u30eb\u3054\u3068\u306e\u81ea\u52d5\u4fdd\u5b58\u4ef6\u6570
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html>\u30de\u30c3\u30d7\u6bce\u306e\u81ea\u52d5\u4fdd\u5b58\u30d5\u30a1\u30a4\u30eb\u6570\uff08n\uff09\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u6700\u521d\u306e\u81ea\u52d5\u4fdd\u5b58\u6642\u306b\u306f \u300c1\u300d\u306e\u756a\u53f7<br>\u4ed8\u304d\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u540c\u69d8\u306e\u5f62\u3067\u4fdd\u5b58\u3057\u3066\u3044\u304d\u3001\u300cn + 1\u300d\u56de\u76ee\u306e\u4fdd\u5b58\u3067\u306f\u3001\u518d\u3073<br>\u300c1\u300d\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002\uff08\u5faa\u74b0\u5f0f\uff09
+OptionPanel.OK = \u4fdd\u5b58
+OptionPanel.org.freeplane.plugin.bugreport = \u57fa\u672c\u7684\u306a\u5bfe\u5fdc\u65b9\u91dd
+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.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.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
+OptionPanel.patternname = \u540d\u524d
+OptionPanel.patternname.tooltip = \u56fa\u6709\u306e\u30d1\u30bf\u30fc\u30f3\u540d
+OptionPanel.pl = \u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e\uff0fpolski
+OptionPanel.placenewbranches = \u65b0\u898f\u30ce\u30fc\u30c9\u306e\u914d\u7f6e
+OptionPanel.placenewbranches.tooltip = \u65b0\u898f\u306e\u679d\u306f\u3069\u3053\u306b\u4f5c\u308a\u307e\u3059\u304b\uff1f\u3000\u6709\u52b9\u5024\u306f\u300c\u5192\u982d\u300d\u304b\u300c\u672b\u5c3e\u300d\u3067\u3059\u3002
+OptionPanel.plugin.tooltip = \u30aa\u30d7\u30b7\u30e7\u30f3\u7684\u306a\u30d7\u30e9\u30b0\u30a4\u30f3\u3067\u3059\u3002
+OptionPanel.plugins = \u30d7\u30e9\u30b0\u30a4\u30f3
+OptionPanel.presentation_dimmer_transparency = \u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u30e2\u30fc\u30c9\u306e\u900f\u904e\u5ea6
+OptionPanel.presentation_mode = \u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u30e2\u30fc\u30c9
+OptionPanel.printonwhitebackground = \u80cc\u666f\u3092\u767d\u5730\u3067\u5370\u5237
+OptionPanel.printonwhitebackground.tooltip = \u80cc\u666f\u3092\u5e38\u306b\u767d\u5730\u3067\u5370\u5237\u3057\u307e\u3059\u3002
+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.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\u307e\u3059\u3002</html>
+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.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
+OptionPanel.resources_use_margin_top_zero_for_notes = \u30ce\u30fc\u30c8\u306e\u4e0a\u90e8\u4f59\u767d\u3092\u524a\u9664
+OptionPanel.revision_color = \u66f4\u65b0\u30ce\u30fc\u30c9\u306e\u80cc\u666f
+OptionPanel.revision_color.tooltip = \u66f4\u65b0\u3055\u308c\u305f\u30ce\u30fc\u30c9\u306e\u80cc\u666f\u8272\u3002
+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_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\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\u30ec\u30af\u30c8\u30ea\u306f\u3001JARs \u53ca\u3073 .class \u30d5\u30a1\u30a4\u30eb \u306e\u30b9\u30ad\u30e3\u30f3\u5bfe\u8c61\u3068\u306a\u308a\u307e\u3059\u3002<br>\u7d76\u5bfe\u6307\u5b9a\u3067\u306a\u3044\u30d1\u30b9\u306f\u3001Freeplane \u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u57fa\u6e96\u3068\u3059\u308b\u76f8\u5bfe\u6307\u5b9a\u3068\u307f\u306a\u3055\u308c\u307e\u3059\u3002<br>\u30af\u30e9\u30b9\u30d1\u30b9\u3092\u6307\u5b9a\u3059\u308b\u5834\u5408\u306f\u3001\u4f75\u305b\u3066\u8aad\u307f\u8fbc\u307f\u30a2\u30af\u30bb\u30b9\u306e\u8a31\u53ef\u3092\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002</html>
+OptionPanel.script_directories = <html>\u30b9\u30af\u30ea\u30d7\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<br>\uff08\u30c4\u30fc\u30eb\u30c1\u30c3\u30d7\u3092\u53c2\u7167\uff09<html>
+OptionPanel.script_directories.tooltip = <html>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\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>\u7d76\u5bfe\u6307\u5b9a\u3067\u306a\u3044\u30d1\u30b9\u306f\u3001Freeplane \u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u57fa\u6e96\u3068\u3059\u308b\u76f8\u5bfe\u6307\u5b9a\u3068\u307f\u306a\u3055\u308c\u307e\u3059\u3002</html>
+OptionPanel.script_user_key_name_for_signing = \u7f72\u540d\u7528\u30e6\u30fc\u30b6\u30ad\u30fc\u30a8\u30a4\u30ea\u30a2\u30b9
+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\u3066\u3044\u307e\u3059\u3002\u30ad\u30fc\u306e\u306a<br>\u304b\u3067\u3082\u7279\u306b\u6a5f\u5bc6\u6027\u304c\u9ad8\u3044\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u3001\u30ad\u30fc\u96c6\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\uff08\u3053\u308c\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u30fb\u30ad\u30fc\u96c6<br>\u3068\u306a\u308b\uff09\u3068\u540c\u3058\u3082\u306e\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002</html>
+OptionPanel.scrollbar_increment = \u901f\u5ea6
+OptionPanel.scrolling_speed = \u81ea\u52d5\u30de\u30c3\u30d7\u30b9\u30af\u30ed\u30fc\u30eb\u901f\u5ea6
+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<br>\u3067\u304d\u307e\u305b\u3093\u3002</html>
+OptionPanel.selection_method_by_click = \u30af\u30ea\u30c3\u30af\u3067\u9078\u629e
+OptionPanel.selection_method_delayed = \u30de\u30a6\u30b9\u30aa\u30fc\u30d0\u30fc\u5f8c\u3001\u9593\u3092\u7f6e\u3044\u3066\u81ea\u52d5\u9078\u629e
+OptionPanel.selection_method_direct = \u30de\u30a6\u30b9\u30aa\u30fc\u30d0\u30fc\u3067\u76f4\u3061\u306b\u9078\u629e
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u30d1\u30bf\u30fc\u30f3
+OptionPanel.separator.anti_alias = \u30a2\u30f3\u30c1\u30a8\u30a4\u30ea\u30a2\u30b9
+OptionPanel.separator.attributes = \u5c5e\u6027
+OptionPanel.separator.automatic_save = \u81ea\u52d5\u4fdd\u5b58
+OptionPanel.separator.behaviour = \u57fa\u672c\u52d5\u4f5c
+OptionPanel.separator.browser = OS \u5225\u306e\u6a19\u6e96\u30d6\u30e9\u30a6\u30b6\u8d77\u52d5\u30b3\u30de\u30f3\u30c9
+OptionPanel.separator.cache = \u30ad\u30e3\u30c3\u30b7\u30e5
+OptionPanel.separator.CloudControls = \u96f2
+OptionPanel.separator.commands_for_the_program = \u30d7\u30ed\u30b0\u30e9\u30e0\u30b3\u30de\u30f3\u30c9
+OptionPanel.separator.connectors = \u30b3\u30cd\u30af\u30bf
+OptionPanel.separator.data_formats = \u30c7\u30fc\u30bf\u66f8\u5f0f\u306e\u8a2d\u5b9a\u3068\u89e3\u6790
+OptionPanel.separator.default_colors = \u6a19\u6e96\u8272
+OptionPanel.separator.default_fonts = \u6a19\u6e96\u30d5\u30a9\u30f3\u30c8
+OptionPanel.separator.default_styles = \u6a19\u6e96\u30b9\u30bf\u30a4\u30eb
+OptionPanel.separator.EdgeControls = \u7dda
+OptionPanel.separator.edit_long_node_window = \u9577\u6587\u7de8\u96c6\u30a6\u30a4\u30f3\u30c9\u30a6
+OptionPanel.separator.editing = \u30a8\u30c7\u30a3\u30bf\u306e\u8a2d\u5b9a
+OptionPanel.separator.files = \u30d5\u30a1\u30a4\u30eb
+OptionPanel.separator.formula = \u8a08\u7b97\u5f0f\u30d7\u30e9\u30b0\u30a4\u30f3
+OptionPanel.separator.General = \u5168\u822c
+OptionPanel.separator.html_export = HTML \u3078\u306e\u66f8\u304d\u51fa\u3057
+OptionPanel.separator.html_import = HTML \u304b\u3089\u306e\u30a4\u30f3\u30dd\u30fc\u30c8
+OptionPanel.separator.hyperlink_types = \u30cf\u30a4\u30d1\u30fc\u30ea\u30f3\u30af\u306e\u7a2e\u985e
+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.key_typing = \u9078\u629e\u30ce\u30fc\u30c9\u3067\u306e\u30ad\u30fc\u5165\u529b
+OptionPanel.separator.language = \u8a00\u8a9e
+OptionPanel.separator.load = \u8aad\u307f\u8fbc\u307f
+OptionPanel.separator.look_and_feel = \u5168\u4f53\u30a4\u30e1\u30fc\u30b8
+OptionPanel.separator.mouse_wheel = \u30de\u30a6\u30b9\u30db\u30a4\u30fc\u30eb
+OptionPanel.separator.new_node_commands = \u65b0\u898f\u30ce\u30fc\u30c9\u4f5c\u6210
+OptionPanel.separator.node_editing_commands = \u30ce\u30fc\u30c9\u7de8\u96c6\u30b3\u30de\u30f3\u30c9
+OptionPanel.separator.node_navigation_commands = \u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30b3\u30de\u30f3\u30c9
+OptionPanel.separator.NodeColors = \u30ce\u30fc\u30c9\u30b3\u30a2\u5168\u4f53\u306e\u8272
+OptionPanel.separator.NodeFont = \u30ce\u30fc\u30c9\u30b3\u30a2\u5168\u4f53\u306e\u30d5\u30a9\u30f3\u30c8
+OptionPanel.separator.NodeShape = \u30ce\u30fc\u30c9\u306e\u5f62
+OptionPanel.separator.NodeStyle = \u30ce\u30fc\u30c9\u306e\u30b9\u30bf\u30a4\u30eb
+OptionPanel.separator.NodeText = \u30ce\u30fc\u30c9\u30b3\u30a2\u306e\u30c6\u30ad\u30b9\u30c8
+OptionPanel.separator.notifications = \u78ba\u8a8d
+OptionPanel.separator.org.freeplane.plugin.bugreport = \u81ea\u52d5\u30d0\u30b0\u30ec\u30dd\u30fc\u30c8
+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.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
+OptionPanel.separator.scripting = \u30b9\u30af\u30ea\u30d7\u30c8
+OptionPanel.separator.scrollbar = \u30b9\u30af\u30ed\u30fc\u30eb\u30d0\u30fc
+OptionPanel.separator.search = \u691c\u7d22
+OptionPanel.separator.selection_colors = \u9078\u629e\u30ce\u30fc\u30c9\u306e\u8272\u7b49
+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.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
+OptionPanel.separator.updates = \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u66f4\u65b0
+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.sharp_bezier = \u5148\u7d30\u30d9\u30b8\u30a7\u66f2\u7dda
+OptionPanel.sharp_linear = \u5148\u7d30\u76f4\u7dda
+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
+OptionPanel.show_styles_in_tooltip = \u30ce\u30fc\u30c9\u30b9\u30bf\u30a4\u30eb\u3092\u30c4\u30fc\u30eb\u30c1\u30c3\u30d7\u8868\u793a
+OptionPanel.signed_script_are_trusted = \u7f72\u540d\u4ed8\u304d\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4fe1\u983c\uff08\u63a8\u5968\uff09
+OptionPanel.signed_script_are_trusted.tooltip = <html>\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u4fe1\u983c\u3067\u304d\u308b\u95a2\u4fc2\u8005\uff08\u4f8b\u3048\u3070\u3001Freeplane \u306e\u4f5c\u8005\u3084\u81ea\u5206\u81ea\u8eab\uff09\u306e\u7f72\u540d\u304c\u3042\u308b\u5834<br>\u5408\u3001\u5236\u9650\u306a\u304f\u5b9f\u884c\u3057\u307e\u3059\u3002</html>
+OptionPanel.simplyhtml.default_paste_mode = \u6a19\u6e96\u306e\u8cbc\u308a\u4ed8\u3051\u5f62\u5f0f
+OptionPanel.single_backup_directory = <html>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u306e\u683c\u7d0d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092<br>\u4e00\u3064\u306b</html>
+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_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.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.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
+OptionPanel.standardbackgroundcolor.tooltip = \u6a19\u6e96\u7684\u306a\u30ce\u30fc\u30c9\u306e\u80cc\u666f\u8272\u3002HTML\u8868\u8a18\u6cd5(16\u9032\u6570\u306e #RRGGBB )\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OptionPanel.standardcloudcolor = \u96f2\u3000\u3000
+OptionPanel.standardcloudcolor.tooltip = \u6a19\u6e96\u7684\u306a\u96f2\u306e\u8272\u3002HTML\u8868\u8a18\u6cd5(16\u9032\u6570\u306e #RRGGBB )\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OptionPanel.standardcloudestyle = \u96f2\u306e\u5f62
+OptionPanel.standardcloudestyle.tooltip = \u6a19\u6e96\u7684\u306a\u96f2\u306e\u5f62
+OptionPanel.standarddrawrectangleforselection = \u9078\u629e\u30ce\u30fc\u30c9\u3092\u67a0\u56f2\u3044\u8868\u793a
+OptionPanel.standarddrawrectangleforselection.tooltip = \u9078\u629e\u30ce\u30fc\u30c9\u3092\u67a0\u3067\u56f2\u307f\u307e\u3059\u3002
+OptionPanel.standardlinkcolor = \u6a19\u6e96\u8272
+OptionPanel.standardlinkcolor.tooltip = \u30b3\u30cd\u30af\u30bf\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.standardlinkestyle = \u30b3\u30cd\u30af\u30bf\u306e\u5f62
+OptionPanel.standardlinkestyle.tooltip = \u30b3\u30cd\u30af\u30bf\u306e\u6a19\u6e96\u7684\u306a\u5f62\u3002\u73fe\u5728\u306f\u300c\u30d9\u30b8\u30a7\u66f2\u7dda\u300d \u3057\u304b\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+OptionPanel.standardselectednodecolor = \u80cc\u666f\u8272
+OptionPanel.standardselectednodecolor.tooltip = \u9078\u629e\u30ce\u30fc\u30c9\u306e\u6a19\u6e96\u7684\u306a\u80cc\u666f\u8272\u3002HTML\u8868\u8a18\u6cd5(16\u9032\u6570\u306e #RRGGBB )\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+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.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.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\u3060\u3055\u3044\u3002</html>
+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_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.reshowDelay = \u8868\u793a\u3092\u518d\u958b\u3059\u308b\u307e\u3067\u306e\u6642\u9593(\u30df\u30ea\u79d2)
+OptionPanel.tr = \u30c8\u30eb\u30b3\u8a9e\uff0fT\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+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.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
+OptionPanel.use_tabbed_pane.tooltip = \u8aad\u307f\u8fbc\u307e\u308c\u305f\u30de\u30c3\u30d7\u3092(FireFox \u306e\u3088\u3046\u306b)\u30bf\u30d6\u3067\u8868\u793a\u3067\u304d\u307e\u3059\u3002
+OptionPanel.user_defined_screen_resolution = \u30e6\u30fc\u30b6\u5b9a\u7fa9\u753b\u9762\u89e3\u50cf\u5ea6(dpi)
+OptionPanel.validate_classpath_needs_readaccess = \u30b9\u30af\u30ea\u30d7\u30c8\uff1a\u30af\u30e9\u30b9\u30d1\u30b9\u3092\u8a2d\u5b9a\u3059\u308b\u5834\u5408\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u3078\u306e\u8aad\u307f\u8fbc\u307f\u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+OptionPanel.validate_invalid_date_format = \u65e5\u4ed8\u306e\u6a19\u6e96\u66f8\u5f0f\u304c\u7121\u52b9
+OptionPanel.validate_invalid_datetime_format = \u6642\u523b\u4ed8\u304d\u65e5\u4ed8\u306e\u6a19\u6e96\u66f8\u5f0f\u304c\u7121\u52b9
+OptionPanel.validate_invalid_number_format = \u6570\u5024\u306e\u6a19\u6e96\u66f8\u5f0f\u304c\u7121\u52b9
+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.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.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
+org.freeplane.plugin.bugreport.agree = \u9001\u4fe1
+org.freeplane.plugin.bugreport.always_agree = \u5e38\u306b\u9001\u4fe1
+org.freeplane.plugin.bugreport.always_deny = \u5e38\u306b\u9001\u4fe1\u3057\u306a\u3044
+org.freeplane.plugin.bugreport.deny = \u9001\u4fe1\u3057\u306a\u3044
+org.freeplane.plugin.bugreport.dialog.title = \u81ea\u52d5\u30d0\u30b0\u30ec\u30dd\u30fc\u30c8
+org.freeplane.plugin.bugreport.freeplane_team = Freeplane \u958b\u767a\u30c1\u30fc\u30e0\u304b\u3089\u306e\u304a\u77e5\u3089\u305b
+org.freeplane.plugin.bugreport.lastreport = \u3044\u305f\u3060\u3044\u305f\u5831\u544a\u306e\u5185\u5bb9
+org.freeplane.plugin.bugreport.never = \u3053\u3053\u3067\u3001\u52a9\u8a00\u306e\u8981\u8acb\u306f\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002
+org.freeplane.plugin.bugreport.question = <html>Freeplane \u306b\u306f\u81ea\u52d5\u30d0\u30b0\u30ec\u30dd\u30fc\u30c8\u6a5f\u80fd\u304c\u3042\u308a\u307e\u3059\u3002<br>\u500b\u4eba\u60c5\u5831\u3084\u30de\u30c3\u30d7\u306e\u5185\u5bb9\u306f\u9001\u4fe1\u3057\u307e\u305b\u3093\u3002<br>\u30d0\u30b0\u30ec\u30dd\u30fc\u30c8\u306f\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u6539\u5584\u306e\u52a9\u3051\u306b\u306a\u308a\u307e\u3059\u3002</html>
+org.freeplane.plugin.bugreport.report = \u4eca\u56de\u306f\u9001\u4fe1
+org.freeplane.plugin.bugreport.wanted_bug = <html>\u5185\u90e8\u51e6\u7406\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30a8\u30e9\u30fc\u306f\u3001\u81ea\u52d5\u7684\u306b\u5831\u544a\u3055\u308c\u307e\u3057\u305f\u3002<br>\u60f3\u5b9a\u5916\u306e\u52d5\u4f5c\u3092\u518d\u73fe\u3059\u308b\u305f\u3081\u306b\u3001\u3088\u308a\u591a\u304f\u306e\u60c5\u5831\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br>\u79c1\u305f\u3061\u304c\u904b\u55b6\u3059\u308b Mantis bug tracker \u306b\u30d0\u30b0\u5831\u544a\u3057\u3066\u3044\u305f\u3060\u304f\u3053\u3068\u304c\u3001\u652f\u63f4\u3068\u306a\u308a\u307e\u3059\u3002<br>\u30d0\u30b0\u3092\u518d\u73fe\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u554f\u984c\u52d5\u4f5c\u767a\u751f\u6642\u306b\u884c\u3063\u3066\u3044\u305f\u3053\u3068\u3092\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br><br>\u300cOK\u300d\u3092\u62bc\u3059\u3068\u3001\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u4e0a\u306b Mantis bug tracker \u306e\u30da\u30fc\u30b8\u304c\u958b\u304d\u307e\u3059\u3002<br><br>\u30d0\u30b0\u30d5\u30a3\u30c3\u30af\u30b9\u306b\u3054\u5354\u529b\u3044\u305f\u3060\u304d\u3001\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059\u3002<br>Freeplane \u958b\u767a\u30c1\u30fc\u30e0\u4e00\u540c</html>
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = \u30ce\u30fc\u30c9 {0} \u306f\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+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)
+PatternNewNameProperty = \u65b0\u898f\u30d1\u30bf\u30fc\u30f3
+PatternToString.backgroundColor = \u80cc\u666f\u8272
+PatternToString.Child = \u5b50\u30ce\u30fc\u30c9\u306e\u30b9\u30bf\u30a4\u30eb
+PatternToString.color = \u8272
+PatternToString.EdgeColor = \u7dda\u306e\u8272
+PatternToString.EdgeStyle = \u7dda\u306e\u5f62\u72b6
+PatternToString.EdgeWidth = \u7dda\u306e\u592a\u3055
+PatternToString.FontBold = \u592a\u5b57
+PatternToString.FontItalic = \u659c\u4f53
+PatternToString.FontName = \u30d5\u30a9\u30f3\u30c8\u540d
+PatternToString.Icon = \u30a2\u30a4\u30b3\u30f3
+PatternToString.NodeFontSize = \u6587\u5b57\u30b5\u30a4\u30ba
+periodic_formula = {0} * n + {1} \u968e\u5c64
+PeriodUnit.DAY = \u65e5
+PeriodUnit.HOUR = \u6642\u9593
+PeriodUnit.MINUTE = \u5206
+PeriodUnit.MONTH = \u304b\u6708
+PeriodUnit.WEEK = \u9031\u9593
+PeriodUnit.YEAR = \u5e74
+plugins/latex/LatexNodeHook.editorTitle = Latex \u30a8\u30c7\u30a3\u30bf\uff08\u9589\u3058\u308b\u3068\u78ba\u5b9a\uff09
+plugins/script_filter = \u30b9\u30af\u30ea\u30d7\u30c8\u30d5\u30a3\u30eb\u30bf {0}
+plugins/script_filter_error = {1} \u306e\u5834\u5408\u3001{0} \u306e\u8fd4\u5024\u306f\u771f\u507d\u5024\u3067\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u306e\u306b\u3001{2} \u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002
+plugins/ScriptEditor.cancel = \u5909\u66f4\u3092\u4fdd\u5b58\u3057\u306a\u3044\u3067\u7d42\u4e86(&D)
+plugins/ScriptEditor.exit = \u4fdd\u5b58\u3057\u3066\u7d42\u4e86(&S)
+plugins/ScriptEditor.FORBIDDEN_ACTION = <html>Freeplane \u306e groovy \u30b9\u30af\u30ea\u30d7\u30c8\u306f\u6a5f\u80fd\u5236\u9650\u4ed8\u304d\u3067\u3059\u3002<br>{0,choice,0#File|1#Network|2#Exec}\u306b\u7d9a\u304f\u4e0b\u8a18\u306e\u52d5\u4f5c\u306f\u7981\u6b62\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<br>\u3000\u3000{1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}<br>\u3053\u306e\u70b9\u306f\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u8a2d\u5b9a\u306b\u3088\u308a\u5909\u66f4\u53ef\u80fd\u3067\u3059\u3002
+plugins/ScriptEditor.menu_actions = \u30a2\u30af\u30b7\u30e7\u30f3(&A)
+plugins/ScriptEditor.new_script = \u65b0\u898f\u30b9\u30af\u30ea\u30d7\u30c8
+plugins/ScriptEditor.run = \u5b9f\u884c(&R)
+plugins/ScriptEditor.sign = \u30b9\u30af\u30ea\u30d7\u30c8\u306b\u7f72\u540d...
+plugins/ScriptEditor/window.Result = Result :
+plugins/ScriptEditor/window.title = \u30b9\u30af\u30ea\u30d7\u30c8\u306e\u7de8\u96c6
+plugins/ScriptingEngine.illegalAccessToInternalAPI = \u5185\u90e8 API \uff08\u30d1\u30c3\u30b1\u30fc\u30b8 {0}\uff09\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306f\u7981\u6b62\u3055\u308c\u3066\u3044\u307e\u3059\u3002/n\u30b9\u30af\u30ea\u30d7\u30c8\u4f5c\u6210 API \u304c\u4e0d\u5341\u5206\u306a\u5834\u5408\u306f\u3001Freeplane \u4f5c\u6210\u30c1\u30fc\u30e0\u306b\u3054\u9023\u7d61\u4e0b\u3055\u3044\u3002
+plugins/TimeList.xml_Created = \u4f5c\u6210
+plugins/TimeList.xml_Date = \u65e5\u4ed8
+plugins/TimeList.xml_Icons = \u30a2\u30a4\u30b3\u30f3
+plugins/TimeList.xml_Modified = \u5909\u66f4
+plugins/TimeList.xml_Notes = \u30ce\u30fc\u30c8
+plugins/TimeList.xml_Text = \u30c6\u30ad\u30b9\u30c8
+plugins/TimeManagement.xml_appendButton = \u9078\u629e\u4e2d\u306e\u65e5\u4ed8\u3092\u633f\u5165
+plugins/TimeManagement.xml_Cancel = \u30ad\u30e3\u30f3\u30bb\u30eb
+plugins/TimeManagement.xml_cancelButton = \u30ad\u30e3\u30f3\u30bb\u30eb
+plugins/TimeManagement.xml_closeButton = \u9589\u3058\u308b
+plugins/TimeManagement.xml_Export = \u9078\u629e\u30ce\u30fc\u30c9\u306e\u66f8\u304d\u51fa\u3057
+plugins/TimeManagement.xml_Find = \u691c\u7d22\u6587\u5b57\u5217
+plugins/TimeManagement.xml_Goto = \u79fb\u52d5
+plugins/TimeManagement.xml_hour = \u6642\uff1a
+plugins/TimeManagement.xml_menu_actions = \u30a2\u30af\u30b7\u30e7\u30f3
+plugins/TimeManagement.xml_minute = \u5206\uff1a
+plugins/TimeManagement.xml_reminderButton = \u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u9078\u629e\u3057\u305f\u65e5\u306b\u30ea\u30de\u30a4\u30f3\u30c0\u3092\u8a2d\u5b9a
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u6307\u5b9a\u671f\u65e5\u307e\u3067\u306e\u30bf\u30a4\u30de\u30fc\u304c\u7d44\u307f\u8fbc\u307e\u308c\u3001\u70b9\u6ec5\u30a2\u30a4\u30b3\u30f3\u3067\u6ce8\u610f\u3092\u4fc3<br> \u3057\u307e\u3059\u3002\u30de\u30c3\u30d7\u3092\u9589\u3058\u3066\u3082\u3001\u30bf\u30a4\u30de\u30fc\u306f\u305d\u306e\u30de\u30c3\u30d7\u3092\u958b\u3051\u305f\u3068\u304d\u52d5\u4f5c\u3092\u518d\u958b\u3057\u307e\u3059\u3002</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>\u73fe\u5728\u3001\u30ea\u30de\u30a4\u30f3\u30c0\u306f\uff11\u30ce\u30fc\u30c9\u306b\u4e00\u3064\u3057\u304b\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002<br>\u73fe\u5728\u306e\u30ea\u30de\u30a4\u30f3\u30c0\u306f {0,date} {0,time}\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u65b0\u305f\u306b\u3001 {1,date} {1,time}\u304c\u9078\u629e\u3055\u308c\u307e\u3057\u305f\u3002<br><br>\u3053\u306e\u30ce\u30fc\u30c9\u306e\u30ea\u30de\u30a4\u30f3\u30c0\u3092\u5909\u66f4\u3057\u307e\u3059\u304b\uff1f (\u306f\u3044) <br>\u305d\u308c\u3068\u3082\u3001\u5143\u306e\u307e\u307e\u306b\u3057\u307e\u3059\u304b\uff1f (\u3044\u3044\u3048)</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = \u30ea\u30de\u30a4\u30f3\u30c0\u306f {0,date} {0,time} \u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059
+plugins/TimeManagement.xml_remindLaterButton = \u6307\u5b9a\u671f\u9593\u7d4c\u904e\u5f8c\u306b\u30ea\u30de\u30a4\u30f3\u30c9\uff08\u8a2d\u5b9a or \u5909\u66f4\uff09
+plugins/TimeManagement.xml_remindLaterButton_tooltip = \u4eca\u65e5\u304b\u3089\u30ea\u30de\u30a4\u30f3\u30c9\u307e\u3067\u306e\u65e5\u6570\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\uff08\u660e\u65e5: 1\u3001\u660e\u5f8c\u65e5: 2\u3001\u2026\uff09
+plugins/TimeManagement.xml_removeReminderButton = \u30ea\u30de\u30a4\u30f3\u30c0\u3092\u524a\u9664
+plugins/TimeManagement.xml_removeReminderButton_tooltip = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304b\u3089\u3059\u3079\u3066\u306e\u30ea\u30de\u30a4\u30f3\u30c0\u3092\u524a\u9664\u3057\u307e\u3059\u3002
+plugins/TimeManagement.xml_Replace = \u7f6e\u63db\u6587\u5b57\u5217
+plugins/TimeManagement.xml_Replace_All = \u3059\u3079\u3066\u7f6e\u63db
+plugins/TimeManagement.xml_Replace_Selected = \u9078\u629e\u30ce\u30fc\u30c9\u3067\u7f6e\u63db
+plugins/TimeManagement.xml_Select = \u9078\u629e
+plugins/TimeManagement.xml_todayButton = \u30ab\u30ec\u30f3\u30c0\u30fc\u9078\u629e\u3092\u73fe\u5728\u306b
+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)...
+PrintDirectAction.text = \u5370\u5237
+printing_settings = \u5370\u5237\u30b5\u30a4\u30ba\u3092\u6307\u5b9a
+PrintPreviewAction.text = \u5370\u5237\u30d7\u30ec\u30d3\u30e5\u30fc(&V)...
+PropertyAction.dialog = \u74b0\u5883\u8a2d\u5b9a
+PropertyAction.text = \u74b0\u5883\u8a2d\u5b9a...
+QuickFilterAction.text = \u30af\u30a3\u30c3\u30af\u30d5\u30a3\u30eb\u30bf
+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)
+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>
+really_cut_node = \u672c\u5f53\u306b\u30ce\u30fc\u30c9\u3092\u5207\u308a\u53d6\u308a\u307e\u3059\u304b\uff1f
+really_execute_script = \u3053\u306e\u30de\u30c3\u30d7\u306b\u542b\u307e\u308c\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f\n\u5b9f\u884c\u3059\u308b\u3068\u3001\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306b\u60aa\u5f71\u97ff\u3092\n\u4e0e\u3048\u308b\u6050\u308c\u304c\u3042\u308a\u307e\u3059\u3002
+really_remove_node = \u672c\u5f53\u306b\u30ce\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
+really_remove_notes = \u672c\u5f53\u306b\u30ce\u30fc\u30c8\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
+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)
+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
+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
+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
+RemoveFormatAction.text = \u66f8\u5f0f\u306e\u307f\u524a\u9664
+RemoveIcon_0_Action.text = \u5148\u982d\u306e\u30a2\u30a4\u30b3\u30f3\u3092\u524a\u9664
+RemoveIconAction.text = \u6700\u5f8c\u306e\u30a2\u30a4\u30b3\u30f3\u3092\u524a\u9664
+RemoveNoteAction.text = \u30ce\u30fc\u30c8\u3092\u524a\u9664
+RemoveNoteAction.tooltip = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\uff08\u8907\u6570\u53ef\uff09\u304b\u3089\u30ce\u30fc\u30c8\u306e\u5185\u5bb9\u3092\u524a\u9664\u3057\u307e\u3059\u3002
+rename = \u540d\u524d\u306e\u5909\u66f4(&R)
+repair_link = \u30ea\u30f3\u30af\u3092\u4fee\u5fa9
+repair_link_question = \u30ea\u30f3\u30af\u3055\u308c\u305f\u30de\u30c3\u30d7\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30ea\u30f3\u30af\u3092\u624b\u52d5\u3067\u4fee\u6b63\u3057\u307e\u3059\u304b\uff1f
+replace = \u7f6e\u63db
+replace_shortcut_question = \u3053\u306e\u30ad\u30fc\u30dc\u30fc\u30c9\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u306f\u3001\u73fe\u5728\u3001\n\u3000\u3000\u300c{0}\u300d\n\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30ad\u30fc\u3078\u306e\u5272\u308a\u5f53\u3066\u6a5f\u80fd\u3092\u7f6e\u63db\u3057\u307e\u3059\u304b\uff1f
+replace_shortcut_title = \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u306e\u7f6e\u63db\u78ba\u8a8d
+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)
+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)
+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)
+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)...
+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.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_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
+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)...
+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
+SelectNoteAction.text = \u30ce\u30fc\u30c8\u7de8\u96c6\u306b\u5207\u308a\u66ff\u3048
+SelectNoteAction.tooltip = \u64cd\u4f5c\u5bfe\u8c61\u3092\u30ce\u30fc\u30c8\u30d1\u30cd\u30eb\u306b\u5207\u308a\u66ff\u3048\u307e\u3059\u3002
+set_accelerator_on_next_click_action = <html>\u30e1\u30cb\u30e5\u30fc\u306e\u4e2d\u304b\u3089\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u30ad\u30fc\u3092\u5272\u308a\u5f53\u3066\u305f\u3044\u6a5f\u80fd\u3092 Ctrl \u3092\u62bc\u3057\u306a\u304c\u3089\u5de6\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001<br>\u30ad\u30fc\u5272\u308a\u5f53\u3066\u30c0\u30a4\u30a2\u30ed\u30b0\u304c\u958b\u304d\u307e\u3059\u3002</html>
+SetAcceleratorOnNextClickAction.text = \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u30ad\u30fc\u3092\u5272\u308a\u5f53\u3066
+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
+SetLinkAnchorAction.tooltip_anchored = <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<br/>\u3000\u6700\u65b0\u306e\u30a2\u30f3\u30ab\u30fc\u3000\uff1a\u3000{0}
+SetLinkByFileChooserAction.text = \u30ea\u30f3\u30af\u5148\u3092\u6307\u5b9a (\u30d5\u30a1\u30a4\u30eb\u9078\u629e)...
+SetLinkByTextFieldAction.text = \u30ea\u30f3\u30af\u5148\u3092\u6307\u5b9a (\u30c6\u30ad\u30b9\u30c8\u5165\u529b)...
+SetNodeLink.text = \u30ce\u30fc\u30c9\u30ea\u30f3\u30af\u3092\u8a2d\u5b9a...
+SetNoteWindowPosition.bottom.text = \u4e0b
+SetNoteWindowPosition.left.text = \u5de6
+SetNoteWindowPosition.right.text = \u53f3
+SetNoteWindowPosition.top.text = \u4e0a
+SetShortenerStateAction.text = \u30ce\u30fc\u30c9\u3092\u77ed\u7e2e\u8868\u793a
+sf_login_required = Source Forge \u3078\u306e\u30ed\u30b0\u30a4\u30f3\u304c\u5fc5\u8981\u3067\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f
+ShowAllAttributesAction.text = \u3059\u3079\u3066\u306e\u5c5e\u6027\u3092\u8868\u793a
+ShowAncestorsAction.text = \u4e0a\u4f4d\u30ce\u30fc\u30c9\u3082\u8868\u793a
+ShowAttributeDialogAction.text = \u5c5e\u6027\u30de\u30cd\u30fc\u30b8\u30e3...
+ShowDescendantsAction.text = \u4e0b\u4f4d\u30ce\u30fc\u30c9\u3082\u8868\u793a
+ShowFilterToolbarAction.text = \u30d5\u30a3\u30eb\u30bf\u30d0\u30fc
+ShowFormatPanel.text = \u30d7\u30ed\u30d1\u30c6\u30a3\u30d1\u30cd\u30eb
+ShowFormatPanel.tooltip = \u30ce\u30fc\u30c9\u3068\u7dda\u306e\u5c5e\u6027\u3092\u540c\u6642\u306b\u5909\u66f4\u3067\u304d\u308b\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+ShowHideNoteAction.text = \u30ce\u30fc\u30c8\u30d1\u30cd\u30eb\u3092\u8868\u793a
+ShowHideNoteAction.tooltip = \u30ce\u30fc\u30c8\u30d1\u30cd\u30eb\u306e\u8868\u793a\uff0f\u975e\u8868\u793a\u3092\u5207\u308a\u66ff\u3048\u307e\u3059\u3002
+ShowNextChildAction.text = \u6b21\u306e\u5b50\u30ce\u30fc\u30c9\u3092\u8868\u793a
+ShowNotesInMapAction.text = \u30de\u30c3\u30d7\u5185\u306b\u30ce\u30fc\u30c8\u3092\u8868\u793a
+ShowSelectedAttributesAction.text = \u8868\u793a\u3059\u308b\u5c5e\u6027\u3092\u9650\u5b9a
+ShowSelectionAsRectangleAction.text = \u9078\u629e\u30ce\u30fc\u30c9\u3092\u67a0\u56f2\u3044\u8868\u793a
+simplyhtml.aboutFrameTitle = \u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066
+simplyhtml.aboutLabel = SimplyHTML \u306b\u3064\u3044\u3066...
+simplyhtml.alignCenter = \u4e2d\u592e
+simplyhtml.alignLabel = \u6587\u5b57\u63c3\u3048\uff1a
+simplyhtml.alignLeft = \u5de6
+simplyhtml.alignRight = \u53f3
+simplyhtml.allCellsRangeLabel = \u3059\u3079\u3066\u306e\u30bb\u30eb
+simplyhtml.allOccurrencesReplaced = \u3059\u3079\u3066\u306e\u9805\u76ee\u3092\u7f6e\u63db\u3057\u307e\u3057\u305f
+simplyhtml.appendTableColLabel = \u5217\u306e\u8ffd\u52a0
+simplyhtml.appendTableRowLabel = \u884c\u306e\u8ffd\u52a0
+simplyhtml.applyCellAttrLabel = \u9069\u7528\uff1a
+simplyhtml.backgroundLabel = \u80cc\u666f\uff1a
+simplyhtml.boldItalicName = \u592a\u5b57 \u659c\u4f53
+simplyhtml.boldName = \u592a\u5b57
+simplyhtml.borderColorLabel = \u8272\uff1a
+simplyhtml.borderWidthLabel = \u5e45
+simplyhtml.bottomLabel = \u4e0b\u8a70\u3081\uff1a
+simplyhtml.cancelBtnName = \u30ad\u30e3\u30f3\u30bb\u30eb
+simplyhtml.cellBorderTabLabel = \u5883\u754c\u7dda
+simplyhtml.cellGenTabLabel = \u5168\u822c
+simplyhtml.cellMarginTabLabel = \u30de\u30fc\u30b8\u30f3
+simplyhtml.cellPanelTitle = \u30bb\u30eb\u306e\u66f8\u5f0f
+simplyhtml.clearFormatLabel = \u66f8\u5f0f\u3092\u524a\u9664
+simplyhtml.clearFormatTip = \u66f8\u5f0f\u3092\u524a\u9664
+simplyhtml.close = \u9589\u3058\u308b
+simplyhtml.closeBtnName = \u9589\u3058\u308b
+simplyhtml.colorLabel = \u8272
+simplyhtml.copyLabel = \u30b3\u30d4\u30fc
+simplyhtml.copyTip = \u30b3\u30d4\u30fc
+simplyhtml.cTagNameHead1 = \u898b\u51fa\u3057 1
+simplyhtml.cTagNameHead2 = \u898b\u51fa\u3057 2
+simplyhtml.cTagNameHead3 = \u898b\u51fa\u3057 3
+simplyhtml.cTagNameHead4 = \u898b\u51fa\u3057 4
+simplyhtml.cTagNameHead5 = \u898b\u51fa\u3057 5
+simplyhtml.cTagNameHead6 = \u898b\u51fa\u3057 6
+simplyhtml.cTagNameLink = \u30ea\u30f3\u30af
+simplyhtml.cTagNameOL = \u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8
+simplyhtml.cTagNamePara = \u6bb5\u843d
+simplyhtml.cTagNameUL = \u756a\u53f7\u306a\u3057\u30ea\u30b9\u30c8
+simplyhtml.cutLabel = \u5207\u308a\u53d6\u308a
+simplyhtml.cutTip = \u5207\u308a\u53d6\u308a
+simplyhtml.defaultDocName = \u7121\u984c
+simplyhtml.deleteTableColLabel = \u5217\u306e\u524a\u9664
+simplyhtml.deleteTableRowLabel = \u884c\u306e\u524a\u9664
+simplyhtml.docTitleQuery = \u30bf\u30a4\u30c8\u30eb\u3092\u8a2d\u5b9a\uff1a
+simplyhtml.docTitleTitle = \u6587\u66f8\u30bf\u30a4\u30c8\u30eb\u3092\u7de8\u96c6
+simplyhtml.editLabel = \u7de8\u96c6
+simplyhtml.effectLabel = \u52b9\u679c
+simplyhtml.familyLabel = \u30d5\u30a1\u30df\u30ea\u30fc
+simplyhtml.findNext = \u6b21\u3092\u691c\u7d22...
+simplyhtml.findReplaceDialogTitle = \u691c\u7d22\uff06\u7f6e\u63db
+simplyhtml.findReplaceLabel = \u691c\u7d22\uff06\u7f6e\u63db
+simplyhtml.findReplaceTip = \u691c\u7d22\uff06\u7f6e\u63db
+simplyhtml.fontBoldLabel = \u592a\u5b57
+simplyhtml.fontBoldTip = \u592a\u5b57
+simplyhtml.fontColorLabel = \u6587\u5b57\u8272
+simplyhtml.fontColorTip = \u6587\u5b57\u8272
+simplyhtml.fontDialogTitle = \u30d5\u30a9\u30f3\u30c8\u306e\u66f8\u5f0f
+simplyhtml.fontItalicLabel = \u659c\u4f53
+simplyhtml.fontItalicTip = \u659c\u4f53
+simplyhtml.fontLabel = \u30d5\u30a9\u30f3\u30c8...
+simplyhtml.fontTabLabel = \u30d5\u30a9\u30f3\u30c8
+simplyhtml.fontTip = \u30d5\u30a9\u30f3\u30c8\u306e\u66f8\u5f0f...
+simplyhtml.fontUnderlineLabel = \u4e0b\u7dda
+simplyhtml.fontUnderlineTip = \u4e0b\u7dda
+simplyhtml.foregroundLabel = \u6587\u5b57\uff1a
+simplyhtml.formatLabel = \u66f8\u5f0f
+simplyhtml.formatListLabel = \u7b87\u6761\u66f8\u304d\uff08\u66f8\u5f0f\u8a2d\u5b9a\uff09...
+simplyhtml.formatListTip = \u7b87\u6761\u66f8\u304d\u306e\u66f8\u5f0f\u5909\u66f4
+simplyhtml.formatParaLabel = \u6bb5\u843d...
+simplyhtml.formatParaTip = \u6bb5\u843d\u66f8\u5f0f\u306e\u5909\u66f4
+simplyhtml.formatTableLabel = \u30c6\u30fc\u30d6\u30eb...
+simplyhtml.formatTableTip = \u30c6\u30fc\u30d6\u30eb\u306e\u66f8\u5f0f
+simplyhtml.helpLabel = \u30d8\u30eb\u30d7
+simplyhtml.htmlTabTitle = HTML \u30b3\u30fc\u30c9\u8868\u793a
+simplyhtml.imageFileDesc = \u753b\u50cf\u30d5\u30a1\u30a4\u30eb
+simplyhtml.insertTableColLabel = \u5217\u306e\u633f\u5165
+simplyhtml.insertTableLabel = \u30c6\u30fc\u30d6\u30eb...
+simplyhtml.insertTableMsg = \u5217\u6570
+simplyhtml.insertTableRowLabel = \u884c\u306e\u633f\u5165
+simplyhtml.insertTableTitle = \u30c6\u30fc\u30d6\u30eb\u306e\u633f\u5165
+simplyhtml.italicName = \u659c\u4f53
+simplyhtml.layoutTabTitle = \u30ec\u30a4\u30a2\u30a6\u30c8\u8868\u793a
+simplyhtml.leftLabel = \u5de6\uff1a
+simplyhtml.listDialogTitle = \u7b87\u6761\u66f8\u304d\u306e\u66f8\u5f0f
+simplyhtml.listIndentTitle = \u30a4\u30f3\u30c7\u30f3\u30c8\uff1a
+simplyhtml.listPosInside = \u5185\u5074
+simplyhtml.listPositionLabel = \u4f4d\u7f6e\uff1a
+simplyhtml.listPosOutside = \u5916\u5074
+simplyhtml.listTypeCircle = \u25cb
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = \u25cf
+simplyhtml.listTypeLabel = \u5f62\u5f0f\uff1a
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = \u306a\u3057
+simplyhtml.listTypeSquare = \u25a1
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = \u5916\u5074
+simplyhtml.matchApproximately = \u66d6\u6627\u691c\u7d22
+simplyhtml.matchApproximately.tooltip = <html>\u66d6\u6627\u691c\u7d22\u306e\u30aa\u30f3\uff0f\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059\u3002<br/>\u4f8b\u3048\u3070\u3001'files' \u306e\u691c\u7d22\u6642\u306b 'flies' \u306a\u3069\u3082\u30de\u30c3\u30c1\u3057\u305f\u3068\u307f\u306a\u3057\u307e\u3059\u3002</html>
+simplyhtml.matchCase = \u5927\u6587\u5b57\uff0f\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b
+simplyhtml.matchCase.tooltip = \u691c\u7d22\u6642\u306b\u5927\u6587\u5b57\uff0f\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u307e\u3059\u3002
+simplyhtml.newStyleDefaultName = \u65b0\u898f\u30b9\u30bf\u30a4\u30eb
+simplyhtml.nextTableCellLabel = \u6b21\u306e\u30bb\u30eb
+simplyhtml.noLineLabel = \u306a\u3057
+simplyhtml.noMoreOccurrencesFound = \u691c\u7d22\u9805\u76ee\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = \u5185\u5074
+simplyhtml.paraAlignCenterLabel = \u4e2d\u592e\u63c3\u3048
+simplyhtml.paraAlignCenterTip = \u6bb5\u843d\u3092\u4e2d\u592e\u63c3\u3048\u306b\u8a2d\u5b9a
+simplyhtml.paraAlignLeftLabel = \u5de6\u63c3\u3048
+simplyhtml.paraAlignLeftTip = \u6bb5\u843d\u3092\u5de6\u63c3\u3048\u306b\u8a2d\u5b9a
+simplyhtml.paraAlignRightLabel = \u53f3\u63c3\u3048
+simplyhtml.paraAlignRightTip = \u6bb5\u843d\u3092\u53f3\u63c3\u3048\u306b\u8a2d\u5b9a
+simplyhtml.paraStyleDialogTitle = \u6bb5\u843d\u30b9\u30bf\u30a4\u30eb
+simplyhtml.paraTabLabel = \u6bb5\u843d
+simplyhtml.pasteHTMLLabel = HTML \u5f62\u5f0f\u3067\u8cbc\u308a\u4ed8\u3051
+simplyhtml.pasteLabel = \u8cbc\u308a\u4ed8\u3051
+simplyhtml.pastePlainTextLabel = \u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u5f62\u5f0f\u3067\u8cbc\u308a\u4ed8\u3051
+simplyhtml.pasteTip = \u8cbc\u308a\u4ed8\u3051
+simplyhtml.plainName = \u6a19\u6e96
+simplyhtml.previewLabel = \u30d7\u30ec\u30d3\u30e5\u30fc
+simplyhtml.previewText = \u30c6\u30ad\u30b9\u30c8\u30d7\u30ec\u30d3\u30e5\u30fc
+simplyhtml.prevTableCellLabel = \u524d\u306e\u30bb\u30eb
+simplyhtml.printLabel = \u5370\u5237...
+simplyhtml.redoLabel = \u3084\u308a\u76f4\u3059
+simplyhtml.redoTip = \u3084\u308a\u76f4\u3059
+simplyhtml.replace = \u7f6e\u63db...
+simplyhtml.replaceAll = \u3059\u3079\u3066
+simplyhtml.replaceDone = \u5b8c\u4e86
+simplyhtml.replaceNo = \u3044\u3044\u3048
+simplyhtml.replaceThisQuery = <html>\u8a72\u5f53\u3059\u308b\u6587\u5b57\u5217\u3092\u7f6e\u63db\u3057\u307e\u3059\u304b\uff1f<br><br>\u3000\u3000</html>
+simplyhtml.replaceWith = \u7f6e\u63db\u6587\u5b57\u5217\uff1a
+simplyhtml.replaceYes = \u306f\u3044
+simplyhtml.rightLabel = \u53f3\uff1a
+simplyhtml.searchDown = \u4e0b\u3078\u691c\u7d22
+simplyhtml.searchDown.tooltip = \u4e0b\u306b\u5411\u304b\u3063\u3066\u691c\u7d22\u3057\u307e\u3059\u3002
+simplyhtml.searchFromStart = \u5148\u982d\u304b\u3089\u691c\u7d22
+simplyhtml.searchFromStart.tooltip = \u30ab\u30fc\u30bd\u30eb\u4f4d\u7f6e\u3067\u306a\u304f\u3001\u5148\u982d\u90e8\u304b\u3089\u691c\u7d22\u3092\u958b\u59cb\u3057\u307e\u3059\u3002
+simplyhtml.searchUp = \u4e0a\u3078\u691c\u7d22
+simplyhtml.searchUp.tooltip = \u4e0a\u306b\u5411\u304b\u3063\u3066\u691c\u7d22\u3057\u307e\u3059\u3002
+simplyhtml.selectAllLabel = \u3059\u3079\u3066\u3092\u9078\u629e
+simplyhtml.sizeLabel = \u30b5\u30a4\u30ba
+simplyhtml.standardStyleName = \u6a19\u6e96
+simplyhtml.strikeLabel = \u53d6\u308a\u6d88\u3057\u7dda
+simplyhtml.styleLabel = \u30b9\u30bf\u30a4\u30eb
+simplyhtml.styleNameInputText = \u65b0\u898f\u30b9\u30bf\u30a4\u30eb\u540d
+simplyhtml.styleNameInputTitle = \u30b9\u30bf\u30a4\u30eb\u306e\u4fdd\u5b58
+simplyhtml.tableBgColLabel = \u80cc\u666f\u8272\uff1a
+simplyhtml.tableDialogTitle = \u30c6\u30fc\u30d6\u30eb\u306e\u66f8\u5f0f
+simplyhtml.tableLabel = \u30c6\u30fc\u30d6\u30eb
+simplyhtml.tablePanelTitle = \u30c6\u30fc\u30d6\u30eb\u306e\u66f8\u5f0f
+simplyhtml.tableWidthLabel = \u5e45\uff1a
+simplyhtml.textIndentLabel = \u30a4\u30f3\u30c7\u30f3\u30c8\uff1a
+simplyhtml.textToFind = \u691c\u7d22\u6587\u5b57\u5217\uff1a
+simplyhtml.thisCellRangeLabel = \u73fe\u5728\u306e\u30bb\u30eb
+simplyhtml.thisColRangeLabel = \u73fe\u5728\u306e\u5217
+simplyhtml.thisRowRangeLabel = \u73fe\u5728\u306e\u884c
+simplyhtml.toggleBulletsLabel = \u7b87\u6761\u66f8\u304d\uff08"\u25cf" \u5f62\u5f0f\uff09
+simplyhtml.toggleBulletsTip = \u7b87\u6761\u66f8\u304d\uff08"\u25cf" \u5f62\u5f0f\uff09
+simplyhtml.toggleNumbersLabel = \u7b87\u6761\u66f8\u304d\uff08"1.,2.,3.,4." \u5f62\u5f0f\uff09
+simplyhtml.toggleNumbersTip = \u7b87\u6761\u66f8\u304d\uff08"1.,2.,3.,4." \u5f62\u5f0f\uff09
+simplyhtml.topLabel = \u4e0a\u8a70\u3081\uff1a
+simplyhtml.uLineLabel = \u4e0b\u7dda
+simplyhtml.unableToOpenFileError = \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+simplyhtml.unableToRedoError = \u3084\u308a\u76f4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\uff1a
+simplyhtml.unableToUndoError = \u5143\u306b\u623b\u305b\u307e\u305b\u3093\uff1a
+simplyhtml.undoLabel = \u5143\u306b\u623b\u3059
+simplyhtml.undoTip = \u5143\u306b\u623b\u3059
+simplyhtml.valignBaseline = \u30d9\u30fc\u30b9\u30e9\u30a4\u30f3
+simplyhtml.valignBottom = \u4e0b\u8a70\u3081
+simplyhtml.valignLabel = \u7e26\u4f4d\u7f6e\u6587\u5b57\u63c3\u3048\uff1a
+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.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.tooltip = \u30ce\u30fc\u30c9\u3092\u5206\u5272\u3057\u307e\u3059\u3002
+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
+StructuredHtmlFlavorHandler = HTML \u30d5\u30a9\u30fc\u30de\u30c3\u30c8\uff1a\u30ce\u30fc\u30c9\u968e\u5c64\u4ed8\u304d
+style = \u30b9\u30bf\u30a4\u30eb
+style_already_exists = \u540c\u3058\u540d\u79f0\u306e\u30b9\u30bf\u30a4\u30eb\u304c\u3042\u308a\u307e\u3059\u3002
+styledialog.cancel.text = \u30ad\u30e3\u30f3\u30bb\u30eb
+styledialog.ok.text = \u4e86\u89e3
+styles = \u30b9\u30bf\u30a4\u30eb(&Y)
+styles.AutomaticLayout = \u968e\u5c64\u5225\u30b9\u30bf\u30a4\u30eb\u3092\u9069\u7528
+styles.connection = \u95a2\u4fc2
+styles.date = \u65e5\u4ed8
+styles.definition = \u5b9a\u7fa9
+styles.description = \u8aac\u660e
+styles.floating_node = \u30d5\u30ed\u30fc\u30c6\u30a3\u30f3\u30b0\u30ce\u30fc\u30c9
+styles.idea = \u3072\u3089\u3081\u304d
+styles.important = \u91cd\u8981
+styles.key = \u30ab\u30ae
+styles.list = \u30ea\u30b9\u30c8
+styles.needs_action = \u8981\u63aa\u7f6e
+styles.note = \u30e1\u30e2\u3001\u8a18\u9332
+styles.ok = \u4e86\u89e3
+styles.pending = \u4fdd\u7559
+styles.predefined = \u5b9a\u7fa9\u6e08\u307f\u30b9\u30bf\u30a4\u30eb
+styles.question = \u7591\u554f
+styles.quotation = \u5f15\u7528
+styles.root_node = \u30b9\u30bf\u30a4\u30eb
+styles.subsubtopic = \u5c0f\u898b\u51fa\u3057
+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_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
+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
+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)
+ToggleMenubarAction.text = \u30e1\u30cb\u30e5\u30fc\u30d0\u30fc
+ToggleStatusAction.text = \u30b9\u30c6\u30fc\u30bf\u30b9\u30d0\u30fc\u3092\u8868\u793a
+ToggleToolbarAction.text = \u30c4\u30fc\u30eb\u30d0\u30fc(&T)
+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)
+UndoFilterAction.text = \u30d5\u30a3\u30eb\u30bf\u3092\u5143\u306b\u623b\u3059
+unfold = \u5c55\u958b
+UnfoldAllAction.text = \u3059\u3079\u3066\u5c55\u958b\u3059\u308b
+UnfoldAllAction.tooltip = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304b\u3089\u3001\u3059\u3079\u3066\u306e\u4e0b\u4f4d\u30ce\u30fc\u30c9\u3092\u5c55\u958b\u3057\u307e\u3059\u3002
+UnfoldOneLevelAction.text = \uff11\u968e\u5c64\u5206\u3060\u3051\u5c55\u958b\u3059\u308b
+UnfoldOneLevelAction.tooltip = \u9078\u629e\u4e2d\u306e\u30ce\u30fc\u30c9\u304b\u3089\uff11\u968e\u5c64\u5206\u3060\u3051\u5c55\u958b\u3057\u307e\u3059\u3002
+up = \u4e0a\u3078(&U)
+update_failed = <html>\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002<br>\u53c2\u7167\u30e1\u30c3\u30bb\u30fc\u30b8\uff1a {0}</html>
+UpdateCheckAction.text = \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u66f4\u65b0\u78ba\u8a8d...
+updatecheckdialog = \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u66f4\u65b0\u78ba\u8a8d
+url_error = URL \u306e\u8a18\u8ff0\u306b\u8aa4\u308a\u304c\u3042\u308a\u307e\u3059\u3002
+url_open_error = URL {0} \u3092\u8aad\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+used_in_menu = \u30c7\u30d5\u30a9\u30eb\u30c8\u30e1\u30cb\u30e5\u30fc\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u3053\u306e\u30ad\u30fc\u306b\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
+UsePlainTextAction.text = \u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u4f7f\u7528
+user_config_folder = User configuration folder: {0}
+user_defined_scale = \u753b\u9762\u8868\u793a(&U)\u3000\u00d7
+user_defined_zoom = \u30e6\u30fc\u30b6\u6307\u5b9a
+user_defined_zoom_status_bar = \u30e6\u30fc\u30b6\u306e\u6307\u5b9a\u306b\u3088\u308a\u753b\u9762\u8868\u793a\u3092 {0}% \u306b\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002
+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
+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...
+ViewLayoutTypeAction.OUTLINE.text = \u30a2\u30a6\u30c8\u30e9\u30a4\u30f3\u30d3\u30e5\u30fc
+WebDocuAction.text = Web\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
+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
+xslt_export.latex = XSLT\u3092\u4f7f\u3063\u3066 Latex \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b
+xslt_export.latexbook = XSLT\u3092\u4f7f\u3063\u3066 Latex Book \u306b
+xslt_export.mediawiki = XSLT\u3092\u4f7f\u3063\u3066 Mediawiki \u306b
+xslt_export.ms_excel = XSLT\u3092\u4f7f\u3063\u3066 Excel\uff082003 \u4ee5\u964d\uff09XML \u306b
+xslt_export.ms_project = XSLT\u3092\u4f7f\u3063\u3066 MS Project\uff082003 \u4ee5\u964d\uff09XML\u306b
+xslt_export.ms_word = XSLT\u3092\u4f7f\u3063\u3066 Word\uff082003 \u4ee5\u964d\uff09XML \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
+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
new file mode 100644
index 0000000..bef56ca
--- /dev/null
+++ b/freeplane/resources/translations/Resources_ko.properties
@@ -0,0 +1,1140 @@
+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
+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
+accessories/plugins/ApplyFormatPlugin.dialog.title = \uB178\uB4DC\uC758 \uD615\uD0DC\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4.
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = \uD328\uD134 \uBCC0\uACBD
+accessories/plugins/EncryptNode.properties_0 = \ub178\ub4dc\ub97c \uc554\ud638\ud654\ud558\uae30 \uc704\ud55c \ube44\ubc00\ubc88\ud638 \uc785\ub825
+accessories/plugins/EncryptNode.properties_1 = \uBE44\uBC00\uBC88\uD638\uAC00 \uAC19\uC9C0 \uC54A\uAC70\uB098 \uB108\uBB34 \uC9E7\uC2B5\uB2C8\uB2E4.
+accessories/plugins/EncryptNode.properties_2 = \uBE44\uBC00\uBC88\uD638:
+accessories/plugins/EncryptNode.properties_3 = \uBE44\uBC00\uBC88\uD638 \uD655\uC778:
+accessories/plugins/EncryptNode.properties_4 = \uBE44\uBC00\uBC88\uD638\uB97C \uC9C0\uC815\uD558\uC138\uC694.
+accessories/plugins/EncryptNode.properties_5 = <html>\uAE30\uC5B5\uD558\uC138\uC694. \uC554\uD638\uC758 \uBCF4\uC548\uC815\uB3C4\uB294<br>\uB2F9\uC2E0\uC774 \uC0AC\uC6A9\uD55C \uC554\uD638\uAC00 \uC5BC\uB9C8\uB098 \uBCF5\uC7A1\uD55C\uC9C0\uC5D0 \uB2EC\uB824\uC788\uC2B5\uB2C8\uB2E4.</html>
+accessories/plugins/EncryptNode.properties_6 = \uD655\uC778
+accessories/plugins/EncryptNode.properties_7 = \uCDE8\uC18C
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = \uc554\ud638\ud654\ub41c \ub178\ub4dc\uc5d0\uc11c\ub9cc \uac00\ub2a5\ud569\ub2c8\ub2e4. \ub3c4\uad6c \uba54\ub274\uc5d0\uc11c \uc554\ud638\ud654\ub41c \ub178\ub4dc \uc0bd\uc785\uc73c\ub85c \ub0b4\uc6a9\uc744 \uba3c\uc800 \ub9cc\ub4dc\uc138\uc694.
+accessories/plugins/EncryptNode.properties_select_me = \uACC4\uC18D\uD558\uAE30 \uC704\uD574 \uD074\uB9AD\uD558\uC138\uC694.
+accessories/plugins/EncryptNode.properties_wrong_password = \uBE44\uBC00\uBC88\uD638\uAC00 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+accessories/plugins/ExportWithTWiki.text = TWiki \uBB38\uC11C\uB85C...
+accessories/plugins/ExportWithTWiki.tooltip = \uB9F5 \uBB38\uC11C\uB97C TWiki \uBB38\uC11C\uB85C \uB0B4\uBCF4\uB0B4\uAE30.
+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 \uBB38\uC11C\uB97C \uB0B4\uBCF4\uB0B4\uAE30 \uD569\uB2C8\uB2E4.
+accessories/plugins/ExportWithXSLT_Flash.text = \uD50C\uB798\uC2DC\uB85C...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = \ud50c\ub798\uc2dc\ub85c \ubb38\uc11c\ub97c \ub0b4\ubcf4\ub0c5\ub2c8\ub2e4.
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML\uB85C \uC800\uC7A5 (JavaScript \uD615\uD0DC)...
+accessories/plugins/ExportWithXSLT_HTML3.text = XHTML\uB85C \uC800\uC7A5 (\uD074\uB9AD\uAC00\uB2A5\uD55C \uB9F5\uC774\uBBF8\uC9C0 \uD615\uD0DC)...
+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>
+add = \ucd94\uac00(&A)
+AddConnectorAction.text = \uc5f0\uacb0
+AddElementaryConditionAction.text = \ucd94\uac00
+AddLocalLinkAction.text = \uB85C\uCEEC \uB9C1\uD06C \uCD94\uAC00
+AddMenuItemLinkAction.text = \uba54\ub274 \ud56d\ubaa9 \ub9c1\ud06c \ucd94\uac00...
+addons.installer.canceled = \uc124\uce58 \ucde8\uc18c
+addons.installer.failed = \uc124\uce58 \uc2e4\ud328: {0}
+addons.installer.invalid.keyboard.shortcut = \uc798\ubabb\ub41c \ub2e8\ucd95\ud0a4\uc785\ub2c8\ub2e4. {0}
+addons.installer.map.structure = \ub9f5 \uad6c\uc870 \uc624\ub958: {0}
+addons.installer.no.scripts = \uc2a4\ud06c\ub9bd\ud2b8 \uc5c6\uc74c
+always = \ud56d\uc0c1
+antialias_all = \ubaa8\ub450 \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2a4 \uc801\uc6a9
+antialias_edges = \uc5f0\uacb0 \uc120\ub9cc \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2a4 \uc801\uc6a9
+antialias_none = \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2a4 \uc0ac\uc6a9 \uc548\ud568
+apply = \uc801\uc6a9(&A)
+ApplyAction.text = \uc801\uc6a9(&A)
+ApplyFormatPlugin.text = \uc11c\uc2dd \ubc14\uafb8\uae30(&C) ...
+ApplyFormatPlugin.tooltip = Presents a dialog in which node and edge attributes can be changed at once.
+as_parent = \uC0C1\uC704 \uB2E8\uACC4\uB85C
+AskForHelp.text = \ub3c4\uc6c0 \uc694\uccad
+AssignAttributesAction.text = \uc18d\uc131 \ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30...
+attributes_attribute = \uc18d\uc131
+attributes_close = \uB2EB\uAE30
+attributes_deselect_all = \uC2A4\uD0A8\uC5C6\uC74C
+attributes_dialog_title = \uc18d\uc131 \uad00\ub9ac\uc790
+attributes_edit = \uD3B8\uC9D1
+attributes_import = \uac00\uc838\uc624\uae30(&I)
+attributes_popup_delete = \uc0ad\uc81c
+attributes_popup_edit = \uD3B8\uC9D1
+attributes_popup_hide = \uc228\uae30\uae30
+attributes_popup_new = \uc0c8\ub85c\uc6b4 \uc18d\uc131
+attributes_popup_optimal_width = \ucd5c\uc801 \ub108\ube44
+attributes_RemoveAllAttributesAction.text = \ubaa8\ub4e0 \uc18d\uc131 \uc81c\uac70
+attributes_RemoveFirstAttributeAction.text = \uccab\ubc88\uc9f8 \uc18d\uc131 \uc81c\uac70
+attributes_RemoveLastAttributeAction.text = \ub9c8\uc9c0\ub9c9 \uc18d\uc131 \uc81c\uac70
+attributes_select_all = \uBAA8\uB450
+attributes_select_all_tooltip = \ubaa8\ub450 \uc120\ud0dd / \ud574\uc81c
+attributes_show = \ubcf4\uc774\uae30
+automatically_save_message = Map was automatically saved (using the file name {0}) ...
+AutomaticLayout.level = {0}\ub2e8\uacc4
+AutomaticLayout.level.root = \ub8e8\ud2b8
+AutomaticLayoutAction.text = \ub2e8\uacc4\ubcc4 \uc2a4\ud0c0\uc77c \uc801\uc6a9(&A)
+AutomaticLayoutAction.tooltip = <html>\uB9F5\uD30C\uC77C\uC758 \uB808\uC774\uC544\uC6C3\uC744 \uC218\uC815\uD569\uB2C8\uB2E4. <br>\uCD5C\uC0C1\uC704 \uB808\uBCA8\uC740 \uAC80\uC740\uC0C9, \uB450\uBC88\uC9F8\uB294 \uD30C\uB780\uC0C9 \uC2DD\uC73C\uB85C \uBCC0\uACBD\uB429\uB2C8\uB2E4.</html>
+BackAction.text = \uB4A4\uB85C
+BackAction.tooltip = Jumps back in the select chain
+background = \uBC30\uACBD
+BlinkingNodeHookAction.text = \ubc18\uc9dd\uc774\ub294 \ub178\ub4dc
+BlinkingNodeHookAction.tooltip = <html>\uc774\uac83\uc740 \ub178\ub4dc\ub97c \ubc18\uc9dd\uc774\uac8c \ud569\ub2c8\ub2e4. <br>\ud558\uc9c0\ub9cc <strong>\ub108\ubb34 \ub9ce\uc740 \ub178\ub4dc\uc5d0 \uc801\uc6a9</strong>\ud558\uac70\ub098 <strong>\ub2e4\ub978 \ud615\uc2dd \uc790\ub3d9 \uc9c0\uc801 \uae30\ub2a5\uc744 \uac19\uc740 \ub178\ub4dc\uc5d0 \ub3d9\uc2dc \uc801\uc6a9</strong>\uc2dc\ud0a4\uc9c0 \uc54a\ub3c4\ub85d \uc8fc\uc758\ud558\uc138\uc694.</html>
+BoldAction.text = \uAD75\uAC8C
+boldify_branch = \uAC00\uC9C0\uB97C \uAD75\uAC8C
+branch = \uAC00\uC9C0
+browse = \ucc3e\uc544\ubcf4\uae30...
+calendar_attributes_panel = \ub2ec\ub825 \ubc0f \uc18d\uc131
+cancel = \ucde8\uc18c(&C)
+CancelAction.text = \ucde8\uc18c(&C)
+cannot_add_parent_diff_parents = \uc774 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ubaa8\ub4e0 \ub178\ub4dc\uac00 \uac19\uc740 \ubd80\ubaa8\ub97c \uac00\uc838\uc57c \ud569\ub2c8\ub2e4.
+cannot_add_parent_to_root = \ub8e8\ud2b8\uc5d0\uc11c\ub294 \ubd80\ubaa8 \ub178\ub4dc\ub97c \ucd94\uac00\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+cannot_delete_root = \ub8e8\ud2b8 \ub178\ub4dc\ub294 \uc0ad\uc81c\ub418\uac70\ub098 \uc624\ub824\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+cannot_join_nodes_with_children = \uD558\uC704\uC5D0 \uB0B4\uC6A9\uC774 \uC788\uB294 \uAC83\uC740 \uD569\uCE60\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+cannot_move_to_child = \ub178\ub4dc\ub97c \uc790\uc2e0\uc758 \ud558\uc704 \ub178\ub4dc\ub85c \uc62e\uae38 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+CenterAction.text = \uC911\uC559\uC815\uB82C
+CenterSelectedNodeAction.text = \uc120\ud0dd\ub41c \ub178\ub4dc\ub97c \uc911\uc559 \uc815\ub82c
+ChangeConnectorArrowsAction.backward.text = \uc5ed\ubc29\ud5a5 \ud654\uc0b4\ud45c \uadf8\ub9ac\uae30
+ChangeConnectorArrowsAction.both.text = \uc591\ubc29\ud5a5 \ud654\uc0b4\ud45c \uadf8\ub9ac\uae30
+ChangeConnectorArrowsAction.forward.text = \uc815\ubc29\ud5a5 \ud654\uc0b4\ud45c \uadf8\ub9ac\uae30
+ChangeConnectorShapeAction.LINE.text = \uc120
+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 = \uBC30\uACBD\uC0C9 \uC120\uD0DD:
+choose_cloud_color = \uAD6C\uB984 \uC0C9\uC0C1 \uC120\uD0DD:
+choose_edge_color = \uD14C\uB450\uB9AC \uC0C9 \uC120\uD0DD
+choose_map_background_color = \ub9f5 \ubc30\uacbd\uc0c9 \uc120\ud0dd
+choose_node_background_color = \ub178\ub4dc \ubc30\uacbd\uc0c9 \uc120\ud0dd:
+choose_node_color = \uAE00\uC790\uC0C9 \uC120\uD0DD:
+CloseAction.text = \ud604\uc7ac \ub9f5 \ub2eb\uae30(&C)
+CloudAction.text = \uad6c\ub984 \ucd94\uac00 / \uc81c\uac70 (\uae30\ubcf8 \uc124\uc815)
+CloudColorAction.text = \uad6c\ub984 \uc0c9\uc0c1...
+CloudShapeAction.ARC.text = \uc6d0\ud638
+CloudShapeAction.RECT.text = \uc9c1\uc0ac\uac01\ud615
+CloudShapeAction.ROUND_RECT.text = \uc9c1\uc0ac\uac01\ud615 (\ub465\uadfc \uaf2d\uc9c0\uc810)
+CloudShapeAction.STAR.text = \ubcc4 \ubaa8\uc591
+ColorProperty.ResetColor = \uc0c9\uc0c1 \ucd08\uae30\ud654
+combined = \uACB0\uD569
+condition = \uc870\uac74
+confirmation = \uD655\uC778
+CopyAction.text = \ubca0\uaef4\ub450\uae30(&C)
+CopyAction.tooltip = \uc120\ud0dd\ub41c \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
+CopyNodeURIAction.text = \ub178\ub4dc URI \ubca0\uaef4\ub450\uae30
+CopySingleAction.text = \ub2e8\uc77c \ub178\ub4dc \ubcf5\uc0ac(&S)
+CopySingleAction.tooltip = \uc120\ud0dd\ub41c \ub178\ub4dc\ub9cc \ubca0\uaef4\ub450\uae30
+corrupt_map = \ub9f5 \ub0b4\uc6a9\uc774 \uc190\uc0c1\ub418\uc5c8\uc2b5\ub2c8\ub2e4
+CreateConjunctConditionAction.text = And
+CreateDisjunctConditionAction.text = Or
+CreateNotSatisfiedConditionAction.text = Not
+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 = \uc624\ub824\ub450\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
+defaultstyle.note = \ub178\ud2b8
+delete = \uc0ad\uc81c(&D)
+delete_child = \ub178\ub4dc \uc0ad\uc81c
+DeleteAction.text = \ub178\ub4dc \uc81c\uac70(&O)
+DeleteConditionAction.text = \uc0ad\uc81c
+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
+DocumentationAction.text = \uBB38\uC11C\uD654
+download = \ub0b4\ub824\ubc1b\uae30
+edge = \uAC00\uC7A5\uC790\uB9AC
+edge_style = \uc120 \uc2a4\ud0c0\uc77c
+edge_width = \uc120 \ub108\ube44
+EdgeColorAction.text = \uc120 \uc0c9\uc0c1...
+EdgeStyleAction.bezier.text = \ubca0\uc9c0\uc5b4 \uace1\uc120
+EdgeStyleAction.hide_edge.text = \uc5f0\uacb0 \uc120 \uc228\uae30\uae30
+EdgeStyleAction.linear.text = \uC9C1\uC120
+EdgeStyleAction.sharp_bezier.text = \uB0A0\uCE74\uB85C\uC6B4 \uC120\uD615
+EdgeStyleAction.sharp_linear.text = \uB0A0\uCE74\uB85C\uC6B4 \uC9C1\uC120
+EdgeStyleAsParentAction.text = \uC0C1\uC704 \uB2E8\uACC4\uB85C
+EdgeWidthAction_width_parent.text = \ubd80\ubaa8 \ub178\ub4dc\ucc98\ub7fc
+EdgeWidthAction_width_thin.text = \uC587\uAC8C
+edit = \ud3b8\uc9d1(&E)
+edit.decision = HTML \ud3b8\uc9d1\uae30
+edit.edit_rich_text = Do you want to use formattings like bold or italics?
+edit_label_font_family = \uae00\uaf34
+edit_label_font_size = \uae00\uaf34 \ud06c\uae30
+edit_link_manually = \ub9c1\ud06c \uc218\ub3d9\uc73c\ub85c \ud3b8\uc9d1...
+edit_transparency_label = \ubd88\ud22c\uba85\ub3c4
+edit_width_label = \ub108\ube44
+EditAction.text = \ub178\ub4dc \uc989\uc11d \uc218\uc815
+EditFilterAction.text = \ud544\ud130 \uc791\uc131\ud558\uae30
+EditLongAction.text = \uc7a5\ubb38 \ud3b8\uc9d1\ucc3d \uc5f4\uae30
+EditScript = \uc2a4\ud06c\ub9bd\ud2b8 \ud3b8\uc9d1...
+EditStylesAction.text = \uc2a4\ud0c0\uc77c \ud3b8\uc9d1
+EncryptedMap.text = \uc554\ud638\ud654\ub41c \ubb38\uc11c\ub85c \uc800\uc7a5(&Y) ...
+EncryptedMap.tooltip = \uC554\uD638\uD654\uB41C \uC0C8\uB85C\uC6B4 \uBB38\uC11C \uC791\uC131
+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_confirms = \uc5d4\ud130 \ud0a4\ub85c \ud655\uc778(&E)
+EnterPassword.text = \ube44\ubc00\ubc88\ud638 \uc785\ub825
+error = \uc624\ub958
+error_applying_template = XSL \ud15c\ud50c\ub9bf \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.
+errornumber = \uc624\ub958 {0}\uac1c
+ExecuteScripts.text = \uc2a4\ud06c\ub9bd\ud2b8
+export_failed = \ub0b4\ubcf4\ub0b4\uae30 \uc2e4\ud328
+export_pdf_text = PDF(Portable Document Format) text\ub85c \ub0b4\ubcf4\ub0b4\uae30
+export_svg_text = SVG(Scalable Vector Graphic) text\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 ...
+ExportBranchToHTMLAction.text = \uAC00\uC9C0\uB97C HTML\uB85C \uB0B4\uBCF4\uB0B4\uAE30
+exported_file = {0} \ud30c\uc77c
+ExportPdf.text = PDF
+ExportSvg.text = SVG
+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
+ExternalImage_popupMenu_Change = \ubcc0\uacbd...
+ExternalImage_popupMenu_Open = \ubdf0\uc5b4\ub85c \uc5f4\uae30
+ExternalImage_popupMenu_Remove = \uc81c\uac70
+ExternalImage_popupMenu_ResetZoom = \ud655\ub300\uc728 \ucd08\uae30\ud654
+ExternalImageAddAction.text = \uc774\ubbf8\uc9c0 \ucd94\uac00...
+ExternalImageChangeAction.text = \uc774\ubbf8\uc9c0 \ubcc0\uacbd...
+ExternalImageRemoveAction.text = \uc774\ubbf8\uc9c0 \uc81c\uac70...
+f_button_unassigned = <\ub3d9\uc791 \uc5c6\uc74c>
+FaqOpenURLAction.text = \uC790\uC8FC \uBB3B\uB294 \uC9C8\uBB38
+file = \ud30c\uc77c(&F)
+file_already_exists = {0} \uD30C\uC77C\uC740 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. \uB36E\uC5B4\uC50C\uC6B8\uAE4C\uC694?
+file_not_found = {0} \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+FilePropertiesAction.text = \ub9f5 \ud1b5\uacc4(&I)...
+filter_add = \ucd94\uac00(&A)
+filter_and = A&nd
+filter_delete = \uc0ad\uc81c(&D)
+filter_icon = \uC544\uC774\uCF58
+filter_leaf = \ub2e8\ub9d0 \ub178\ub4dc
+filter_match_case = \ub300\uc18c\ubb38\uc790 \uad6c\ubd84(&C)
+filter_node_level = \ub178\ub4dc\uc758 \ub2e8\uacc4
+filter_not = &Not
+filter_note = \ub178\ud2b8
+filter_odd_level = \ud640\uc218 \ub2e8\uacc4\uc758 \ub178\ub4dc
+filter_or = O&r
+filter_priority = \uc6b0\uc120\uc21c\uc704
+filter_root = \ub8e8\ud2b8 \ub178\ub4dc
+filter_select = \uc120\ud0dd(&S)
+filter_style = \uc2a4\ud0c0\uc77c
+find_what = \ucc3e\uc744 \ub0b4\uc6a9
+FindAction.text = \ucc3e\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 \uC804\uCCB4 \uB9F5\uB0B4\uC6A9\uC744 \uB9DE\uCD94\uAE30
+fold = \uC811\uAE30
+FoldAllAction.text = \ubaa8\ub450 \uc811\uae30
+FoldAllAction.tooltip = <html>\uc120\ud0dd\ub41c \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\ub41c \ub178\ub4dc\ub85c\ubd80\ud130 \ud55c \ub2e8\uacc4\uae4c\uc9c0\ub9cc \uc811\uc2b5\ub2c8\ub2e4.</html>
+follow_graphical_link = \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_menu_edge_styles = \uc120 \uc2a4\ud0c0\uc77c(&E)
+format_menu_edge_widths = \uc120 \ub450\uaed8(&W)
+format_panel = \uc11c\uc2dd
+FormatCopy.text = \uc11c\uc2dd \ubca0\uaef4\ub450\uae30
+FormatCopy.tooltip = <html>\ub178\ub4dc\uc5d0 \uc0ac\uc6a9\ub41c \uc11c\uc2dd\uc744 \ubca0\uaef4\ub461\ub2c8\ub2e4.</html>
+FormatPaste.text = \uC11C\uC2DD \uBD99\uC5EC\uB123\uAE30
+FormatPaste.tooltip = <html>\ubca0\uaef4\ub454 \uc11c\uc2dd\uc744 \ub178\ub4dc\uc5d0 \uc801\uc6a9\ud569\ub2c8\ub2e4.</html>
+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.menuname = \uc218\uc2dd
+formula_editor = \uc218\uc2dd \ud3b8\uc9d1\ud558\uae30
+ForwardAction.text = \uC55E\uC73C\uB85C
+Freeplane.progress.buildScreen = \uD654\uBA74 \uB9CC\uB4E4\uAE30...
+Freeplane.progress.createController = \uD070\uD2B8\uB864\uB7EC \uC0DD\uC131...
+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.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...
+Freeplane.progress.updateLookAndFeel = \uC2A4\uD0A8 \uAC31\uC2E0...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = \uC628\uB77C\uC778 \uB3C4\uC6C0\uB9D0...
+FreeplaneHelpStarter.tooltip = \ud504\ub9ac\ud50c\ub808\uc778 \ud655\uc7a5 \ub3c4\uc6c0\ub9d0
+GotoLinkNodeAction.text = \uB9C1\uD06C\uB85C \uAC00\uAE30
+GotoNodeAction.text = ID\ub85c \ub178\ub4dc \uc120\ud0dd...
+GrabKeyDialog.common.cancel = \uCDE8\uC18C
+GrabKeyDialog.common.ok = \uD655\uC778
+GrabKeyDialog.grab-key.assigned-to = \uD560\uB2F9\uD558\uAE30
+GrabKeyDialog.grab-key.assigned-to.none = \uD604\uC7AC \uD560\uB2F9\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+GrabKeyDialog.grab-key.clear = \uBE44\uC6B0\uAE30
+GrabKeyDialog.grab-key.remove = \uC81C\uAC70
+GrabKeyDialog.grab-key.remove-ask = \uC774 \uB2E8\uCD95\uD0A4\uB97C \uC9C0\uC6B8\uAE4C\uC694?
+GrabKeyDialog.grab-key.title = \uC0C8\uB85C\uC6B4 \uD0A4\uAC12\uC744 \uC785\uB825\uD558\uC138\uC694
+green = \ucd08\ub85d\uc0c9
+help = \ub3c4\uc6c0\ub9d0(&H)
+HideAllAttributesAction.text = \ubaa8\ub4e0 \uc18d\uc131 \uc228\uae30\uae30
+HierarchicalIconsAction.text = \uC544\uC774\uCF58 \uACC4\uCE35\uC801\uC73C\uB85C \uBCF4\uAE30
+HierarchicalIconsAction.tooltip = If one of the (grand)children of me has an icon, I will show this icon in little format, too.
+hot_keys = \ub2e8\ucd95\ud0a4
+hot_keys_table = \ub2e8\ucd95\ud0a4 \ud45c
+HotKeyInfoAction.text = \ub2e8\ucd95\ud0a4 \uc548\ub0b4
+html_export_based_on_headings = HTML \uB0B4\uBCF4\uB0B4\uAE30 - \uC81C\uBAA9\uC5D0 \uAE30\uBC18\uD574\uC11C...
+html_export_fold_all = HTML \uB0B4\uBCF4\uB0B4\uAE30 - \uBAA8\uB450 \uC811\uC5B4\uC11C...
+html_export_fold_currently_folded = HTML \uB0B4\uBCF4\uB0B4\uAE30 - \uD604\uC7AC \uC811\uD78C \uBD80\uBD84\uB9CC \uC811\uC5B4\uC11C...
+html_export_no_folding = HTML \uB0B4\uBCF4\uB0B4\uAE30 - \uBAA8\uB450 \uC811\uC9C0 \uC54A\uACE0...
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = \ub367\uc148
+icon_attach = \uC8FC\uBAA9
+icon_back = \uB4A4\uB85C
+icon_bee = \ud504\ub9ac\ud50c\ub808\uc778
+icon_bell = \uAE30\uC5B5\uD558\uC138\uC694.
+icon_bookmark = \uD6CC\uB96D\uD568
+icon_broken-line = \uc798\ub9bc
+icon_button_cancel = \uCDE8\uC18C
+icon_button_ok = \uD655\uC778
+icon_calendar = \ub0a0\uc9dc
+icon_checked = \uccb4\ud06c \ud45c\uc2dc
+icon_clanbomber = \uC704\uD5D8
+icon_clock = \uc2dc\uac04
+icon_decrypted = \uc7a0\uae08 \ud574\uc81c
+icon_desktop_new = \uc78a\uc9c0 \ub9c8\uc138\uc694
+icon_division = \ub098\ub217\uc148
+icon_encrypted = \uc7a0\uae40
+icon_family = \uAE00\uAF34
+icon_fema = \ub0a8\uc790\uc640 \uc5ec\uc790
+icon_female1 = \uc5ec\uc7901
+icon_female2 = \uc5ec\uc7902
+icon_females = \uc5ec\uc790\ub4e4
+icon_flag = \ube68\uac04\uc0c9 \uae43\ubc1c
+icon_flag-black = \uac80\uc740\uc0c9 \uae43\ubc1c
+icon_flag-blue = \ud30c\ub780\uc0c9 \uae43\ubc1c
+icon_flag-green = \ucd08\ub85d\uc0c9 \uae43\ubc1c
+icon_flag-orange = \uc8fc\ud669\uc0c9 \uae43\ubc1c
+icon_flag-pink = \ubd84\ud64d\uc0c9 \uae43\ubc1c
+icon_flag-yellow = \ub178\ub780\uc0c9 \uae43\ubc1c
+icon_folder = \ud3f4\ub354
+icon_forward = \uC55E\uC73C\uB85C
+icon_freemind_butterfly = \ud504\ub9ac\ub9c8\uc778\ub4dc
+icon_full-0 = \uc6b0\uc120\uc21c\uc704 0
+icon_full-1 = \uC6B0\uC120\uC21C\uC704 1
+icon_full-2 = \uC6B0\uC120\uC21C\uC704 2
+icon_full-3 = \uC6B0\uC120\uC21C\uC704 3
+icon_full-4 = \uC6B0\uC120\uC21C\uC704 4
+icon_full-5 = \uC6B0\uC120\uC21C\uC704 5
+icon_full-6 = \uC6B0\uC120\uC21C\uC704 6
+icon_full-7 = \uC6B0\uC120\uC21C\uC704 7
+icon_full-8 = \uc6b0\uc120\uc21c\uc704 8
+icon_full-9 = \uc6b0\uc120\uc21c\uc704 9
+icon_go = \ucd08\ub85d\uc0c9 \uc2e0\ud638\ub4f1
+icon_gohome = \uC9D1
+icon_group = \uadf8\ub8f9
+icon_help = \uC9C8\uBB38
+icon_hourglass = \uae30\ub2e4\ub9ac\ub294 \uc911
+icon_icon_not_found = \uc544\uc774\ucf58\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c
+icon_idea = \uC544\uC774\uB514\uC5B4
+icon_info = \uc815\ubcf4
+icon_kaddressbook = \uC804\uD654
+icon_kmail = \uc774\uba54\uc77c
+icon_knotify = \uC74C\uC545
+icon_korn = \uBA54\uC77C\uD568
+icon_ksmiletris = \uD589\uBCF5
+icon_licq = \uBA4B\uC9D0
+icon_list = \ubaa9\ub85d
+icon_Mail = \uBA54\uC77C
+icon_male1 = \ub0a8\uc7901
+icon_male2 = \ub0a8\uc7902
+icon_males = \ub0a8\uc790\ub4e4
+icon_menu = \uC544\uC774\uCF58
+icon_messagebox_warning = \uC911\uC694
+icon_multiplication = \uacf1\uc148
+icon_negative = \ubd80\uc815
+icon_neutral = \uc911\ub9bd
+icon_password = \uc5f4\uc1e0
+icon_penguin = \uB9AC\uB205\uC2A4
+icon_positive = \uae0d\uc815
+icon_prepare = \ub178\ub780\uc0c9 \uc2e0\ud638\ub4f1
+icon_smiley-angry = \ud654\ub0a8
+icon_smiley-neutral = \ubb34\ud45c\uc815
+icon_smiley-oh = \ub180\ub78c
+icon_smily_bad = \uc7ac\ubbf8 \uc5c6\uc5b4
+icon_stop = \ube68\uac04 \uc2e0\ud638\ub4f1
+icon_stop-sign = \uc815\uc9c0
+icon_subtraction = \ube84\uc148
+icon_unchecked = \uccb4\ud06c \ud574\uc81c
+icon_user_icon = \uc0ac\uc6a9\uc790 \uc544\uc774\ucf58
+icon_very_negative = \uac15\ud558\uac8c \ubd80\uc815
+icon_very_positive = \uac15\ud558\uac8c \uae0d\uc815
+icon_wizard = \uB9C8\uC220
+icon_xmag = \uc758\ub17c\ub418\uc5b4\uc57c \ud568
+icon_yes = \uC911\uC694
+IconGroupPopupAction.arrows.text = \ud654\uc0b4\ud45c
+IconGroupPopupAction.docs_folders.text = \ubb38\uc11c \ubc0f \ud3f4\ub354
+IconGroupPopupAction.flags.text = \uae43\ubc1c
+IconGroupPopupAction.math.text = \uc218\ud559
+IconGroupPopupAction.miscallaneous.text = \uae30\ud0c0
+IconGroupPopupAction.nature.text = \uc790\uc5f0
+IconGroupPopupAction.numbers.text = \uc22b\uc790
+IconGroupPopupAction.office.text = \uc0ac\ubb34\uc2e4
+IconGroupPopupAction.people.text = \uc0ac\ub78c\ub4e4
+IconGroupPopupAction.rating.text = \ud3c9\uac00
+IconGroupPopupAction.signs.text = \ud45c\uc9c0\ud310
+IconGroupPopupAction.smiley.text = \ud45c\uc815
+IconGroupPopupAction.time.text = \uc2dc\uac04
+IconGroupPopupAction.user.text = \uc0ac\uc6a9\uc790 \uc544\uc774\ucf58
+IconProgressExtended10Action.text = \ud655\uc7a5\ub41c \uc9c4\ud589\uc728 10%
+IconProgressExtended25Action.text = \ud655\uc7a5\ub41c \uc9c4\ud589\uc728 25%
+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>
+import = \uac00\uc838\uc624\uae30
+import_linked_branch_no_link = \uc120\ud0dd\ub41c \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)...
+ImportExplorerFavoritesAction.text = \uc990\uaca8\ucc3e\uae30 \ud0d0\uc0c9(&E)...
+ImportFolderStructureAction.text = \ud3f4\ub354 \uad6c\uc870(&F)...
+ImportLinkedBranchAction.text = \uc5f0\uacb0\ub41c \uac00\uc9c0(&L)
+ImportLinkedBranchWithoutRootAction.text = \ub8e8\ud2b8 \uc81c\uc678 \uc5f0\uacb0\ub41c \uac00\uc9c0(&W)...
+ImportMindmanagerFiles.text = &MindManager X5 \ub9f5...
+increase_branch_font_size = \ub354 \ud070 \uae00\uaf34
+IncreaseNodeFontAction.text = \ub354 \ud070 \uae00\uaf34
+invalid_uri = \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 URI {0}
+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
+LatexDeleteLatexAction.text = LaTe&X \uc218\uc2dd \uc81c\uac70
+LatexEditLatexAction.text = &LaTeX \uc218\uc2dd \ud3b8\uc9d1...
+LatexInsertLatexAction.text = &LaTeX \uc218\uc2dd \ucd94\uac00...
+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.
+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.
+load = \ubd88\ub7ec\uc624\uae30(&L)
+locking_failed_by_open = {0} \uB9F5\uD30C\uC77C \uC7A0\uAE08\uC791\uC5C5\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC77D\uAE30\uC804\uC6A9\uBAA8\uB4DC\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.
+locking_failed_by_save_as = {0} \uB9F5\uD30C\uC77C \uC7A0\uAE08\uC791\uC5C5\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC800\uC7A5\uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+locking_old_lock_removed = {0} \uB9F5\uD30C\uC77C\uC740 {1} \uC0AC\uC6A9\uC790\uC5D0 \uC758\uD574 \uC7A0\uACA8\uC788\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?
+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?
+ManageAddOnsAction.text = \ubd80\uac00 \uae30\ub2a5
+ManageAddOnsDialog.activate = \ud65c\uc131\ud654
+ManageAddOnsDialog.configure = \uc124\uc815
+ManageAddOnsDialog.deactivate = \ube44\ud65c\uc131\ud654
+ManageAddOnsDialog.deinstall = \uc81c\uac70
+ManageAddOnsDialog.error = \uc124\uce58 \uc911 \uc624\ub958: {0}.
+ManageAddOnsDialog.install = \uc124\uce58(&I)
+ManageAddOnsDialog.really.deinstall = \uc815\ub9d0\ub85c {0}\uc744(\ub97c) \uc81c\uac70\ud560\uae4c\uc694?
+ManageAddOnsDialog.select.tooltip = \ud30c\uc77c \uc120\ud0dd
+ManageAddOnsDialog.status.downloading = \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc \uc911...
+ManageAddOnsDialog.status.installing = \ubd80\uac00 \uae30\ub2a5 \uc124\uce58 \uc911...
+ManageAddOnsDialog.status.success = \uc124\uce58 \uc644\ub8cc {0}.
+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 \uC5F4\uB824\uC788\uC2B5\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_not_saved = The map was not saved before.
+menu_applyStyle = \uc2a4\ud0c0\uc77c \uc801\uc6a9
+menu_attributes = \uc18d\uc131(&A)
+menu_clouds = \uad6c\ub984
+menu_copy = \ubca0\uaef4\ub450\uae30
+menu_details = \uc790\uc138\ud55c \ub0b4\uc6a9
+menu_displayAttributes = \ub178\ub4dc \uc18d\uc131
+menu_encryption = \ube44\ubc00\ubc88\ud638 \ubcf4\ud638
+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_iconView = \uc544\uc774\ucf58
+menu_image = \uc774\ubbf8\uc9c0
+menu_insert = \uc0bd\uc785(&S)
+menu_manageStyles = \uc2a4\ud0c0\uc77c \uad00\ub9ac(&M)
+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_noteView = \ub178\ud2b8
+menu_progress = \uc9c4\ud589\uc728 \uc544\uc774\ucf58 (%)
+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_toolbars = \ub3c4\uad6c \uc0c1\uc790
+menu_view = \ubcf4\uae30(&V)
+mindmap = \uB9F5
+MindMapNodesFlavorHandler = \ub178\ub4dc \ub2e8\uacc4\ubcc4 \uad6c\uc870
+mindmaps = \ub9f5(&M)
+mindmaps_desc = \uB9F5 (*.mm)
+mindmaps_filter_desc = \ud544\ud130 (*.mmfilter)
+mode_na = \ubaa8\ub4dc \uc0ac\uc6a9 \ubd88\uac00
+mode_status = {0} \ubaa8\ub4dc\ub85c \uc804\ud658\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+mode_title = \ud504\ub9ac\ud50c\ub808\uc778 - {0}
+modes = \uBAA8\uB4DC
+ModesMenuAction.Browse.text = \ub9f5 \ube0c\ub77c\uc6b0\uc800
+ModesMenuAction.File.text = \ud30c\uc77c \ud0d0\uc0c9\uae30
+ModesMenuAction.MindMap.text = \ub9c8\uc778\ub4dc\ub9f5 \ud3b8\uc9d1\uae30
+most_recent_files = \uCD5C\uADFC\uC5D0 \uC5F4\uC5C8\uB358 \uD30C\uC77C
+MoveToRootAction.text = \ub8e8\ud2b8\ub85c \uac00\uae30
+NameConditionAction.text = \uc774\ub984 \uc9c0\uc815
+NavigationNextMapAction.text = \uB2E4\uC74C \uB9F5
+NavigationPreviousMapAction.text = \uC774\uC804 \uB9F5
+new = \uc0c8\ub85c \ub9cc\ub4e4\uae30(&N)
+new_map_from_user_templates.text = \ud15c\ud50c\ub9bf\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ub9f5 \ub9cc\ub4e4\uae30(&T)...
+new_mindmap = \uC0C8\uB85C\uC6B4 \uB9C8\uC778\uB4DC\uB9F5
+new_node = \uc0c8\ub85c\uc6b4 \ub178\ub4dc
+new_node_as_sibling_not_possible_for_the_root = \ub8e8\ud2b8\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.
+NewChildAction.text = \uD558\uC704 \uD56D\uBAA9 \uCD94\uAC00
+NewerFileRevisionsFoundDialog.file_name = \ud30c\uc77c
+NewerFileRevisionsFoundDialog.file_size = \ubc14\uc774\ud2b8
+NewerFileRevisionsFoundDialog.open = \uc5f4\uae30(&O)
+NewerFileRevisionsFoundDialog.restore = \ub418\uc0b4\ub9ac\uae30(&O)
+NewerFileRevisionsFoundDialog.restore.tooltip = {0}\uc744 {1}(\uc73c)\ub85c \ub300\uccb4
+NewLevelStyleAction.text = \ub2e8\uacc4\ubcc4 \uc2a4\ud0c0\uc77c \ucd94\uac00
+NewMapAction.text = \uc0c8\ub85c\uc6b4 \ub9f5(&N)
+NewParentNode.text = \uc0c8\ub85c\uc6b4 \ubd80\ubaa8 \ub178\ub4dc
+NewParentNode.tooltip = <html>\uC120\uD0DD\uB41C \uBAA8\uB4E0 \uD56D\uBAA9\uC774 \uC0C1\uC704\uB85C \uC774\uB3D9\uB429\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
+NextNodeAction.BACK.text = \uc774\uc804 \ub178\ub4dc\ub85c \uac00\uae30
+NextNodeAction.FORWARD.text = \ub2e4\uc74c \ub178\ub4dc\ub85c \uac00\uae30
+no = \uC544\uB2C8\uC624
+no_format_copy_before_format_paste = \uBAA8\uC591\uC744 \uBCF5\uC0AC\uD558\uAE30 \uC804\uAE4C\uC9C0\uB294 \uBD99\uC5EC\uB123\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+no_found_from = "{1}" \uC5D0\uC11C "{0}"\uC744 \uCC3E\uC9C0\uBABB\uD588\uC2B5\uB2C8\uB2E4..
+no_more_found_from = "{1}" \uC5D0\uC11C "{0}"\uC744 \uB354\uC774\uC0C1 \uBABB\uD588\uC2B5\uB2C8\uB2E4..
+no_previous_find = \uC774\uC804\uC5D0\uC11C \uB354\uC774\uC0C1 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.
+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 = Dragging changes node location, ctrl+dragging changes distances, double click and ctrl+double click reset them.
+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
+NodeBackgroundColorAction.text = \ub178\ub4dc \ubc30\uacbd\uc0c9(&N)...
+NodeColorAction.text = \ub178\ub4dc \uc0c9\uc0c1...
+NodeColorBlendAction.text = \uC0C9\uC0C1 \uD63C\uD569
+NodeDownAction.text = \ub178\ub4dc \uc774\ub3d9\ud558\uae30 (\ud615\uc81c \uc544\ub798\ub85c)
+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...
+NodeShapeAction.bubble.text = \uac70\ud488\ud615\ud0dc\uc758 \uc678\uacfd\uc120(&B)
+NodeShapeAction.fork.text = \uc678\uacfd\uc120 \uc5c6\uc560\uae30(&F)
+NodeUpAction.text = \ub178\ub4dc \uc774\ub3d9\ud558\uae30 (\ud615\uc81c \uc704\ub85c)
+nonboldify_branch = \uAD75\uC9C0 \uC54A\uAC8C
+nonitalicise_branch = \uae30\uc6b8\uc784 \ud574\uc81c
+normal = \ubcf4\ud1b5
+not_saved_for_link_error = \ub9c1\ud06c \uc624\ub958: \uc774 \ud30c\uc77c\uc744 \uc800\uc7a5\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud30c\uc77c\uc120\ud0dd\uc5d0 \uc758\ud574 \ub9c1\ud06c\ub97c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
+note_window_location = \ub178\ud2b8 \ud328\ub110 \uc704\uce58
+ok = \ud655\uc778(&O)
+OKAction.text = \ud655\uc778(&O)
+OpenAction.text = \uc800\uc7a5\ub41c \ub9f5 \uc5f4\uae30(&O)...
+OpenFreeplaneSiteAction.text = \ud504\ub9ac\ud50c\ub808\uc778 \ud648\ud398\uc774\uc9c0
+OpenPathAction.text = \ud30c\uc77c \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)
+OptionalDontShowMeAgainDialog.dontShowAgain = \uB2E4\uC74C\uBD80\uD130 \uBB3C\uC5B4\uBCF4\uC9C0 \uC54A\uC74C(&D).
+OptionalDontShowMeAgainDialog.ok = \uC608(&Y)
+OptionalDontShowMeAgainDialog.rememberMyDescision = \uACB0\uC815\uC744 \uAE30\uC5B5\uD568(&R).
+OptionPanel.absolute = \uc808\ub300 \uacbd\ub85c
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = \uC790\uB3D9 \uB808\uC774\uC544\uC6C3 \uD328\uD134
+OptionPanel.ADD_CHILD = \uc790\uc2dd \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_save_folding = \ud56d\uc0c1 \uc800\uc7a5
+OptionPanel.antialias = \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2f1
+OptionPanel.antialias.tooltip = <html>\ub9f5\uc758 \ud654\uc9c8\uc744 \uacb0\uc815\ud569\ub2c8\ub2e4. \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2f1\ub97c \ub9ce\uc774 \uc0ac\uc6a9\ud558\uba74 \ub354 \ub290\ub824\uc9d1\ub2c8\ub2e4.</html>
+OptionPanel.antialias_all = \ubaa8\ub450 \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2f1
+OptionPanel.antialias_edges = \uc5f0\uacb0 \uc120\ub9cc \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2f1
+OptionPanel.antialias_none = \uc564\ud2f0\uc5d0\uc77c\ub9ac\uc5b4\uc2f1 \uc0ac\uc6a9 \uc548\ud568
+OptionPanel.Appearance = \uc0dd\uae40\uc0c8
+OptionPanel.ar = \uc544\ub78d\uc5b4 / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ARC = \uc6d0\ud638
+OptionPanel.as_parent = \uBD80\uBAA8 \uAC12
+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_level1 = \uB8E8\uD2B8\uB178\uB4DC \uBAA8\uC591
+OptionPanel.automaticFormat_level2 = 1\uB2E8\uACC4 \uB178\uB4DC \uBAA8\uC591
+OptionPanel.Behaviour = \ub3d9\uc791 \uc124\uc815
+OptionPanel.bezier = \ubca0\uc9c0\uc5b4 \uace1\uc120
+OptionPanel.bubble = \uac70\ud488 \ubaa8\uc591
+OptionPanel.Cancel = \uCDE8\uC18C
+OptionPanel.center_selected_node = \uc790\ub3d9\uc73c\ub85c \uc120\ud0dd\ub41c \ub178\ub4dc\ub97c \uc911\uc559 \uc815\ub82c
+OptionPanel.check_updates_automatically = \ud504\ub85c\uadf8\ub7a8 \uc2dc\uc791 \uc2dc \uc5c5\ub370\uc774\ud2b8 \ud655\uc778
+OptionPanel.childpattern = \uc790\uc2dd \ud328\ud134
+OptionPanel.childpattern.tooltip = \uC120\uD0DD\uB41C \uD328\uD134\uC740 \uBAA8\uB4E0 \uD558\uC704\uB178\uB4DC\uC5D0 \uC801\uC6A9\uB429\uB2C8\uB2E4.
+OptionPanel.clear_all_setters = \ubaa8\ub450 \uc804\ud658
+OptionPanel.clear_all_setters.tooltip = \uBCC0\uACBD\uC0AC\uD56D \uC9C0\uC2DC\uC790\uB97C \uBAA8\uB450 \uD65C\uC131\uD654 \uB610\uB294 \uBE44\uD65C\uC131\uD654 \uD569\uB2C8\uB2E4.
+OptionPanel.cloud = \uad6c\ub984
+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>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 = \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.
+OptionPanel.da = \ub374\ub9c8\ud06c\uc5b4 / dansk
+OptionPanel.date_format = \ud45c\uc900 \ub0a0\uc9dc \ud615\uc2dd
+OptionPanel.datetime_format = \ud45c\uc900 \ub0a0\uc9dc-\uc2dc\uac04 \ud615\uc2dd
+OptionPanel.de = \ub3c5\uc77c\uc5b4 / Deutsch
+OptionPanel.default = \uAE30\uBCF8\uAC12
+OptionPanel.default_browser_command_mac = \uB9E4\uD0A8\uD1A0\uC2DC \uAE30\uBCF8 \uBD80\uB77C\uC6B0\uC800 \uBA85\uB839\uC5B4
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_other_os = \uB2E4\uB978 \uC6B4\uC601\uCCB4\uC81C\uC758 \uAE30\uBCF8 \uBE0C\uB77C\uC6B0\uC800 \uBA85\uB839\uC5B4
+OptionPanel.default_browser_command_other_os.tooltip = <html> \uC77C\uBC18\uC801\uC73C\uB85C \uB9AC\uB205\uC2A4 \uC785\uB2C8\uB2E4:</html>
+OptionPanel.default_browser_command_windows_9x = Windows 9x \uAE30\uBCF8 \uBE0C\uB77C\uC6B0\uC800 \uBA85\uB839\uC5B4
+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_nt = Windows NT \uAE30\uBCF8 \uBE0C\uB77C\uC6B0\uC800 \uBA85\uB839\uC5B4
+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 = \ubb38\uc790\uc9d1\ud569
+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> If the files should be deleted automatically on a normal shutdown of Freeplane set the following variable to true</html>
+OptionPanel.delete_nodes_without_question = Delete nodes without confirmation?
+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.disable_cursor_move_paper = \uB9C8\uC778\uB4DC\uB9F5 \uD654\uBA74\uC744 \uB9C8\uC6B0\uC2A4 \uB4DC\uB798\uADF8\uB85C \uC6C0\uC9C1\uC774\uC9C0 \uBABB\uD558\uAC8C
+OptionPanel.disable_cursor_move_paper.tooltip = <html>\uB9C8\uC778\uB4DC\uB9F5 \uD654\uBA74\uC744 \uB4DC\uB798\uADF8\uD560 \uB54C \uC774\uB3D9 \uCEE4\uC11C\uB97C \uBCF4\uC774\uC9C0 \uC54A\uC74C</html>
+OptionPanel.display_node_id = \ub178\ub4dc\uc758 ID \ud45c\uc2dc
+OptionPanel.edgecolor = \uc5f0\uacb0 \uc120 \uc0c9\uc0c1
+OptionPanel.edgecolor.tooltip = \ubd80\ubaa8 \ub178\ub4dc\ub85c \uac00\ub294 \uc5f0\uacb0 \uc120\uc758 \uc18d\uc131 (\ubaa8\ub4e0 \ud558\uc704\ub178\ub4dc\uc5d0 \uc801\uc6a9 \ub428)
+OptionPanel.edgestyle = \uc5f0\uacb0 \uc120 \uc2a4\ud0c0\uc77c
+OptionPanel.edgestyle.tooltip = \ubd80\ubaa8 \ub178\ub4dc\ub85c \uac00\ub294 \uc5f0\uacb0 \uc120\uc758 \uc18d\uc131 (\ubaa8\ub4e0 \ud558\uc704\ub178\ub4dc\uc5d0 \uc801\uc6a9 \ub428)
+OptionPanel.edgewidth = \uc5f0\uacb0 \uc120 \uad74\uae30
+OptionPanel.edgewidth.tooltip = \ubd80\ubaa8 \ub178\ub4dc\ub85c \uac00\ub294 \uc5f0\uacb0 \uc120\uc758 \uc18d\uc131 (\ubaa8\ub4e0 \ud558\uc704\ub178\ub4dc\uc5d0 \uc801\uc6a9 \ub428)
+OptionPanel.EDIT_CURRENT = \ub0b4\uc6a9 \ub36e\uc5b4\uc4f0\uae30
+OptionPanel.el = \uadf8\ub9ac\uc2a4\uc5b4 / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__enter_confirms_by_default = Enter Confirms By Default
+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__position_window_below_node = Position Window Below Node
+OptionPanel.en = \uc601\uc5b4 / English
+OptionPanel.Environment = \uD658\uACBD\uC124\uC815
+OptionPanel.es = \uc2a4\ud398\uc778\uc5b4 / espa\u00f1ol, castellano
+OptionPanel.et = \uc5d0\uc2a4\ud1a0\ub2c8\uc544\uc5b4 / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking = Scripts should be carried out without confirmation?
+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.experimental_file_locking_on = \uD30C\uC77C \uC7A0\uADF8\uAE30 (\uD14C\uC2A4\uD2B8\uC911\uC778 \uAE30\uB2A5\uC784)
+OptionPanel.experimental_file_locking_on.tooltip = <html>\uD14C\uC2A4\uD2B8\uC911\uC778 \uAE30\uB2A5\uC785\uB2C8\uB2E4.</html>
+OptionPanel.export_icons_in_html = HTML\uC5D0\uC11C \uC544\uC774\uCF58\uB3C4 \uB0B4\uBCF4\uB0B4\uAE30
+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.Files = \uD30C\uC77C
+OptionPanel.first = \uCC98\uC74C
+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>
+OptionPanel.fork = \uc678\uacfd\uc120 \uc5c6\uc74c
+OptionPanel.format_locale = \ubb38\uc790\uc5f4 \ud615\ud0dc\uc5d0 \uc801\uc6a9\ud560 \uad6d\uac00 \uc124\uc815
+OptionPanel.fr = \ud504\ub791\uc2a4\uc5b4 / Fran\u00e7ais
+OptionPanel.gl = Gl
+OptionPanel.gtk = Gtk
+OptionPanel.hr = \ud06c\ub85c\uc544\ud2f0\uc544\uc5b4 / hrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Based On Headings
+OptionPanel.html_export_fold_all = \uBAA8\uB4E0 \uB0B4\uC6A9 \uC811\uAE30
+OptionPanel.html_export_fold_currently_folded = \uC811\uD78C \uAC00\uC9C0\uB4E4\uC740 \uC811\uD788\uAC8C
+OptionPanel.html_export_folding = Html Export Folding
+OptionPanel.html_export_no_folding = \uAC00\uC9C0\uAC00 \uC811\uD788\uC9C0 \uC54A\uAC8C
+OptionPanel.hu = \ud5dd\uac00\ub9ac\uc5b4 / Magyar
+OptionPanel.icon = \uC544\uC774\uCF58
+OptionPanel.icon.tooltip = \uC801\uC6A9\uB418\uBA74 \uD574\uB2F9 \uB178\uB4DC\uB294 \uC774 \uC544\uC774\uCF58\uC73C\uB85C \uC124\uC815\uB429\uB2C8\uB2E4.
+OptionPanel.id = \uc778\ub3c4\ub124\uc2dc\uc544\uc5b4 / Bahasa Indonesia
+OptionPanel.it = \uc774\ud0c8\ub9ac\uc544\uc5b4 / Italiano
+OptionPanel.ja = \uc77c\ubcf8\uc5b4 / \u65e5\u672c\u8a9e
+OptionPanel.Keystrokes = \uB2E8\uCD95\uD0A4
+OptionPanel.ko = \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.label_font_family = \uae00\uaf34
+OptionPanel.label_font_size = \uae00\uc790 \ud06c\uae30
+OptionPanel.language = \uC5B8\uC5B4
+OptionPanel.language.tooltip = <html>\uD504\uB9AC\uB9C8\uC778\uB4DC\uC758 \uC5B8\uC5B4\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. \uC790\uB3D9\uC744 \uD604 \uC2DC\uC2A4\uD15C\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uC5B8\uC5B4\uB97C \uC790\uB3D9\uC744 \uCC3E\uAC8C\uB429\uB2C8\uB2E4.</html>
+OptionPanel.last = \uB9C8\uC9C0\uB9C9
+OptionPanel.last_opened_list_length = \uC5F4\uC5C8\uB358 \uBB38\uC11C \uBCF4\uAD00 \uAC2F\uC218
+OptionPanel.links = \uB9C1\uD06C
+OptionPanel.links.tooltip = <html>Set Links either relative or absolute </html>
+OptionPanel.load_last_map = \uB9C8\uC9C0\uB9C9\uC5D0 \uC5F4\uC5C8\uB358 \uBB38\uC11C \uC790\uB3D9\uC73C\uB85C \uC5F4\uAE30
+OptionPanel.load_last_map.tooltip = <html>\uCCB4\uD06C\uD558\uC2DC\uBA74 Freeplane \uC2DC\uC791\uC2DC, \uB9C8\uC9C0\uB9C9\uC5D0 \uC5F4\uC5C8\uB358 \uBB38\uC11C\uB97C \uC790\uB3D9\uC73C\uB85C \uBD88\uB7EC\uC635\uB2C8\uB2E4.</html>
+OptionPanel.lookandfeel = \uC2A4\uD0A8\uC120\uD0DD
+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 work for applets</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = \ucd5c\ub300 \ub178\ub4dc \ub108\ube44
+OptionPanel.max_node_width.tooltip = <html>The default maximal node width in pixels</html>
+OptionPanel.max_shortened_text_length = \ub2e8\ucd95\ub41c \ubb38\uc790\uc5f4\uc758 \ucd5c\ub300 \ub108\ube44
+OptionPanel.metal = \uBA54\uD0C8
+OptionPanel.min_node_width = \ucd5c\uc18c \ub178\ub4dc \ub108\ube44
+OptionPanel.motif = \uBAA8\uD2F0\uD504(\uD478\uB978\uACC4\uC5F4)
+OptionPanel.never_save_folding = \uc808\ub300 \uc800\uc7a5 \uc548\ud568
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = \uB178\uB4DC \uBC30\uACBD\uC0C9
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = \uB178\uB4DC \uC0C9\uC0C1
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+OptionPanel.nodefontbold = \uAD75\uAC8C
+OptionPanel.nodefontitalic = \uae30\uc6b8\uc784
+OptionPanel.nodefontname = \uAE00\uAF34
+OptionPanel.nodefontsize = \uae00\uc790 \ud06c\uae30
+OptionPanel.nodeformat = \uc11c\uc2dd
+OptionPanel.nodeshape = \ub178\ub4dc \uc2a4\ud0c0\uc77c
+OptionPanel.nodeshape.tooltip = nodeshape.tooltip
+OptionPanel.nodetext = \uB178\uB4DC \uAE00\uC790
+OptionPanel.nodetext.tooltip = nodetext.tooltip
+OptionPanel.nothing = \uc5c6\uc74c
+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> 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.OK = \uC800\uC7A5
+OptionPanel.org.freeplane.plugin.bugreport.allowed = \ud56d\uc0c1 \ubcf4\ub0b4\uae30
+OptionPanel.org.freeplane.plugin.bugreport.ask = \ubc84\uadf8 \uc2e0\uace0 \ub300\ud654 \uc0c1\uc790 \ubcf4\uc774\uae30
+OptionPanel.org.freeplane.plugin.bugreport.denied = \uc808\ub300 \uc548 \ubcf4\ub0b4\uae30
+OptionPanel.outline_hgap = \uc218\ud3c9 \uac70\ub9ac
+OptionPanel.outline_vgap = \uc218\uc9c1 \uac70\ub9ac
+OptionPanel.patternname = \uC774\uB984
+OptionPanel.patternname.tooltip = \uC911\uBCF5\uB418\uC9C0 \uC54A\uC740 \uD328\uD134 \uC774\uB984
+OptionPanel.pl = \ud3f4\ub780\ub4dc\uc5b4 / polski
+OptionPanel.placenewbranches = \uC0C8\uB85C\uC6B4 \uAC00\uC9C0 \uB9CC\uB4E4\uAE30
+OptionPanel.placenewbranches.tooltip = <html>Where to place new branches. Valid values are 'first' and 'last' </html>
+OptionPanel.plugins = \ud50c\ub7ec\uadf8\uc778
+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.relative = \uc0c1\ub300 \uacbd\ub85c
+OptionPanel.ROUND_RECT = \uc9c1\uc0ac\uac01\ud615 (\ub465\uadfc \uaf2d\uc9c0\uc810)
+OptionPanel.ru = \ub7ec\uc2dc\uc544\uc5b4 / \u0420\u0443\u0441\u0441\u043a\u0438\u0439
+OptionPanel.save_folding_if_map_is_changed = \ub9f5\uc774 \ubcc0\uacbd\ub420 \uacbd\uc6b0
+OptionPanel.scrollbar_increment = \uc18d\ub3c4
+OptionPanel.selection_method = \ub178\ub4dc \uc120\ud0dd \ubc29\ubc95
+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 = \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.attributes = \uc18d\uc131
+OptionPanel.separator.automatic_save = \uc790\ub3d9 \uc800\uc7a5
+OptionPanel.separator.behaviour = \ub3d9\uc791 \uc124\uc815
+OptionPanel.separator.browser = \uBE0C\uB77C\uC6B0\uC800
+OptionPanel.separator.CloudControls = \uad6c\ub984
+OptionPanel.separator.commands_for_the_program = \ud504\ub85c\uadf8\ub7a8 \uba85\ub839\uc5b4
+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.EdgeControls = \uc5f0\uacb0 \uc120
+OptionPanel.separator.edit_long_node_window = \uc790\uc138\ud788 \ud3b8\uc9d1\ud558\uae30
+OptionPanel.separator.editing = \ud3b8\uc9d1\uae30 \uc124\uc815
+OptionPanel.separator.files = \uD30C\uC77C
+OptionPanel.separator.formula = \uc218\uc2dd
+OptionPanel.separator.General = \uC77C\uBC18
+OptionPanel.separator.html_export = Html \uB0B4\uBCF4\uB0B4\uAE30
+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.initial_map_size = \uC2DC\uC791\uC2DC \uAE30\uBCF8 \uB9F5\uD30C\uC77C \uC0AC\uC774\uC988
+OptionPanel.separator.key_typing = \uD0A4 \uC785\uB825
+OptionPanel.separator.language = \uC5B8\uC5B4
+OptionPanel.separator.load = \ubd88\ub7ec\uc624\uae30
+OptionPanel.separator.look_and_feel = \uC2A4\uD0A8\uC120\uD0DD
+OptionPanel.separator.mouse_wheel = \uB9C8\uC6B0\uC2A4 \uD720
+OptionPanel.separator.new_node_commands = \ub178\ub4dc \ucd94\uac00 \uba85\ub839\uc5b4
+OptionPanel.separator.node_editing_commands = \ub178\ub4dc \ud3b8\uc9d1 \uba85\ub839\uc5b4
+OptionPanel.separator.node_navigation_commands = \ub178\ub4dc \uc0ac\uc774 \uc774\ub3d9 \uba85\ub839\uc5b4
+OptionPanel.separator.NodeColors = \uB178\uB4DC \uC0C9\uC0C1
+OptionPanel.separator.NodeFont = \uB178\uB4DC \uAE00\uAF34
+OptionPanel.separator.notifications = Confirmations
+OptionPanel.separator.other_defaults = \uAE30\uD0C0 \uAE30\uBCF8\uAC12
+OptionPanel.separator.others = Other key bindings
+OptionPanel.separator.patterns = \uD328\uD134
+OptionPanel.separator.root_node_appearance = Root node appearance
+OptionPanel.separator.save = \uC800\uC7A5
+OptionPanel.separator.selection_method = \ub178\ub4dc \uc120\ud0dd \ubc29\ubc95
+OptionPanel.separator.undo = \uC2E4\uD589 \uCDE8\uC18C
+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.sharp_bezier = \uC608\uB9AC\uD55C \uACE1\uC120
+OptionPanel.sharp_linear = \uC608\uB9AC\uD55C \uC9C1\uC120
+OptionPanel.sk = \uc2ac\ub85c\ubc14\ud0a4\uc544\uc5b4 / sloven\u010dina
+OptionPanel.sl = \uc2ac\ub85c\ubca0\ub2c8\uc544\uc5b4 / sloven\u0161\u010dina
+OptionPanel.sr = \uc138\ub974\ube44\uc544\uc5b4 / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standardbackgroundcolor = \ub178\ub4dc \ud45c\uc900 \ubc30\uacbd\uc0c9
+OptionPanel.standardbackgroundcolor.tooltip = <html>The standard background color in html notation </html>
+OptionPanel.standardcloudcolor = \uad6c\ub984 \ud45c\uc900 \uc0c9\uc0c1
+OptionPanel.standardcloudcolor.tooltip = <html>The standard cloud color in html notation </html>
+OptionPanel.standardcloudestyle = \uad6c\ub984 \ud45c\uc900 \uc2a4\ud0c0\uc77c
+OptionPanel.standardcloudestyle.tooltip = <html>The standard cloud style. currently, only 'bezier' is supported</html>
+OptionPanel.standardlinkcolor = \ub9c1\ud06c \ud45c\uc900 \uc0c9\uc0c1
+OptionPanel.standardlinkcolor.tooltip = <html>The standard link color in html notation </html>
+OptionPanel.standardlinkestyle = \ub9c1\ud06c \ud45c\uc900 \uc2a4\ud0c0\uc77c
+OptionPanel.standardlinkestyle.tooltip = <html>The standard link style. currently, only 'bezier' is supported</html>
+OptionPanel.standardselectednodecolor = \uc120\ud0dd\ub41c \ub178\ub4dc\uc758 \ud45c\uc900 \uae00\uc790\uc0c9
+OptionPanel.standardselectednodecolor.tooltip = <html>The standard node color if selected. In html notation (#RRGGBB in hex values) </html>
+OptionPanel.STAR = \ubcc4 \ubaa8\uc591
+OptionPanel.sv = \uc2a4\uc6e8\ub374\uc5b4 / svenska
+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> 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.max_tooltip_width = \uD234\uD301 \uB108\uBE44
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>\uB514\uD3F4\uD2B8 \uD234\uD301 \uB108\uBE44\uB97C \uD53D\uC140\uB2E8\uC704\uB85C \uC785\uB825\uD558\uC138\uC694.</html>
+OptionPanel.tr = \ud130\ud0a4\uc5b4 / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+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\uB97C \uC811\uC2B5\uB2C8\uB2E4.
+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 = \uD0ED \uC0AC\uC6A9
+OptionPanel.use_tabbed_pane.tooltip = \uC120\uD0DD\uD558\uC2DC\uBA74 \uBB38\uC11C\uAC00 \uD0ED\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4 (FireFox \uCC98\uB7FC :-) ).
+OptionPanel.vi = \ubca0\ud2b8\ub0a8\uc5b4 / Ti\u1ebfng Vi\u1ec7t
+OptionPanel.wheel_velocity = \uC18D\uB3C4
+OptionPanel.wheel_velocity.tooltip = \uAC12\uC774 \uB192\uC73C\uBA74 \uBB38\uC11C\uC5D0\uC11C \uB9C8\uC6B0\uC2A4 \uD720\uC774 \uBE60\uB974\uAC8C \uC6C0\uC9C1\uC774\uB294 \uD6A8\uACFC\uAC00 \uC788\uC2B5\uB2C8\uB2E4.
+OptionPanel.windows = \uC708\uB3C4\uC6B0
+OptionPanel.zh_CN = \uc911\uad6d\uc5b4 \uac04\uccb4 / \u7b80\u4f53\u5b57
+OptionPanel.zh_TW = \uc911\uad6d\uc5b4 \ubc88\uccb4 / \u7e41\u9ad4\u5b57
+PageAction.text = \uD398\uC774\uC9C0 \uC124\uC815...
+PasteAction.text = \ubd99\uc5ec\ub123\uae30(&P)
+PatternNewNameProperty = \uC0C8 \uD328\uD134
+PatternToString.backgroundColor = \uBC30\uACBD\uC0C9
+PatternToString.Child = \uD558\uC704\uB178\uB4DC \uC2A4\uD0C0\uC77C
+PatternToString.color = \uC0C9
+PatternToString.EdgeColor = \uD14C\uB450\uB9AC \uC0C9\uC0C1
+PatternToString.EdgeStyle = \uAC00\uC9C0\uC2A4\uD0C0\uC77C -
+PatternToString.EdgeWidth = \uAC00\uC9C0\uD615\uD0DC -
+PatternToString.FontBold = \uAD75\uAC8C
+PatternToString.FontItalic = \uAE30\uC6B8\uAC8C
+PatternToString.FontName = \uAE00\uAF34\uC774\uB984
+PatternToString.Icon = \uC544\uC774\uCF58
+PatternToString.NodeFontSize = \uAE00\uC790\uD06C\uAE30
+plugins/latex/LatexNodeHook.editorTitle = LaTeX \uc218\uc2dd \ud3b8\uc9d1
+plugins/ScriptEditor.cancel = \ubcc0\uacbd \uc0ac\ud56d\uc744 \uc800\uc7a5\ud558\uc9c0 \uc54a\uace0 \uc885\ub8cc(&D)
+plugins/ScriptEditor.exit = \uc800\uc7a5 \ud6c4 \uc885\ub8cc(&S)
+plugins/ScriptEditor.menu_actions = \ub3d9\uc791(&A)
+plugins/ScriptEditor.new_script = \uC0C8 \uC2A4\uD06C\uB9BD\uD2B8
+plugins/ScriptEditor.run = \uC2E4\uD589(&R)
+plugins/ScriptEditor.sign = \uc2a4\ud06c\ub9bd\ud2b8 \uc11c\uba85\ud558\uae30...
+plugins/ScriptEditor/window.Result = \uACB0\uACFC:
+plugins/ScriptEditor/window.title = \uC2A4\uD06C\uB9BD\uD2B8 \uD3B8\uC9D1\uAE30
+plugins/TimeList.xml_Created = \uC0DD\uC131\uB428
+plugins/TimeList.xml_Date = \uC77C
+plugins/TimeList.xml_Icons = \uC544\uC774\uCF58
+plugins/TimeList.xml_Modified = \uC218\uC815\uB428
+plugins/TimeList.xml_Notes = \uB178\uD2B8
+plugins/TimeList.xml_Text = \uD14D\uC2A4\uD2B8
+plugins/TimeManagement.xml_appendButton = \uc120\ud0dd\ub41c \ub178\ub4dc\uc5d0 \ub0a0\uc9dc \uc0bd\uc785
+plugins/TimeManagement.xml_Cancel = \uCDE8\uC18C
+plugins/TimeManagement.xml_cancelButton = \uCDE8\uC18C
+plugins/TimeManagement.xml_closeButton = \uB2EB\uAE30
+plugins/TimeManagement.xml_Export = \uC120\uD0DD\uB41C \uB178\uB4DC \uB0B4\uBCF4\uB0B4\uAE30
+plugins/TimeManagement.xml_Find = \uCC3E\uAE30
+plugins/TimeManagement.xml_Goto = \uAC00\uAE30
+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_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\ub2c8\uba74 \uae30\uc874\uc758 \ud0c0\uc774\uba38\ub97c \uc720\uc9c0\ud560\uae4c\uc694? (NO)</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = {0,\uC77C} {0,\uC2DC} \uC5D0 \uC54C\uB824\uC8FC\uAE30
+plugins/TimeManagement.xml_removeReminderButton = \uC54C\uB9BC\uAE30\uB2A5 \uC81C\uAC70
+plugins/TimeManagement.xml_removeReminderButton_tooltip = \uc120\ud0dd\ub41c \ub178\ub4dc\uc5d0 \uc5f0\uacb0\ub41c \ubaa8\ub4e0 \uc54c\ub9bc \uae30\ub2a5 \uc81c\uac70.
+plugins/TimeManagement.xml_Replace = \uBC14\uAFB8\uAE30
+plugins/TimeManagement.xml_Replace_All = \uBAA8\uB450 \uBC14\uAFB8\uAE30
+plugins/TimeManagement.xml_Replace_Selected = \uC120\uD0DD\uB41C \uC601\uC5ED \uBC14\uAFB8\uAE30
+plugins/TimeManagement.xml_Select = \uC120\uD0DD
+plugins/TimeManagement.xml_todayButton = \uC624\uB298
+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\ud558\uae30(&P)...
+PrintDirectAction.text = \uC778\uC1C4...
+printing_settings = \uC778\uC1C4 \uBE44\uC728
+PrintPreviewAction.text = \uc778\uc1c4 \ubbf8\ub9ac\ubcf4\uae30(&V)...
+PropertyAction.dialog = \ud658\uacbd\uc124\uc815
+PropertyAction.text = \uD658\uACBD\uC124\uC815 ...
+QuitAction.text = \uc885\ub8cc(&Q)
+read_only = \uC77D\uAE30 \uC804\uC6A9
+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 = \uB178\uB4DC\uB97C \uC815\uB9D0\uB85C \uC790\uB97C\uAE4C\uC694?
+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 = \uB178\uB4DC\uB97C \uC815\uB9D0\uB85C \uC0AD\uC81C\uD560\uAE4C\uC694?
+RedoAction.text = \ub2e4\uc2dc \uc2e4\ud589(&R)
+RedoFilterAction.text = \uB2E4\uC2DC \uC2E4\uD589
+ReminderHookAction.text = \uc54c\ub9bc \ud45c\uc2dc \uc81c\uac70
+ReminderHookAction.tooltip = \ub178\ub4dc\uc5d0\uc11c \uc54c\ub9bc \ud45c\uc2dc \uc81c\uac70
+RemoveAllIconsAction.text = \uBAA8\uB4E0 \uC544\uC774\uCF58 \uC0AD\uC81C
+RemoveIcon_0_Action.text = \uccab\ubc88\uc9f8 \uc544\uc774\ucf58 \uc81c\uac70
+RemoveIconAction.text = \uB9C8\uC9C0\uB9C9 \uC544\uC774\uCF58 \uC0AD\uC81C
+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. \uB9C1\uD06C\uB97C \uC218\uC815\uD558\uACA0\uC2B5\uB2C8\uAE4C?
+replace = \uBC14\uAFB8\uAE30
+ResetNodeLocationAction.text = \uC704\uCE58 \uB9AC\uC14B
+save_failed = \uB9F5 \uC800\uC7A5\uC791\uC5C5\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+save_unsaved = \uB2E4\uC74C\uC758 \uB9C8\uC778\uB4DC\uB9F5\uC744 \uC800\uC7A5\uD560\uAE4C\uC694? :
+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 = \ub2e4\ub978 \uc774\ub984\uc73c\ub85c \uc800\uc7a5(&A)...
+saved = \uC800\uC7A5\uB428
+scheme_evaluate = \uD3C9\uAC00!
+ScriptEditor.text = \uC2A4\uD06C\uB9BD\uD2B8 \uD3B8\uC9D1\uAE30(&C)...
+ScriptEditor.tooltip = Freeplane\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?
+select_favorites_folder = \uC990\uACA8\uCC3E\uB294 \uD3F4\uB354 \uC120\uD0DD
+select_folder_for_importing = \uB0B4\uBCF4\uB0BC \uD3F4\uB354 \uC120\uD0DD
+SelectAllAction.text = \ubcf4\uc774\ub294 \ub178\ub4dc \ubaa8\ub450 \uc120\ud0dd(&V)
+SelectBranchAction.text = \ubcf4\uc774\ub294 \ub178\ub4dc \ud558\uc704 \ud56d\ubaa9 \uc120\ud0dd(&B)
+SelectedPasteAction.text = \uc120\ud0dd\ud558\uc5ec \ubd99\uc5ec\ub123\uae30(&A)...
+selection_method_by_click = \ud55c \ubc88 \ud074\ub9ad\ud558\uc5ec \uc120\ud0dd
+selection_method_delayed = \ub9c8\uc6b0\uc2a4\ub97c \uac00\uc838\uac00\uba74 \uc57d\uac04\uc758 \uc9c0\uc5f0 \ud6c4 \uc120\ud0dd
+selection_method_direct = \ub9c8\uc6b0\uc2a4\ub97c \uac00\uc838\uac00\uba74 \ubc14\ub85c \uc120\ud0dd
+SelectNoteAction.text = Note Edit Switch
+SelectNoteAction.tooltip = Switch to resp. from note window
+SetImageByFileChooserAction.text = \uC774\uBBF8\uC9C0 (\uD30C\uC77C\uC120\uD0DD \uB610\uB294 \uB9C1\uD06C \uCD94\uAC00)...
+SetLinkByFileChooserAction.text = \uB9C1\uD06C (\uD30C\uC77C\uC120\uD0DD)...
+SetLinkByTextFieldAction.text = \uB9C1\uD06C (\uD14D\uC2A4\uD2B8)...
+ShowHideNoteAction.text = \uB178\uD2B8 \uCC3D
+ShowHideNoteAction.tooltip = Lets the note window appear resp. disappear.
+ShowSelectionAsRectangleAction.text = \uC0AC\uAC01\uD615 \uBAA8\uC591\uC73C\uB85C \uC120\uD0DD \uCF1C\uAE30/\uB044\uAE30
+simplyhtml.aboutFrameTitle = \uD504\uB85C\uADF8\uB7A8 \uC815\uBCF4
+simplyhtml.aboutLabel = SimplyHTML \uC815\uBCF4...
+simplyhtml.alignCenter = \uAC00\uC6B4\uB370
+simplyhtml.alignLabel = \uC815\uB82C:
+simplyhtml.alignLeft = \uC67C\uCABD
+simplyhtml.alignRight = \uC624\uB978\uCABD
+simplyhtml.allCellsRangeLabel = \uBAA8\uB4E0 \uC140
+simplyhtml.allOccurrencesReplaced = \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4
+simplyhtml.appendTableColLabel = \uCE78 \uCD94\uAC00
+simplyhtml.appendTableRowLabel = \uC904 \uCD94\uAC00
+simplyhtml.applyCellAttrLabel = \uC801\uC6A9
+simplyhtml.backgroundLabel = \uBC30\uACBD:
+simplyhtml.boldItalicName = \uAD75\uACE0 \uAE30\uC6B8\uAC8C
+simplyhtml.boldName = \uAD75\uAC8C
+simplyhtml.borderColorLabel = \uC0C9\uC0C1:
+simplyhtml.borderWidthLabel = \uB108\uBE44
+simplyhtml.bottomLabel = \uD558\uB2E8:
+simplyhtml.cancelBtnName = \uCDE8\uC18C
+simplyhtml.cellBorderTabLabel = \uD14C\uB450\uB9AC
+simplyhtml.cellGenTabLabel = \uC77C\uBC18
+simplyhtml.cellMarginTabLabel = \uC5EC\uBC31
+simplyhtml.cellPanelTitle = \uC140 \uBAA8\uC591
+simplyhtml.clearFormatLabel = \uAE00\uC790 \uBAA8\uC591 \uC81C\uAC70
+simplyhtml.clearFormatTip = \uAE00\uC790 \uBAA8\uC591 \uC81C\uAC70
+simplyhtml.close = \uB2EB\uAE30
+simplyhtml.closeBtnName = \uB2EB\uAE30
+simplyhtml.colorLabel = \uC0C9
+simplyhtml.copyLabel = \uD558\uC704\uB97C \uD3EC\uD568\uD55C \uBCF5\uC0AC
+simplyhtml.copyTip = \uBCF5\uC0AC
+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 = \uB9C1\uD06C
+simplyhtml.cTagNameOL = \uC21C\uC11C\uC788\uB294 \uBAA9\uB85D
+simplyhtml.cTagNamePara = \uBB38\uB2E8
+simplyhtml.cTagNameUL = \uC21C\uC11C\uC5C6\uB294 \uBAA9\uB85D
+simplyhtml.cutLabel = \uC798\uB77C\uB0B4\uAE30
+simplyhtml.cutTip = \uC798\uB77C\uB0B4\uAE30
+simplyhtml.defaultDocName = \uC81C\uBAA9\uC5C6\uC74C
+simplyhtml.deleteTableColLabel = \uCE78 \uC0AD\uC81C
+simplyhtml.deleteTableRowLabel = \uC904 \uC0AD\uC81C
+simplyhtml.docTitleQuery = \uC81C\uBAA9 \uC124\uC815:
+simplyhtml.docTitleTitle = \uBB38\uC11C\uC81C\uBAA9 \uD3B8\uC9D1
+simplyhtml.editLabel = \uD3B8\uC9D1
+simplyhtml.effectLabel = \uD6A8\uACFC
+simplyhtml.familyLabel = \uAE00\uAF34
+simplyhtml.findNext = \uB2E4\uC74C \uCC3E\uAE30...
+simplyhtml.findReplaceDialogTitle = \ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30
+simplyhtml.findReplaceLabel = \ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30
+simplyhtml.findReplaceTip = \ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30
+simplyhtml.fontBoldLabel = \uAD75\uAC8C
+simplyhtml.fontBoldTip = \uAD75\uAC8C \uC124\uC815/\uCDE8\uC18C
+simplyhtml.fontColorLabel = \ubb38\uc790 \uc0c9
+simplyhtml.fontColorTip = \ubb38\uc790 \uc0c9
+simplyhtml.fontDialogTitle = \uAE00\uC790\uBAA8\uC591
+simplyhtml.fontItalicLabel = \uae30\uc6b8\uc784
+simplyhtml.fontItalicTip = \uAE30\uC6B8\uAC8C \uC124\uC815/\uCDE8\uC18C
+simplyhtml.fontLabel = \uae00\uaf34...
+simplyhtml.fontTabLabel = \uAE00\uAF34
+simplyhtml.fontTip = \uAE00\uC790\uBAA8\uC591 \uC124\uC815...
+simplyhtml.fontUnderlineLabel = \uBC11\uC904
+simplyhtml.fontUnderlineTip = \uBC11\uC904 \uC124\uC815/\uCDE8\uC18C
+simplyhtml.foregroundLabel = \uAE00\uC790:
+simplyhtml.formatLabel = \uBAA8\uC591
+simplyhtml.formatListLabel = \uBAA9\uB85D...
+simplyhtml.formatListTip = \uBAA9\uB85D \uD615\uD0DC \uBCC0\uACBD
+simplyhtml.formatParaLabel = \uBB38\uB2E8...
+simplyhtml.formatParaTip = \uBB38\uB2E8 \uBAA8\uC591 \uBCC0\uACBD
+simplyhtml.formatTableLabel = \uD45C...
+simplyhtml.formatTableTip = \uD45C \uBAA8\uC591
+simplyhtml.helpLabel = \uB3C4\uC6C0\uB9D0
+simplyhtml.htmlTabTitle = HTML \ucf54\ub4dc \ubcf4\uae30
+simplyhtml.imageFileDesc = \uC774\uBBF8\uC9C0 \uD30C\uC77C
+simplyhtml.insertTableColLabel = \uc5f4 \uc0bd\uc785
+simplyhtml.insertTableLabel = \uD45C...
+simplyhtml.insertTableMsg = \uc5f4 \uc218\ub97c \uc785\ub825\ud558\uc138\uc694.
+simplyhtml.insertTableRowLabel = \ud589 \uc0bd\uc785
+simplyhtml.insertTableTitle = \ud45c \uc0bd\uc785
+simplyhtml.italicName = \uae30\uc6b8\uc784
+simplyhtml.layoutTabTitle = \uD3B8\uC9D1\uD654\uBA74 \uBCF4\uAE30
+simplyhtml.leftLabel = \uC67C\uCABD:
+simplyhtml.listDialogTitle = \uD615\uD0DC \uBAA9\uB85D
+simplyhtml.listIndentTitle = \uB4E4\uC5EC\uC4F0\uAE30:
+simplyhtml.listPosInside = \uC548\uCABD
+simplyhtml.listPositionLabel = \uC704\uCE58:
+simplyhtml.listPosOutside = \uBC14\uAE65\uCABD
+simplyhtml.listTypeCircle = \uC6D0
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = file symbol as bullet
+simplyhtml.listTypeLabel = \uc885\ub958:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = \uC5C6\uC74C
+simplyhtml.listTypeSquare = \uC0AC\uAC01\uD615
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = \uBC14\uAE65\uCABD
+simplyhtml.matchCase = \uB300\uC18C\uBB38\uC790 \uAD6C\uBD84
+simplyhtml.newStyleDefaultName = \uC0C8 \uC2A4\uD0C0\uC77C
+simplyhtml.nextTableCellLabel = \uB2E4\uC74C \uC140
+simplyhtml.noLineLabel = \uC5C6\uC74C
+simplyhtml.noMoreOccurrencesFound = \uB354 \uC774\uC0C1 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
+simplyhtml.okBtnName = \uD655\uC778
+simplyhtml.paddingLabel = \uC548\uCABD
+simplyhtml.paraAlignCenterLabel = \uAC00\uC6B4\uB370 \uC815\uB82C
+simplyhtml.paraAlignCenterTip = \uAC00\uC6B4\uB370\uB85C \uBB38\uB2E8 \uC815\uB82C
+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.paraTabLabel = \uBB38\uB2E8
+simplyhtml.pasteLabel = \uBD99\uC5EC\uB123\uAE30
+simplyhtml.pasteTip = \uBD99\uC5EC\uB123\uAE30
+simplyhtml.plainName = \uBCF4\uD1B5
+simplyhtml.previewLabel = \uBBF8\uB9AC\uBCF4\uAE30
+simplyhtml.previewText = \ubb38\uc790\uc5f4 \ubbf8\ub9ac\ubcf4\uae30
+simplyhtml.prevTableCellLabel = \uC774\uC804 \uC140
+simplyhtml.printLabel = \uc778\uc1c4...
+simplyhtml.redoLabel = \uB2E4\uC2DC \uC2E4\uD589
+simplyhtml.redoTip = \uB2E4\uC2DC \uC2E4\uD589
+simplyhtml.replace = \uBC14\uAFB8\uAE30...
+simplyhtml.replaceAll = \uBAA8\uB450
+simplyhtml.replaceDone = \uC644\uB8CC
+simplyhtml.replaceNo = \uC544\uB2C8\uC624
+simplyhtml.replaceThisQuery = \ucc3e\uc744 \ubb38\uc790\uc5f4:
+simplyhtml.replaceWith = \uBC14\uAFC0 \uBB38\uC790\uC5F4:
+simplyhtml.replaceYes = \uC608
+simplyhtml.rightLabel = \uC624\uB978\uCABD:
+simplyhtml.searchDown = \uC544\uB798\uB85C \uAC80\uC0C9
+simplyhtml.searchFromStart = \uCC98\uC74C\uBD80\uD130 \uAC80\uC0C9
+simplyhtml.searchUp = \uC704\uB85C \uAC80\uC0C9
+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.tableBgColLabel = \uBC30\uACBD\uC0C9:
+simplyhtml.tableDialogTitle = \uD14C\uC774\uBE14 \uBAA8\uC591
+simplyhtml.tableLabel = \uD45C
+simplyhtml.tablePanelTitle = \uD14C\uC774\uBE14 \uBAA8\uC591
+simplyhtml.tableWidthLabel = \uB108\uBE44:
+simplyhtml.textIndentLabel = \uB4E4\uC5EC\uC4F0\uAE30:
+simplyhtml.textToFind = \uCC3E\uC744 \uBB38\uC790\uC5F4:
+simplyhtml.thisCellRangeLabel = \uD604\uC7AC \uC140
+simplyhtml.thisColRangeLabel = \uD604\uC7AC \uC5F4
+simplyhtml.thisRowRangeLabel = \uD604\uC7AC \uD589
+simplyhtml.toggleBulletsLabel = \uC21C\uC11C\uC5C6\uB294 \uBAA9\uB85D \uCF1C\uAE30/\uB044\uAE30
+simplyhtml.toggleBulletsTip = \uC21C\uC11C\uC5C6\uB294 \uBAA9\uB85D \uCF1C\uAE30/\uB044\uAE30
+simplyhtml.toggleNumbersLabel = \uC21C\uC11C\uC788\uB294 \uBAA9\uB85D \uCF1C\uAE30/\uB044\uAE30
+simplyhtml.toggleNumbersTip = \uC21C\uC11C\uC788\uB294 \uBAA9\uB85D \uCF1C\uAE30/\uB044\uAE30
+simplyhtml.topLabel = \uC0C1\uB2E8:
+simplyhtml.uLineLabel = \uBC11\uC904
+simplyhtml.unableToOpenFileError = \uD30C\uC77C\uC744 \uC5F4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
+simplyhtml.unableToRedoError = \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4:
+simplyhtml.unableToUndoError = \uC2E4\uD589\uCDE8\uC18C \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4:
+simplyhtml.undoLabel = \uC2E4\uD589 \uCDE8\uC18C
+simplyhtml.undoTip = \uC2E4\uD589 \uCDE8\uC18C
+simplyhtml.valignBaseline = \uBCA0\uC774\uC2A4\uB77C\uC778
+simplyhtml.valignBottom = \uC544\uB798
+simplyhtml.valignLabel = \uC138\uB85C\uC815\uB82C:
+simplyhtml.valignMiddle = \uC911\uAC04
+simplyhtml.valignTop = \uC704
+simplyhtml.wholeWordsOnly = \uC804\uCCB4 \uB2E8\uC5B4 \uC77C\uCE58
+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)
+SplitConditionAction.text = \ub098\ub204\uae30
+SplitNode.text = \ub178\ub4dc \ub098\ub204\uae30(&S)
+style = \uC2A4\uD0C0\uC77C
+styles = \uc2a4\ud0c0\uc77c(&Y)
+styles.date = \ub0a0\uc9dc
+styles.definition = \uc6a9\uc5b4 \uc815\uc758
+styles.floating_node = \ub5a0 \uc788\ub294 \ub178\ub4dc
+styles.idea = \uc544\uc774\ub514\uc5b4
+styles.important = \uc911\uc694
+styles.key = \uc5f4\uc1e0
+styles.list = \ubaa9\ub85d
+styles.note = \ub178\ud2b8
+styles.ok = OK
+styles.question = \uc9c8\ubb38
+styles.quotation = \uc778\uc6a9
+styles.root_node = \uc2a4\ud0c0\uc77c
+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.website = \uc6f9\uc0ac\uc774\ud2b8
+svg = SVG
+TimeListAction.text = \uC2DC\uAC04 \uAD00\uB9AC\uBAA9\uB85D\uCC3D \uC5F4\uAE30 ...
+TimeListAction.tooltip = \uBAA8\uB4E0 \uC2A4\uCF00\uC904 \uD56D\uBAA9\uACFC \uC5F0\uACB0\uD56D\uBAA9 \uBCF4\uC774\uAE30
+TimeManagementAction.text = \uB2EC\uB825 \uBCF4\uC774\uAE30...
+TimeManagementAction.tooltip = <html>Kai Toedter\uB2D8\uC774 \uC81C\uACF5\uD55C \uB2EC\uB825 \uBAA8\uB4C8\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.</html>
+ToggleChildrenFoldedAction.text = \uD558\uC704 \uB2E8\uACC4\uB97C \uC811\uAE30(\uD3B4\uAE30)
+ToggleFoldedAction.text = \uD558\uC704 \uD56D\uBAA9 \uC811\uAE30
+ToggleLeftToolbarAction.text = \uc544\uc774\ucf58 \ub3c4\uad6c \uc0c1\uc790 \ubcf4\uc774\uae30/\uc228\uae30\uae30(&I)
+ToggleMenubarAction.text = \uba54\ub274 \ubcf4\uc774\uae30/\uc228\uae30\uae30
+ToggleToolbarAction.text = \ub3c4\uad6c \uc0c1\uc790 \ubcf4\uc774\uae30/\uc228\uae30\uae30(&T)
+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 = \uC2E4\uD589 \uCDE8\uC18C
+unfold = \uD3BC\uCE58\uAE30
+UnfoldAllAction.text = \uBAA8\uB4E0 \uB0B4\uC6A9 \uD3BC\uCE58\uAE30
+UnfoldAllAction.tooltip = <html>\uc120\ud0dd\ub41c \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 = <html>\uc120\ud0dd\ub41c \ub178\ub4dc\ub85c\ubd80\ud130 \ud55c \ub2e8\uacc4\uae4c\uc9c0\ub9cc \ud3bc\uce69\ub2c8\ub2e4.</html>
+url_error = \uC774 \uACBD\uB85C\uB294 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4!
+url_load_error = \ud574\ub2f9 URL\uc758 \ub9f5\uc744 \uc77d\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4:
+UsePlainTextAction.text = \uC77C\uBC18 \uD14D\uC2A4\uD2B8
+user_defined_zoom = \uc0ac\uc6a9\uc790 \uc9c0\uc815
+user_defined_zoom_status_bar = \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C {0}% \uC758 \uBE44\uC728\uB85C \uD655\uB300/\uCD95\uC18C
+user_zoom = \uC0AC\uC6A9\uC790 \uC815\uC758 \uD504\uB9B0\uD2B8 \uBE44\uC728 (0.0 - 2.0):
+width = \uB108\uBE44
+xslt_export.html = HTML \ubb38\uc11c
+xslt_export.latex = LaTeX \ubb38\uc11c
+xslt_export.latexbook = LaTeX \ucc45
+xslt_export.mediawiki = \ubbf8\ub514\uc5b4\uc704\ud0a4
+xslt_export.ms_excel = \uc5d1\uc140 (2003 \uc774\ud6c4) XML \ud615\uc2dd
+xslt_export.ms_word = \uc6cc\ub4dc (2003 \uc774\ud6c4) XML \ud615\uc2dd
+xslt_export_not_possible = \ud504\ub9ac\ud50c\ub808\uc778 XSLT \ub0b4\ubcf4\ub0b4\uae30 \ubd88\uac00
+yes = \uC608
+ZoomInAction.text = \uD655\uB300
+ZoomOutAction.text = \uCD95\uC18C
diff --git a/freeplane/resources/translations/Resources_lt.properties b/freeplane/resources/translations/Resources_lt.properties
new file mode 100644
index 0000000..b3aac7c
--- /dev/null
+++ b/freeplane/resources/translations/Resources_lt.properties
@@ -0,0 +1,579 @@
+AboutAction.text = Apie
+accessories/plugins/EncryptNode.properties_0 = \u012Eveskite u\u017Ekoduotos at\u0161akos slapta\u017Eod\u012F
+accessories/plugins/EncryptNode.properties_1 = Slapta\u017Eod\u017Eiai nesutampa arba yra per trumpi.
+accessories/plugins/EncryptNode.properties_2 = \u012Eveskite slapta\u017Eod\u012F:
+accessories/plugins/EncryptNode.properties_3 = Pakartokite slapta\u017Eod\u012F:
+accessories/plugins/EncryptNode.properties_4 = \u012Eveskite slapta\u017Eod\u012F.
+accessories/plugins/EncryptNode.properties_5 = <html>Atkreipkite d\u0117mesi, koduot\u0117s stiprumas<br> beveik absoliu\u010Diai priklauso nuo slapta\u017Eod\u017Eio sud\u0117tingumo.
+accessories/plugins/EncryptNode.properties_6 = Gerai
+accessories/plugins/EncryptNode.properties_7 = At\u0161aukti
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Atrakinti ar u\u017Erakinti galite tik u\u017Ekoduotas at\u0161akas. Pirma sukurkite toki\u0105 i\u0161 \u012Eranki\u0173 meniu.
+accessories/plugins/EncryptNode.properties_select_me = Pasirink mane ir prat\u0119sime!
+accessories/plugins/EncryptNode.properties_wrong_password = Klaidingas slapta\u017Eodis.
+accessories/plugins/ExportWithXSLT.tooltip = Standartinis eksportavimo metodas naudojant XSLT skriptus.
+accessories/plugins/ExportWithXSLT_HTML.text = \u012E XHTML (JavaScript versija)...
+accessories/plugins/ExportWithXSLT_HTML3.text = \u012E XHTML (versija su \u017Eem\u0117lapio atvaizdu)...
+add = prid\u0117ti
+AddLocalLinkAction.text = Prid\u0117ti vietin\u0119 nuorod\u0105
+antialias_all = I\u0161lyginti visk\u0105
+antialias_edges = I\u0161lyginti kra\u0161tines
+antialias_none = Nelyginti nieko
+as_parent = Kaip motinin\u0117s
+attributes_attribute = atributai
+attributes_close = u\u017Edaryti
+attributes_deselect_all = Nieko
+attributes_edit = redaguoti
+attributes_popup_edit = redaguoti
+attributes_refresh = atnaujinti
+attributes_visible = matomi
+attributes_visible_tooltip = matomi
+AutomaticLayoutAction.text = Automatinis schemos stilius
+AutomaticLayoutAction.tooltip = <html>Sutvarko \u017Eem\u0117lapio schemos stili\u0173. <br>Pirmas lygis - juodas, antras - m\u0117lynas, etc.</html>
+BackAction.text = Atgal
+background = Fonas
+BlinkingNodeHookAction.text = Mirksinti at\u0161aka
+BlinkingNodeHookAction.tooltip = <html>At\u0161aka ima mirks\u0117ti. B\u016Bkite atsarg\u016Bs. Nesusiekite su daugybe at\u0161ak\u0173 ir <strong> negali b\u016Bti taikomas tai pa\u010Diai at\u0161akai drauge su kitais automatiniais stiliais</strong></html>
+BoldAction.text = Sodrinti
+boldify_branch = Sodrinti
+branch = \u0160aka
+cancel = At\u0161aukti
+CancelAction.text = At\u0161aukti
+cannot_add_parent_diff_parents = Norint panaudoti \u0161i\u0105 funkcij\u0105 visos at\u0161akos turi tur\u0117ti t\u0105 pa\u010Di\u0105 motinin\u0119.
+cannot_add_parent_to_root = \u0160aknis negali tur\u0117ti motinin\u0117s at\u0161akos.
+cannot_join_nodes_with_children = Negaliu sujungti motinini\u0173 ir dukterini\u0173 at\u0161ak\u0173
+cannot_move_to_child = Perkelti motinin\u0119 at\u0161ak\u0105 \u012F dukterin\u0119 - ne\u012Fmanoma.
+CenterAction.text = Centruoti
+ChangeConnectorArrowsAction.backward.text = Atgal
+ChangeConnectorArrowsAction.forward.text = Pirmyn
+choose_background_color = Pasirinkite fono spalv\u0105:
+choose_cloud_color = Pasirinkite debesies spalv\u0105:
+choose_edge_color = Pasirinkite kra\u0161tin\u0117s spalv\u0105
+choose_node_background_color = Pasirinkite fonin\u0119 at\u0161akos spalv\u0105:
+choose_node_color = Pasirinkite at\u0161akos spalv\u0105:
+CloseAction.text = U\u017Edaryti
+CloudAction.text = Debesis
+CloudColorAction.text = Debesies spalva...
+ColorProperty.ResetColor = Atstatyti spalv\u0105
+combined = Kombinuotas
+CopyAction.text = Kopijuoti
+CopySingleAction.text = Kopijuoti vienetin\u012F
+CreationModificationPluginAction.text = Rodyti modifikavimo laikus
+CreationModificationPluginAction.tooltip = <html>\u0160i funkcija seka at\u0161akos suk\u016Brimo ir modifikavimo laikus.</html>
+CutAction.text = I\u0161kirpti
+decrease_branch_font_size = Ma\u017Einti \u0161rift\u0105
+DecreaseNodeFontAction.text = Ma\u017Einti \u0161rift\u0105
+delete = i\u0161trinti
+delete_child = I\u0161trinti at\u0161ak\u0105
+DeleteAction.text = Pa\u0161alinti at\u0161ak\u0105
+DocumentationAction.text = Dokumentacija
+edge = Kra\u0161tin\u0117
+edge_style = Kra\u0161tin\u0117s stilius
+edge_width = Kra\u0161tin\u0117s plotis
+EdgeColorAction.text = Kra\u0161tin\u0117s spalva...
+EdgeStyleAction.bezier.text = Lenktas
+EdgeStyleAction.linear.text = Linijinis
+EdgeStyleAction.sharp_bezier.text = Smailas lenktas
+EdgeStyleAction.sharp_linear.text = Smailas linijinis
+EdgeStyleAsParentAction.text = Kaip motinin\u0117s
+EdgeWidthAction_width_parent.text = Kaip motinin\u0117s
+EdgeWidthAction_width_thin.text = Plonas
+edit = Redaguoti
+edit_link_manually = Redaguoti nuorod\u0105 rankomis...
+EditAction.text = Redaguoti at\u0161ak\u0105
+EditFilterAction.text = redaguoti
+EditLongAction.text = Redaguoti ilg\u0105 at\u0161ak\u0105...
+EncryptedMap.text = Sukurti u\u017Ekoduot\u0105 \u017Eem\u0117lap\u012F ...
+EncryptedMap.tooltip = Sukurti nauj\u0105 u\u017Ekoduot\u0105 \u017Eem\u0117lap\u012F
+enter_base_url = Ketinu \u012Fkelti reliatyvias nuorodas. \u012Eveskite bazin\u0119 URL.
+enter_confirms = 'Enter' patvirtina
+EnterPassword.text = Atrakinti/u\u017Erakinti u\u017Ekoduot\u0105 at\u0161ak\u0105 / \u017Eem\u0117lap\u012F
+error_creating_directory = Nepavyksta sukurti aplanko eksportavimui.
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Eksportuoti
+ExportBranchToHTMLAction.text = \u0160ak\u0105 \u012F HTML
+ExportPdf.text = \u012E PDF...
+ExportSvg.text = \u012E SVG...
+ExportToHTMLAction.text = \u012E HTML
+ExportToImage.jpg.text = \u012E JPEG...
+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
+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
+filter_delete = i\u0161trinti
+filter_does_not_exist = neegzistuoja
+filter_enter_value = \u012Evesti vert\u0119
+filter_exist = egzistuoja
+filter_icon = piktograma
+filter_is_equal_to = yra tapatus
+filter_is_not_equal_to = n\u0117ra tapatus
+filter_node = at\u0161akos tekstas
+filter_not = ne
+filter_or = ar
+filter_select = pasirinkti
+find_what = Ko ie\u0161koti
+FindAction.text = Rasti...
+fit_map_to_page = Talpinti \u012F vien\u0105 puslap\u012F
+FitToPage.text = Talpinti \u012F puslap\u012F
+FitToPage.tooltip = Nustato rodymo dydi taip, kad visas \u017Eem\u0117lapis tilpt\u0173 lange.
+fold = Suskleisti
+FoldAllAction.text = Suskleisti visk\u0105
+FoldAllAction.tooltip = <html>Suskleid\u017Eia pasirinktas ir visas j\u0173 dukterines at\u0161akas.</html>
+FoldOneLevelAction.text = Suskleisti vienu lygiu
+FoldOneLevelAction.tooltip = <html>Suskleid\u017Eia pasirinktas at\u0161akas vienu lygiu.</html>
+font = \u0160riftas
+FontFamilyAction.text = \u0161riftas
+FontSizeAction.text = \u0161rifto dydis
+format_menu_edge_styles = Kra\u0161tini\u0173 stiliai
+format_menu_edge_widths = Kra\u0161tini\u0173 plo\u010Diai
+FormatCopy.text = Kopijuoti stili\u0173
+FormatCopy.tooltip = <html>Kopijuoja at\u0161akos stili\u0173.</html>
+FormatPaste.text = \u012Ekelti stili\u0173
+FormatPaste.tooltip = <html>\u012Ekelia at\u0161akos stili\u0173.</html>
+ForwardAction.text = Pirmyn
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = Pagalba...
+FreeplaneHelpStarter.tooltip = Freeplane i\u0161pl\u0117stin\u0117 pagalba
+GotoLinkNodeAction.text = Goto nuoroda
+GrabKeyDialog.common.cancel = At\u0161aukti
+GrabKeyDialog.common.ok = Gerai
+GrabKeyDialog.grab-key.assigned-to = Susietas su
+GrabKeyDialog.grab-key.assigned-to.none = Nesusietas
+GrabKeyDialog.grab-key.clear = I\u0161valyti
+GrabKeyDialog.grab-key.remove = Pa\u0161alinti
+GrabKeyDialog.grab-key.remove-ask = Ar tikrai norite pa\u0161alinti \u0161\u012F klavi\u0161o veiksm\u0105?
+GrabKeyDialog.grab-key.title = \u012Eveskite nauj\u0105 klavi\u0161\u0105
+help = Pagalba
+HierarchicalIconsAction.text = Piktogramas rodyti hierarchi\u0161kai
+HierarchicalIconsAction.tooltip = Jei kuri nors mano dukterin\u0117 at\u0161aka turi piktogram\u0105, a\u0161 j\u0105 irgi rodysiu.
+html_export_based_on_headings = HTML Eksportas - Pagal antra\u0161tes
+html_export_fold_all = HTML Eksportas - Suskleisti visk\u0105
+html_export_fold_currently_folded = HTML Eksportas - Suskleisti, kas suskleista
+html_export_no_folding = HTML Eksportas - Nesuskleisti
+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]
+icon_attach = Pa\u017Ei\u016Br\u0117ti
+icon_back = Atgal
+icon_bee = Freeplane[translate me]
+icon_bell = Prisiminti
+icon_bookmark = Puiku
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Blogai
+icon_button_ok = Gerai
+icon_calendar = Data
+icon_clanbomber = Pavojinga
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Nepamir\u0161ti
+icon_fema = Females[translate me]
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_females = Females[translate me]
+icon_flag = V\u0117liava
+icon_flag-black = Black Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_forward = Pirmyn
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioritetas 1
+icon_full-2 = Prioritetas 2
+icon_full-3 = Prioritetas 3
+icon_full-4 = Prioritetas 4
+icon_full-5 = Prioritetas 5
+icon_full-6 = Prioritetas 6
+icon_full-7 = Prioritetas 7
+icon_gohome = Namai
+icon_help = Klausimas
+icon_idea = Id\u0117ja
+icon_info = Info[translate me]
+icon_kaddressbook = Telefonas
+icon_knotify = Muzika
+icon_korn = Pa\u0161to d\u0117\u017Eut\u0117
+icon_ksmiletris = Man linksma
+icon_licq = Smagu
+icon_Mail = Pa\u0161tas
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Piktogramos
+icon_messagebox_warning = Svarbu
+icon_password = Raktas
+icon_pencil = Per\u017Ei\u016Br\u0117ti
+icon_penguin = Linux
+icon_smily_bad = I'm not amused[translate me]
+icon_stop = Stop
+icon_wizard = Stebuklinga
+icon_xmag = Aptarti
+icon_yes = Svarbu
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Pasirinkti piktogram\u0105...
+IconSelectionPlugin.tooltip = <html>\u010Cia galite pasirinkti piktogram\u0105 i\u0161 sublango.</html>
+import = Importuoti
+import_linked_branch_no_link = Pasirinkta at\u0161aka neturi nuorodos i\u0161 kurios b\u016Bt\u0173 galima importuoti.
+ImportBranchAction.text = \u0160ak\u0105...
+ImportExplorerFavoritesAction.text = Explorerio Favoritus...
+ImportFolderStructureAction.text = Aplank\u0173 strukt\u016Br\u0105...
+ImportLinkedBranchAction.text = Susiet\u0105 \u0161ak\u0105
+ImportLinkedBranchWithoutRootAction.text = (Susiet\u0105 \u0161ak\u0105) be \u0161aknies...
+ImportMindmanagerFiles.text = MindManager X5 \u017Eem\u0117lap\u012F...
+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.
+locking_failed_by_save_as = Nepavyko u\u017Erakinti \u017Eem\u0117lapio {0}. ''I\u0161saugoti kaip'' sustabdoma.
+locking_old_lock_removed = \u017Dem\u0117lap\u012F {0} u\u017Erakino vartotojas {1}. U\u017Eraktas d\u0117l senaties pa\u0161alintas.
+long_node_changed_cancel = J\u016Bs pakeit\u0117t\u0117 at\u0161ak\u0105. Ar norite at\u0161aukti pakeitimus?
+lots_of_links_warning = J\u016Bs kuriate daug nuorod\u0173 \u012F t\u0105 pa\u010Di\u0105 at\u0161ak\u0105. Ar tikrai norite sukurti \u0161ias nuorodas?
+map_already_exists = Toks \u017Eem\u0117lapis jau sukurtas. Ar norite i\u0161saugoti vietoje jo?
+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)
+mode_na = Re\u017Eimas nepasiekiamas
+mode_status = Re\u017Eimas pakeistas \u012F {0} re\u017Eim\u0105
+mode_title = Freeplane - {0} Re\u017Eimas
+modes = Re\u017Eimai
+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
+NavigationNextMapAction.text = Kitas \u017Eem\u0117lapis
+NavigationPreviousMapAction.text = Ankstesnis \u017Eem\u0117lapis
+new_mindmap = Naujas \u017Eem\u0117lapis
+new_node = Nauja at\u0161aka
+new_node_as_sibling_not_possible_for_the_root = \u0160aknis negali tur\u0117ti broli\u0161k\u0173 at\u0161ak\u0173
+NewChildAction.text = Nauja dukterin\u0117 at\u0161aka
+NewMapAction.text = Nauji
+NewParentNode.text = Nauja motinin\u0117 at\u0161aka
+NewParentNode.tooltip = <html>Pasirinktos at\u0161akos jungiamos prie naujos motinin\u0117s.</html>
+NewPreviousSiblingAction.text = Nauja ankstesn\u0117 broli\u0161ka at\u0161aka
+NewSiblingAction.text = Nauja broli\u0161ka at\u0161aka
+no = Ne
+no_format_copy_before_format_paste = Negalite \u012Fkelti stiliaus, kol jis n\u0117ra nukopijuotas.
+no_found_from = Nerastas "{0}" i\u0161 "{1}".
+no_more_found_from = Daugiau "{0}" nerasta i\u0161 "{1}".
+no_previous_find = Ankstesni\u0173 nerasta.
+node = At\u0161aka
+node_changed_discard_changes = J\u016Bs pakeit\u0117t\u0117 at\u0161ak\u0105. Ar norite at\u0161aukti pakeitimus?
+NodeBackgroundColorAction.text = Fonin\u0117 at\u0161akos spalva...
+NodeColorAction.text = At\u0161akos spalva...
+NodeColorBlendAction.text = Atskiesti spalv\u0105
+NodeDownAction.text = At\u0161ak\u0105 \u017Eemyn
+NodeListAction.text = Rodyti \u017Eem\u0117lapio istorij\u0105 ...
+NodeListAction.tooltip = Visos at\u0161akos rodomos su suk\u016Brimo/modifikavimo laiku.
+NodeShapeAction.bubble.text = Balionas
+NodeShapeAction.fork.text = \u0160akut\u0117
+NodeUpAction.text = At\u0161ak\u0105 auk\u0161tyn
+nonboldify_branch = At\u0161aukti sodrinim\u0105
+nonitalicise_branch = At\u0161aukti pvertim\u0105
+normal = Normaliai
+not_saved_for_link_error = \u017Dem\u0117lapis turi b\u016Bti i\u0161saugotas, prie\u0161 nustatant nuoroda bylos pasirinkimo b\u016Bdu
+ok = Gerai
+OKAction.text = Gerai
+OpenAction.text = Atverti...
+OpenFreeplaneSiteAction.text = Freeplane's Homepage[translate me]
+option_changes_may_require_restart = Norint aktyvuoti pakeitimus, veikiausiai reik\u0117s perkrauti Freeplane.
+OptionalDontShowMeAgainDialog.dontShowAgain = Don't ask me again.[translate me]
+OptionPanel.absolute = Absoliutus
+OptionPanel.antialias = I\u0161lyginimas
+OptionPanel.antialias.tooltip = <html>Vizualin\u0117 \u017Eem\u0117lapio kokyb\u0117. Kuo daugiau i\u0161lyginimo, tuo didesnis kompiuterio apkrovimas.</html>
+OptionPanel.antialias_all = I\u0161lyginti visk\u0105
+OptionPanel.antialias_edges = I\u0161lyginti kra\u0161tines
+OptionPanel.antialias_none = Jokio i\u0161lyginimo
+OptionPanel.Appearance = I\u0161vaizda
+OptionPanel.ar = Ar[translate me]
+OptionPanel.as_parent = Kaip motinin\u0117
+OptionPanel.automatic = Automatin\u0117
+OptionPanel.Behaviour = Elgsena
+OptionPanel.bezier = Lenktas
+OptionPanel.bubble = Balionas
+OptionPanel.Cancel = At\u0161aukti
+OptionPanel.combined = Kombinuotas
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Standartinis
+OptionPanel.default_browser_command_mac = Standartin\u0117s nar\u0161ykl\u0117s komanda Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> ir MAC: (a\u010Di\u016B Nick!)</html>
+OptionPanel.default_browser_command_other_os = Standartin\u0117s nar\u0161ykl\u0117s komanda kitoms OS
+OptionPanel.default_browser_command_other_os.tooltip = <html> Tai da\u017Eniausiai yra Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Standartin\u0117s nar\u0161ykl\u0117s komanda Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Windows ("" simboliai reikalingi d\u0117l nuorod\u0173 turin\u010Di\u0173 "=" savo URL).</html>
+OptionPanel.default_browser_command_windows_nt = Standartin\u0117s nar\u0161ykl\u0117s komanda Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Windows ("" simboliai reikalingi d\u0117l nuorod\u0173 turin\u010Di\u0173 "=" savo URL).</html>
+OptionPanel.Defaults = Standartai
+OptionPanel.delete_automatic_saves_at_exit = I\u0161jungiant program\u0105 i\u0161trinti automatinius i\u0161saugojimus
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Jei automatiniai i\u0161saugojimai turi b\u016Bti i\u0161trinami normaliai i\u0161jungiant program\u0105 Freeplane kintam\u0105j\u012F nustato kaip 'true'</html>
+OptionPanel.disable_cursor_move_paper = I\u0161jungti ne\u0161ant\u012F kursori\u0173
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Nerodyti ne\u0161an\u010Dio kursoriaus piktogramos, kol "ne\u0161amas" \u017Eem\u0117lapis</html>
+OptionPanel.el__enter_confirms_by_default = Standarti\u0161kai 'Enter' patvirtina
+OptionPanel.el__max_default_window_height = Maksimalus standartinis lango auk\u0161tis
+OptionPanel.el__max_default_window_width = Maksimalus standartinis lango plotis
+OptionPanel.el__min_default_window_height = Minimalus standartinis lango auk\u0161tis
+OptionPanel.el__min_default_window_width = Minimalus standartinis lango plotis
+OptionPanel.el__position_window_below_node = Lang\u0105 d\u0117ti \u017Eemiau at\u0161akos
+OptionPanel.en = En
+OptionPanel.Environment = Aplinka
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Eksperimentinis bylos rakinimas
+OptionPanel.experimental_file_locking_on.tooltip = <html> Eksperimentin\u0117 galimyb\u0117</html>
+OptionPanel.export_icons_in_html = Eksportuoti piktogramas \u012F HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Nurodyti ar HTML eksportuoti i\u0161 Freeplane turi b\u016Bti su piktogramomis. Problema yra, kad gana da\u017Enai eksportuotose HTML nuorodos \u012F piktogramas nerandamos.</html>
+OptionPanel.Files = Bylos
+OptionPanel.first = Pirmas
+OptionPanel.foldingsymbolwidth = Suskleidimo simbolio plotis
+OptionPanel.foldingsymbolwidth.tooltip = <html>Diametras apskritimo, \u017Eymin\u010Dio suskleistas \u0161akas</html>
+OptionPanel.fork = \u0160akut\u0117
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr[translate me]
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Pagal antra\u0161tes
+OptionPanel.html_export_fold_all = Suskleisti visk\u0105
+OptionPanel.html_export_fold_currently_folded = Suskleisti, kas suskleista
+OptionPanel.html_export_folding = HTML eksportavimas suskleidus
+OptionPanel.html_export_no_folding = Nesuskleisti
+OptionPanel.hu = Hu
+OptionPanel.icon = piktograma
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Klavi\u0161ai
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Font Size[translate me]
+OptionPanel.language = Kalba
+OptionPanel.language.tooltip = <html>Pasirenkama programos naudojama kalba. 'automatin\u0117' bando \u012Fkrauti vartotojo sistemoje nustatyt\u0105 kalb\u0105. </html>
+OptionPanel.last = Paskutinis
+OptionPanel.last_opened_list_length = Pastar\u0173j\u0173 byl\u0173 s\u0105ra\u0161o ilgis
+OptionPanel.linear = Linijinis
+OptionPanel.links = Nuorodos
+OptionPanel.links.tooltip = <html>Nustatykite absoliu\u010Dias arba reliatyvias nuorodas </html>
+OptionPanel.lookandfeel = Look and Feel
+OptionPanel.lookandfeel.tooltip = <html>Look&Feel. Palaikomi - 'metal', 'windows', 'motif', 'gtk', 'mac' skirtas tik MacOS. Jei norite \u012Fjungti savo L&F, \u012Fveskite class vard\u0105 ir \u012Fsitikinkite ar atatinkamos jar bylos \u012Fkrautos. Jei susiduriate su problemomis, pasirinkitie 'nieko'.</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Maksimalus at\u0161akos plotis
+OptionPanel.max_node_width.tooltip = <html>Maksimalus at\u0161akos plotis ta\u0161kais</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn[translate me]
+OptionPanel.nothing = Nieko
+OptionPanel.number_of_different_files_for_automatic_save = Automatiniam i\u0161saugojimui skirt\u0173 skirting\u0173 byl\u0173 skai\u010Dius
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> skai\u010Dius n skirting\u0173 byl\u0173, kur bus i\u0161saugojami \u017Eem\u0117lapiai. Pirmas automatinis i\u0161saugojimas daromas \u012F pirm\u0105 byl\u0105, antras - \u012F antr\u0105, ir taip iki n+1, kuris v\u0117l i\u0161saugojamas \u012F pirm\u0105j\u0105 byl\u0105 (cikli\u0161kumas)</html>
+OptionPanel.OK = I\u0161saugoti
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Nauj\u0173 \u0161ak\u0173 vieta
+OptionPanel.placenewbranches.tooltip = <html>Kur d\u0117ti naujas \u0161akas. Palaikomos vert\u0117s - 'pirmas' ir 'paskutinis' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Reliatyvus
+OptionPanel.ru = Ru
+OptionPanel.selection_method = Pasirinkimo metodas
+OptionPanel.selection_method.tooltip = <html> galite ijungti/i\u0161jungti u\u017Edelsto pasirinkimo schem\u0105. Auto parinktys. Nemodifikuokite j\u0173, nes jos bus i\u0161saugotos \u012F auto.properties bet kokiu atveju.</html>
+OptionPanel.selection_method_by_click = Spragtelint
+OptionPanel.selection_method_delayed = U\u017Edelstas
+OptionPanel.selection_method_direct = Rodant
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Modeliai
+OptionPanel.separator.anti_alias = I\u0161lyginimas
+OptionPanel.separator.attributes = atributai
+OptionPanel.separator.automatic_save = Automatinis i\u0161saugojimas
+OptionPanel.separator.behaviour = Elgsena
+OptionPanel.separator.browser = Nar\u0161ykl\u0117
+OptionPanel.separator.commands_for_the_program = Komandos programai
+OptionPanel.separator.default_colors = Standartin\u0117s spalvos
+OptionPanel.separator.default_fonts = Standartiniai \u0161riftai
+OptionPanel.separator.default_styles = Standartiniai stiliai
+OptionPanel.separator.edit_long_node_window = Ilgos at\u0161akos redagavimo langas
+OptionPanel.separator.files = Bylos
+OptionPanel.separator.html_export = HTML eksportas
+OptionPanel.separator.hyperlink_types = Nuorod\u0173 tipai
+OptionPanel.separator.icon_properties = Piktogramos
+OptionPanel.separator.initial_map_size = Pradinis \u017Eem\u0117lapio dydis
+OptionPanel.separator.key_typing = U\u017Era\u0161ymas
+OptionPanel.separator.language = Kalba
+OptionPanel.separator.look_and_feel = Look and Feel
+OptionPanel.separator.new_node_commands = Naujos at\u0161akos komandos
+OptionPanel.separator.node_editing_commands = At\u0161akos redagavimo komandos
+OptionPanel.separator.node_navigation_commands = At\u0161akos navigavimo komandos
+OptionPanel.separator.other_defaults = Kiti standartiniai nustatymai
+OptionPanel.separator.patterns = Modeliai
+OptionPanel.separator.save = I\u0161saugoti
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = Pasirinkimo metodas
+OptionPanel.separator.undo = At\u0161aukti
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Standartin\u0117 fono spalva
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standartin\u0117 fono spalva pagal html \u017Eym\u0117jim\u0105 </html>
+OptionPanel.standardcloudcolor = Standartin\u0117 debesies spalva
+OptionPanel.standardcloudcolor.tooltip = <html>Standartin\u0117 debesies spalva pagal html \u017Eym\u0117jim\u0105 </html>
+OptionPanel.standardcloudestyle = Standartinis debesies stilius
+OptionPanel.standardcloudestyle.tooltip = <html>Standartinis debesies stilius. Kol kas palaikomas tik 'lenktas'</html>
+OptionPanel.standardlinkcolor = Standartin\u0117 jungties spalva
+OptionPanel.standardlinkcolor.tooltip = <html>Standartin\u0117 jungties spalva pagal html \u017Eym\u0117jim\u0105 </html>
+OptionPanel.standardlinkestyle = Standartinis jungties stilius
+OptionPanel.standardlinkestyle.tooltip = <html>Standartinis jungties stilius. Kol kas palaikomas tik 'lenktas'</html>
+OptionPanel.standardselectednodecolor = Standartin\u0117 pasirinktos at\u0161akos spalva
+OptionPanel.standardselectednodecolor.tooltip = <html>Standartin\u0117 pasirinktos at\u0161akos spalva. Pagal html \u017Eym\u0117jim\u0105 (#RRGGBB hex vert\u0117se) </html>
+OptionPanel.sv = Se[translate me]
+OptionPanel.time_for_automatic_save = Automatinio i\u0161saugojimo laikas
+OptionPanel.time_for_automatic_save.tooltip = <html> laikas tarp automatini\u0173 i\u0161saugojim\u0173 (msek): Jei norite i\u0161jungti automatin\u012F i\u0161saugojim\u0105, nustatykite skai\u010Di\u0173 2000000000.</html>
+OptionPanel.time_for_delayed_selection = U\u017Edelsimo laikas
+OptionPanel.time_for_delayed_selection.tooltip = <html> Pasirinkimo u\u017Edelsimo laikas (msek), kai pelyt\u0117 yra vir\u0161 at\u0161akos. Nustatykite 1 jei norite tu\u010Dtuojau pasirinkti tik u\u017Evedus pelyt\u0119.</html>
+OptionPanel.tr = Tr[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Puslapio nustatymas...
+PasteAction.text = \u012Ekelti
+PatternToString.EdgeStyle = Kra\u0161tin\u0117s stilius
+PatternToString.EdgeWidth = Kra\u0161tin\u0117s plotis
+PatternToString.FontBold = Sodrinti
+PatternToString.Icon = piktograma
+PatternToString.NodeFontSize = Font Size[translate me]
+plugins/ScriptEditor.exit = Save and Exit[translate me]
+plugins/ScriptEditor/window.title = Script Editor[translate me]
+plugins/TimeList.xml_Created = Sukurtas
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = Piktogramos
+plugins/TimeList.xml_Modified = Modifikuotas
+plugins/TimeList.xml_Text = Tekstas
+plugins/TimeManagement.xml_appendButton = \u012Eterpti dat\u0105 \u012F pasirinktas at\u0161akas
+plugins/TimeManagement.xml_Cancel = At\u0161aukti
+plugins/TimeManagement.xml_cancelButton = At\u0161aukti
+plugins/TimeManagement.xml_closeButton = u\u017Edaryti
+plugins/TimeManagement.xml_hour = Valandos:
+plugins/TimeManagement.xml_minute = Minut\u0117s:
+plugins/TimeManagement.xml_reminderButton = Priminimas nurodyt\u0105 dat\u0105
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Paspaudus nustatoma nurodyta data. Mirksin\u010Dios piktogramos atkreips j\u016Bs\u0173 d\u0117mes\u012F.<br> U\u017Edarius \u017Eem\u0117lap\u012F, taimeriai aktyvuojami v\u0117l j\u012F atidarius.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Kol kas at\u0161akai gali b\u016Bti nustatomas tik vienas priminimas. <br>Dabartinis priminimas nustatytas {0,date} {0,time}, j\u016Bs\u0173 pasirinkimas yra {1,date} {1,time}. <br><br>Ar norite pakeisti priminimo laik\u0105 (TAIP) <br>ar nor\u0117tum\u0117te palikti sen\u0105j\u012F (NE)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Priminimas nustatytas {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Pa\u0161alinti priminim\u0105
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Pa\u0161alinti visus priminimus susietus su pasirinktomis at\u0161akomis.
+plugins/TimeManagement.xml_todayButton = \u0160iandien
+plugins/TimeManagement.xml_WindowTitle = Laiko valdymas
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Search & Replace[translate me]
+preferences = Pasirinkimai
+PrintAction.text = Spausdinti...
+PrintDirectAction.text = Spausdinti
+printing_settings = Spausdinimo mastelis
+PropertyAction.text = Pasirinkimai ...
+QuitAction.text = Palikti
+read_only = Read Only
+RedoAction.text = Gr\u0105\u017Einti
+RedoFilterAction.text = Gr\u0105\u017Einti
+ReminderHookAction.text = Pa\u0161alinti priminim\u0105
+ReminderHookAction.tooltip = Pa\u0161alina priminim\u0105 i\u0161 at\u0161akos.
+RemoveAllIconsAction.text = Pa\u0161alinti visas piktogramas
+RemoveIconAction.text = Pa\u0161alinti paskutin\u0119 piktogram\u0105
+repair_link = Taisyti nuorod\u0105
+repair_link_question = Negaliu \u012Fkrauti nurodyto \u017Eem\u0117lapio. Taisyti nuorod\u0105 rankomis?
+ResetNodeLocationAction.text = Gr\u0105\u017Einti \u012Fprastin\u0119 pozicij\u0105
+save_failed = Nepavyko i\u0161saugoti \u017Eem\u0117lapio {0}.
+save_unsaved = I\u0161saugoti \u0161\u012F \u017Eem\u0117lap\u012F? :
+SaveAction.text = I\u0161saugoti
+SaveAsAction.text = I\u0161saugoti kaip...
+saved = I\u0161saugotas
+scheme_evaluate = \u012Evertinkite!
+select_favorites_folder = Pasirinkite aplank\u0105, kuriame bus laikomi j\u016Bs\u0173 favoritai
+select_folder_for_importing = Pasirinkite aplank\u0105 importavimui
+SelectAllAction.text = Pasirinkti visk\u0105 kas matoma
+SelectBranchAction.text = Pasirinkti matom\u0105 \u0161ak\u0105
+selection_method_by_click = Pasirinkimas spragtel\u0117jimu
+selection_method_delayed = U\u017Edelstas automatinis pasirinkimas
+selection_method_direct = Pasirinkimas rodymu
+SetImageByFileChooserAction.text = Paveiksl\u0117lis (Bylos pasirinkimas arba nuoroda)...
+SetLinkByFileChooserAction.text = Nuoroda (Bylos pasirinkimas)...
+SetLinkByTextFieldAction.text = Nuoroda (Teksto laukelis)...
+ShowAncestorsAction.text = rodyti prot\u0117vius
+simplyhtml.alignLabel = Alignment\:[translate me]
+simplyhtml.boldName = bold[translate me]
+simplyhtml.borderWidthLabel = Plotis
+simplyhtml.cancelBtnName = At\u0161aukti
+simplyhtml.close = u\u017Edaryti
+simplyhtml.closeBtnName = u\u017Edaryti
+simplyhtml.copyLabel = Kopijuoti
+simplyhtml.cTagNameHead3 = Heading 3[translate me]
+simplyhtml.cutLabel = I\u0161kirpti
+simplyhtml.defaultDocName = Untitled[translate me]
+simplyhtml.editLabel = redaguoti
+simplyhtml.fontBoldLabel = Sodrinti
+simplyhtml.fontColorLabel = Text Color[translate me]
+simplyhtml.fontColorTip = Text Color[translate me]
+simplyhtml.fontItalicLabel = Paversti
+simplyhtml.fontTabLabel = \u0160riftas
+simplyhtml.fontUnderlineLabel = Pabraukti
+simplyhtml.foregroundLabel = Foreground\:[translate me]
+simplyhtml.helpLabel = Pagalba
+simplyhtml.listTypeSquare = square bullet[translate me]
+simplyhtml.okBtnName = Gerai
+simplyhtml.pasteLabel = \u012Ekelti
+simplyhtml.redoLabel = Gr\u0105\u017Einti
+simplyhtml.replaceNo = Ne
+simplyhtml.replaceYes = Taip
+simplyhtml.styleLabel = Stilius
+simplyhtml.styleNameInputText = Name of new style?[translate me]
+simplyhtml.topLabel = top\:[translate me]
+simplyhtml.uLineLabel = Pabraukti
+simplyhtml.undoLabel = At\u0161aukti
+simplyhtml.valignLabel = Vert. Alignment\:[translate me]
+split = Perskirti
+style = Stilius
+svg = SVG[translate me]
+TimeListAction.text = Rodyti laiko tvarkara\u0161t\u012F ...
+TimeListAction.tooltip = Rodo visus nustatytus laikus ir atatinkamas at\u0161akas.
+TimeManagementAction.text = Rodyti kalendori\u0173...
+TimeManagementAction.tooltip = <html>Rodo kalendoriaus modul\u012F sukurta Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = (i\u0161/su)skleisti dukterines at\u0161akas
+ToggleFoldedAction.text = I\u0161skleisti/suskleisti
+ToggleFullScreenAction.text = Full screen mode[translate me]
+ToggleLeftToolbarAction.text = \u012Ejungti/i\u0161jungti \u012Frankius kair\u0117je
+ToggleMenubarAction.text = \u012Ejungti/i\u0161jungti meniu
+ToggleToolbarAction.text = \u012Ejungti/i\u0161jungti \u012Frankius
+undefined_error = Netik\u0117ta klaida. Pra\u0161ome prane\u0161ti programos k\u016Br\u0117jams.
+underline = Pabraukti
+underlined = Pabrauktas
+UndoAction.text = At\u0161aukti
+UndoFilterAction.text = At\u0161aukti
+unfold = I\u0161skleisti
+UnfoldAllAction.text = I\u0161skleisti visk\u0105
+UnfoldAllAction.tooltip = <html>I\u0161skleid\u017Eia pasirinktas ir visas j\u0173 dukterines at\u0161akas.</html>
+UnfoldOneLevelAction.text = I\u0161skleisti vienu lygiu
+UnfoldOneLevelAction.tooltip = <html>I\u0161skleid\u017Eia pasirinktas at\u0161akas vienu lygiu.</html>
+UpdateCheckAction.text = Check for Updates[translate me]
+url_error = \u0160is URL blogai suformuotas!
+url_load_error = Negaliu \u012Fkrauti \u017Eem\u0117lapio pagal URL:
+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):
+width = Plotis
+yes = Taip
+ZoomInAction.text = Priartinti
+ZoomOutAction.text = Nutolinti
diff --git a/freeplane/resources/translations/Resources_nb.properties b/freeplane/resources/translations/Resources_nb.properties
new file mode 100644
index 0000000..0190455
--- /dev/null
+++ b/freeplane/resources/translations/Resources_nb.properties
@@ -0,0 +1,885 @@
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Endre noders format
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Endre m\u00F8nster
+accessories/plugins/EncryptNode.properties_0 = Velg passord for kryptert node
+accessories/plugins/EncryptNode.properties_1 = Passordene er ikke like eller er for korte.
+accessories/plugins/EncryptNode.properties_2 = Passord:
+accessories/plugins/EncryptNode.properties_3 = Gjenta passord:
+accessories/plugins/EncryptNode.properties_4 = Skriv inn passord.
+accessories/plugins/EncryptNode.properties_5 = <html>Husk at kvaliteten p\u00E5 krypteringer er helt<br> avhengig av kvaliteten p\u00E5 passordet.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Avbryt
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Du kan bare velge kryptering for en kryptert node. Sett inn en kryptert node ved \u00E5 velge i verkt\u00F8ymenyen.
+accessories/plugins/EncryptNode.properties_select_me = Trykk her for \u00E5 fortsette!
+accessories/plugins/EncryptNode.properties_wrong_password = Passordet er ikke korrekt.
+accessories/plugins/ExportWithTWiki.text = Som TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Eksporterer kartet som et TWiki-dokument.
+accessories/plugins/ExportWithXSLT.tooltip = Eksporterer kartet ved hjelp av XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Som Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Eksporterer kartet som en java nettleser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Som Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Eksporterer kartet som en flash-aplikasjon.
+accessories/plugins/ExportWithXSLT_HTML.text = Som XHTML (JavaScript versjon)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Som XHTML (klikkbar kartbilde-versjon)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Ressurser fra RESOURCES-noden til TaskJuggler-filen...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Eksporterer ressurser fra RESOURCES-noden til Taskjuggler-modulen. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Oppgaver fra oppgavenoden til TaskJuggler-filen...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Eksporterer oppgaver fra TASK-noden til Taskjuggler-modulen. </html>
+add = Legg til
+AddLocalLinkAction.text = Legg til lokal hyperlink
+antialias_all = Antialias alt
+antialias_edges = Antialias kanter
+antialias_none = Ingen antialiasing
+apply = Utf\u00F8r
+ApplyAction.text = Utf\u00F8r
+ApplyFormatPlugin.text = Endre format ...
+ApplyFormatPlugin.tooltip = Presenterer en dialog der node- og ramme-atributter kan endres.
+ApplyNoFilteringAction.text = Ingen filtrering
+as_parent = Som foreldre
+AssignAttributesAction.text = Tildele atributter...
+attribute_delete = Slett alle verdiene
+attribute_delete_value = Slett denne verdien
+attribute_font_size_tooltip = Atributters skriftst\u00F8rrelse
+attribute_list_box_label_text = Eksisterende verdier
+attribute_replace = Bytt ut med
+attribute_top = Alle kjente atributter for de \u00E5pne kartene
+attributes_adding_empty_attribute_error = Kan ikke bruke en tom streng som atributtnavn
+attributes_all = Alle atributter
+attributes_attribute = Atributter
+attributes_close = Lukk
+attributes_deselect_all = Ingen
+attributes_edit = Redigere
+attributes_edit_tooltip = Redigere sett
+attributes_for_selected = Valgte noder
+attributes_for_visible = Alle synlige noder
+attributes_import = Import
+attributes_import_tooltip = Importer atributter fra de andre \u00E5pne kartene
+attributes_no_import_candidates_found = Ingen nye atributter funnet
+attributes_popup_delete = Slett
+attributes_popup_down = Ned
+attributes_popup_edit = Redigere
+attributes_popup_hide = Skjul
+attributes_popup_new = Ny atributt
+attributes_popup_optimal_width = Optimal bredde
+attributes_popup_up = Opp
+attributes_refresh = Oppfrisk
+attributes_restricted_attributes_tooltip = Begrenset sett med atributter
+attributes_restricted_values_tooltip = Begrens verdier for disse atributtene
+attributes_restriction = Begrenset sett
+attributes_select_all = Alt
+attributes_select_all_tooltip = Velg / Velg bort alt
+attributes_show = Vis
+attributes_skip_root = Drop rotnoden
+attributes_visible = Valgte synlige
+attributes_visible_tooltip = Valgte synlige
+automatically_save_message = Kartet ble automatisk lagret (ved bruk av filnavnet {0}) ...
+AutomaticLayoutAction.text = Automatisk Layout
+AutomaticLayoutAction.tooltip = <html>Legger automatisk layout p\u00E5 tegningen <br>Det \u00F8verste laget er svart, det neste Bl\u00E5tt osv.</html>
+BackAction.text = Tilbake
+BackAction.tooltip = Hopper bakover i den valgte kjeden
+background = Bakgrunn
+BlinkingNodeHookAction.text = Blinkende node
+BlinkingNodeHookAction.tooltip = <html>Dette gj\u00F8r noden blinkende. V\u00E6r forsiktig og ikke sett for mange noder blinkende og <strong> ikke med annen automatisk formattering p\u00E5 de samme nodene</strong></html>
+BoldAction.text = Uthevet
+boldify_branch = Uthev
+branch = Gren
+cancel = Avbryt
+CancelAction.text = Avbryt
+cannot_add_parent_diff_parents = Alle noder m\u00E5 ha samme foreldre for \u00E5 benytte denne funksjonen.
+cannot_add_parent_to_root = Rotnoden kan ikke legges til en ny foreldre.
+cannot_join_nodes_with_children = Kan ikke forbinde noder med barn
+cannot_move_to_child = Du kan ikke flytte en node til et av dens blader.
+CenterAction.text = Sentrer
+ChangeConnectorArrowsAction.backward.text = Tilbake
+ChangeConnectorArrowsAction.forward.text = Frem
+ChangeNodeLevelLeftsAction.text = Node til venstre
+ChangeNodeLevelLeftsAction.tooltip = Til venstre for roten er noden(e) vendt nedover. De(n) blir barn til sine s\u00F8sken over. Til h\u00F8yre for roten er noden(e) vendt oppover. Direkte p\u00E5 roten bytter noden(e) side.
+ChangeNodeLevelRightsAction.text = Node til h\u00F8yre
+ChangeNodeLevelRightsAction.tooltip = Til h\u00F8yre for roten er noden(e) vendt nedover. De(n) blir barn til sine s\u00F8sken over. Til venstre for roten er noden(e) vendt oppover. Direkte p\u00E5 roten bytter noden(e) side.
+choose_background_color = Velg bakgrunnsfarge:
+choose_cloud_color = Velg Sky-farge:
+choose_edge_color = Velg rammefarge
+choose_node_background_color = Velg bakgrunnsfarge for noden:
+choose_node_color = Velg skriftfarge:
+CloseAction.text = Lukk
+CloudAction.text = Sky
+CloudColorAction.text = Skyens farge...
+ColorProperty.ResetColor = Tilbakestill farge
+combined = Kombinert
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Kopier
+CopySingleAction.text = Kopier bare en
+CreationModificationPluginAction.text = Vis tid for siste endring
+CreationModificationPluginAction.tooltip = <html>Denne funksjonen viser tidspunkter for endring av noden.</html>
+CutAction.text = Klipp
+decrease_branch_font_size = Mindre grenskrift
+DecreaseNodeFontAction.text = Mindre grenskrift
+delete = Slett
+delete_child = Slett node
+DeleteAction.text = Fjern node
+DeleteConditionAction.text = Slett
+DocumentationAction.text = Dokumentasjon
+edge = Kant
+edge_style = Rammestil
+edge_width = Rammetykkelse
+EdgeColorAction.text = Kantfarge
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = Line\u00E6r
+EdgeStyleAction.sharp_bezier.text = Skarp Bezier
+EdgeStyleAction.sharp_linear.text = Skarp Line\u00E6r
+EdgeStyleAsParentAction.text = Som foreldre
+EdgeWidthAction_width_parent.text = Eier
+EdgeWidthAction_width_thin.text = Tynn
+edit = Endre
+edit.decision = HTML Editor[translate me]
+edit_link_manually = Endre link manuelt
+EditAction.text = Rediger node
+EditAttributesAction.text = Redigere atributter
+EditFilterAction.text = Redigere
+EditLongAction.text = Endre en lang node
+EncryptedMap.text = Opprett kryptert hjernekart ...
+EncryptedMap.tooltip = Opprette et kryptert kart
+enter_base_url = Jeg setter inn relative linker. Sett inn start-URL.
+enter_confirms = Enter bekrefter
+EnterPassword.text = Skift mellom kryptert / ukryptert
+error = Feil
+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 = Eksport
+ExportBranchToHTMLAction.text = Eksporter gren til HTML
+ExportPdf.text = Som PDF...
+ExportSvg.text = Som SVG...
+ExportToHTMLAction.text = Eksporter til HTML
+ExportToImage.jpg.text = Som JPEG...
+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
+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_add = Legg til
+filter_and = Og
+filter_conditions = Filtere
+filter_contains = Inneholder
+filter_delete = Slett
+filter_dialog = Filterdesign
+filter_does_not_exist = Eksisterer ikke
+filter_edit_description = Redigere filterlisten
+filter_enter_value = Skriv inn verdi
+filter_exist = Eksisterer
+filter_icon = Ikon
+filter_is_equal_to = Er lik
+filter_is_not_equal_to = Er ulik
+filter_no_filtering = Ingen filtrering
+filter_node = Nodetekst
+filter_not = Ikke
+filter_or = Eller
+filter_select = Velg
+filter_selected_node_view = Valgte noder
+find_what = Finn hva
+FindAction.text = Finn
+fit_map_to_page = Tilpass til siden
+FitToPage.text = Tilpass til side
+FitToPage.tooltip = Justerer kartet til skjermst\u00F8rrelsen.
+fold = Fold inn
+FoldAllAction.text = Fold inn alle
+FoldAllAction.tooltip = <html>Folder inn de valgte nodene og alle deres barn.</html>
+FoldOneLevelAction.text = Fold inn et niv\u00E5
+FoldOneLevelAction.tooltip = <html>Folder inn de valgte nodene ett niv\u00E5.</html>
+font = Font
+FontFamilyAction.text = Skriftfamilie
+FontSizeAction.text = Skriftst\u00F8rrelse
+format_menu_edge_styles = Kantstiler
+format_menu_edge_widths = Kantbredder
+FormatCopy.text = Kopier format
+FormatCopy.tooltip = <html>Kopierer formatet p\u00E5 noden.</html>
+FormatPaste.text = Lim inn format
+FormatPaste.tooltip = <html>Lim inn formatet p\u00E5 noden.</html>
+ForwardAction.text = Frem
+ForwardAction.tooltip = Hopper forover i den valgte kjeden
+Freeplane.progress.buildScreen = Bygger skjermbilde...
+Freeplane.progress.createController = Oppretter kontrollerontroller...
+Freeplane.progress.createInitialMode = Oppretter startfasen...
+Freeplane.progress.endStartup = Ferdig med oppstart.
+Freeplane.progress.gettingPreferenceDirectories = Finner foretrukket mappe...
+Freeplane.progress.gettingPreferences = Finner foretrukne innstillinger...
+Freeplane.progress.loadMaps = Laster kart...
+Freeplane.progress.propagateLookAndFeel = Utvikler brukergrensesnittet...
+Freeplane.progress.settingPreferences = Setter foretrukne innstillinger...
+Freeplane.progress.startCreateController = Starter opprettelse av kontroller...
+Freeplane.progress.updateLookAndFeel = Oppdaterer brukergrensesnittet...
+freeplane_reverted = Freeplane_Gjen\u00C5pnet_
+FreeplaneHelpStarter.text = Hjelp...
+FreeplaneHelpStarter.tooltip = Freeplane ekstra hjelp
+GotoLinkNodeAction.text = G\u00E5 til lenke
+GrabKeyDialog.common.cancel = Avbryt
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Tilordnet til
+GrabKeyDialog.grab-key.assigned-to.none = Ikke tilordnet
+GrabKeyDialog.grab-key.clear = Slett
+GrabKeyDialog.grab-key.remove = Fjern
+GrabKeyDialog.grab-key.remove-ask = Er du sikker p\u00E5 at du vil fjerne dette tastetrykket?
+GrabKeyDialog.grab-key.title = Skriv inn ny n\u00F8kkel
+help = Hjelp
+HideAllAttributesAction.text = Skjul alle atributter
+HierarchicalIconsAction.text = Vis ikonene i hele hierarkiet
+HierarchicalIconsAction.tooltip = Hvis et av barna eller barnebarna mine har ikoner vil jeg ogs\u00E5 vise dem.
+html_export_based_on_headings = HTML Eksport - Basert p\u00E5 overskrifter
+html_export_fold_all = HTML Export - Fold inn alt
+html_export_fold_currently_folded = HTML Eksport - Fold som n\u00E5
+html_export_no_folding = HTML Eksport - Alt utfoldet
+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]
+icon_attach = Se her
+icon_back = Tilbake
+icon_bee = Freeplane[translate me]
+icon_bell = Husk
+icon_bookmark = Flott
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Avbryt
+icon_button_ok = OK
+icon_calendar = Dato
+icon_clanbomber = Farlig
+icon_desktop_new = Husk
+icon_down = Ned
+icon_family = Familie
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Flagg
+icon_flag-black = Black Flag[translate me]
+icon_flag-blue = Blue Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_flag-yellow = Yellow Flag[translate me]
+icon_forward = Frem
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioritet 1
+icon_full-2 = Prioritet 2
+icon_full-3 = Prioritet 3
+icon_full-4 = Prioritet 4
+icon_full-5 = Prioritet 5
+icon_full-6 = Prioritet 6
+icon_full-7 = Prioritet 7
+icon_gohome = Hjem
+icon_help = Sp\u00F8rsm\u00E5l
+icon_idea = Ide
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_knotify = Musikk
+icon_korn = Mailboks
+icon_ksmiletris = Jeg er glad
+icon_licq = Flott
+icon_Mail = Mail
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Ikoner
+icon_messagebox_warning = Viktig
+icon_password = N\u00F8kkel
+icon_pencil = Skal beskrives
+icon_penguin = Linux
+icon_smiley-angry = Angry[translate me]
+icon_smily_bad = Den var ikke morsom
+icon_stop = Stopp
+icon_up = Opp
+icon_wizard = Magi
+icon_xmag = Skal diskuteres
+icon_yes = Viktig
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Velg ikon...
+IconSelectionPlugin.tooltip = <html>Viser en popup med ikoner.</html>
+import = Importer
+import_linked_branch_no_link = Den valgte noden har ingen lenke for \u00E5 importere.
+ImportAction.text = Import
+ImportBranchAction.text = Importer gren
+ImportExplorerFavoritesAction.text = Importer explorer-favoritter
+ImportFolderStructureAction.text = Importer filmappestruktur
+ImportLinkedBranchAction.text = Importer lenkede grener
+ImportLinkedBranchWithoutRootAction.text = Importer uten rot
+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.
+load = Load[translate me]
+locking_failed_by_open = L\u00E5sing av map {0} mislykkes. \u00C5pner den read-only.
+locking_failed_by_save_as = L\u00E5sing av map {0} mislykkes. Kan ikke Lagre Som...
+locking_old_lock_removed = Mappen {0} var l\u00E5st av bruker {1}. L\u00E5sen er fjernet, da den var gammel.
+long_node_changed_cancel = Du har endret denne noden. Vil du oppheve endringene?
+long_node_changed_submit = Du har endret denne noden. Vil du lagre endringene?
+lots_of_links_warning = Du er i ferd med \u00E5 lage mange linker til samme node. Er du sikker p\u00E5 at du vil opprette disse linkene?
+map_already_exists = Mappen eksisterer. Vil du overskrive den?
+map_corrupted = Mappen er \u00F8delagt. Vil du se detaljer?
+map_locked_by_open = Mappen {0} blir rettet av bruker {1}. \u00C5pner den for l\u00E5sing.
+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_extras = Verkt\u00F8y
+menu_file_import = Import
+menu_filter = Filter[translate me]
+menu_format = Format
+menu_insert = Sett inn
+menu_navigate = Naviger
+menu_view = Vis
+mindmap = Hjernekart
+mindmaps = Hjernekart
+mindmaps_desc = Hjernekart (*.mm)
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Kan ikke benytte visning
+mode_status = Visning skiftet {0} Visning
+mode_title = Freeplane - {0} Visning
+modes = Visninger
+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
+NavigationNextMapAction.text = Neste kart
+NavigationPreviousMapAction.text = Forrige kart
+new_mindmap = Nytt hjernekart
+new_node = Ny node
+new_node_as_sibling_not_possible_for_the_root = Du kan ikke sette inn en node parallelt med roten
+NewChildAction.text = Ny bladnode
+NewMapAction.text = Ny
+NewParentNode.text = Ny foreldrenode
+NewParentNode.tooltip = <html>Alle valgte noder blir flyttet til nye foreldre.</html>
+NewPreviousSiblingAction.text = Ny node h\u00F8yere niv\u00E5
+NewSiblingAction.text = Ny node samme niv\u00E5
+no = Nei
+no_format_copy_before_format_paste = Du kan ikke lime inn f\u00F8r du har kopiert.
+no_found_from = Ingen "{0}" funnet fra "{1}".
+no_more_found_from = Ikke flere "{0}" funnet fra "{1}".
+no_previous_find = Ingen funnet tidligere.
+node = Node
+node_changed_discard_changes = Du har endret denne noden. Vil du oppheve endringene?
+NodeBackgroundColorAction.text = Bakgrunnsfarge for node...
+NodeColorAction.text = Nodefarge...
+NodeColorBlendAction.text = Bland farger
+NodeDownAction.text = Node ned
+NodeListAction.text = Finn og bytt ut...
+NodeListAction.tooltip = Viser alle noder som en s\u00F8kbar liste med filtreringsmuligheter.
+NodeShapeAction.bubble.text = Boble
+NodeShapeAction.fork.text = Gaffel
+NodeUpAction.text = Node opp
+nonboldify_branch = Normal
+nonitalicise_branch = Ikke kursiv
+normal = Normal
+not_saved_for_link_error = Mappen m\u00E5 lagres f\u00F8r du kan sette inn link fra filvelgeren
+ok = OK
+OKAction.text = OK
+OpenAction.text = \u00C5pne...
+option_changes_may_require_restart = For \u00E5 se effekten av endringen, m\u00E5 du sannsynligvis restarte Freeplane.
+OptionPanel.absolute = Absolutt
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatisk layout m\u00F8nstre
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Bestemmer kartets kvalitet. Mer antialias trenger mer tid.</html>
+OptionPanel.antialias_all = Antialias alt
+OptionPanel.antialias_edges = Antialias kanter
+OptionPanel.antialias_none = Ingen antialias
+OptionPanel.Appearance = Oppf\u00F8rsel
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Som foreldre
+OptionPanel.automatic = Automatisk
+OptionPanel.automaticFormat_level = Automatisk layout-stil
+OptionPanel.automaticFormat_level1 = Rotnodeformatet
+OptionPanel.automaticFormat_level2 = 1. niv\u00E5 nodeformat
+OptionPanel.Behaviour = Oppf\u00F8rsel
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Avbryt
+OptionPanel.childpattern = Barnem\u00F8nster
+OptionPanel.childpattern.tooltip = Det valgte m\u00F8nsteret er anvendt for alle barna.
+OptionPanel.clear_all_setters = Bytt alle
+OptionPanel.clear_all_setters.tooltip = Aktiverer eller deaktiverer alle endringsindikatorer.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Kombinert
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Standard
+OptionPanel.default_browser_command_mac = Standard kommando for web-leser i MacOS
+OptionPanel.default_browser_command_mac.tooltip = <html> og MAC: </html>
+OptionPanel.default_browser_command_other_os = Standard kommando for web-leser i andre OS
+OptionPanel.default_browser_command_other_os.tooltip = <html> Typisk Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Standard kommando for web-leser i Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>For Windows.</html>
+OptionPanel.default_browser_command_windows_nt = Standard kommando for web-leser i Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>For Windows.</html>
+OptionPanel.Defaults = Standarder
+OptionPanel.delete_automatic_saves_at_exit = Slett automatisk lagrede filer ved avslutning.
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html>Settes til sant hvis automatisk lagrede filer skal slettes ved normal avslutning</html>
+OptionPanel.disable_cursor_move_paper = Ikke endre cursor under flytting
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Ikke vise 'flytte' cursor under flytting</html>
+OptionPanel.display_node_id = Display node ID[translate me]
+OptionPanel.edgecolor = Rammefarge
+OptionPanel.edgecolor.tooltip = Egenskap til rammen rundt foreldrenoden (Blir ogs\u00E5 brukt for alle barnenodene)
+OptionPanel.edgestyle = Rammestil
+OptionPanel.edgestyle.tooltip = Egenskap til rammen rundt foreldrenoden (Blir ogs\u00E5 brukt for alle barnenodene)
+OptionPanel.edgewidth = Rammebredde
+OptionPanel.edgewidth.tooltip = Egenskap til rammen rundt foreldrenoden (Blir ogs\u00E5 brukt for alle barnenodene)
+OptionPanel.el__enter_confirms_by_default = Retur-tasten stenger vinduet
+OptionPanel.el__max_default_window_height = Maks vindush\u00F8yde
+OptionPanel.el__max_default_window_width = Maks vindusbredde
+OptionPanel.el__min_default_window_height = Min vindush\u00F8yde
+OptionPanel.el__min_default_window_width = Min vindusbredde
+OptionPanel.el__position_window_below_node = Legg vindu under node
+OptionPanel.en = En
+OptionPanel.Environment = Milj\u00F8
+OptionPanel.es = Es
+OptionPanel.experimental_file_locking_on = Eksperimentell fill\u00E5sing
+OptionPanel.experimental_file_locking_on.tooltip = <html> Eksperimentell egenskap</html>
+OptionPanel.export_icons_in_html = Eksport Ikoner i Html
+OptionPanel.export_icons_in_html.tooltip = <html> Angi om ikoner skal tas med i eksport av Html. Problemet er at ganske ofte vil ikke lenken til ikonene fungere.</html>
+OptionPanel.Files = Filer
+OptionPanel.first = F\u00F8rste
+OptionPanel.foldingsymbolwidth = Symbol ved lukking av grener
+OptionPanel.foldingsymbolwidth.tooltip = <html>St\u00F8rrelsen p\u00E5 sirkelen som vises ved lukking av grener</html>
+OptionPanel.fr = Fr
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Basert p\u00E5 overskrifter
+OptionPanel.html_export_fold_all = Fold inn alle
+OptionPanel.html_export_fold_currently_folded = Lukk de som er lukkede
+OptionPanel.html_export_folding = Html Eksport Lukking
+OptionPanel.html_export_no_folding = Ingen lukking
+OptionPanel.hu = Hu
+OptionPanel.icon = Ikon
+OptionPanel.icon.tooltip = Hvis brukt, vil noden bruke dette ikonet.
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Tastetrykk
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Skriftst\u00F8rrelse
+OptionPanel.language = Spr\u00E5k
+OptionPanel.language.tooltip = <html>Her velges spr\u00E5k. 'automatisk' pr\u00F8ver \u00E5 finne brukerens spr\u00E5k automatisk. </html>
+OptionPanel.last = Siste
+OptionPanel.last_opened_list_length = Lengde p\u00E5 listen over sist brukte filer.
+OptionPanel.links = Lenker
+OptionPanel.links.tooltip = <html>Lenker kan enten v\u00E6re relative eller absolutte </html>
+OptionPanel.load_last_map = \u00E5pne det sist brukte kartet automatisk
+OptionPanel.load_last_map.tooltip = <html>Hvis avkrysset, vil Freeplane under oppstart automatisk \u00E5pne det sist brukte kartet.</html>
+OptionPanel.lookandfeel = Tema
+OptionPanel.lookandfeel.tooltip = <html>Hvilket tema for grafikk som skal brukes. 'metall','windows','motif', 'gtk' er supportert, 'mac' er tilgjengelig bare p\u00E5 MacOS. 'standard' betyr at standard tema blir brukt. </html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Maks bredde for noden
+OptionPanel.max_node_width.tooltip = <html>Maksimal nodebredde i pixler</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Nodens bakgrunnsfarge
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Nodens farge
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+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
+OptionPanel.number_of_different_files_for_automatic_save = Antall automatisk lagrede filer
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Angi antall automatisk lagrede filer. N\u00E5r antallet n\u00E5s, vil systemet overskrive f\u00F8rste fil (syklisk)</html>
+OptionPanel.OK = Lagre
+OptionPanel.org.freeplane.plugin.bugreport = Policy[translate me]
+OptionPanel.patternname = Navn
+OptionPanel.patternname.tooltip = Unikt m\u00F8nsternavn
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Plasser ny gren
+OptionPanel.placenewbranches.tooltip = <html>Hvor nye grener skal plasseres. Gyldige verdier er 'f\u00F8rst' og 'sist' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relativ
+OptionPanel.ru = Ru
+OptionPanel.selection_method = Metode for valg
+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 = Ved \u00E5 klikke
+OptionPanel.selection_method_delayed = Forsinket
+OptionPanel.selection_method_direct = Direkte
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = M\u00F8nstre
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Atributter
+OptionPanel.separator.automatic_save = Automatisk lagring
+OptionPanel.separator.behaviour = Oppf\u00F8rsel
+OptionPanel.separator.browser = Webleser
+OptionPanel.separator.commands_for_the_program = Programkommandoer
+OptionPanel.separator.default_colors = Standard farger
+OptionPanel.separator.default_fonts = Standard skrifttyper
+OptionPanel.separator.default_styles = Standard stiler
+OptionPanel.separator.EdgeControls = Rammer
+OptionPanel.separator.edit_long_node_window = Vindu for redigering av lange tekster
+OptionPanel.separator.files = Filer
+OptionPanel.separator.General = Generell
+OptionPanel.separator.html_export = Html-eksport
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Hyperlinktyper
+OptionPanel.separator.icon_properties = Ikoner
+OptionPanel.separator.initial_map_size = Initiell kartst\u00F8rrelse
+OptionPanel.separator.key_typing = Automatisk redigering
+OptionPanel.separator.language = Spr\u00E5k
+OptionPanel.separator.load = Load[translate me]
+OptionPanel.separator.look_and_feel = Tema
+OptionPanel.separator.mouse_wheel = Musehjul
+OptionPanel.separator.new_node_commands = Kommando for nye noder
+OptionPanel.separator.node_editing_commands = Kommandoer for redigering av noder
+OptionPanel.separator.node_navigation_commands = Kommandoer for navigering mellom noder
+OptionPanel.separator.NodeColors = Nodefarger
+OptionPanel.separator.NodeFont = Nodeskrift
+OptionPanel.separator.other_defaults = Andre standardverdier
+OptionPanel.separator.others = Andre hurtigtaster
+OptionPanel.separator.patterns = M\u00F8nstre
+OptionPanel.separator.save = Lagre
+OptionPanel.separator.selection_method = Metode for valg
+OptionPanel.separator.undo = Angre
+OptionPanel.set_property_text = Endre
+OptionPanel.set_property_text.tooltip = Tom: Ikke r\u00F8r; Minus=Fjern egenskap (sett standardverdi); Pluss=Endre egenskap
+OptionPanel.sharp_bezier = skarp bezier
+OptionPanel.sharp_linear = skarp line\u00E6r
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Standard bakgrunnsfarge
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standard bakgrunnsfarge. I html notasjon (#RRGGBB i hex-verdier) </html>
+OptionPanel.standardcloudcolor = Standard skyfarge
+OptionPanel.standardcloudcolor.tooltip = <html>Standard skyfarge. I html-notasjon (#RRGGBB i hex-verdier) </html>
+OptionPanel.standardcloudestyle = Standard stil for sky
+OptionPanel.standardcloudestyle.tooltip = <html>Standard stil for sky. Bare 'bezier' er st\uFFFDttet i denne versjonen</html>
+OptionPanel.standardlinkcolor = Standard lenkefarge
+OptionPanel.standardlinkcolor.tooltip = <html>Standard lenkefarge. I html-notasjon (#RRGGBB i hex-verdier) </html>
+OptionPanel.standardlinkestyle = Standard stil for lenker
+OptionPanel.standardlinkestyle.tooltip = <html>Standard stil for lenker. Bare 'bezier' er st\uFFFDttet i denne versjonen</html>
+OptionPanel.standardselectednodecolor = Standardfarge for valgte noder
+OptionPanel.standardselectednodecolor.tooltip = <html>Standard nodefarge for valgte noder. I html-notasjon (#RRGGBB i hex-verdier) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Tid for automatisk lagring
+OptionPanel.time_for_automatic_save.tooltip = <html>Tiden mellom automatisk lagring (i millisekunder): For \u00E5 skru av automatisk lagring, sett verdien til 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tid f\u00F8r noden velges ved forsinket valg
+OptionPanel.time_for_delayed_selection.tooltip = <html> Tid f\u00F8r noden blir valgt n\u00E5r musen f\u00F8res over, sett til 1 for \u00F8yeblikkelig valg</html>
+OptionPanel.toolTipManager.max_tooltip_width = ToolTip-bredde
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Standard tooltip-bredde i piksler.</html>
+OptionPanel.tr = Tr
+OptionPanel.undefined_font = Udefinert skrifttype
+OptionPanel.undo_levels = Angre niv\u00E5er
+OptionPanel.undo_levels.tooltip = <html>Bestemmer hvor mange trekk som er lagret og kan derfor angres med "Angre".</html>
+OptionPanel.use_tabbed_pane = Bruk tabber
+OptionPanel.use_tabbed_pane.tooltip = Hvis avkrysset, blir kartet vist som tabber (som i FireFox :-) ).
+OptionPanel.wheel_velocity = Utveksling
+OptionPanel.wheel_velocity.tooltip = En h\u00F8yere verdi resulterer i at bevegelse p\u00E5 kartet krever mindre bevegelse med musen.
+OptionPanel.windows = Vindu
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+org.freeplane.plugin.bugreport.agree = Send[translate me]
+PageAction.text = Sideoppsett...
+PasteAction.text = Lim inn
+PatternNewNameProperty = Nytt m\u00F8nster
+PatternToString.backgroundColor = Bakgrunnsfarge
+PatternToString.color = Farge
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Rammestil
+PatternToString.EdgeWidth = Rammetykkelse
+PatternToString.FontBold = Uthevet
+PatternToString.Icon = Ikon
+PatternToString.NodeFontSize = Skriftst\u00F8rrelse
+plugins/ScriptEditor.exit = Avslutt
+plugins/ScriptEditor.menu_actions = Actions
+plugins/ScriptEditor.run = Kj\u00F8r
+plugins/ScriptEditor/window.Result = Resultat:
+plugins/ScriptEditor/window.title = Skriptredigering
+plugins/TimeList.xml_Created = Opprettet
+plugins/TimeList.xml_Date = Dato
+plugins/TimeList.xml_Icons = Ikoner
+plugins/TimeList.xml_Modified = Endret
+plugins/TimeList.xml_Notes = Notater
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Legg dagens dato til gjeldende node.
+plugins/TimeManagement.xml_Cancel = Avbryt
+plugins/TimeManagement.xml_cancelButton = Avbryt
+plugins/TimeManagement.xml_closeButton = Lukk
+plugins/TimeManagement.xml_Export = Eksporter valgte noder
+plugins/TimeManagement.xml_Find = Finn
+plugins/TimeManagement.xml_Goto = G\u00E5 til
+plugins/TimeManagement.xml_hour = Time:
+plugins/TimeManagement.xml_menu_actions = Actions
+plugins/TimeManagement.xml_minute = Minutt:
+plugins/TimeManagement.xml_reminderButton = P\u00E5minnelse
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Forel\u00F8pig finnes det bare en p\u00E5minnelse per node. <br>Den n\u00E5v\u00E6rende p\u00E5minnelsen er satt til {0,date} {0,time}, ditt valg var {1,date} {1,time}. <br><br>Vil du endre tid for p\u00E5minnelsen (JA) <br>eller beholde den gamle (NEI)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = P\u00E5minnelse satt til {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Fjern p\u00E5minnelse
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Fjerne alle p\u00E5minnelser for noden.
+plugins/TimeManagement.xml_Replace = Bytt ut
+plugins/TimeManagement.xml_Replace_All = Bytt ut alle
+plugins/TimeManagement.xml_Replace_Selected = Bytt ut den valgte
+plugins/TimeManagement.xml_Select = Velg
+plugins/TimeManagement.xml_todayButton = Idag
+plugins/TimeManagement.xml_WindowTitle = Tidsstyring
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = S\u00F8k & bytt ut
+preferences = Foretrukne
+PrintDirectAction.text = Skriv ut...
+printing_settings = Utskriftsskalering
+PrintPreviewAction.text = Forh\u00E5ndsvisning...
+PropertyAction.text = Foretrekkes ...
+QuitAction.text = Lukk
+read_only = Read Only
+RedoAction.text = Gjenta
+RedoFilterAction.text = Gjenta
+ReminderHookAction.text = Fjern p\u00E5minnelse
+ReminderHookAction.tooltip = Fjerner en p\u00E5minnelse fra en node.
+RemoveAllIconsAction.text = Fjern alle ikoner
+RemoveIconAction.text = Fjern siste ikon
+repair_link = Reparer link
+repair_link_question = Kunne ikke \u00C5pne det lenkede kartet. Vil du reparere linken manuelt?
+replace = Bytt ut
+ResetNodeLocationAction.text = Tilbakestill posisjon
+save_failed = Kunne ikke lagre kart {0}.
+save_unsaved = Lagre hjernekart? :
+SaveAction.text = Lagre
+SaveAll.text = Lagre alle
+SaveAll.tooltip = Lagrer alle \u00E5pne kart.
+SaveAsAction.text = Lagre som
+saved = Lagret
+scheme_evaluate = Evaluer!
+ScriptEditor.text = Skriptredigering...
+ScriptEditor.tooltip = Lar deg skrive st\u00F8rre skript i Freeplane.
+ScriptEditorPanel.changed_cancel = Skriptet ble endret. Er du sikker p\u00E5 at du ikke vil lagre disse endringene?
+select_favorites_folder = Velg mappen der du har dine favoritter
+select_folder_for_importing = Velg mappen du vil importere
+SelectAllAction.text = Velg alt synlig
+SelectBranchAction.text = Velg synlig gren
+selection_method_by_click = Enkeltklikk for \u00E5 velge
+selection_method_delayed = Forsinket automatisk fokus
+selection_method_direct = Velges automatisk
+SelectNoteAction.text = Notatredigeringsbryter
+SelectNoteAction.tooltip = Switch to resp. from note window
+SetImageByFileChooserAction.text = Angi bilde (Filvelger eller link)
+SetLinkByFileChooserAction.text = Angi link (Filvelger)
+SetLinkByTextFieldAction.text = Angi link (tekstfelt)
+SetNoteWindowPosition.bottom.text = Bottom[translate me]
+ShowAllAttributesAction.text = Vis alle atributter
+ShowAncestorsAction.text = Vis forfedre
+ShowAttributeDialogAction.text = Atributth\u00E5ndterer
+ShowDescendantsAction.text = Vis etterkommere
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+ShowHideNoteAction.text = Vis/skjul notatvindu
+ShowHideNoteAction.tooltip = Er et menyhurtigvalg for de sm\uFFFD pilene p\uFFFD delelinjen.
+ShowSelectedAttributesAction.text = Vis valgte atributter
+simplyhtml.aboutFrameTitle = Om dette programmet
+simplyhtml.alignCenter = senter
+simplyhtml.alignLabel = Posisjon:
+simplyhtml.alignLeft = venstre
+simplyhtml.alignRight = h\u00F8yre
+simplyhtml.allCellsRangeLabel = alle celler
+simplyhtml.allOccurrencesReplaced = Alle instanser er byttet ut
+simplyhtml.appendTableColLabel = Legg til kolonne
+simplyhtml.appendTableRowLabel = Legg til rad
+simplyhtml.applyCellAttrLabel = Brukes til
+simplyhtml.backgroundLabel = Bakgrunn:
+simplyhtml.boldItalicName = fet kursiv
+simplyhtml.boldName = fet
+simplyhtml.borderColorLabel = Farge:
+simplyhtml.borderWidthLabel = Bredde
+simplyhtml.bottomLabel = bunn:
+simplyhtml.cancelBtnName = Avbryt
+simplyhtml.cellBorderTabLabel = Kantlinjer
+simplyhtml.cellGenTabLabel = Generell
+simplyhtml.cellMarginTabLabel = Margin
+simplyhtml.cellPanelTitle = Celleformat
+simplyhtml.clearFormatLabel = Fjern formatering
+simplyhtml.clearFormatTip = Fjern formatering
+simplyhtml.close = Lukk
+simplyhtml.closeBtnName = Lukk
+simplyhtml.colorLabel = Farge
+simplyhtml.copyLabel = Kopier
+simplyhtml.copyTip = kopier
+simplyhtml.cTagNameHead1 = Overskrift 1
+simplyhtml.cTagNameHead2 = Overskrift 2
+simplyhtml.cTagNameHead3 = Overskrift 3
+simplyhtml.cTagNameHead4 = Overskrift 4
+simplyhtml.cTagNameHead5 = Overskrift 5
+simplyhtml.cTagNameHead6 = Overskrift 6
+simplyhtml.cTagNameLink = Link
+simplyhtml.cTagNameOL = Sortert liste
+simplyhtml.cTagNamePara = Avsnitt
+simplyhtml.cTagNameUL = Usortert liste
+simplyhtml.cutLabel = Klipp
+simplyhtml.cutTip = klipp ut
+simplyhtml.defaultDocName = Uten tittel
+simplyhtml.deleteTableColLabel = Slett kolonne
+simplyhtml.deleteTableRowLabel = Slett rad
+simplyhtml.docTitleQuery = Sett tittelen til:
+simplyhtml.docTitleTitle = Redigere dokumenttittel
+simplyhtml.editLabel = Redigere
+simplyhtml.effectLabel = Effekt
+simplyhtml.familyLabel = Familie
+simplyhtml.findNext = Finn neste
+simplyhtml.findReplaceDialogTitle = Finn og bytt ut
+simplyhtml.findReplaceLabel = Finn og bytt ut
+simplyhtml.findReplaceTip = finn & bytt ut
+simplyhtml.fontBoldLabel = Uthevet
+simplyhtml.fontBoldTip = bytt fet av/p\u00E5
+simplyhtml.fontDialogTitle = Format skrift
+simplyhtml.fontItalicLabel = Kursiv
+simplyhtml.fontItalicTip = bytt kursiv av/p\u00E5
+simplyhtml.fontLabel = Skrift...
+simplyhtml.fontTabLabel = Font
+simplyhtml.fontTip = Format skrift...
+simplyhtml.fontUnderlineLabel = Understreket
+simplyhtml.fontUnderlineTip = bytt understreket av/p\u00E5
+simplyhtml.foregroundLabel = Forgrunn:
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = Liste...
+simplyhtml.formatListTip = endre listeformat
+simplyhtml.formatParaLabel = Avsnitt...
+simplyhtml.formatParaTip = Endre avsnittsformatet
+simplyhtml.formatTableLabel = Tabell...
+simplyhtml.formatTableTip = Format tabell
+simplyhtml.helpLabel = Hjelp
+simplyhtml.htmlTabTitle = HTML-kodevisning
+simplyhtml.imageFileDesc = Bildefiler
+simplyhtml.insertTableColLabel = Sett inn kolonne
+simplyhtml.insertTableLabel = Tabell...
+simplyhtml.insertTableMsg = Hvor mange kolonner?
+simplyhtml.insertTableRowLabel = Sett inn rad
+simplyhtml.insertTableTitle = insertTable
+simplyhtml.italicName = kursiv
+simplyhtml.layoutTabTitle = Layout-visning
+simplyhtml.leftLabel = venstre:
+simplyhtml.listDialogTitle = Format liste
+simplyhtml.listIndentTitle = Innrykk:
+simplyhtml.listPosInside = innenfor
+simplyhtml.listPositionLabel = Posisjon:
+simplyhtml.listPosOutside = utenfor
+simplyhtml.listTypeCircle = runde punkter
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = punkt som filsymbol
+simplyhtml.listTypeLabel = Type:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = Ingen
+simplyhtml.listTypeSquare = firkantede punkter
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Ytre
+simplyhtml.matchCase = Ta hensyn til sm\u00E5 og store bokstaver
+simplyhtml.newStyleDefaultName = Ny stil
+simplyhtml.nextTableCellLabel = Neste celle
+simplyhtml.noLineLabel = Ingen
+simplyhtml.noMoreOccurrencesFound = Ingen (flere) instanser funnet
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Indre
+simplyhtml.paraAlignCenterLabel = Senterstilt
+simplyhtml.paraAlignCenterTip = Sett avsnitt senterstilt
+simplyhtml.paraAlignLeftLabel = Venstrestilt
+simplyhtml.paraAlignLeftTip = Sett avsnitt venstrestilt
+simplyhtml.paraAlignRightLabel = H\u00F8yrestilt
+simplyhtml.paraAlignRightTip = Sett avsnitt h\u00F8yrestilt
+simplyhtml.paraStyleDialogTitle = Avsnitt-stil
+simplyhtml.paraTabLabel = Avsnitt
+simplyhtml.pasteLabel = Lim inn
+simplyhtml.pasteTip = lim inn
+simplyhtml.plainName = normal
+simplyhtml.previewLabel = Forh\u00E5ndsvisning
+simplyhtml.previewText = Forh\u00E5ndsvisning av tekst
+simplyhtml.prevTableCellLabel = Forrige celle
+simplyhtml.redoLabel = Gjenta
+simplyhtml.redoTip = gjenta
+simplyhtml.replace = Bytt ut...
+simplyhtml.replaceAll = Alt
+simplyhtml.replaceDone = Ferdig
+simplyhtml.replaceNo = Nei
+simplyhtml.replaceThisQuery = Bytt ut denne instansen av
+simplyhtml.replaceWith = Bytt ut med:
+simplyhtml.replaceYes = Ja
+simplyhtml.rightLabel = h\u00F8yre:
+simplyhtml.searchDown = S\u00F8k ned
+simplyhtml.searchFromStart = S\u00F8k fra start
+simplyhtml.searchUp = S\u00F8k opp
+simplyhtml.selectAllLabel = Velg alt
+simplyhtml.sizeLabel = St\u00F8rrelse
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Strek gjennom
+simplyhtml.styleLabel = Stil
+simplyhtml.styleNameInputText = Navnet p\u00E5 den nye stilen?
+simplyhtml.styleNameInputTitle = Lagre stil
+simplyhtml.tableBgColLabel = Bakgrunnsfarge:
+simplyhtml.tableDialogTitle = Format tabell
+simplyhtml.tableLabel = Tabell
+simplyhtml.tablePanelTitle = Tabellformat
+simplyhtml.tableWidthLabel = Bredde:
+simplyhtml.textIndentLabel = Innrykk:
+simplyhtml.textToFind = Tekst som skal finnes:
+simplyhtml.thisCellRangeLabel = denne cellen
+simplyhtml.thisColRangeLabel = denne kolonnen
+simplyhtml.thisRowRangeLabel = denne raden
+simplyhtml.toggleBulletsLabel = Punktmarkert liste av/p\u00E5
+simplyhtml.toggleBulletsTip = punktmarkert liste av/p\u00E5
+simplyhtml.toggleNumbersLabel = Nummerert liste av/p\u00E5
+simplyhtml.toggleNumbersTip = nummerert liste av/p\u00E5
+simplyhtml.topLabel = topp:
+simplyhtml.uLineLabel = Understreket
+simplyhtml.unableToOpenFileError = Filen kan ikke \u00E5pnes
+simplyhtml.unableToRedoError = Kan ikke gjenta:
+simplyhtml.unableToUndoError = Kan ikke angre:
+simplyhtml.undoLabel = Angre
+simplyhtml.undoTip = angre
+simplyhtml.valignBaseline = grunnlinje
+simplyhtml.valignBottom = bunn
+simplyhtml.valignLabel = Vertikal posisjon:
+simplyhtml.valignMiddle = midten
+simplyhtml.valignTop = topp
+simplyhtml.wholeWordsOnly = Kun hele ord
+SortNodes.text = Sorter barn
+SortNodes.tooltip = Sorter alle barn til en node alfabetisk.
+split = Del
+SplitNode.text = Del node
+SplitNode.tooltip = <html>Noden er delt</html>
+style = Stil
+svg = SVG[translate me]
+TimeListAction.text = Vis p\u00E5minnelsesliste ...
+TimeListAction.tooltip = Vis alle p\u00E5minnelser og tilh\u00F8rende noder.
+TimeManagementAction.text = Vis kalender...
+TimeManagementAction.tooltip = <html>Viser kalendermodulen til Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Fold barn inn/ut
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Skift mellom inn- og utfoldet
+ToggleLeftToolbarAction.text = Skift venstre verkt\u00F8ylinje
+ToggleMenubarAction.text = Skift menylinje
+ToggleToolbarAction.text = Skift verkt\u00F8ylinje
+undefined_error = En uventet feil har oppst\u00E5tt. V\u00E6r s\u00E5 snill \u00E5 sende en feilrapportering.
+underline = Understreket
+underlined = Understreket
+UndoAction.text = Angre
+UndoFilterAction.text = Angre
+unfold = Fold ut
+UnfoldAllAction.text = Fold ut alle
+UnfoldAllAction.tooltip = <html>Folder ut den valgte noden og alle dens barn.</html>
+UnfoldOneLevelAction.text = Fold ut et niv\u00E5
+UnfoldOneLevelAction.tooltip = <html>Folder ut de valgte nodene ett niv\u00E5.</html>
+url_error = Denne URL er feil utformet
+url_load_error = Kunne ikke \u00C5pne hjernekartet fra URL:
+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):
+WebDocuAction.text = Web-dokumentasjon
+width = Bredde
+yes = Ja
+ZoomInAction.text = Zoom Inn
+ZoomOutAction.text = Zoom Ut
diff --git a/freeplane/resources/translations/Resources_nl.properties b/freeplane/resources/translations/Resources_nl.properties
new file mode 100644
index 0000000..5e049ca
--- /dev/null
+++ b/freeplane/resources/translations/Resources_nl.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane van Joerg Mueller\nEen programma voor het maken en bekijken van mindmaps.\nCopyright (C) 2000-2004 Joerg Mueller\nDeze software is gratis (GPL)\nHome: http://freeplane.sourceforge.net/\nVersion:
+AboutAction.text = Over Freeplane
+acceleratorPresets = Sneltoetsenset
+accelerators_loading_error = Kan de sneltoetsen niet laden uit {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Wijzig de opmaak van knopen
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Wijzig opmaakrofiel
+accessories/plugins/EncryptNode.properties_0 = Kies wachtwoord om knoop te beveiligen
+accessories/plugins/EncryptNode.properties_1 = De wachtwoorden verschillen of zijn te kort.
+accessories/plugins/EncryptNode.properties_2 = Geef een wachtwoord:
+accessories/plugins/EncryptNode.properties_3 = Geef het nog eens:
+accessories/plugins/EncryptNode.properties_4 = Geef je wachtwoord.
+accessories/plugins/EncryptNode.properties_5 = <html> Let op: de sterkte van de beveiliging<br> hangt af van de kwaliteit (voorspelbaarheid) van je wachtwoord.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Annuleer
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Je kunt alleen de beveiliging van een knoop met wachtwoord in- en uitschakelen. Voeg een wachtwoord toe via het menu Extra.
+accessories/plugins/EncryptNode.properties_select_me = Kies mij om verder te gaan!
+accessories/plugins/EncryptNode.properties_wrong_password = Het wachtwoord is onjuist.
+accessories/plugins/ExportWithTWiki.text = TWiki
+accessories/plugins/ExportWithTWiki.tooltip = Exporteren mindmap als TWiki document.
+accessories/plugins/ExportWithXSLT.tooltip = Dit is een algemene export methode
+accessories/plugins/ExportWithXSLT_Applet.text = Java Applet
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporteren mindmap als java browser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Flash
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporteren mindmap als flash toepassing.
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML, JavaScript
+accessories/plugins/ExportWithXSLT_HTML3.text = XHTML, Klikbare mindmap
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = TJI, Bronnen Taskjuggler
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html> Exporteert bronnen (resources) uit knoop RESOURCES naar Taskjuggler module. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = TJI, Taken TaskJuggler
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html> Exporteert taken uit TAKEN-knoop naar Taskjuggler module. </html>
+action_keystroke_in_use_error = Toets {0} voor actie {1} is al in gebruik voor actie {2}
+active = Aktief
+actual_map_styles = Conditionele stijl op mindmapniveau
+actual_node_styles = Conditionele stijl op knoopniveau
+add = &Toevoegen
+AddConnectorAction.text = Toevoegen verbindingslijn
+AddElementaryConditionAction.text = Toevoegen
+AddLocalLinkAction.text = Snelkoppeling naar andere knoop
+AddMenuItemLinkAction.text = Snelkoppeling naar menutoegang...
+AddOnDetailsPanel.authored.by = Door {0}
+AddOnDetailsPanel.header.function = Functie
+AddOnDetailsPanel.header.menu = Plaats van het menu
+AddOnDetailsPanel.header.shortcut = Sneltoets
+AddOnDetailsPanel.homepage = Homepagina
+addons.installer.canceled = Installatie afgebroken
+addons.installer.confirm.licence = <html><body><h1>Licentie</h1>{0}<p><p><em>Accepteer je deze licentie?</em></p></body></html>
+addons.installer.failed = Installatie mislukt: {0}
+addons.installer.freeplaneversion.format.error = Format error in {0} (waarde: {1})
+addons.installer.groovy.script.name = Script naam {0} eindigt niet met ".groovy"
+addons.installer.html.script = Script kern mag geen HTML zijn
+addons.installer.install = Installeren
+addons.installer.invalid.keyboard.shortcut = Onjuiste sneltoets {0}.
+addons.installer.licence.unchanged = Licentie is niet veranderd
+addons.installer.map.structure = Fout in mindmap structuur: {0}
+addons.installer.missing.child.nodes = Ontbrekende kindknopen: {0}
+addons.installer.missing.permission.attribute = Script {0}: missing permission attributes {1}
+addons.installer.missing.properties = Missende eigenschappen: {0}
+addons.installer.missing.translation = Ontbrekende vertaling {0} voor locale {1}
+addons.installer.no.scripts = Geen scripts aanwezig
+addons.installer.no.zipdata = Geen zip data gevonden
+addons.installer.nonstandard.permissions = Het script vereist de volgende permissie die op dit moment niet zijn ingeschakeled: {0}. \nMoeten ze standaard worden ingeschakeld ?
+addons.installer.one.child.expected = Er zou precies \u00e9\u00e9n kind van {0} moeten zijn.
+addons.installer.script.no.execution_mode = Geen "execution_mode" attribuut gedefinieer voor {0}
+addons.installer.script.no.menulocation = Geen "menuLocation" attribuut gedefinieerd voor {0}
+addons.installer.script.no.menutitle = Geen "menuTitleKey" attribuut gedefinieerd voor {0}
+addons.installer.script.no.permissions = Geen permissies gedefinieerd voor {0}
+addons.installer.success = Installatie geslaagd.\nDe plugin zal beschikbaar zijn na een herstart.
+addons.installer.success.update = Update van {0} naar {1} geslaagd.\nSommige functies zijn pas beschikbaar na een herstart.
+addons.installer.title = Add-ons installatieprogramma
+addons.installer.too.new = Huidige Freeplane versie {0} is te nieuw. Deze plug-in ondersteunt maximaal {1}
+addons.installer.too.old = Huidige Freeplane versie {0} is te oud. Deze plug-in vereist tenminste {1}
+addons.installer.unknown.deinstallation.rules = Onbekende regels voor deinstallatie {0}
+addons.installer.update = Update van versie {0}
+addons.installer.warning = <html><body><em>Je moet alleen add-ons installeren van een bron die je vertrouwt. Kwaadaardige software kan schade toebrengen aan gegevens of je privacy.</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = Toevoegen attributen uit stijl
+AddStyleAttributes.tooltip = Toevoegen attributen uit stijl
+AllMapsNodeListAction.text = Zoeken en vervangen alle mindmaps
+always = Altijd
+AlwaysUnfoldedNodeAction.text = Knoop atijd opengevouwen(wel/niet)
+antialias_all = Alles verzachten
+antialias_edges = Takken verzachten
+antialias_none = Niets verzachten
+apply = &Toepassen
+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
+ApplyToVisibleAction.text = Verder filteren (verfijnen)
+as_parent = Als ouder (Niveau hoger)
+AskForHelp.text = Hulp vragen
+AssignAttributesAction.text = Zoeken en vervangen attributen...
+attribute_delete = Alle waarden wissen
+attribute_delete_value = Deze waarde wissen
+attribute_font_size_tooltip = Tekengrootte van attribuut
+attribute_list_box_label_text = Bestaande waarden
+attribute_name = Attribuutnaam
+attribute_replace = Vervangen door
+attribute_top = Alle bekende attributen voor de geladen Mindmaps
+attribute_value = Attribuutwaarde
+attributes_AddAttributeAction.text = Toevoegen attribuut...
+attributes_adding_empty_attribute_error = Attribuutnaam mag niet leeg zijn
+attributes_all = Alle attributen
+attributes_assign_dialog = Attributen toekennen
+attributes_attribute = Attribuut
+attributes_close = Sluiten
+attributes_deselect_all = Niets
+attributes_dialog_title = Attributenbeheerder
+attributes_edit = Bewerken attributen
+attributes_edit_tooltip = Set bewerken
+attributes_for_selected = Geslecteerde knopen
+attributes_for_visible = Alle zichtbare knopen
+attributes_import = & Importeren
+attributes_import_tooltip = Importeren attributen uit alle geladen mindmaps
+attributes_no_import_candidates_found = Geen nieuwe attributen gevonden
+attributes_popup_delete = Wissen attribuut
+attributes_popup_down = Naar beneden
+attributes_popup_edit = Bewerken attributen
+attributes_popup_hide = Verbergen attributen
+attributes_popup_new = Nieuw attribuut
+attributes_popup_optimal_width = Optimale breedte
+attributes_popup_up = Naar boven
+attributes_refresh = Vernieuwen
+attributes_RemoveAllAttributesAction.text = Alle attributen verwijderen
+attributes_RemoveFirstAttributeAction.text = Eerste attribuut verwijderen
+attributes_RemoveLastAttributeAction.text = Laatste attribuut verwijderen
+attributes_restricted_attributes_tooltip = Beperk de set attributen
+attributes_restricted_values_tooltip = Beperk waardenbereik voor huidig attribuut
+attributes_restriction = Beperkte set
+attributes_select_all = Alle attributen
+attributes_select_all_tooltip = Alle attributen (de)selecteren
+attributes_show = Tonen
+attributes_skip_root = Overslaan stamknoop
+attributes_visible = Geselecteerde attibuten tonen
+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} ...
+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.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.HEADINGS.text = voor niet-bladeren
+AutomaticLayoutControllerAction.null.text = uitgeschakeld
+BackAction.text = Achteruit in sequentie
+BackAction.tooltip = Terug in de selectiehistorie
+background = Achtergrond
+bitmaps = Afbeeldingen (bitmaps)
+black = Zwart
+BlinkingNodeHookAction.text = Knipperende knoop
+BlinkingNodeHookAction.tooltip = <html> Dit laat de knoop knipperen. Maar wees voorzichtig: pas dit niet op teveel knopen toe, en <strong> niet samen met andere automatische opmaakmogelijkheden op dezelfde knoop</strong></html>
+blue = Blauw
+BoldAction.text = Vet
+boldify_branch = Vet maken
+branch = Tak
+browse = Verkennen...
+calendar_attributes_panel = Agenda en attributen
+calendar_panel = Agenda
+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_save_key_set = Kan de set met sneltoetsen niet bewaren
+cancel = &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 gewist
+cannot_join_nodes_with_children = Knopen met takken (kindknopen) kunnen niet worden samengevoegd
+cannot_move_to_child = Een ouderknoop kan niet direkt aan zijn kindknoop worden gehangen.
+CenterAction.text = Centreren
+CenterSelectedNodeAction.text = Geselecteerde knoop centreren
+ChangeConnectorArrowsAction.backward.text = Pijl achteruit
+ChangeConnectorArrowsAction.both.text = Pijlen naar beide kanten
+ChangeConnectorArrowsAction.forward.text = Pijl vooruit
+ChangeConnectorArrowsAction.none.text = Lijn zonder pijl
+ChangeConnectorArrowsAction.text = Wijzig pijlen verbindingslijn
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Bocht
+ChangeConnectorShapeAction.EDGE_LIKE.text = Als tak
+ChangeConnectorShapeAction.LINE.text = Lijn
+ChangeConnectorShapeAction.LINEAR_PATH.text = Rechthoekige lijn
+ChangeNodeLevelLeftsAction.text = Naar beneden en ouderniveau
+ChangeNodeLevelLeftsAction.tooltip = Geselecteerde knopen links van de stamknoop verplaatsen naar boven en worden kindknopen van de knoop boven de huidige knoop. Knopen rechts van de stamknoop verplaatsen naar boven. Hierop is een uitzondering: knopen direct links of rechts van de stamknoop verplaatsen naar de andere zijde van de stamknoop.
+ChangeNodeLevelRightsAction.text = Naar boven en kindniveau
+ChangeNodeLevelRightsAction.tooltip = Geselecteerde knopen rechts van de stamknoop verplaatsen naar beneden en worden kindknopen van de knoop onder de huidge knoop. Knopen links van de stamknoop verplaatsen naar boven. Hierop is een uitzondering: knopen direct links of rechts van de stamknoop verplaatsen naar de andere zijde van de stamknoop.
+choose_background_color = Kies achtergrondkleur:
+choose_cloud_color = Kies wolkkleur:
+choose_edge_color = Kies takkleur
+choose_map_background_color = Kies achtergrondkleur mindmap
+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>
+close_btn = Sluiten
+CloseAction.text = &Sluiten mindmap
+CloudAction.text = Maken/verwijderen wolk
+CloudColorAction.text = Kleur wolk...
+CloudShapeAction.ARC.text = Boog
+CloudShapeAction.RECT.text = Rechthoek
+CloudShapeAction.ROUND_RECT.text = Afgeronde rechthoek
+CloudShapeAction.STAR.text = Ster
+ColorProperty.ResetColor = Kleur herstellen
+combined = Gecombineerd
+condition = Conditie
+confirmation = Bevestiging
+connector = Verbindingslijn
+connector_arrows = Pijlvorm verbindingslijn
+connector_label = Label bij verbindingslijn
+connector_lines = Lijnvorm verbindingslijn
+connector_shapes = Bochtvorm verbindingslijn
+ConnectorColorAction.text = Kleur verbindingslijn...
+CopyAction.text = Kopi\u00ebren
+CopyAction.tooltip = Kopieer geselecteerde tak
+CopyAttributes.text = Kopi\u00ebren attributen
+CopyIDAction.text = Kopi\u00ebren knoop-ID
+CopyMapStylesAction.text = Mindmapstijl toepassen
+CopyNodeURIAction.text = Kopieer URI van knoop
+copyright = Copyright \u00a9 2000-2012 Freeplane team en anderen
+CopySingleAction.text = Kopi\u00ebren zonder zijtakken
+CopySingleAction.tooltip = Kopieer alleen de geselecteerde knoop
+CopyStyleExtensionsAction.text = Toevoegen uit stijlsjabloon
+corrupt_map = De inhoud van de mindmap is beschadigd
+CreateConjunctConditionAction.text = En
+CreateDisjunctConditionAction.text = Of
+CreateNotSatisfiedConditionAction.text = Niet
+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
+decrease_branch_font_size = Lettertype verkleinen
+DecreaseNodeFontAction.text = Lettertype verkleinen
+default = Standaardstijl
+DefaultColorAction.text = Standaardkleur
+defaultstyle.details = Knoopdetails
+defaultstyle.floating = Zwevende knoop
+defaultstyle.note = Knoopnotitie
+delete = &Wissen
+delete_child = Wissen kindknoop
+DeleteAction.text = Verwijderen knoop
+DeleteConditionAction.text = Wissen
+DeleteDetailsAction.text = Verwijderen knoopdetails
+DeleteLevelStyleAction.text = Wissen automatische opmaakstijl voor niveau
+DeleteStyleAction.text = Wissen opmaakstijl
+DeleteUserStyleAction.text = Wissen van door de gebruiker defefinieerde opmaakstijl
+dialect_info.app = Mindmap bestand {0} is gemaakt met programma {1}.
+dialect_info.unknownApp = Het geladen mindmap bestand is gemaakt met een onbekend programma.
+dialect_info.unknownURL = Zijn website is onbekend.
+dialect_info.url = Bezoek programmawebsite {0} voor meer informatie.
+dialect_info.warning = Freeplane kan onjuist worden geopend, getoond of bewaard.
+DirectHtmlFlavorHandler = HTML als enkele knoop
+DocumentationAction.text = Documentatie
+down = N&aar beneden
+download = Laad
+dropped_file_error = Kon het geplakte bestand(en) niet openen. Oorzaak: {0}
+edge = Tak
+edge_is_formatted_by_style = Takopmaak bepaald door stijl...
+edge_style = Vorm tak
+edge_width = Dikte tak
+EdgeColorAction.text = Kleur tak
+EdgeStyleAction.bezier.text = Ronde bocht
+EdgeStyleAction.bezier.tooltip = <html>Toon de tak als bocht.</html>
+EdgeStyleAction.hide_edge.text = Verborgen
+EdgeStyleAction.hide_edge.tooltip = <html>Toon voor de geselecteerde knopen de verbinding naar de ouder als<br>stippellijn en verberg de verbinding in andere gevallen..</html>
+EdgeStyleAction.horizontal.text = Rechthoekige bocht
+EdgeStyleAction.horizontal.tooltip = <html>Gebruik loodrechte rechte lijnen voor de takken.</html>
+EdgeStyleAction.linear.text = Rechte lijn
+EdgeStyleAction.linear.tooltip = <html>Toon de tak als rechte lijn.</html>
+EdgeStyleAction.sharp_bezier.text = Taps toelopend ronde bocht
+EdgeStyleAction.sharp_bezier.tooltip = <html>Toon de tak als bocht met scherpe uiteinden.</html>
+EdgeStyleAction.sharp_linear.text = Tapstoelopend recht
+EdgeStyleAction.sharp_linear.tooltip = <html>Toon de tak als rechte lijn met scherpe uiteinden.</html>
+EdgeStyleAsParentAction.text = Als ouderknoop
+EdgeStyleAsParentAction.tooltip = <html>Use edge style of parent node.</html>[obsolete]
+EdgeWidthAction_width_parent.text = Als ouderknoop
+EdgeWidthAction_width_thin.text = Dun
+edit = Be&werken
+edit.decision = HTML Editor
+edit.edit_rich_text = Wil je opmaak zoals Vet en Schuin gebruiken ?
+edit_details = Bewerken knoopdetails
+edit_end_label = <html>Connector<br>label
+edit_label_font_family = Lettertype
+edit_label_font_size = Lettergrootte
+edit_link_manually = De koppeling intypen...
+edit_long_node = Bewerken knoopkern in apart venster
+edit_middle_label = Tekstlabel midden
+edit_note = Bewerken notitie
+edit_source_label = Tekstabel begindzijde
+edit_target_label = Tekstlabel eindzijde
+edit_transparency_label = Doorschijnendheid
+edit_width_label = Dikte
+EditAction.text = Bewerken knoopkern (snel)
+EditAttributesAction.text = Toevoegen en bewerken attribuut
+EditDetailsAction.text = Bewerken knoopdetails (snel)
+EditDetailsInDialogAction.text = Bewerken knoopdetails in apart venster
+EditFilterAction.text = Componeren filter
+EditLongAction.text = Bewerken knoopkern in apart venster
+EditNoteInDialogAction.text = Bewerken knoopnotitie
+EditScript = Bewerken script...
+EditStylesAction.text = Bewerken knoopstijlen
+EncryptedMap.text = Nieuwe beveiligde mindmap ...
+EncryptedMap.tooltip = Maken beveiligde mindmap
+enter_base_url = Ik ga relatieve koppelingen plakken. Geef uw basis URL op.
+enter_condition_name = Voer niewe naam in voor de conditie
+enter_confirms = &Entertoets bevestigt
+enter_keyset_name = Invoeren naam voor set met sneltoetsen
+enter_map_url = Vul URL van mindmap in.
+enter_new_style_name = Invoeren naam voor opmaakstijl
+enter_node_id = Voer knoop ID in
+enter_zoom = Invoeren zoom factor
+EnterPassword.text = Opgeven wachtwoord
+error = Er is een fout opgetreden
+error_applying_template = Fout bij het toepassen van XSL template
+error_creating_directory = Kan geen map voor export maken.
+error_in_template = Fouten in standaard mindmap template {0}. Probeer dit bestand te verwijderen.
+errornumber = {0} fouten
+ExecuteScriptError.text = Fout bij uitvoeren script \n {0}Controleer het log-bestand voor details.
+ExecuteScriptForAllNodes.text = Uitvoeren alle scripts
+ExecuteScriptForSelectionAction.text = Uitvoeren scripts van geselecteerde knopen
+ExecuteScriptOnSelectedNode.text = Uitvoeren {0} voor alle geselecteerde knopen
+ExecuteScriptOnSelectedNodeRecursively.text = Recursief uitvoeren {0} voor alle knopen
+ExecuteScriptOnSingleNode.text = Uitvoeren {0} voor \u00e9\u00e9n geselecteerde knoop
+ExecuteScripts.noScriptsAvailable = Niet aanwezig
+ExecuteScripts.text = Beschikbare groovy scripts
+ExecuteScriptSecurityError.text = Er is een fout opgetreden bij de uitvoering van script: {0}
+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...
+ExportBranchAction.text = Exporteren tak als nieuwe mindmap
+ExportBranchToHTMLAction.text = HTML, volledige tak
+exported_file = {0} bestand
+ExportPdf.text = PDF, Portable Document Format
+ExportSvg.text = SVG, Scalable Vector Graphics
+ExportToHTMLAction.text = HTML, hele mindmap
+ExportToImage.jpg.text = JPEG, gecomprimeerd beeld
+ExportToImage.png.text = PNG, Portable Network Graphic
+ExportToOoWriter.text = ODT, Open Office Text
+extension_menu = &Opmaakpatronen...
+ExternalImage_popupMenu_Change = Wijzig...
+ExternalImage_popupMenu_Open = Open in viewer
+ExternalImage_popupMenu_Remove = Verwijder
+ExternalImage_popupMenu_ResetZoom = Herstel zoom
+ExternalImageAddAction.text = Toevoegen afbeelding
+ExternalImageChangeAction.text = Wijzigen afbeeldingsgrootte
+ExternalImageRemoveAction.text = Verwijderen afbeelding
+ExtractLinkFromTextAction.text = Koppeling uit tekstadres
+ExtractLinkFromTextAction.tooltip = Maak snelkoppeling van adres in kern
+f_button_unassigned = <geen actie>
+FaqOpenURLAction.text = FAQ
+file = &Bestand
+file_already_exists = Het bestand {0} bestaat al. Wil je het overschrijven?
+file_not_found = Bestand {0} niet gevonden
+FileListFlavorHandler = Hyperlinks naar bestanden
+FileProperties_BranchLeafCount = Aaantal bladknopen in geselecteerde tak(ken)
+FileProperties_BranchNodeCount = Aantal knopen in geselecteerde tak(ken):
+FileProperties_ChangesSinceLastSave = Wijzigingen na laatste keer bewaren:
+FileProperties_FileName = Bestandsnaam:
+FileProperties_FileSaved = Opgeslagen bestand:
+FileProperties_FileSize = Bestandsgrootte:
+FileProperties_MainBranchCount = Aantal hoofdtakken:
+FileProperties_NeverSaved = Nooit opgeslagen
+FileProperties_NodeChildCount = Aantal kinderen van geselecteerde knop/knopen:
+FileProperties_NodeSelectionCount = Aantal geselecteerde knopen:
+FileProperties_TotalFilteredCount = Aantal knopen dat aan filtercriterium voldoet:
+FileProperties_TotalLeafCount = Totaal aantal bladknopen:
+FileProperties_TotalNodeCount = Totaal aantal knopen:
+FilePropertiesAction.text = Mindmapeigenschappen
+FileRevisionsDialog.cancel = Niet uitvoeren
+FileRevisionsDialog.file_last_modified = Tijdstempel
+FileRevisionsDialog.file_name = Bestand
+FileRevisionsDialog.file_size = Bytes
+FileRevisionsDialog.open = Open
+FileRevisionsDialog.open.tooltip = Open bestand ook indien verouderd
+FileRevisionsDialog.question = Versies (Revisies) gevonden van {0}
+FileRevisionsDialog.restore = Herstellen
+FileRevisionsDialog.restore.tooltip = Vervangen {0} door {1}
+FileRevisionsDialog.title = Bestandsversies(revisies)
+filter = Filter
+filter_add = &Toevoegen
+filter_and = &En
+filter_any_text = Kern, details of notitie
+filter_conditions = Filters
+filter_contains = Bevat
+filter_created_after = Gemaakt na
+filter_created_before = Gemaakt voor
+filter_delete = &Wissen
+filter_details = Knoopdetails
+filter_dialog = Filter samenstellen
+filter_does_not_exist = Bestaat niet
+filter_edit_description = Bewerken filterlijst
+filter_enter_value = Invoeren waarde
+filter_even_level = Knoop op oneven niveau
+filter_exist = Bestaat
+filter_icon = Pictogram
+filter_is_equal_to = Is gelijk aan
+filter_is_not_equal_to = Is niet gelijk aan
+filter_leaf = Bladknoop
+filter_link = Koppeling
+filter_match_approximately = Benaderen
+filter_match_approximately_tooltip = <html>Of benaderingen zijn toegestaan,<br/>bijv zoeken naar 'bestand' vindt ook ''berand''.</html>
+filter_match_case = Hoofdlettergevoelig
+filter_match_case_tooltip = Of rekening moet worden gehouden met hoofd/kleine letters.
+filter_modified_after = Gewijzigd na
+filter_modified_before = Gewijzigd voor
+filter_no_filtering = Geen filter
+filter_node = Knoopkern
+filter_node_level = Knoopniveau
+filter_not = &Niet
+filter_note = Knoopnotitie
+filter_odd_level = Knoop op even niveau
+filter_or = &Of
+filter_parent = Knoopkern van ouder
+filter_periodic_level = Periodiciteit
+filter_priority = Pioriteit
+filter_regexp_matches = Komt overeen met reguliere expressie
+filter_reminder = Herinnering
+filter_reminder_after = vindt plaats na
+filter_reminder_before = vindt plaats voor
+filter_reminder_executed = al uitgevoerd
+filter_reminder_later = later ingesteld
+filter_root = stamknoop
+filter_script = Script filter
+filter_select = &Selecteren
+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 = Wat wil je zoeken?
+FindAction.text = Zoeken...
+FirstGroupNodeAction.text = Eerste knoop van groep
+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
+FitToPage.text = Maak passend op de pagina
+FitToPage.tooltip = Grootte van de mindmap aanpassen aan de huidige venstergrootte.
+fold = Dichtvouwen (verbergen)
+FoldAllAction.text = Alle afstammelingen dichtvouwen
+FoldAllAction.tooltip = <html> Alle afstammelingen dichtvouwen.</html>
+FoldOneLevelAction.text = E\u00e9n niveau dichtvouwen
+FoldOneLevelAction.tooltip = <html> E\u00e9n niveau dichtvouwen.</html>
+follow_graphical_link = Ga naar:
+FollowLinkAction.text = Openen hyperlink
+font = Lettertype
+FontFamilyAction.text = Lettertypenaam (font)
+FontSizeAction.text = Lettertypegrootte
+format_invalid_pattern = Geen geldig patroon
+format_menu_cloud_shapes = Toevoegen wolk of veranderen vorm
+format_menu_edge_styles = Vorm tak
+format_menu_edge_widths = Dikte tak
+format_panel = Opmaak
+FormatCopy.text = Kopi\u00ebren opmaak (kern)
+FormatCopy.tooltip = <html> Hiermee kopi\u00eber je alleen de opmaak van een knoop.</html>
+FormatPaste.text = Plakken opmaak
+FormatPaste.tooltip = <html> Hiermee plak je de opmaak van een knoop.</html>
+formats_not_loaded = Formaten konden niet worden geladen, bestand is beschadigd
+formula.error.attributeValueIsNull = Attribuutwaarde "{0}" is leeg na evaluatie
+formula.error.circularReference = Cirkelverwijzing: De formule in knoop "{0}"verwijst naar zichzelf.
+formula.EvaluateAllAction.text = Alles uitrekenen
+formula.EvaluateAllAction.tooltip = Alle formules in de huidige map uitrekenen
+formula.menuname = Formules
+formula_editor = Bewerken formule
+ForwardAction.text = Vooruit in sequentie
+ForwardAction.tooltip = Vooruit in de selectiehistorie
+FreeNodeAction.text = Vrije knoop (aan/uit)
+Freeplane.progress.buildScreen = Scherm opbouwen...
+Freeplane.progress.createController = Controller aanmaken...
+Freeplane.progress.createInitialMode = Initi\u00ebleInitiele modus bepalen...
+Freeplane.progress.endStartup = Opstarten be\u00ebindigen
+Freeplane.progress.gettingPreferenceDirectories = Mappen met voorkeuren ophalen...
+Freeplane.progress.gettingPreferences = Voorkeuren ophalen...
+Freeplane.progress.loadMaps = Mindmap bestanden openen
+Freeplane.progress.propagateLookAndFeel = Verspreid verschijningvorm over kindknopen...
+Freeplane.progress.settingPreferences = Voorkeuren instellen
+Freeplane.progress.startCreateController = Begin met aanmaken van een Controller...
+Freeplane.progress.updateLookAndFeel = Bijwerken verschijningsvorm...
+freeplane_reverted = Freeplane_Teruggezet_
+FreeplaneHelpStarter.text = On line help...
+FreeplaneHelpStarter.tooltip = Uitgebreide help voor Freeplane op het Internet.
+GettingStartedAction.text = Handleiding
+GotoLinkNodeAction.text = Open snelkoppeling
+GotoNodeAction.text = Naar knoop met ID...
+GrabKeyDialog.common.cancel = Annuleren
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Toegewezen aan
+GrabKeyDialog.grab-key.assigned-to.none = Nog niet toegewezen
+GrabKeyDialog.grab-key.clear = Wissen
+GrabKeyDialog.grab-key.remove = Verwijderen
+GrabKeyDialog.grab-key.remove-ask = Weet je zeker dat je deze toets wilt verwijderen?
+GrabKeyDialog.grab-key.title = Nieuwe toetsactie bepalen
+green = Groen
+help = &Help
+HideableAction.tooltip = <htm>Markeren van de achtergrond van elke vernaderde knoop. <html>
+HideAllAttributesAction.text = Verbergen van alle atributen
+HierarchicalIcons2Action.text = Toon kruispunt kind-pictogrammen
+HierarchicalIconsAction.text = Pictogrammenhi\u00ebrarchie
+HierarchicalIconsAction.tooltip = Als \u00e9\u00e9n van mijn onderliggende mappen een icoontje heeft, dan zal ik dat ook in het klein tonen
+hot_keys = Sneltoetsen
+hot_keys_table = Overzicht sneltoetsen
+HotKeyInfoAction.text = Overzicht van sneltoetsen
+html_export_based_on_headings = HTML-export - Gebaseerd op koppen
+html_export_fold_all = HTML-export - Alleen hoofdtakken tonen, andere takken dichtvouwen
+html_export_fold_currently_folded = HTML-export - Alleen openvouwen wat nu op de mindmap zichtbaar is
+html_export_no_folding = HTML-export - Alle takken opengevouwen
+html_problem = <html>Kan geen html genereren<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Optelling
+icon_attach = Kijk hier
+icon_audio = Audio
+icon_back = Terug
+icon_bee = Freeplane
+icon_bell = Onthouden
+icon_bookmark = Uitstekend
+icon_broken-line = Kapot
+icon_button_cancel = Niet OK
+icon_button_ok = OK
+icon_calendar = Datum
+icon_checked = Vinkje
+icon_clanbomber = Gevaarlijk
+icon_clock = Tijd
+icon_clock2 = Herinnering
+icon_closed = Geen toegang
+icon_decrypted = Niet beveiligd, open
+icon_desktop_new = Niet vergeten
+icon_division = Deling
+icon_down = Naar beneden
+icon_edit = Uitwerken
+icon_encrypted = Op slot
+icon_executable = Uitvoerbaar programma
+icon_family = Familie
+icon_fema = Man & vrouw
+icon_female1 = Vrouw1
+icon_female2 = Vrouw2
+icon_females = Vrouwen
+icon_flag = Rode vlag
+icon_flag-black = Zwarte vlag
+icon_flag-blue = Blauwe vlag
+icon_flag-green = Groene vlag
+icon_flag-orange = Oranje vlag
+icon_flag-pink = Roze vlag
+icon_flag-yellow = Gele vlag
+icon_folder = Map
+icon_forward = Vooruit
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Prioriteit 0
+icon_full-1 = Prioriteit 1
+icon_full-2 = Prioriteit 2
+icon_full-3 = Prioriteit 3
+icon_full-4 = Prioriteit 4
+icon_full-5 = Prioriteit 5
+icon_full-6 = Prioriteit 6
+icon_full-7 = Prioriteit 7
+icon_full-8 = Prioriteit 8
+icon_full-9 = Prioriteit 9
+icon_go = Groen stoplicht
+icon_gohome = Thuis
+icon_group = Groep
+icon_help = Vraag
+icon_hourglass = Wachten
+icon_icon_not_found = Pictogram niet gevonden
+icon_idea = Idee
+icon_image = Afbeelding
+icon_info = Informatie
+icon_internet = Internet
+icon_internet_warning = Internetwaarschuwing
+icon_kaddressbook = Telefoon
+icon_kmail = E-Mail
+icon_knotify = Muziek
+icon_korn = Postbus
+icon_ksmiletris = Ik ben gelukkig
+icon_launch = Lancering
+icon_licq = Leuk
+icon_list = Lijst
+icon_Mail = Post
+icon_male1 = Man1
+icon_male2 = Man2
+icon_males = Mannen
+icon_menu = Pictogram
+icon_messagebox_warning = Belangrijk
+icon_mindmap = Mindmap
+icon_multiplication = Vermenigvuldiging
+icon_narrative = Vertelling
+icon_negative = Negatief
+icon_neutral = Neutraal
+icon_password = Sleutel
+icon_pencil = Verder uitwerken
+icon_penguin = Linux
+icon_positive = Positief
+icon_prepare = Geel verkeerslicht
+icon_revision = Revisie
+icon_smiley-angry = Boos
+icon_smiley-neutral = Geen idee
+icon_smiley-oh = Verrassing
+icon_smily_bad = Vind ik niet leuk
+icon_stop = Rood verkeerslicht
+icon_stop-sign = Stop
+icon_subtraction = Aftrekking
+icon_unchecked = Zonder vinkje
+icon_up = Naar boven
+icon_user_icon = Gebruikerpictogrammen
+icon_very_negative = Zeer negatief
+icon_very_positive = Zeer positief
+icon_video = Video
+icon_wizard = Magie
+icon_xmag = Discussie nodig
+icon_yes = Belangrijk
+IconGroupPopupAction.arrows.text = Pijlen
+IconGroupPopupAction.docs_folders.text = Documenten en mappen
+IconGroupPopupAction.flags.text = Vlaggen
+IconGroupPopupAction.math.text = Berekening
+IconGroupPopupAction.media.text = Media
+IconGroupPopupAction.miscellaneous.text = Allerhande
+IconGroupPopupAction.nature.text = Natuur
+IconGroupPopupAction.numbers.text = Getallen
+IconGroupPopupAction.office.text = Kantoor
+IconGroupPopupAction.people.text = Mensen
+IconGroupPopupAction.rating.text = Score
+IconGroupPopupAction.signs.text = Tekens
+IconGroupPopupAction.smiley.text = Smiley
+IconGroupPopupAction.time.text = Tijd
+IconGroupPopupAction.user.text = Gebruikerpictogrammen
+IconProgressExtended10Action.text = Grote schijf met 10% punt
+IconProgressExtended10Action.tooltip = <html>Voegt schijf toe met punt die 10% groter wordt bij dubbel rechtsklikken. .<br>Control + dubbel rechtsklikken vermindert het percentage of verwijdert de schijfpunt..</html>
+IconProgressExtended25Action.text = Grote schijf met 25% punt
+IconProgressExtended25Action.tooltip = <html>Voegt %schijf toe punt die 25% groter wordt bij dubbel rechtsklikken..<br> Control +dubbel linksklikken verkleint of verwijdert de schijfpunt.</html>
+IconProgressIconDownAction.text = Verminderen %
+IconProgressIconDownAction.tooltip = Vermindert/verwijdert schijfpunten (100%->75%->50%->25%->0%->verwijder).
+IconProgressIconUpAction.text = Vermeerderen %
+IconProgressIconUpAction.tooltip = Vermeerder schijfpunt pictogram (0%->25%->50%->100% + OK)
+IconProgressRemoveAction.text = Verwijder schijfpunt
+IconProgressRemoveAction.tooltip = Verwijder %schijf (pictogram en grote schijf).
+IconSelectionPlugin.text = Kiezen pictogram uit tabel...
+IconSelectionPlugin.tooltip = <html> Hier kun je een pictogram kiezen..</html>
+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
+ImportBranchAction.text = Importeren volledige tak...
+ImportExplorerFavoritesAction.text = Importeren Explorer-favorieten...
+ImportFolderStructureAction.text = Importeren mappenstructuur...
+ImportLinkedBranchAction.text = Importeren gekoppelde tak...
+ImportLinkedBranchWithoutRootAction.text = Importeren gekoppelde tak zonder stamknoop...
+ImportMindmanagerFiles.text = Importeren MindManager X5 Map...
+increase_branch_font_size = Lettertype vergroten
+IncreaseNodeFontAction.text = Lettertype vergroten
+internal_error_tooltip = Interne fout. Raadpleeg laatste log bestand in {0} voor meer informatie.
+invalid_export_file = Ongeldige bestandsnaam voor exporteren
+invalid_file_msg = Kon bestand voor {0} niet vinden
+invalid_uri = Ongeldige URI {0}
+invalid_url = Kon geen geldige URL maken
+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
+LatexDeleteLatexAction.text = Verwijderen formule (LaTex)
+LatexEditLatexAction.text = Bewerken formule (LaTeX)...
+LatexInsertLatexAction.text = Toevoegen formule (LaTeX)...
+less_than_two_selected_nodes = Je moet minstens twee knopen selecteren om een snelkoppeling te maken.
+license = Licentie
+license_text = Freeplane - Een programma om Mindmaps te maken en te bekijken\nCopyright (C) 2000-2010 Joerg Mueller <joergmueller at bigfoot.com>\nBekijk COPYING voor details\n\nDit programma is gratis software; U kunt het opnieuw distribueren en- of\naanpassen onder de voorwaarden van de GNU General Public License\nzoals gepubliceerd door de Free Software Foundation; versie 2\nvan de licentie, of (naar eigen keuze) een latere versie.\n\nDit programma is verstrekt in de hoop dat het bruikbaar is ,\nmaar zonder enige garantie te geven over de\nverhandelbaarheid of geschiktheid voor een specifiek doel. Zie de \nGNU General Public License voor meer details.\n\nU moet een kopie van de GNU General Public License\nhebben ontvangen bij dit programma; Als dat niet zo is, schrijf naar de Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = Laden
+load_accelerator_presets = Laden
+LoadAcceleratorPresetsAction.textPatterns.text = Sets met sneltoetsen:
+locking_failed_by_open = Mindmap {0} is in gebruik en wordt daarom als alleen-lezen geopend.
+locking_failed_by_save_as = Mindmap {0} is in gebruik en daarom wordt de actie bewaren-als afgebroken.
+locking_old_lock_removed = Mindmap {0} was geblokkeerd omdat deze in gebruik was door gebruiker {1}. De blokkering is nu ongedaan gemaakt.
+long_node_changed_cancel = U heeft de knoop gewijzigd. Wilt u de wijzigingen annuleren?
+long_node_changed_submit = U heeft de knoop gewijzigd. Wilt u de wijzigingen bewaren?
+lots_of_links_warning = Je gaat veel koppelingen naar dezelfde knoop maken. Wilt je deze koppelingen werkelijk aanmaken?
+main_resource_directory = Installeren bronnen: {0}
+MainView.errorUpdateText = Fout bij het instellen van de tekst voor input: {0}.\n De fout was: {1}
+MakeLinkFromAnchorAction.text = Maken koppeling vanaf anker
+MakeLinkFromAnchorAction.tooltip = <html>maken koppeling van <br/>de ankerknoop naar de geselekteerde knoop; ook tussen mindmaps</html>
+MakeLinkToAnchorAction.text = Maken koppeling naar anker
+MakeLinkToAnchorAction.tooltip = <html>maken van een koppeling van<br/>de geselekteerde knoop naar de ankerknoop;ook tussen mind maps</html>
+ManageAddOnsAction.text = Add-ons
+ManageAddOnsDialog.activate = Activeren
+ManageAddOnsDialog.activation.success = {0} wordt actief na een herstart
+ManageAddOnsDialog.authored.by = door {0}
+ManageAddOnsDialog.cannot.activate = Kan niet aktiveren: {0} is al aktief.
+ManageAddOnsDialog.cannot.configure = Kan niet configureren {0}.
+ManageAddOnsDialog.cannot.deactivate = Kan niet deactiveren: {0} is niet aktief.
+ManageAddOnsDialog.cannot.deinstall = Kanniet deinstalleren {0}.
+ManageAddOnsDialog.configure = Instellen
+ManageAddOnsDialog.deactivate = Deaktiveren
+ManageAddOnsDialog.deactivation.success = deacktiveren {0} vereist een herstart
+ManageAddOnsDialog.deinstall = Deinstallleren
+ManageAddOnsDialog.deinstallation.success = {0} wordt door herstarten gedeinstalleerd.
+ManageAddOnsDialog.error = Fout bij installeren: {0}
+ManageAddOnsDialog.install = &Installeren
+ManageAddOnsDialog.install.from.known.location = Installeren add-on van een bekende locatie
+ManageAddOnsDialog.install.tooltip = Vul hier de URL van een add-on installatie in
+ManageAddOnsDialog.map.not.opened = Mindmap {0} lijkt niet geopend.
+ManageAddOnsDialog.really.deinstall = Echt {0} dinstalleren ?
+ManageAddOnsDialog.search = Add-ons zoeken
+ManageAddOnsDialog.search.file = Zoeken
+ManageAddOnsDialog.select.tooltip = Selecteren bestand
+ManageAddOnsDialog.status.downloading = Downloaden bestand...
+ManageAddOnsDialog.status.installing = Installeren plug-in...
+ManageAddOnsDialog.status.success = Installeren geslaagd
+ManageAddOnsDialog.tab.install = Zoeken en installeren
+ManageAddOnsDialog.tab.install.tooltip = Zoeken en installeren niewue add-ons
+ManageAddOnsDialog.tab.manage = Beheren add-ons
+ManageAddOnsDialog.tab.manage.themes = Thema's
+ManageAddOnsDialog.tab.manage.themes.tooltip = Beheren geinstalleerde thema's
+ManageAddOnsDialog.tab.manage.tooltip = Beheren add-ons
+ManageAddOnsDialog.visit.addon.page = Ga naar add-on pagina
+ManageConditionalStylesAction.text = Beheren conditionele stijlen op mindmapniveau
+ManageNodeConditionalStylesAction.text = Beheren conditionele stijlen op knoopniveau
+map_already_exists = De mindmap bestaat al. Wilt u deze overschrijven?
+map_corrupted = De mindmap is beschadigd. Details bekijken?
+map_load_error = Kon mindmap niet laden.
+map_locked_by_open = De mindmap {0} wordt al bewerkt door gebruiker {1} en wordt als alleen-lezen geopend.
+map_locked_by_save_as = De mindmap {0} wordt al bewerkt door gebruiker {1}. De actie bewaren-als is afgebroken.
+map_not_saved = De mindmap was niet opgeslagen.
+MapBackgroundColorAction.text = Achtergrondkleur mindmap...
+MaxNodeWidth.text = Bepaal maximum knoopbreedte
+menu_applyStyle = Toepassen stijl
+menu_attributes = Attributen
+menu_clouds = Wolk
+menu_copy = Kopieren
+menu_coreFormat = Knoopkern
+menu_details = Knoopuitbreiding
+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
+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_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 geldig menu item sleutel
+mindmap = Mindmap
+MindMapNodesFlavorHandler = Knoop hi\u00ebrarchie (afstamming)
+mindmaps = &Mindmaps
+mindmaps_desc = Mindmaps (*.mm)
+mindmaps_filter_desc = Filters (*.mmfilter)
+MinNodeWidth.text = Instellen minimum knoopbreedte
+mode_Browse = Bladermodus
+mode_File = Bestandsmodus
+mode_MindMap = Mindmapmodus
+mode_na = Modus is niet beschikbaar
+mode_status = Modus gewijzigd naar {0}
+mode_title = Freeplane - {0} Modus
+modes = Modus
+ModesMenuAction.Browse.text = Mindmaplezer
+ModesMenuAction.File.text = Bestandsverkenner
+ModesMenuAction.MindMap.text = Mindmapbewerker
+most_recent_files = &Onlangs geopend
+MoveToRootAction.text = Naar stamknoop
+NameConditionAction.text = Naam toekennen
+NavigationNextMapAction.text = Volgende mindmap
+NavigationPreviousMapAction.text = Vorige mindmap
+new = &Nieuw
+new_map_from_user_templates.text = Nieuwe mindmap met stijl...
+new_mindmap = Nieuwe mindmap
+new_node = Nieuwe knoop
+new_node_as_sibling_not_possible_for_the_root = Nieuwe knoop op dit niveau (stamknoop) is niet mogelijk
+new_version_available = Nieuwe versie ''{0}''beschikbaar
+NewChildAction.text = Nieuwe kindknoop (niveau lager)
+NewerFileRevisionsFoundDialog.cancel = Overslaan
+NewerFileRevisionsFoundDialog.cancel.tooltip = Dit bestand niet openen
+NewerFileRevisionsFoundDialog.file_last_modified = Tijdstip
+NewerFileRevisionsFoundDialog.file_name = Bestand
+NewerFileRevisionsFoundDialog.file_size = Bytes
+NewerFileRevisionsFoundDialog.open = Openen
+NewerFileRevisionsFoundDialog.open.tooltip = Open ook indien verouderd
+NewerFileRevisionsFoundDialog.question = Nieuwere versie gevonden van: {0}!\nWil je {0} openen?\nOm {0} te vervangen door een automatisch bewaard bestand uit de lijst\nkies het bestand en klik ''Herstellen''.
+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 ?
+NewMapAction.text = Nieuwe mindmap
+NewMapViewAction.text = Nieuwe mindmap afbeelding
+NewParentNode.text = Nieuwe ouderknoop (niveau hoger)
+NewParentNode.tooltip = <html> Alle geselecteerde knopen worden naar nieuwe ouderknoop verplaatst.</html>
+NewPreviousSiblingAction.text = Nieuwe knoop boven de huidige
+NewSiblingAction.text = Nieuwe knoop onder de huidige
+NewSummaryAction.text = Nieuwe groepsknoop met accolade
+NewUserStyleAction.text = Selectie bewaren als nieuwe gebruikerstijl
+NextNodeAction.BACK.text = Naar vorige knoop
+NextNodeAction.BACK_N_FOLD.text = Naar vorige knoop (dichtvouwen)
+NextNodeAction.FORWARD.text = Naar volgende knoop
+NextNodeAction.FORWARD_N_FOLD.text = Naar volgende knoop (dichtvouwen)
+NextPresentationItemAction.text = Uitvouwen volgend presentatieitem
+no = Nee
+no_copy_attributes_before_paste_attributes = Het is niet mogelijk attributen te plakken voordat deze zijn gekopieerd.
+NO_FORMAT = Tekst
+no_format_copy_before_format_paste = Je kunt geen opmaak plakken voor je opmaak gekopi\u00eberd hebt.
+no_found_from = <html> Geen <b>{0}</b> gevonden van <b>{1}</b>.
+no_more_found_from = <html> Geen <b>{0}</b> meer gevonden van <b>{1}</b>.
+no_previous_find = Niet opnieuw gevonden
+no_styles_found_in_map = Geen stijlen in de mindmap gevonden
+node = Knoop
+node_changed_discard_changes = U heeft de knoop gewijzigd. Wilt u de wijzigingen annuleren?
+node_is_write_protected = De doelknoop is beveiligd tegen schrijven
+node_location_help = Slepen verandert de plaats van de knoop, ctrl+slepen verandert de afstand, dubbel klikken en ctrl+dubbel klikken herstellen de positie.
+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
+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.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
+ok = OK
+OKAction.text = &OK
+OnlineReference.text = Online documentatiemindmaps
+open_asMindMap = Miindmap
+OpenAction.text = Openen mindmap...
+OpenFreeplaneSiteAction.text = Thuispagina op Internet van Freeplane
+OpenPathAction.text = Openen bestand
+OpenURLMapAction.text = Open mindmap voor URL...
+OpenUserDirAction.text = Openen gebruikersdirectory
+option_changes_may_require_restart = Om de gewijzigde instellingen te laten werken, zul je waarschijnlijk Freeplane moeten sluiten en opnieuw starten.
+OptionalDontShowMeAgainDialog.cancel = &Nee
+OptionalDontShowMeAgainDialog.dontShowAgain = &Vraag dit niet nog eens
+OptionalDontShowMeAgainDialog.ok = &Ja
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Onthoud mijn beslissing
+OptionPanel.absolute = Absoluut
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Stijlen voor automatisch-opmaken
+OptionPanel.ADD_CHILD = Toevoegen kindknoop
+OptionPanel.ADD_SIBLING = Toevoegen onderliggende knoop (sibling)
+OptionPanel.addons = Add-ons
+OptionPanel.always_fold_all_after_load = Alles dichtvouwen
+OptionPanel.always_load_last_maps = Openen laatste en nieuwe mindmapbestanden
+OptionPanel.always_load_last_maps.tooltip = Open de laatste bestanden zoals aangegeven door bovenstaande opties en start FP met een geselecteerde mindmap
+OptionPanel.always_save_folding = Altijd
+OptionPanel.always_save_folding_state = Laatste toestand van open/dichtvouwen onthouden
+OptionPanel.always_save_folding_state.tooltip = Bij open/dichtvouwen vragen om de mindmap op te slaan.
+OptionPanel.always_unfold_all_after_load = Alles openvouwen
+OptionPanel.antialias = Verzachten
+OptionPanel.antialias.tooltip = <html> Bepaalt de kwaliteit van de mindmap. Meer verzachten duurt langer.</html>
+OptionPanel.antialias_all = Alles verzachten
+OptionPanel.antialias_edges = (Afstammings)lijnen verzachten
+OptionPanel.antialias_none = Niets verzachten
+OptionPanel.Appearance = Voorkomen
+OptionPanel.apply_system_screen_resolution = Toepassen standaard beeldschermresolutie
+OptionPanel.approximate_search_threshold = Drempel voor zoeken bij benadering
+OptionPanel.approximate_search_threshold.tooltip = <html>Drempel voor benaderend passen<br/><font size="2">zie http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(groter betekent dat de gevonden term meer lijkt op de zoekterm<br/>)</html>
+OptionPanel.ar = Arabisch / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ARC = Boog
+OptionPanel.as_parent = Als ouderknoop
+OptionPanel.ask = Vraag
+OptionPanel.automatic = Automatisch
+OptionPanel.automaticFormat_level = Opmaak knopen op verschillende niveaus
+OptionPanel.automaticFormat_level1 = Opmaak van de stamknoop
+OptionPanel.automaticFormat_level2 = Opmaak van een knoop op niveau 1
+OptionPanel.backup_file_number = Aantal permanent bewaarde back-up bestanden
+OptionPanel.Behaviour = Gedrag
+OptionPanel.bezier = Ronde bocht
+OptionPanel.bubble = Knoopomlijning
+OptionPanel.ca = Catalaans / Catal\u00e0
+OptionPanel.Cancel = Annuleren
+OptionPanel.center_selected_node = Centreren geselecteerde knopen
+OptionPanel.check_updates_automatically = Bij de start controleren of er nieuwe programmaonderdelen zijn
+OptionPanel.childpattern = Opmaakprofiel kindknoop
+OptionPanel.childpattern.tooltip = De gekozen opmaak toepassen op alle kindknopen van de huidige knoop.
+OptionPanel.clear_all_setters = Wissen alle instellingen
+OptionPanel.clear_all_setters.tooltip = In/uitschakelen van alle wijzigingsindicatoren (plus, min of leeg)
+OptionPanel.cloud = Wolk
+OptionPanel.cloudcolor = Kleur wolk
+OptionPanel.cloudshape = Vorm wolk
+OptionPanel.combined = Gecombineerd
+OptionPanel.compare_as_number = Vergelijken als getallen
+OptionPanel.convert_to_current_version = <html> Automatisch oudere Freeplane versies <br> naar de huidige versie converteren ?</html>
+OptionPanel.convert_to_current_version.tooltip = <html> Alleen voor gevorderde gebruikers die weten wat ze doen:<br>alleen heel grote mindmaps die niet geconverteerd hoeven worden<br>kun je openen zonder conversie.</html>
+OptionPanel.cs = Tsjechisch \u010desky
+OptionPanel.cut_nodes_without_question = Knopen knippen zonder bevestiging?
+OptionPanel.cut_nodes_without_question.tooltip = Indien het vinkje is gezet worden alle knopen zonder bevestigingsvraag gekipt. Per ongeluk knippen geeft informatieverlies.
+OptionPanel.da = Deens / Dansk
+OptionPanel.date_format = Standaard datumformaat
+OptionPanel.date_format.tooltip = Either SHORT, MEDIUM, LONG or FULL or a pattern like "MM/dd/yyyy"
+OptionPanel.datetime_format = Staandaard datum-tijdformaat
+OptionPanel.datetime_format.tooltip = <datestyle>,<timestyle> (with KORT, MEDIUM, LONG or FULL as style) or a full pattern like "M/d/yyyy hh:mm"
+OptionPanel.de = Duits / Deutsch
+OptionPanel.default = Standaard knoopstijl
+OptionPanel.default_attribute_key_column_width = Standaarbreedte attribuutnaam
+OptionPanel.default_attribute_value_column_width = Standaardbreedte attribuutwaarde
+OptionPanel.default_browser_command_mac = Standaard browsercommando Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> Standaard browsercommando voor Mac OS</html>
+OptionPanel.default_browser_command_other_os = Standaard browsercommando ander besturingssysteem
+OptionPanel.default_browser_command_other_os.tooltip = <html> Dit is typisch voor Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Standaard browsercommando voor Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html> Voor Windows (de "" tekens zijn noodzakelijk voor links die een "=" in de URL hebben).</html>
+OptionPanel.default_browser_command_windows_nt = Standaard browsercommando Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html> Voor Windows (de "" tekens zijn noodzakelijk voor links die een "=" in de URL hebben).</html>
+OptionPanel.default_charset = Karakterset
+OptionPanel.Defaults = Instellingen
+OptionPanel.delete_automatic_saves_at_exit = Verwijderen reservekopie bij afsluiten
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Als de reservebestanden tijdens het normaal afsluiten van Freeplane moeten worden verwijderd, zet deze instelling op ja</html>
+OptionPanel.delete_nodes_without_question = Knopen verwijderen zonder bevestiging ?
+OptionPanel.delete_nodes_without_question.tooltip = Als het vinkje is gezet worden knopen zonder bevestigingsvraag verwijderd. Bij vergissingen leidt dit tot informatieverlies.
+OptionPanel.disable_cursor_move_paper = Met de cursor verschuiven van mindmap(pagina)uitschakelen
+OptionPanel.disable_cursor_move_paper.tooltip = <html> De cursor voor verschuiven van de mindmap(pagina) niet tonen tijdens het verslepen</html>
+OptionPanel.display_inline_editor_for_all_new_nodes = Standaard: kern bewerken binnen knoop (in-line)
+OptionPanel.display_node_id = Tonen knoop-ID
+OptionPanel.edgecolor = Kleur tak
+OptionPanel.edgecolor.tooltip = Opmaak van de tak naar de ouderknoop; deze wordt ook toegpast naar de eigen kindknopen.
+OptionPanel.edgestyle = Vorm tak
+OptionPanel.edgestyle.tooltip = Opmaak van de tak naar de ouderknoop; deze wordt ook toegepast op de eigen kindknopen
+OptionPanel.edgewidth = Dikte tak
+OptionPanel.edgewidth.tooltip = Opmaak van de tak naar de ouderknoop; deze wordt ook toegepast naar de eigen kindknopen
+OptionPanel.EDIT_CURRENT = Inhoud overschrijven
+OptionPanel.edit_on_double_click = Bewerkinsmode na dubbelklikken
+OptionPanel.editor_extra_width = Extra diktestap
+OptionPanel.editor_extra_width.tooltip = <html>Bepaalt het aantal pixels waarmee de knoopbreedte groter wordt als de tekst te breed is..</html>
+OptionPanel.el = Grieks \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__buttons_above = Knoppen aan de bovenkant
+OptionPanel.el__enter_confirms_by_default = Entertoets dient standaard als bevestiging
+OptionPanel.el__max_default_window_height = Maximum hoogte standaardvenster
+OptionPanel.el__max_default_window_width = Maximum breedte standaardvenster
+OptionPanel.el__min_default_window_height = Minimum hoogte standaardvenster
+OptionPanel.el__min_default_window_width = Minimum breedte standaardvenster
+OptionPanel.el__position_window_below_node = Positie venster onder knoop
+OptionPanel.en = Engels / English
+OptionPanel.Environment = Omgeving
+OptionPanel.es = Spaans / espa\u00f1ol, castellano
+OptionPanel.et = Ests / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking = Moeten scripts worden uitgevoerd zonder bevestiging ?
+OptionPanel.execute_scripts_without_asking.tooltip = <html> Freeplane scripts kunnen bijna elke actie uitvoeren op je computer. <br>Voer dus geen scripts uit waarvan je niet zeker bent dat ze veilig zijn.</html>
+OptionPanel.execute_scripts_without_exec_restriction = Toestaan om andere applicaties uit te voeren (NIET aanbevolen)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html> <body> Kies deze optie als je Groovy script (zonder vragen !) een andere applicatie nodig heeft (zoals een browswer). <br> Gebruik met beleid, want een onveilig script kan je computer beschadigen</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Sta bestandsacties toe (NIET aanbevolen)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html> <body> Kies deze optie als je Groovy script bestandsfuncties (openen, sluiten, lezen, verwijdern (!) nodig heeft. <br> Gebruik met beleid, want een onveilig script kan je computer beschadigen</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Netwerkacties toestaan (NIET aanbevolen)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html> <body> Toestaan netwerkacties <br> Gebruik met beleid, want een onveilig script kan je computer beschadigen</body></html>
+OptionPanel.execute_scripts_without_write_restriction = Bestandsoperaties toestaan (NIET aanbevolen)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html> <body>Als je Groovy scrips schrijftoegang tot bestanden nodig hebben (schrijven, wissen (!)),<br>moet je deze optie toestaan.<br>Normaal met leestoegang.<br>Maar gebruik met zorg omdat kwaadaardige scripts je computer kunnen beschadigen!</body></html>
+OptionPanel.experimental_file_locking_on = Experimenteel: bestanden beveiligen
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experimentele functie</html>
+OptionPanel.export_icons_in_html = Exporteren pictogrammen in HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Aangeven of de HTML uit Freeplane ge\u00ebxporteerd ook pictogrammen moet bevatten. Het probleem met pictogrammen is dat de links naar pictogrammen in de ge\u00ebxporteerde HTML dikwijls niet werken.</html>
+OptionPanel.Files = Bestanden
+OptionPanel.first = Eerste
+OptionPanel.fold_on_click_inside = Vouwen na klikken knoopkern
+OptionPanel.foldingsymbolwidth = Breedte van het pictogram voor dichtvouwen (verbergen)
+OptionPanel.foldingsymbolwidth.tooltip = <html> Breedte van de cirkel die het dichtvouwen (verbergen) markeert</html>
+OptionPanel.fork = Geen omlijning
+OptionPanel.format_locale = Plaats voor formaten
+OptionPanel.format_locale.tooltip = Localization setting for formatting and data parsing
+OptionPanel.formula_disable_caching = Uitschakelen cache formuleberekening (cache)
+OptionPanel.formula_disable_plugin = Uitschakelen formule plugin
+OptionPanel.fr = Frans / Fran\u00e7ais
+OptionPanel.gl = Galician / Galego
+OptionPanel.goto_note_end_on_edit = Veplaats notietiecursor naar het eind
+OptionPanel.grid_size = Raster afstand
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Verborgen
+OptionPanel.highlight_formulas = Accentueren furmules
+OptionPanel.horizontal = Rechte bocht
+OptionPanel.hr = Kroatisch / Hrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Gebaseerd op koppen
+OptionPanel.html_export_fold_all = Alles dichtvouwen
+OptionPanel.html_export_fold_currently_folded = Alleen openvouwen wat nu op de mindmap zichtbaar is
+OptionPanel.html_export_folding = HTML-export met dichtvouwen
+OptionPanel.html_export_no_folding = Alle takken openvouwen
+OptionPanel.hu = Hongaars / / Magyar
+OptionPanel.ic_disable = Uitschakelen
+OptionPanel.ic_file = Gebruik schijf
+OptionPanel.ic_ram = In RAM
+OptionPanel.icon = Pictogram
+OptionPanel.icon.tooltip = De knoop krijgt dit pictogram
+OptionPanel.icons.list = Lijst met stadaardpictogrammen
+OptionPanel.icons.list.tooltip = Hier kun je de standaardpictogrammen instellen. De pictogrammen moeten worden gescheiden door ';'.
+OptionPanel.id = Indonesisch / Bahasa Indonesia
+OptionPanel.IGNORE = Doe niets
+OptionPanel.il__enter_confirms_by_default = Standaard bevestiging met Enter
+OptionPanel.image_cache = voor afbeeldingen
+OptionPanel.it = Italiaans / Italiano
+OptionPanel.ja = Japans / \u65e5\u672c\u8a9e
+OptionPanel.key_type_action = Bij toetsindruk
+OptionPanel.Keystrokes = Sneltoetsen
+OptionPanel.ko = Koreaans / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.label_font_family = Naam lettertype
+OptionPanel.label_font_size = Grootte lettertype
+OptionPanel.language = Taal
+OptionPanel.language.tooltip = <html> Dit is de taal die het programma zou moeten gebruiken. 'Automatisch' probeert de huidige taal van de gebruiker te laden.</html>
+OptionPanel.last = Laatste
+OptionPanel.last_opened_list_length = Lengte van de lijst van recent geopende bestanden
+OptionPanel.layout_map_on_text_change = Map layout bij bewerken
+OptionPanel.layout_map_on_text_change.tooltip = Schakel uit voor betere werking
+OptionPanel.linear = Rechte lijn
+OptionPanel.links = Hyperlinks
+OptionPanel.links.tooltip = <html> Stel kyperlinks in als relatief of absoluuut</html>
+OptionPanel.load_folding = Bij openen
+OptionPanel.load_folding_from_map_default_fold_all = Uit mindmap overnemen om alles open/dicht te vouwen
+OptionPanel.load_folding_from_map_default_unfold_all = Uit mindmap overnemen of alles openvouwen
+OptionPanel.load_last_map = Automatisch laatste mindmap openen
+OptionPanel.load_last_map.tooltip = <html> Als Freeplane start, wordt automatisch de laatste gebruikte mindmap geopend. </html>
+OptionPanel.load_last_maps = Open bij opstarten alle laatstgeopende mindmaps opnieuw
+OptionPanel.lookandfeel = Gebruiksomgeving
+OptionPanel.lookandfeel.tooltip = <html> De gebruiksomgeving waarin je wil werken. 'metaal, 'windows', 'motief' en 'gtk' worden ondersteund, 'mac' kan enkel gebruikt worden bij MacOS. Standaard betekent dat de standaard gebruikersomgeving wordt gebruikt. Als je hier je eigen gebruiksomgeving wil gebruiken, vul dan hier de klassenaam in en zorg er voor dat de benodigde jar-bestanden geladen worden. Als er problemen zijn met de gebruiksomgeving, kies hier dan 'niets'. Dat werkt voor applets</html>
+OptionPanel.lt = Lithuanian / Kalba
+OptionPanel.max_displayed_node_count = Maximum aantal zichtbare knopen
+OptionPanel.max_image_width = Maximum beginbreedte afbeelding
+OptionPanel.max_image_width.tooltip = Nieuwe afbeeldingen verkleind tot deze breedte
+OptionPanel.max_menu_item_count = Maximum aantal menu's
+OptionPanel.max_menu_item_count.tooltip = Beperken aantal items per submenu, minimaal 10
+OptionPanel.max_node_width = Maximum knoopbreedte
+OptionPanel.max_shortened_text_length = Maximale beperking knooplengte
+OptionPanel.metal = Metaal
+OptionPanel.min_node_width = Minimum knoopbreedte
+OptionPanel.motif = Motief
+OptionPanel.nb = Noors / Norsk bokm\u00e5l
+OptionPanel.never_save_folding = Nooit
+OptionPanel.nl = Nederlands, Vlaams / Nederlands, Vlaams
+OptionPanel.nn = Noors / Norsk nynorsk
+OptionPanel.nodebackgroundcolor = Achtergrondkleur
+OptionPanel.nodebackgroundcolor.tooltip = Achtergrondkleur knoop indien niet geselecteerd
+OptionPanel.nodecolor = Tekstkleur
+OptionPanel.nodecolor.tooltip = Tekstkleur knoop indien niet geselecteerd
+OptionPanel.nodefontbold = Vet lettertype
+OptionPanel.nodefonthyperlink = Hyperlink
+OptionPanel.nodefontitalic = Schuin lettertype
+OptionPanel.nodefontname = Naam lettertype
+OptionPanel.nodefontsize = Grootte lettertype
+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
+OptionPanel.number_format = Standaard getalformaat
+OptionPanel.number_format.tooltip = Een patroon met '#' voor optionele of '0' voor verplichte cijfers. Voorbeelden: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = Aantal verschillende reservebestanden bij automatisch bewaren
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> Aantal verschillende reservebestanden dat tijdens het werken automatisch wordt bewaard. De eerste keer automatisch bewaren gebeurt in het eerste bestand enz. Wanneer het laatste bestand gevuld is, wordt het eerste reservebestand overschreven, enz.</html>
+OptionPanel.OK = Bewaren
+OptionPanel.org.freeplane.plugin.bugreport = Beleid
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Altijd verzenden
+OptionPanel.org.freeplane.plugin.bugreport.ask = Tonen dialoog voor foutenmelding
+OptionPanel.org.freeplane.plugin.bugreport.denied = Nooit verzenden
+OptionPanel.org.freeplane.plugin.bugreport.userid = Optional identifier to be sent
+OptionPanel.outline_hgap = Horizontale afstand
+OptionPanel.outline_vgap = Verticale afstand
+OptionPanel.paint_connectors_behind = Tekenen verbinding achter knopen
+OptionPanel.parse_data = Herkenning van ivoer van getalen en datum-tijd notatie
+OptionPanel.parse_data.tooltip = Probeer datum, datum-tijd en getalswaarden te vinden en pas hierop de standaardformaten toe. Voorbeelden: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.PASTE_HTML = Plakken als opgemaakte tekst (HTML)
+OptionPanel.PASTE_PLAIN_TEXT = Plakken zonder opmaak
+OptionPanel.path_property_may_not_be_empty = Pad mag niet leeg zijn!/Wijziging is ongedaan gemaakt.
+OptionPanel.patternname = Naam
+OptionPanel.patternname.tooltip = Unieke naam voor opmaakprofiel
+OptionPanel.pl = Pools / Polski
+OptionPanel.placenewbranches = Nieuwe takken maken
+OptionPanel.placenewbranches.tooltip = <html> Waar nieuwe takken gemaakt moeten worden. Geldige waarden zijn 'eerst' en 'laatst' </html>
+OptionPanel.plugin.tooltip = Non-core plugins.
+OptionPanel.plugins = Plugins
+OptionPanel.presentation_dimmer_transparency = Presentatie minder transparantie
+OptionPanel.presentation_mode = Presentatiemode
+OptionPanel.printonwhitebackground = <html> Witte achtergrond bij het printen</html>
+OptionPanel.printonwhitebackground.tooltip = <html> Altijd een witte achtergrond bij het printen</html>
+OptionPanel.pt_BR = Portugees (Brazilie) / Portugu\u00eas (Brasil)
+OptionPanel.pt_PT = Portugees (Portugal) / Portugu\u00eas (Portugal)
+OptionPanel.RECT = Rechthoek
+OptionPanel.relative = Relatief
+OptionPanel.remind_type_of_new_nodes.tooltip = <html> "Vragen" vraagt om bevestiging (gebruiken als je twijfelt).<br>"Ja" toont tekstopmaakvenster. <br>"Nee" toont knoopvenster. </html>
+OptionPanel.remind_use_rich_text_in_new_nodes = Gebruik uitgebreide tekstopmaak voor geplakte knopen
+OptionPanel.remove_notes_without_question = Notitie(venster) verwijderen zonder bevestiging ?
+OptionPanel.remove_notes_without_question.tooltip = Indien ingesteld: geselecteerde knopen verwijderen zonder te vragen.
+OptionPanel.resources_use_default_font_for_notes_too = Gebruik standaard lettertype ook voor notities
+OptionPanel.resources_use_margin_top_zero_for_notes = Verwijderen bovenmarge voor notities
+OptionPanel.revision_color = Revisiekleur
+OptionPanel.revision_color.tooltip = Achtergrondkleur voor gewijzigde knopen
+OptionPanel.ROUND_RECT = Afgeronde rechthoek
+OptionPanel.ru = Russisch / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a
+OptionPanel.save_folding = Bewaar de situatie van open/dichtvouwen
+OptionPanel.save_folding_if_map_is_changed = Als mindamap is veranderd
+OptionPanel.save_modification_times = Bewaren bewerkingstijdstippen
+OptionPanel.script_classpath = Script klasse pad: Mappen die klassen en/of JARs (separate by ;;) bevatten
+OptionPanel.script_classpath.tooltip = <html> Een lijst van JARs en/of directories om toe te voegen aan het klassepad van scripts en formules.<br>Gebruik ; (Windows) of : (Linux, Mac) om elementen te scheiden. <br>Directories zullen worden onderzocht op JARs en .class bestanden.<br>Paden die niet absoluut zijn, worden beschouwd als relatief tot Freeplane gebruikersdirectory.<br> Als je het klassepad instelt moet je ook leestoegang geven !</html>
+OptionPanel.script_directories = Zoekpad voor scripts (ingangen gescheiden door ;;)
+OptionPanel.script_directories.tooltip = <html> Een lijst van directories.<br>Gebruik ; (Windows) of : (Linus, Mac) om elementen te scheiden. <br>Paden die niet absolut zijn, worden opgevat als relatief tot de Freeplane gebruikersdirectory</html>
+OptionPanel.script_user_key_name_for_signing = Optionele gebruikersleutel voor ondertekening
+OptionPanel.script_user_key_name_for_signing.tooltip = <html> Als je je scripts wilt ondertekenen, voer de alias van de sleutel hier in. <br>De sleutel dient zich in de standaard sleutelopslag te bevinden. <br>Het wachtwoord voor de geheime sleutel van de sleutel moet overeenkomen met het wachtwoord van de sleutelopslag (dit is de standaard).</html>
+OptionPanel.scrollbar_increment = Snelheid
+OptionPanel.scrolling_speed = Automatische scroll-snelheid van mindmap
+OptionPanel.selection_method = Selectiemethode
+OptionPanel.selection_method.tooltip = <html> Met volgende schakelaar kun je het vertraagde selectieschema inschakelen/uitschakelen. Automatische opties. Wijzig deze niet omdat ze toch in auto.properties bewaard zullen worden.</html>
+OptionPanel.selection_method_by_click = Door te klikken
+OptionPanel.selection_method_delayed = Vertraagd
+OptionPanel.selection_method_direct = Onmiddellijk
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Stijlen
+OptionPanel.separator.anti_alias = Verzachten
+OptionPanel.separator.attributes = Attributen
+OptionPanel.separator.automatic_save = Automatisch bewaren
+OptionPanel.separator.behaviour = Gedrag
+OptionPanel.separator.browser = Browser
+OptionPanel.separator.cache = Cache
+OptionPanel.separator.CloudControls = Opmaak wolk
+OptionPanel.separator.commands_for_the_program = Commando's voor het programma
+OptionPanel.separator.connectors = Verbindingslijnen en labels
+OptionPanel.separator.data_formats = Datum herkenning en formatering
+OptionPanel.separator.default_colors = Standaard kleuren
+OptionPanel.separator.default_fonts = Standaard lettertype
+OptionPanel.separator.default_styles = Standaard stijlen
+OptionPanel.separator.EdgeControls = Opmaak tak
+OptionPanel.separator.edit_long_node_window = Bewerken knoopkern in hulpvenster
+OptionPanel.separator.editing = Bewerkingsinstellingen
+OptionPanel.separator.files = Bestanden
+OptionPanel.separator.formula = Plugin voor formules
+OptionPanel.separator.General = Algemeen
+OptionPanel.separator.html_export = HTML-exporteren
+OptionPanel.separator.html_import = HTML Importeren
+OptionPanel.separator.hyperlink_types = Hyperlinktypes
+OptionPanel.separator.icon_properties = Pictogrammen
+OptionPanel.separator.icons = Pictogrammen in "Selecteren pictogram..."
+OptionPanel.separator.initial_map_size = Initi\u00eble grootte mindmap
+OptionPanel.separator.inline_editor = Geintegreerd knoopbewerkingsvenster
+OptionPanel.separator.key_typing = Typen
+OptionPanel.separator.language = Taal
+OptionPanel.separator.load = Laden
+OptionPanel.separator.look_and_feel = Kenmerken gebruiksomgeving
+OptionPanel.separator.mouse_wheel = Muiswiel
+OptionPanel.separator.new_node_commands = Commando's voor nieuwe knopen
+OptionPanel.separator.node_editing_commands = Commando's voor het bewerken van knopen
+OptionPanel.separator.node_navigation_commands = Commando's voor navigatie
+OptionPanel.separator.NodeColors = Kleur hele kern
+OptionPanel.separator.NodeFont = Lettertype hele kern
+OptionPanel.separator.NodeShape = Vorm knoop
+OptionPanel.separator.NodeStyle = Opmaakstijl knoop
+OptionPanel.separator.NodeText = Opmaak kern
+OptionPanel.separator.notifications = Bevestigingen
+OptionPanel.separator.org.freeplane.plugin.bugreport = Automatische foutmelding
+OptionPanel.separator.other_defaults = Andere standaardinstellingen
+OptionPanel.separator.others = Andere sneltoetsen
+OptionPanel.separator.outline_view = Overzichtsweergave
+OptionPanel.separator.patterns = Opmaakpatronen
+OptionPanel.separator.RichTextEditor = Bewerken in dialoogvenster
+OptionPanel.separator.root_node_appearance = Opmaak stamknoop
+OptionPanel.separator.save = Bewaren...
+OptionPanel.separator.scripting = Rechten voor scripts
+OptionPanel.separator.scrollbar = Schuifbalk
+OptionPanel.separator.search = Zoeken
+OptionPanel.separator.selection_colors = Selectiekleuren
+OptionPanel.separator.selection_method = Selectiemethode
+OptionPanel.separator.single_instance_mode = Enkele programma instantie
+OptionPanel.separator.size_limits = Grootte beperking
+OptionPanel.separator.spelling = Opties voor spellingscontrole
+OptionPanel.separator.status = Statuslijn
+OptionPanel.separator.tooltip = Tijdsintervallen voor tooltips
+OptionPanel.separator.undo = Ongedaan maken bewerken
+OptionPanel.separator.updates = Nieuwe programmaonderdelen
+OptionPanel.set_property_text = Aanpassen
+OptionPanel.set_property_text.tooltip = Vinkje = eigenschap wijzigen
+OptionPanel.setscript = Aanpassen?
+OptionPanel.setscript.tooltip = Er kan een script worden gekoppeld aan de stijl.
+OptionPanel.sharp_bezier = Taps toelopend bocht
+OptionPanel.sharp_linear = Tapstoelopend recht
+OptionPanel.show_icon_for_attributes = Tonen pictogram voor attributen
+OptionPanel.show_node_tooltips = Tonen tooltip van knoop
+OptionPanel.show_note_icons = Tonen notitieicons
+OptionPanel.show_styles_in_tooltip = Tonen knoopstijl in tooltip
+OptionPanel.signed_script_are_trusted = Vertrouw ondertekende scripts (aanbevolen)
+OptionPanel.signed_script_are_trusted.tooltip = Uitvoeren script zonder beperkingen indien getekend door een vertouwde partij zoals Freeplane's auteurs of jijzelf.
+OptionPanel.simplyhtml.default_paste_mode = Standaardwijze voor plakken
+OptionPanel.single_backup_directory = Gebruik dezelfde directory voor back-up bestanden
+OptionPanel.single_backup_directory.tooltip = <html> Als bestanden van backups en automatisch bewaren in bijelkaar in een directory geplaatst moeten worden, in plaats van in een subdirectory in de directory waarin de mindmap staat. </html>
+OptionPanel.single_backup_directory_path = Backup directory (als bovenstaande optie geselecteerd is)
+OptionPanel.single_backup_directory_path.tooltip = <html> Gaat boven defaut <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance = Open bestanden van lopende instantie
+OptionPanel.single_instance_force = Vermijd in ieder geval tweede instantie
+OptionPanel.single_instance_force.tooltip = Voorkom tweede instantie ook als geen file wordt geladen
+OptionPanel.sk = Slovaaks / sloven\u010dina
+OptionPanel.sl = Slowenisch / sloven\u0161\u010dina
+OptionPanel.spelling_opt_case_sensitive = Hoofdlettergevoelig
+OptionPanel.spelling_opt_ignore_all_caps_words = Negeer alle hoofdletterwoorden.
+OptionPanel.spelling_opt_ignore_capitalization = Negeer hoofdletter aan het begin van een woord.
+OptionPanel.spelling_opt_ignore_words_with_numbers = Negeer woorden met een getal.
+OptionPanel.spelling_opt_suggestions_limit_dialog = Maximum aantal suggesties in het dialoogvenster.
+OptionPanel.spelling_opt_suggestions_limit_menu = Maximum aantal suggesties in het menu
+OptionPanel.sr = Servisch / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = Standaard stijlbestand
+OptionPanel.standardbackgroundcolor = Standaard achtergrondkleur
+OptionPanel.standardbackgroundcolor.tooltip = <html> De standaard achtergrondkleur in html-notatie </html>
+OptionPanel.standardcloudcolor = Standaard wolkkleur
+OptionPanel.standardcloudcolor.tooltip = <html> De standaard wolkkleur in html-notatie </html>
+OptionPanel.standardcloudestyle = Standaard wolkstijl
+OptionPanel.standardcloudestyle.tooltip = <html> De standaard wolkstijl. Op dit moment is enkel 'bocht' mogelijk</html>
+OptionPanel.standarddrawrectangleforselection = Tonen geselecteerde knopen met een omlijning
+OptionPanel.standarddrawrectangleforselection.tooltip = <html> Markeren geselecteerde knopen met een omlijning.</html>
+OptionPanel.standardlinkcolor = Standaard kleur van een hyperlink
+OptionPanel.standardlinkcolor.tooltip = <html> De standaardkleur van de hyperlink in html-notatie </html>
+OptionPanel.standardlinkestyle = Standaardstijl hyperlink
+OptionPanel.standardlinkestyle.tooltip = <html> De standaarstijl voor hyperlink: op dit moment wordt alleen 'bocht' ondersteund</html>
+OptionPanel.standardselectednodecolor = Standaardkleur geselecteerde knoop
+OptionPanel.standardselectednodecolor.tooltip = <html> De standaard tekstkleur indien geselecteerd. In html-notatie (#RRGGBB in hex waarden) </html>
+OptionPanel.standardselectednoderectanglecolor = Kleur knoopomlijning geselecteerde knoop
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html> De kleur van de omlijning van geselecteerde knopen. In HTML notatie (#RRGGBB in hex waarden) </html>
+OptionPanel.STAR = Ster
+OptionPanel.structured_html_import = Importeren HTML als knoop structuur
+OptionPanel.structured_icon_toolbar = Gestructureerde werkbalk pictogrammenmenu
+OptionPanel.summary = Samenvatting/Groep
+OptionPanel.sv = Zweeds/ svenska
+OptionPanel.text.use_ctrl_key = Gebruik 'Toewijzen sneltoets' van het menu Extra
+OptionPanel.time_for_automatic_save = Tijdsinterval voor automatisch bewaren
+OptionPanel.time_for_automatic_save.tooltip = <html> tussentijd voor automatisch bewaren in miliseconden; Om automatisch bewaren uit te schakelen, zet je dit getal op 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tijd voor vertraagde selectie
+OptionPanel.time_for_delayed_selection.tooltip = <html> Tijd voor de vertraagde selectie van knopen wanneer de muis er over gaat (in msec). Wijzig deze waarde naar 1 wanneer je onmiddellijke selectie wil wanneer de muis over een knoop gaat.</html>
+OptionPanel.toolTipManager.dismissDelay = Vertraging voor het laten verdwijnen, ms
+OptionPanel.toolTipManager.initialDelay = Beginvertraging, ms
+OptionPanel.toolTipManager.max_tooltip_width = Breedte tooltip
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html> De standaardbreedte van de tooltip in pixels,</html>
+OptionPanel.toolTipManager.reshowDelay = Vertraging in het opnieuw laten zien, ms
+OptionPanel.tr = Turks, / T\u00fcrkmen
+OptionPanel.uk_UA = Ukrainisch / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
+OptionPanel.undefined_font = Niet-gedefinieerd lettertype
+OptionPanel.undo_levels = Aantal stappen
+OptionPanel.undo_levels.tooltip = <html> Bepaalt hoeveel stappen bewaard worden en zo ongedaan kunnen worden gemaakt met de "Ongedaan maken" knop.</html>
+OptionPanel.unfold_on_paste = Openvouwen bij plakken
+OptionPanel.unfold_on_paste.tooltip = Openvouwen bij plakken of bij verplaatsen
+OptionPanel.use_common_out_point_for_root_node = Alle takken beginnen bij de stamknoop
+OptionPanel.use_common_out_point_for_root_node.tooltip = Alle takken beginnen de stamknoop
+OptionPanel.use_tabbed_pane = Gebruiken tabbladen
+OptionPanel.use_tabbed_pane.tooltip = Als deze is aangevinkt, worden de mindmaps onder tabbladen weergegeven (net zoals in Firefox :-)).
+OptionPanel.user_defined_screen_resolution = Gebruikersinstelling schermresolutie (dpi)
+OptionPanel.validate_classpath_needs_readaccess = Scripting: Wanneer je het klassepad instelt moet je ook leestoegang geven!
+OptionPanel.validate_invalid_date_format = Onjuist standaard datumformaat
+OptionPanel.validate_invalid_datetime_format = Onjuist datum-tijdformaat
+OptionPanel.validate_invalid_number_format = Onjuist getalformaat
+OptionPanel.validate_write_without_read = Scripting: overweeg om Lezen/Bestand toe te voegen aan Schrijven/Bestand
+OptionPanel.validation_error = <html> <body>Controle fouten:<p><em>{0}</em><p>Verander de instellingen om de fout te voorkomen.</body></html>
+OptionPanel.validation_warning = <html> <body>Controle foutwaarschuwing:<p><em>{0}</em></body></html>
+OptionPanel.vi = Vietnamees / Ti\u1ebfng Vi\u1ec7t
+OptionPanel.wheel_velocity = Snelheid
+OptionPanel.wheel_velocity.tooltip = Een hogere waarde geeft snellere respons op het muiswiel in de map.
+OptionPanel.windows = Vensters
+OptionPanel.zh_CN = Chinees vereenvoudigd / \u7b80\u4f53\u5b57
+OptionPanel.zh_TW = Chinees, traditioneel / \u7e41\u9ad4\u5b57
+org.freeplane.plugin.bugreport.agree = Verzenden
+org.freeplane.plugin.bugreport.always_agree = Altijd verzenden
+org.freeplane.plugin.bugreport.always_deny = Nooit verzenden
+org.freeplane.plugin.bugreport.deny = Niet verzenden
+org.freeplane.plugin.bugreport.dialog.title = Automatische melding van een fout
+org.freeplane.plugin.bugreport.freeplane_team = Bericht van Freeplane's team
+org.freeplane.plugin.bugreport.lastreport = De ontvangen melding
+org.freeplane.plugin.bugreport.never = Vraag me nooit om hulp
+org.freeplane.plugin.bugreport.question = Freeplane verstuurt automatisch een melding in het geval van een fout (bug).\nEr zullen nooit persoonlijke gegevens of de inhoud van een mindmap verstuurd worden.\nMeldingen over fouten helpen ons de software te verbeteren.
+org.freeplane.plugin.bugreport.report = Huidige melding
+org.freeplane.plugin.bugreport.wanted_bug = Er deed zich een interne fout voor en deze werd automatisch gemeld.\nWe zouden graag meer informatie willen hebben om dit onverwachte gedrag te kunnen reproduceren\nHelp ons alsjeblieft door een melding op te voeren in onze Mantis bug tracker:\nleg uit wat je op dat moment aan het doen was, zodat we de bug kunnen reproduceren.\n\nSelecteer OK om de bug tracker pagina in je web browser te kunnen openen.\n\Bedankt voor je hulp bij het oplossen van een bug.\nJouw Freeplane Team.
+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...
+password_is_not_ascii = Wachtwoord bevat andere tekes dan ASCII
+PasteAction.text = Plakken
+PasteAttributes.text = Plakken attributen
+PatternNewNameProperty = Nieuw opmaakprofiel
+PatternToString.backgroundColor = Achtergrondkleur
+PatternToString.Child = Opmaakprofiel kindknoop
+PatternToString.color = Kleur
+PatternToString.EdgeColor = Takkleur
+PatternToString.EdgeStyle = Takvorm
+PatternToString.EdgeWidth = Takdikte
+PatternToString.FontBold = Vet
+PatternToString.FontItalic = Schuin
+PatternToString.FontName = Naam lettertype
+PatternToString.Icon = Pictogram
+PatternToString.NodeFontSize = Grootte letterype
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = dagen
+PeriodUnit.HOUR = uren
+PeriodUnit.MINUTE = minuten
+PeriodUnit.MONTH = maanden
+PeriodUnit.WEEK = weken
+PeriodUnit.YEAR = jaren
+plugins/latex/LatexNodeHook.editorTitle = Bewerken LaTex
+plugins/script_filter = Script filter {0}
+plugins/script_filter_error = {0} moest een boolean waarde geven voor {1} maar gaf {2}
+plugins/ScriptEditor.cancel = &Vergeten veranderingen en stoppen
+plugins/ScriptEditor.exit = &Bewaren en sluiten
+plugins/ScriptEditor.FORBIDDEN_ACTION = Freeplane groovy scripts zijn begrensd. De volgende {0,choice,0#File|1#Network|2#Exec} operatie is verboden: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Je kan dit veranderen in de programma opties.
+plugins/ScriptEditor.menu_actions = &Acties
+plugins/ScriptEditor.new_script = Nieuw script
+plugins/ScriptEditor.run = &Uitvoeren
+plugins/ScriptEditor.sign = Beveiligen script
+plugins/ScriptEditor/window.Result = Resultaat:
+plugins/ScriptEditor/window.title = Scriptbewerker
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Toegang tot interne API (package {0} niet toegestaan). - Neem contact op met het Freeplane team als de API voor scripts niet krachtig genoeg is.
+plugins/TimeList.xml_Created = Gemaakt
+plugins/TimeList.xml_Date = Datum
+plugins/TimeList.xml_Icons = Pictogrammen
+plugins/TimeList.xml_Modified = Gewijzigd
+plugins/TimeList.xml_Notes = Knoopnotities
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Datum toevoegen aan geselecteerde knopen
+plugins/TimeManagement.xml_Cancel = Annuleren
+plugins/TimeManagement.xml_cancelButton = Annuleren
+plugins/TimeManagement.xml_closeButton = Sluiten
+plugins/TimeManagement.xml_Export = Geselcteerde knopen exporteren
+plugins/TimeManagement.xml_Find = Zoeken
+plugins/TimeManagement.xml_Goto = Naar
+plugins/TimeManagement.xml_hour = Uren:
+plugins/TimeManagement.xml_menu_actions = Functies
+plugins/TimeManagement.xml_minute = Minuten:
+plugins/TimeManagement.xml_reminderButton = Toevoegen herinnering
+plugins/TimeManagement.xml_reminderButton_tooltip = <html> Wanneer je hier klikt, wordt er een timer ingeschakeld op de gegeven datum. Dan zullen knipperende pictogrammen je aandacht trekken.<br> Als je deze mindmap sluit, dan zullen de timers opnieuw geactiveerd worden als je de volgende keer deze mindmap opent.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html> Nu kan er maar \u00e9\u00e9n herinnering per knoop ingesteld worden. <br>De herinnering voor deze knoop is al ingesteld op {0,date} {0,time}, jouw keuze was {1,date} {1,time}. <br><br>Wil je de herinneringstijd van de knoop wijzigen (JA) <br>of wil je de vorige instelling behouden (NEE)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Herinnering gepland op {0,date} {0,time}.
+plugins/TimeManagement.xml_remindLaterButton = Later herinneren
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Later herinneren
+plugins/TimeManagement.xml_removeReminderButton = Verwijderen herinnering
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Wis alle herinneringen die gekoppeld zijn aan de geselecteerde knopen.
+plugins/TimeManagement.xml_Replace = Vervangen
+plugins/TimeManagement.xml_Replace_All = Alles vervangen
+plugins/TimeManagement.xml_Replace_Selected = Selectie vervangen
+plugins/TimeManagement.xml_Select = Selecteren
+plugins/TimeManagement.xml_todayButton = Vandaag
+plugins/TimeManagement.xml_WindowTitle = Agenda
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Zoeken en vervangen
+preferences = Voorkeuren
+print_preview_title = Afdrukvoorbeeld
+PrintAction.text = Afdrukken mindmap...
+PrintDirectAction.text = Afdrukken...
+printing_settings = Pagina-afdrukinstellingen
+PrintPreviewAction.text = &Afdrukvoorbeeld
+PropertyAction.dialog = Instellingen
+PropertyAction.text = Instellingen...
+QuickFilterAction.text = Filteren mindmap
+QuickFindAction.BACK.text = Vorige zoeken
+QuickFindAction.FORWARD.text = Volgende zoeken
+QuickFindAllAction.text = Filteren en selecteren
+QuickHighlightAction.text = Alle passende knopen selecteren
+QuitAction.text = Afsluiten Freeplane
+read_only = Alleen lezen
+ReadScriptError.text = Fout bij het lezen van het script\nControleer het log bestand voor details.
+really_convert_to_current_version = <html> Deze mindmap is met een oudere versie van Freeplane gemaakt. <br> Wilt u de mindmap vertalen naar het nieuwste formaat ? <br> Anders wordt het in het oude formaat geladen en kunnen er onverwachte dingen gebeuren.</html>
+really_cut_node = Knoop/knopen werkelijk knippen ?
+really_execute_script = Ben je zeker dat je de scripts in deze mindmap wil uitvoeren ? Het is mogelijk dat je computer wordt beschadigd.
+really_remove_node = Knopen echt verwijderen ?
+really_remove_notes = Knoopnotitie echt verwijderen ?
+ReapplyFilterAction.text = Opnieuw filteren (bijwerken)
+red = Rood
+RedefineStyleAction.text = Tot standaardknoopstijl maken
+RedoAction.text = Filteractie opnieuw doen
+RedoFilterAction.text = Herhalen laatste filteractie
+regular_expressions = Gangbare uitdrukking
+ReminderHookAction.text = Verwijderen herinnering
+ReminderHookAction.tooltip = Verwijderen herinnering uit een knoop.
+remove_file_from_list_on_error = Bestand (0) kon niet geopend worden. Verwijderen van de laatst gebruikte bestanden lijst?
+remove_shortcut_question = Sneltoets verwijderen ?
+RemoveAllIconsAction.text = Verwijderen alle pictogrammen
+RemoveConnectorAction.text = Verwijderen verbindindingslijn
+RemoveEncryption.text = Verwijderen wachtwoord
+RemoveFormatAction.text = Verwijderen opmaak
+RemoveIcon_0_Action.text = Verwijderen eerste pictogram
+RemoveIconAction.text = Verwijderen laatste pictogram
+RemoveNoteAction.text = Verwijderen knoopnotitie
+RemoveNoteAction.tooltip = <html> Verwijderen inhoud van notitievenster.</html>
+rename = &Hernoemen
+repair_link = Herstellen hyperlink
+repair_link_question = Kan de gekoppelde mindmap niet laden. Wilt u de koppeling handmatig herstellen?
+replace = Vervangen
+replace_shortcut_question = Deze sneltoets is op dit moment verbonden mer\n {0}.\nDeze koppeling verwijderen ?
+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
+ResetStyleAction.text = Herstel knoopstijl
+RevertAction.text = &Terug gaan naar opgeslagen versie
+RevisionPluginAction.text = Tonen revisies door achtergrondkleur
+save_failed = Bewaren van mindmap {0} is mislukt.
+save_unsaved = De volgende mindmap bewaren? :
+save_unsaved_styles = Niet-bewaarde stijlen bewaren?
+SaveAcceleratorPresetsAction.text = Bewaren set met sneltoetsen
+SaveAction.text = Bewaren
+SaveAll.text = &Bewaren alle open mindmaps
+SaveAll.tooltip = Bewaren alle open mindmaps
+SaveAsAction.text = Bewaren als...
+saved = Opgeslagen
+saving_canceled = Bewaren is geannuleerd
+scanners_not_loaded = Scanners niet geladen, bestand is beschadigd
+scheme_evaluate = Bereken!
+script_execution_disabled = Geen uivoering van script
+ScriptEditor.text = Groovy scripts bewerken
+ScriptEditor.tooltip = Laat toe om grotere scripts te maken in Freeplane.
+ScriptEditorPanel.changed_cancel = De scripts werden veranderd. Ben je zeker dat je de aanpassingen niet wil bewaren ?
+scripting_api_generator_legend = Legenda
+scripting_api_generator_proxy = Proxy
+scripting_api_generator_title = API voor scripts
+scripting_api_generator_utilities = Utilities
+scripting_api_generator_web = Web bronnen
+select_favorites_folder = Selecteren map waarin je favorieten staan
+select_file_export_to = Selecteren bestand voor exporteren
+select_folder_for_importing = Selecteren map voor importeren
+select_icon = Selecteren pictogram
+select_menu_item_dialog = Kiezen menuoptie
+select_menu_item_root_node = Menu
+SelectAllAction.text = Selecteren alle zichtbare knopen
+SelectBranchAction.text = Selecteren zichtbare tak
+SelectedPasteAction.text = Plakken als...
+selection_method_by_click = Enkele klik om te selecteren
+selection_method_delayed = Uitgestelde automatische selectie
+selection_method_direct = Aanwijzen om te selecteren
+SelectNoteAction.text = Bewerken notitiehulpvenster
+SelectNoteAction.tooltip = Wissel naar/van notitievenster
+set_accelerator_on_next_click_action = Klik op het gewenste menuitem om een nieuwe sneltoets toe te wijzen
+SetAcceleratorOnNextClickAction.text = Toewijzen sneltoets
+SetImageByFileChooserAction.text = Toevoegen afbeelding of converteren link...
+SetLinkAnchorAction.text = Zetten koppelingsanker
+SetLinkAnchorAction.tooltip = <html>instellen geselekteerde knoop als anker voor later te<br/>maken van een hyperlink tussen knopen (ook tussen mindmaps).
+SetLinkAnchorAction.tooltip_anchored = <html>instellen geselekteerde knoop als anker voor later te<br/>maken hyperlink tussen knopen. Huidig anker:<br/>{0}
+SetLinkByFileChooserAction.text = Koppeling kiezen...
+SetLinkByTextFieldAction.text = Koppeling typen of wijzigen
+SetNodeLink.text = Maak knoopkoppeling
+SetNoteWindowPosition.bottom.text = Onder
+SetNoteWindowPosition.left.text = Links
+SetNoteWindowPosition.right.text = Rechts
+SetNoteWindowPosition.top.text = Boven
+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....
+ShowDescendantsAction.text = Ook afstammelingen tonen
+ShowFilterToolbarAction.text = Tonen filtermenu
+ShowFormatPanel.text = Tonen opmaakpaneel
+ShowFormatPanel.tooltip = Toont een dialoogvenster waarin de opmaak van een knoop en tak in tegelijkertijd kunnen worden veranderd.
+ShowHideNoteAction.text = Tonen notitiehulpvenster
+ShowHideNoteAction.tooltip = Laat het notitiehulpvenster verschijnen of verdwijnen
+ShowNextChildAction.text = Tonen volgend kind
+ShowNotesInMapAction.text = Tonen notities bij knopen
+ShowSelectedAttributesAction.text = Attributenbeheer
+ShowSelectionAsRectangleAction.text = Tonen rechthoekig selectiekader
+simplyhtml.aboutFrameTitle = Over deze toepassing
+simplyhtml.aboutLabel = Over SimplyHTML...
+simplyhtml.alignCenter = Centreren
+simplyhtml.alignLabel = Uitlijning
+simplyhtml.alignLeft = links
+simplyhtml.alignRight = rechts
+simplyhtml.allCellsRangeLabel = alle cellen
+simplyhtml.allOccurrencesReplaced = Alle voorkomens vervangen
+simplyhtml.appendTableColLabel = Toevoegen kolom
+simplyhtml.appendTableRowLabel = Toevoegen rij
+simplyhtml.applyCellAttrLabel = Toepassen op
+simplyhtml.backgroundLabel = Achtergrond:
+simplyhtml.boldItalicName = Vet Schuin
+simplyhtml.boldName = Vet
+simplyhtml.borderColorLabel = Kleur:
+simplyhtml.borderWidthLabel = Breedte
+simplyhtml.bottomLabel = onderaan:
+simplyhtml.cancelBtnName = Annuleren
+simplyhtml.cellBorderTabLabel = Randen
+simplyhtml.cellGenTabLabel = Algemeen
+simplyhtml.cellMarginTabLabel = Marge
+simplyhtml.cellPanelTitle = Celopmaak
+simplyhtml.clearFormatLabel = Verwijderen opmaak
+simplyhtml.clearFormatTip = Verwijderen opmaak
+simplyhtml.close = Sluiten
+simplyhtml.closeBtnName = Sluiten
+simplyhtml.colorLabel = Kleur
+simplyhtml.copyLabel = Kopi\u00ebren
+simplyhtml.copyTip = Kopi\u00ebren
+simplyhtml.cTagNameHead1 = Kop 1
+simplyhtml.cTagNameHead2 = Kop 2
+simplyhtml.cTagNameHead3 = Kop 3
+simplyhtml.cTagNameHead4 = Kop 4
+simplyhtml.cTagNameHead5 = Kop 5
+simplyhtml.cTagNameHead6 = Kop 6
+simplyhtml.cTagNameLink = Koppeling
+simplyhtml.cTagNameOL = Geordende lijst
+simplyhtml.cTagNamePara = Paragraaf
+simplyhtml.cTagNameUL = Ongenummerde lijst
+simplyhtml.cutLabel = Knippen
+simplyhtml.cutTip = Knippen
+simplyhtml.defaultDocName = Zonder kern
+simplyhtml.deleteTableColLabel = Verwijderen kolom
+simplyhtml.deleteTableRowLabel = Verwijderen rij
+simplyhtml.docTitleQuery = Wijzig de titel :
+simplyhtml.docTitleTitle = Bewerken titel van het document
+simplyhtml.editLabel = Bewerken label
+simplyhtml.effectLabel = Effekt
+simplyhtml.familyLabel = Naam lettertype
+simplyhtml.findNext = Zoek volgende...
+simplyhtml.findReplaceDialogTitle = Zoeken en vervangen
+simplyhtml.findReplaceLabel = Zoeken en vervangen
+simplyhtml.findReplaceTip = Zoeken en vervangen
+simplyhtml.fontBoldLabel = Vet
+simplyhtml.fontBoldTip = Vet aan/uit
+simplyhtml.fontColorLabel = Tekstkleur
+simplyhtml.fontColorTip = Tekstkleur
+simplyhtml.fontDialogTitle = Opmaak lettertype
+simplyhtml.fontItalicLabel = Schuin
+simplyhtml.fontItalicTip = Schuin aan/uit
+simplyhtml.fontLabel = Lettertype...
+simplyhtml.fontTabLabel = Lettertype
+simplyhtml.fontTip = Opmaak lettertype
+simplyhtml.fontUnderlineLabel = Onderlijnd
+simplyhtml.fontUnderlineTip = Onderlijning aan/uit
+simplyhtml.foregroundLabel = Voorgrond:
+simplyhtml.formatLabel = Opmaken
+simplyhtml.formatListLabel = Lijst...
+simplyhtml.formatListTip = Wijzigen lijstopmaak
+simplyhtml.formatParaLabel = Paragraaf...
+simplyhtml.formatParaTip = Wijzigen paragraafopmaak
+simplyhtml.formatTableLabel = Tabel...
+simplyhtml.formatTableTip = Tabel opmaken
+simplyhtml.helpLabel = Help
+simplyhtml.htmlTabTitle = Venster met HTML
+simplyhtml.imageFileDesc = Afbeeldingsbestanden
+simplyhtml.insertTableColLabel = Kolom invoegen
+simplyhtml.insertTableLabel = Tabel...
+simplyhtml.insertTableMsg = Hoeveel kolommen ?
+simplyhtml.insertTableRowLabel = Rij invoegen
+simplyhtml.insertTableTitle = Rij invoegen
+simplyhtml.italicName = Schuin
+simplyhtml.layoutTabTitle = Met opmaak
+simplyhtml.leftLabel = links:
+simplyhtml.listDialogTitle = Lijstopmaak:
+simplyhtml.listIndentTitle = Inspringen:
+simplyhtml.listPosInside = binnen
+simplyhtml.listPositionLabel = Positie:
+simplyhtml.listPosOutside = buiten
+simplyhtml.listTypeCircle = stip als opsommingsteken
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = bestandssymbool als opsommingsteken
+simplyhtml.listTypeLabel = Type\:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = geen
+simplyhtml.listTypeSquare = vierkant opsommingsteken
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Buitenste
+simplyhtml.matchApproximately = Benaderend passen
+simplyhtml.matchApproximately.tooltip = <html>Al dan niet toestaan van benaderingen,<br/>bijv. zoeken naar 'files' vindt ook 'flies'.</html>
+simplyhtml.matchCase = Identieke hoofd- en kleine letters
+simplyhtml.matchCase.tooltip = Al dan niet letten op hoofdletters bij het vergelijken
+simplyhtml.newStyleDefaultName = Nieuw opmaakprofiel
+simplyhtml.nextTableCellLabel = Volgende cel
+simplyhtml.noLineLabel = geen
+simplyhtml.noMoreOccurrencesFound = geen (andere) gevallen gevonden
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Binnenste
+simplyhtml.paraAlignCenterLabel = Centreren
+simplyhtml.paraAlignCenterTip = Centreren
+simplyhtml.paraAlignLeftLabel = Links uitlijnen
+simplyhtml.paraAlignLeftTip = Links uitlijnen
+simplyhtml.paraAlignRightLabel = Rechts uitlijnen
+simplyhtml.paraAlignRightTip = Rechts uitlijnen
+simplyhtml.paraStyleDialogTitle = Paragraafopmaak
+simplyhtml.paraTabLabel = Paragraaf
+simplyhtml.pasteHTMLLabel = Plakken met HTML opmaak
+simplyhtml.pasteLabel = Plakken
+simplyhtml.pastePlainTextLabel = Plakken zonder HTML opmaak
+simplyhtml.pasteTip = Plakken
+simplyhtml.plainName = platte
+simplyhtml.previewLabel = Voorbeeld
+simplyhtml.previewText = Voorbeeld tekst
+simplyhtml.prevTableCellLabel = Vorige cel
+simplyhtml.printLabel = Afdrukken...
+simplyhtml.redoLabel = Opnieuw
+simplyhtml.redoTip = Opnieuw
+simplyhtml.replace = Vervangen...
+simplyhtml.replaceAll = Selecteren alle attributen
+simplyhtml.replaceDone = Uitgevoerd
+simplyhtml.replaceNo = Nee
+simplyhtml.replaceThisQuery = vervang deze
+simplyhtml.replaceWith = Vervangen door:
+simplyhtml.replaceYes = Ja
+simplyhtml.rightLabel = rechts:
+simplyhtml.searchDown = Zoek omlaag
+simplyhtml.searchDown.tooltip = Van boven naar beneden zoeken.
+simplyhtml.searchFromStart = Zoek vanaf het begin
+simplyhtml.searchFromStart.tooltip = Zoeken vanaf het begin in plaats vanaf de cursor.
+simplyhtml.searchUp = Zoek omhoog
+simplyhtml.searchUp.tooltip = Terugzoeken (bottom up)
+simplyhtml.selectAllLabel = Alles selecteren
+simplyhtml.sizeLabel = Grootte
+simplyhtml.standardStyleName = Standaard
+simplyhtml.strikeLabel = Doorhaling
+simplyhtml.styleLabel = Opmaakprofiel
+simplyhtml.styleNameInputText = Naam van het nieuwe opmaakprofiel ?
+simplyhtml.styleNameInputTitle = Bewaar het opmaakprofiel
+simplyhtml.tableBgColLabel = Achtergrondkleur:
+simplyhtml.tableDialogTitle = Opmaken tabel
+simplyhtml.tableLabel = Tabel
+simplyhtml.tablePanelTitle = Tabelopmaak
+simplyhtml.tableWidthLabel = Breedte:
+simplyhtml.textIndentLabel = Inspringen:
+simplyhtml.textToFind = Te zoeken tekst:
+simplyhtml.thisCellRangeLabel = deze cel
+simplyhtml.thisColRangeLabel = deze kolom
+simplyhtml.thisRowRangeLabel = deze rij
+simplyhtml.toggleBulletsLabel = Lijst met opsommingstekens
+simplyhtml.toggleBulletsTip = Lijst met opsommingstekens aan/uit
+simplyhtml.toggleNumbersLabel = Lijst met nummers
+simplyhtml.toggleNumbersTip = Lijst met nummers aan/uit
+simplyhtml.topLabel = bovenaan:
+simplyhtml.uLineLabel = Onderlijnd
+simplyhtml.unableToOpenFileError = Bestand kan niet worden geopend
+simplyhtml.unableToRedoError = Kan niet opnieuw
+simplyhtml.unableToUndoError = Kan niet ongedaan maken:
+simplyhtml.undoLabel = Ongedaan maken
+simplyhtml.undoTip = Ongedaan maken
+simplyhtml.valignBaseline = basislijn
+simplyhtml.valignBottom = Onder
+simplyhtml.valignLabel = Vertikaal uitlijnen
+simplyhtml.valignMiddle = Midden
+simplyhtml.valignTop = Boven
+simplyhtml.wholeWordsOnly = Alleen volledige woorden
+simplyhtml.wholeWordsOnly.tooltip = Beperk het zoeken tot hele woorden.
+SortNodes.text = Alfabetisch sorteren kinderen
+SortNodes.tooltip = Alfabetisch sorteren alle kinknopen
+split = &Splitsen
+SplitConditionAction.text = Splitsen
+SplitNode.text = Splitsen knoop
+SplitNode.tooltip = <html> Knoop is gesplitst</html>
+STANDARD_FORMAT = Standaard
+stop_processing = Stoppen
+StringFlavorHandler = Van platte tekst naar hi\u00ebrarchie van knopen
+StructuredHtmlFlavorHandler = Van HTML maar hi\u00ebrarchie van knopen
+style = Stijlnaam
+style_already_exists = Opmaakprofiel bestaat al
+styledialog.cancel.text = Annuleren
+styledialog.ok.text = OK
+styles = Stijlen
+styles.AutomaticLayout = Knoopniveaustijl toepassen...
+styles.connection = Verbindingslijn
+styles.date = Datum
+styles.definition = Definitie
+styles.description = Beschrijving
+styles.floating_node = Zwevende knoop
+styles.idea = Idee
+styles.important = Belangrijk
+styles.key = Sleutel
+styles.list = Lijst
+styles.needs_action = Te doen
+styles.note = Opmerking
+styles.ok = OK
+styles.pending = In afwachting
+styles.predefined = Knoopprofiel toepassen...
+styles.question = Vraag
+styles.quotation = Citaat
+styles.root_node = Opmaakprofiel
+styles.subsubtopic = Deeldeelonderwerp
+styles.subtopic = Deelonderwerp
+styles.topic = Onderwerp
+styles.user-defined = Gebruikerstijl toepassen...
+styles.website = Website
+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...
+TimeListAction.tooltip = Toont alle geplande herinneringen en de bijhorende knopen.
+TimeManagementAction.text = Managen tijd...
+TimeManagementAction.tooltip = <html> Start de agendamodule.</html>
+ToggleChildrenFoldedAction.text = Kleinkinderen open/dichtvouwen
+ToggleDetailsAction.text = Tonen knoopdetails
+ToggleFBarAction.text = Tonen F-balk (functietoetsen)
+ToggleFoldedAction.text = Open/dichtvouwen
+ToggleFullScreenAction.text = Tonen volledig scherm
+ToggleLeftToolbarAction.text = Tonen pictogrammenbalk
+ToggleMenubarAction.text = Tonen hoofdmenu
+ToggleStatusAction.text = Tonen statuslijn
+ToggleToolbarAction.text = Tonen werkmenu
+undefined_error = Er is een onverwachte fout opgetreden. Probeer er een foutmelding van te maken.
+underline = Onderstreept
+UnderlineAction.text = Onderstrepen
+underlined = Onderstreept
+UndoAction.text = Ongedaan maken laatse filteractie
+UndoFilterAction.text = Ongedaan maken laatste filteractie
+unfold = Openvouwen
+UnfoldAllAction.text = Alle afstammelingen openvouwen
+UnfoldAllAction.tooltip = <html> Alle afstammelingen openvouwen.</html>
+UnfoldOneLevelAction.text = E\u00e9n niveau openvouwen
+UnfoldOneLevelAction.tooltip = <html> E\u00e9n niveau openvouwen.</html>
+up = &Op
+update_failed = Het laden van nieuwe onderdelen is mislukt met bericht {0}
+UpdateCheckAction.text = Controleren op nieuwe onderdelen
+updatecheckdialog = Dialoogvenster voor nieuwe onderdelen
+url_error = Deze URL is onjuist!
+url_open_error = Kon URL {0} niet openen.
+used_in_menu = Deze sneltoets kan niet worden ingesteld omdat deze al in gebruik is.
+UsePlainTextAction.text = Platte tekstopmaak
+user_config_folder = Configuratiemap van de gebruiker: {0}
+user_defined_scale = Door de gebruiker gedefinieerde schaal
+user_defined_zoom = Door gebruiker gedefinieerd.
+user_defined_zoom_status_bar = De zoomfactor wijzigen naar het door de gebruiker opgegeven percentage van {0}%.
+user_icon = Gebruiker pictogram "{0}"
+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...
+ViewLayoutTypeAction.OUTLINE.text = Tonen overzichtsweergave
+WebDocuAction.text = Web Documentatie
+width = Breedte
+wrong_regexp = Verkeerde reguliere uitdrukking "{0}", fout {1}
+xslt_export.html = HTML document
+xslt_export.latex = LaTex document
+xslt_export.latexbook = LaTex boek
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 en hoger) XML formaat
+xslt_export.ms_project = MS Project (2003 en hoger) XML formaat
+xslt_export.ms_word = Word (2003 en hoger) XML formaat
+xslt_export.text = Platte tekst
+xslt_export_not_possible = Exporteren Freeplane XLST is niet mogelijk
+yes = Ja
+ZoomInAction.text = Inzoomen
+ZoomOutAction.text = Uitzoomen
diff --git a/freeplane/resources/translations/Resources_nn.properties b/freeplane/resources/translations/Resources_nn.properties
new file mode 100644
index 0000000..ed02435
--- /dev/null
+++ b/freeplane/resources/translations/Resources_nn.properties
@@ -0,0 +1,590 @@
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/EncryptNode.properties_0 = Vel passord for kryptert node
+accessories/plugins/EncryptNode.properties_1 = Passorda er ikkje like eller for korte.
+accessories/plugins/EncryptNode.properties_2 = Skriv inn passordet:
+accessories/plugins/EncryptNode.properties_3 = Skriv inn passordet p\u00E5 nytt:
+accessories/plugins/EncryptNode.properties_4 = Skriv inn passordet ditt.
+accessories/plugins/EncryptNode.properties_5 = <html>Hugs at krypteringsstyrken<br> er s\u00E5 godt som heilt avhengig av kvaliteten p\u00E5 passordet
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Avbryt
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Du kan berre endra krypteringsstatusen til krypterte nodar. Du bruker verkt\u00F8ymenyen for \u00E5 setja inn ein slik nodetype.
+accessories/plugins/EncryptNode.properties_select_me = Vel meg for \u00E5 halde fram!
+accessories/plugins/EncryptNode.properties_wrong_password = Feil passord.
+accessories/plugins/ExportWithXSLT.tooltip = Dette er ein sams eksportmetode som nyttar XSLT-skript.
+accessories/plugins/ExportWithXSLT_HTML.text = Som XHTML (JavaScript-versjon) ...
+accessories/plugins/ExportWithXSLT_HTML3.text = Som XHTML (kartbilete med peikarar)...
+add = legg til
+AddLocalLinkAction.text = Legg til lokal hyperlenkje
+antialias_all = Kantutjamning p\u00E5 alt
+antialias_edges = Kantutjamning (berre p\u00E5 kantar)
+antialias_none = Ingen kantutjamning
+as_parent = Som forelder
+attributes_attribute = atributt
+attributes_close = lukk
+attributes_deselect_all = Ingenting
+attributes_edit = endra
+attributes_import = Import[translate me]
+attributes_popup_edit = endra
+attributes_refresh = frisk opp att
+attributes_select_all = Alle
+attributes_visible = synleg
+attributes_visible_tooltip = synleg
+AutomaticLayoutAction.text = Automatisk utforming
+AutomaticLayoutAction.tooltip = <html>Ordnar kartutforminga. <br>F\u00F8rste niv\u00E5 er svart, det andre er bl\u00E5tt, osv.</html>
+BackAction.text = Tilbake
+background = Bakgrunn
+BlinkingNodeHookAction.text = Blinkande node
+BlinkingNodeHookAction.tooltip = <html>Dette gjer at noden blinkar, men ver varsam. Knyt det ikkje til mange nodar og <strong> ikkje saman med andre automatiske formatteringar av den same noden.</strong></html>
+BoldAction.text = Feit
+boldify_branch = Gjer feit
+branch = Grein
+cancel = Avbryt
+CancelAction.text = Avbryt
+cannot_add_parent_diff_parents = All nodar m\u00E5 ha same forelder for \u00E5 kunne bruka denne funksjonen.
+cannot_add_parent_to_root = Rotnoden kan ikkje leggjast til ein ny forelder.
+cannot_join_nodes_with_children = Klarer ikkje \u00E5 kopla nodar med undernodar
+cannot_move_to_child = Kan ikkje flytta ein node til eit underordna niv\u00E5.
+CenterAction.text = Midtstill
+ChangeConnectorArrowsAction.backward.text = Tilbake
+ChangeConnectorArrowsAction.forward.text = Fram
+choose_background_color = Vel bakgrunnsfarge:
+choose_cloud_color = Vel skyfarge:
+choose_edge_color = Vel kantfarge
+choose_node_background_color = Vel bakgrunnsfarge for noden:
+choose_node_color = Vel nodefarge:
+CloseAction.text = Lukk
+CloudAction.text = Sky
+CloudColorAction.text = Skyfarge ...
+ColorProperty.ResetColor = Nullstill farge
+combined = Kombinert
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Kopier
+CopySingleAction.text = Kopier \u00E9in
+CreationModificationPluginAction.text = Vis endringstidene
+CreationModificationPluginAction.tooltip = <html>Denne funksjonen held orden p\u00E5 opprettings- og endringstidene til noden.</html>
+CutAction.text = Klypp ut
+decrease_branch_font_size = Mindre skrift
+DecreaseNodeFontAction.text = Mindre skrift
+delete = slett
+delete_child = Slett node
+DeleteAction.text = Fjern node
+DocumentationAction.text = Dokumentasjon
+edge = Kant
+edge_style = Kantstil
+edge_width = Kantbreidd
+EdgeColorAction.text = Kantfarge ...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = Linjeforma
+EdgeStyleAction.sharp_bezier.text = Bratt Bezier
+EdgeStyleAction.sharp_linear.text = Bratt line\u00E6r
+EdgeStyleAsParentAction.text = Som forelder
+EdgeWidthAction_width_parent.text = Forelder
+EdgeWidthAction_width_thin.text = Tynn
+edit = Endra
+edit.decision = HTML Editor[translate me]
+edit_link_manually = Endra hyperlenkje manuelt ...
+EditAction.text = Endra node
+EditFilterAction.text = endra
+EditLongAction.text = Endra langnode ...
+EncryptedMap.text = Lag kryptert kart ...
+EncryptedMap.tooltip = Lag eit nytt krypter kart
+enter_base_url = Eg vil lima inn relative peikarar. Skriv inn grunnadressa (URL).
+enter_confirms = Enter stadfestar
+EnterPassword.text = Sl\u00E5 av/p\u00E5 kryptert/ukryptert
+error_creating_directory = Klarer ikkje laga eksportkatalog.
+export_pdf_text = Portabelt dokumentformat (PDF)
+export_svg_text = Skalerbar vektorgrafikk (SVG)
+ExportAction.text = Eksport
+ExportBranchToHTMLAction.text = Grein som HTML
+ExportPdf.text = Som PDF ...
+ExportSvg.text = Som SVG ...
+ExportToHTMLAction.text = Som HTML
+ExportToImage.jpg.text = Som JPEG ...
+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
+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_add = legg til
+filter_and = og
+filter_contains = inneheld
+filter_delete = slett
+filter_does_not_exist = finst ikkje
+filter_enter_value = Skriv inn verdi
+filter_exist = finst
+filter_icon = ikon
+filter_is_equal_to = er lik med
+filter_is_not_equal_to = er ulik med
+filter_node = nodetekst
+filter_not = ikkje
+filter_or = eller
+filter_select = vel
+find_what = Finna kva
+FindAction.text = S\u00F8k ...
+fit_map_to_page = Skaler til \u00E9i side
+FitToPage.text = Skaler til \u00E5 passa til sida
+FitToPage.tooltip = Skaler slik at heile kartet passar til det noverande vindauget.
+fold = Brett saman
+FoldAllAction.text = Brett saman alle
+FoldAllAction.tooltip = <html>Bretter saman alle valde nodar og alle barna deira.</html>
+FoldOneLevelAction.text = Brett saman eitt niv\u00E5
+FoldOneLevelAction.tooltip = <html>Bretter saman dei valde nodane med eitt niv\u00E5.</html>
+font = Skrifttype
+FontFamilyAction.text = skrifttypefamilie
+FontSizeAction.text = skriftstorleik
+format_menu_edge_styles = Linjestilar
+format_menu_edge_widths = Linjebreidder
+FormatCopy.text = Kopiformat
+FormatCopy.tooltip = <html>Kopierer nodeformatet.</html>
+FormatPaste.text = Limformat
+FormatPaste.tooltip = <html>Limer inn nodeformatet.</html>
+ForwardAction.text = Fram
+freeplane_reverted = Freeplane_endra tilbake_
+FreeplaneHelpStarter.text = Hjelp ...
+FreeplaneHelpStarter.tooltip = Freeplane utvida hjelp
+GotoLinkNodeAction.text = G\u00E5 til-lenkje
+GrabKeyDialog.common.cancel = Avbryt
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Bunden til
+GrabKeyDialog.grab-key.assigned-to.none = Enno ikkje bunden
+GrabKeyDialog.grab-key.clear = Nullstill
+GrabKeyDialog.grab-key.remove = Fjern
+GrabKeyDialog.grab-key.remove-ask = Er du sikker p\u00E5 at du fjerna tasten?
+GrabKeyDialog.grab-key.title = Legg til ny tast
+help = Hjelp
+HierarchicalIconsAction.text = Vis ikon hierarkisk
+HierarchicalIconsAction.tooltip = Dersom nokre av (barne)barna mine har eit ikon vil eg visa det i lite format \u00F2g.
+html_export_based_on_headings = HTML-eksport - basert p\u00E5 overskrifter
+html_export_fold_all = HTML-eksport - brett saman alt
+html_export_fold_currently_folded = HTML-eksport - som noverande samanbretting
+html_export_no_folding = HTML-eksport - inga samanbretting
+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]
+icon_attach = Sj\u00E5 her
+icon_back = Tilbake
+icon_bee = Freeplane[translate me]
+icon_bell = Hugs
+icon_bookmark = Flott
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Ikkje OK
+icon_button_ok = OK
+icon_calendar = Dato
+icon_clanbomber = Farleg
+icon_desktop_new = Gl\u00F8ym ikke
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Flagg
+icon_flag-black = Black Flag[translate me]
+icon_flag-blue = Blue Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_flag-yellow = Yellow Flag[translate me]
+icon_forward = Fram
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioritet 1
+icon_full-2 = Prioritet 2
+icon_full-3 = Prioritet 3
+icon_full-4 = Prioritet 4
+icon_full-5 = Prioritet 5
+icon_full-6 = Prioritet 6
+icon_full-7 = Prioritet 7
+icon_gohome = Heim
+icon_help = Sp\u00F8rsm\u00E5l
+icon_idea = Id\u00E9
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_knotify = Musikk
+icon_korn = Postkasse
+icon_ksmiletris = Eg er glad
+icon_licq = Kjekt
+icon_Mail = Post
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Ikon
+icon_messagebox_warning = Viktig
+icon_password = N\u00F8kkel
+icon_pencil = For gjennomg\u00E5ing
+icon_penguin = Linux
+icon_smiley-angry = Angry[translate me]
+icon_stop = Stopp
+icon_wizard = Magi
+icon_xmag = Skal diskuterast
+icon_yes = Viktig
+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_linked_branch_no_link = Den valde noden har ingen peikar \u00E5 importera fr\u00E5.
+ImportAction.text = Import[translate me]
+ImportBranchAction.text = Grein ...
+ImportExplorerFavoritesAction.text = IE-favorittar ...
+ImportFolderStructureAction.text = Mappetre ...
+ImportLinkedBranchAction.text = Lenka grein
+ImportLinkedBranchWithoutRootAction.text = (Lenka grein) utan rota ...
+ImportMindmanagerFiles.text = MindManager X5-kart ...
+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]
+locking_failed_by_open = Klarte ikkje \u00E5 l\u00E5sa kartet {0}. Blir opna som skrivebeskytta.
+locking_failed_by_save_as = Klarte ikkje \u00E5 l\u00E5sa kartet {0}. Handlinga "Lagra som" avbroten.
+locking_old_lock_removed = Kartet {0} var l\u00E5st av brukaren {1}. L\u00E5singa blei oppheva d\u00E5 han var for gammal.
+long_node_changed_cancel = Du har endra noden. Vil du sj\u00E5 vekk fr\u00E5 endringane?
+lots_of_links_warning = Du er p\u00E5 veg til \u00E5 laga mange peikarar til same node. Vil du verkeleg gjera dette?
+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)
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Modus er ikkje tilgjengeleg
+mode_status = Modus er endra til {0}-modus
+mode_title = Freeplane - {0}-modus
+modes = Modusar
+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
+NavigationNextMapAction.text = Nytt kart
+NavigationPreviousMapAction.text = Tidlegare kart
+new_mindmap = Nytt tankekart
+new_node = Ny node
+new_node_as_sibling_not_possible_for_the_root = Rota kan ikkje ha s\u00F8skennodar
+NewChildAction.text = Ny barnenode
+NewMapAction.text = Nytt
+NewParentNode.text = Ny foreldrenode
+NewParentNode.tooltip = <html>Alle valde er sende til til ein ny forelder.</html>
+NewPreviousSiblingAction.text = Ny tidlegare s\u00F8skennode
+NewSiblingAction.text = Ny s\u00F8skennode
+no = Nei
+no_format_copy_before_format_paste = Du m\u00E5 f\u00F8rst kopiera formatet f\u00F8r du kan lima det inn.
+no_found_from = Ingen "{0}" funnen i "{1}".
+no_more_found_from = Ingen fleire "{0}" funnen i "{1}".
+no_previous_find = Ingen tidlegare treff.
+node = Node
+node_changed_discard_changes = Du har endra noden. Vil du sj\u00E5 vekk fr\u00E5 endringane?
+NodeBackgroundColorAction.text = Bakgrunnsfarge node ...
+NodeColorAction.text = Nodefarge ...
+NodeColorBlendAction.text = Bland farge
+NodeDownAction.text = Node ned
+NodeListAction.text = Vis karthistorikk ...
+NodeListAction.tooltip = Vis alle nodar med opprettings-/endringsdatoane.
+NodeShapeAction.bubble.text = Boble
+NodeShapeAction.fork.text = Forgreining
+NodeUpAction.text = Node opp
+nonboldify_branch = Ikkje feit
+nonitalicise_branch = Ikkje kursiv
+normal = Normal
+not_saved_for_link_error = Kartet m\u00E5 lagrast f\u00F8r filveljaren kan laga ein peikar
+ok = OK
+OKAction.text = OK
+OpenAction.text = Opna ...
+option_changes_may_require_restart = Du m\u00E5 sannsynlegvis starta Freeplane p\u00E5 nytt f\u00F8r endringane verkar.
+OptionPanel.absolute = Absolutt
+OptionPanel.antialias = Kantutjamning
+OptionPanel.antialias.tooltip = <html>Bestemmer kvaliteten til kartet. Meir kantutjamning krev meir tid.</html>
+OptionPanel.antialias_all = Kantutjamning p\u00E5 alt
+OptionPanel.antialias_edges = Kantutjamning (berre p\u00E5 kantar)
+OptionPanel.antialias_none = Inga kantutjamning
+OptionPanel.Appearance = Utsj\u00E5nad
+OptionPanel.as_parent = Som forelder
+OptionPanel.automatic = Automatisk
+OptionPanel.automaticFormat_level1 = Root Node Format[translate me]
+OptionPanel.Behaviour = Oppf\u00F8rsel
+OptionPanel.bezier = Bezier
+OptionPanel.bubble = Boble
+OptionPanel.Cancel = Avbryt
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Kombinert
+OptionPanel.cs = CS
+OptionPanel.da = DK
+OptionPanel.de = DE
+OptionPanel.default = Sgtandard
+OptionPanel.default_browser_command_mac = Standard nettlesarkommando (Mac)
+OptionPanel.default_browser_command_mac.tooltip = <html> og MAC: (takk til Nick!)</html>
+OptionPanel.default_browser_command_other_os = Standard nettlesarkommando (andre operativsystem)
+OptionPanel.default_browser_command_other_os.tooltip = <html> Dette gjeld typisk for Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Standard nettlesarkommando (Windows 9x)
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>For Windows (""-teikna er n\u00F8dvendige for peikarar som har "=" i adressa deira).</html>
+OptionPanel.default_browser_command_windows_nt = Standard nettlesarkommando (Windows NT-familien)
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>For Windows (""-teikna er n\u00F8dvendige for peikarar som har "=" i adressa deira).</html>
+OptionPanel.Defaults = Standardverdiar
+OptionPanel.delete_automatic_saves_at_exit = Sl\u00E5 av automatisk lagring ved avslutning
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Dersom du vil at filene skal slettast automatisk n\u00E5r Freeplane lukkast m\u00E5 du setja f\u00F8lgjande variabel til \u00E5 vera "sann"</html>
+OptionPanel.disable_cursor_move_paper = Sl\u00E5 av peikar under flytting
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Vis ikkje 'move'-peikaren under flytting</html>
+OptionPanel.display_node_id = Display node ID[translate me]
+OptionPanel.el__enter_confirms_by_default = Retur-tasten stadfestar (standardverdi)
+OptionPanel.el__max_default_window_height = Maksimum standard vindaugsh\u00F8gd
+OptionPanel.el__max_default_window_width = Maksimum standard vindaugsbreidd
+OptionPanel.el__min_default_window_height = Minimum standard vindaugsh\u00F8gd
+OptionPanel.el__min_default_window_width = Minimum standard vindaugsbreidd
+OptionPanel.el__position_window_below_node = Posisjon vindauge under node
+OptionPanel.en = EN
+OptionPanel.Environment = Omgjevnad
+OptionPanel.es = ES
+OptionPanel.experimental_file_locking_on = Eksperimentell fill\u00E5sing
+OptionPanel.experimental_file_locking_on.tooltip = <html> Eksperimentell eigenskap</html>
+OptionPanel.export_icons_in_html = Eksporter ikon
+OptionPanel.export_icons_in_html.tooltip = <html> Fortel om HTML eksportert fr\u00E5 Freeplane skal innehalda ikon. Problemet er ofte at peikarane til ikona ikkje blir funnen i den eksporterte HTML.</html>
+OptionPanel.Files = Filer
+OptionPanel.first = F\u00F8rste
+OptionPanel.foldingsymbolwidth = Brettesymbolbreidd
+OptionPanel.foldingsymbolwidth.tooltip = <html>Breidda p\u00E5 brettemarkeringssymbolet</html>
+OptionPanel.fork = Gaffel
+OptionPanel.fr = FR
+OptionPanel.gtk = GTK
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Basert p\u00E5 overskrifter
+OptionPanel.html_export_fold_all = Brett saman alle
+OptionPanel.html_export_fold_currently_folded = Brett saman noverande bretta
+OptionPanel.html_export_folding = Bretting ved HTML-eksport
+OptionPanel.html_export_no_folding = Inga bretting
+OptionPanel.hu = HU
+OptionPanel.icon = ikon
+OptionPanel.it = IT
+OptionPanel.ja = JA
+OptionPanel.Keystrokes = Tastetrykk
+OptionPanel.ko = KR
+OptionPanel.language = Spr\u00E5k
+OptionPanel.language.tooltip = <html>Dette er spr\u00E5ket som b\u00F8r brukast i programmet. "Automatisk" pr\u00F8ver \u00E5 nytta same spr\u00E5k som noverande brukar.</html>
+OptionPanel.last = Siste
+OptionPanel.last_opened_list_length = Siste opna listelengd
+OptionPanel.linear = Line\u00E6r
+OptionPanel.links = Peikarar
+OptionPanel.links.tooltip = <html>L\u00E8t peikarane vera anten relative eller absolutte</html>
+OptionPanel.lookandfeel = Utsj\u00E5nad og verkem\u00E5te
+OptionPanel.lookandfeel.tooltip = <html>Kva for utsj\u00E5nad og verkem\u00E5te ein vil bruka. Ein kan nytta 'Metal','Windows','Motif' og 'GTK'. 'Mac' er berre tilgjengeleg der ein nyttar MacOS. Standard betyr at einbruker standard utsj\u00E5nad og verkem\u00E5te. \u00D8nskjer du \u00E5 leggja inn eit eige oppsett m\u00E5 du skriva inn klassenamnet her og sj\u00E5 til at tilh\u00F8rande jar-fil(er) blir lasta. Om det er eit problem med oppsette kan du velja "Ingenting". Fungerer med miniprogram.</html>
+OptionPanel.lt = LT
+OptionPanel.max_node_width = Maksimal nodebreidd
+OptionPanel.max_node_width.tooltip = <html>Standard maksimumsverdi for nodebreidda (i pikslar)</html>
+OptionPanel.metal = Metall
+OptionPanel.motif = Motif
+OptionPanel.nb = NO
+OptionPanel.nl = NL
+OptionPanel.nothing = Ingenting
+OptionPanel.number_of_different_files_for_automatic_save = Tal p\u00E5 filversjonar ved automatisk lagring
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> H\u00F8gste tal p\u00E5 filversjonar ved automatisk lagring er talet n. F\u00F8rste lagring skjer i den f\u00F8rste fila opptil n+1. D\u00E5 startar ein fr\u00E5 f\u00F8rste fil att (syklisk sekvens)</html>
+OptionPanel.OK = Lagra
+OptionPanel.org.freeplane.plugin.bugreport = Policy[translate me]
+OptionPanel.pl = PL
+OptionPanel.placenewbranches = Plasser ny grein
+OptionPanel.placenewbranches.tooltip = <html>Kor ein skal plassera nye greiner. Gyldige verdiar er 'f\u00F8rst' and 'sist' </html>
+OptionPanel.pt_BR = PT-BR
+OptionPanel.pt_PT = PT-PT
+OptionPanel.relative = Relativ
+OptionPanel.ru = RU
+OptionPanel.selection_method = Valmetode
+OptionPanel.selection_method.tooltip = <html> Med denne brytaren kan du sl\u00E5 av/p\u00E5 forseinka val. Auto options. Do not modify these as they will be saved to auto.properties anyway.</html>
+OptionPanel.selection_method_by_click = Ved klikk
+OptionPanel.selection_method_delayed = Forseinka
+OptionPanel.selection_method_direct = Direkte
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = M\u00F8nster
+OptionPanel.separator.anti_alias = Kantutjamning
+OptionPanel.separator.attributes = atributt
+OptionPanel.separator.automatic_save = Automatisk lagring
+OptionPanel.separator.behaviour = Oppf\u00F8rsel
+OptionPanel.separator.browser = Nettlesar
+OptionPanel.separator.commands_for_the_program = Program
+OptionPanel.separator.default_colors = Standardfargar
+OptionPanel.separator.default_fonts = Standardskrifter
+OptionPanel.separator.default_styles = Standardstiler
+OptionPanel.separator.EdgeControls = Edges[translate me]
+OptionPanel.separator.edit_long_node_window = Endra langnodevindauge
+OptionPanel.separator.files = Filer
+OptionPanel.separator.html_export = HTML-eksport
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Hyperlenkjetypar
+OptionPanel.separator.icon_properties = Ikon
+OptionPanel.separator.initial_map_size = Standard kartstorleik
+OptionPanel.separator.key_typing = Skriving
+OptionPanel.separator.language = Spr\u00E5k
+OptionPanel.separator.load = Load[translate me]
+OptionPanel.separator.look_and_feel = Utsj\u00E5nad og verkem\u00E5te
+OptionPanel.separator.new_node_commands = Ny node
+OptionPanel.separator.node_editing_commands = Noderedigering
+OptionPanel.separator.node_navigation_commands = Nodenavigering
+OptionPanel.separator.NodeFont = Node Font[translate me]
+OptionPanel.separator.other_defaults = Andre standarverdiar
+OptionPanel.separator.patterns = M\u00F8nster
+OptionPanel.separator.save = Lagra
+OptionPanel.separator.selection_method = Valmetode
+OptionPanel.separator.undo = Angra
+OptionPanel.sl = SL
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Standard bakgrunnsfarge
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standard bakgrunnsfarge (i HTML-notasjon) </html>
+OptionPanel.standardcloudcolor = Standard skyfarge
+OptionPanel.standardcloudcolor.tooltip = <html>Standard skyfarge (i HTML-notasjon) </html>
+OptionPanel.standardcloudestyle = Standard skystil
+OptionPanel.standardcloudestyle.tooltip = <html>Standard skystil. Ein kan berre bruka 'Bezier'</html>
+OptionPanel.standardlinkcolor = Standard peikarfarge
+OptionPanel.standardlinkcolor.tooltip = <html>Standard peikarfarge (i HTML-notasjon) </html>
+OptionPanel.standardlinkestyle = Standard peikarstil
+OptionPanel.standardlinkestyle.tooltip = <html>Standard peikarstil. Ein kan berre bruka 'Bezier'</html>
+OptionPanel.standardselectednodecolor = Standard vald nodefarge
+OptionPanel.standardselectednodecolor.tooltip = <html>Standard nodefarge om vald. Bruker HTML-format (#RRGGBB i heks-verdi) </html>
+OptionPanel.time_for_automatic_save = Tid mellom automatiske lagringar
+OptionPanel.time_for_automatic_save.tooltip = <html> tid mellom to automatiske lagringar (i ms): du sl\u00E5r av automatisk lagring ved \u00E5 f\u00F8ra inn talet 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tid f\u00F8r noden blir vald
+OptionPanel.time_for_delayed_selection.tooltip = <html> Tidsforseinking f\u00F8r noden blir vald n\u00E5r musepeikaren er over han (i ms). Endra denne verdien til "1" om du \u00F8nskjer \u00E5 velja noden direkte n\u00E5r musa kviler over han.</html>
+OptionPanel.undo_levels = Angreniv\u00E5
+OptionPanel.undo_levels.tooltip = <html>Bestemmer kor mange lagra handlingar som kan gjerast om via "Angra".</html>
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = ZH-CN
+OptionPanel.zh_TW = ZH
+org.freeplane.plugin.bugreport.agree = Send[translate me]
+PageAction.text = Sideinnstillingar ...
+PasteAction.text = Lim inn
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Kantstil
+PatternToString.EdgeWidth = Kantbreidd
+PatternToString.FontBold = Feit
+PatternToString.Icon = ikon
+plugins/ScriptEditor/window.title = Script Editor[translate me]
+plugins/TimeList.xml_Created = Oppretta
+plugins/TimeList.xml_Date = Dato
+plugins/TimeList.xml_Icons = Ikon
+plugins/TimeList.xml_Modified = Endra
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Legg til dato p\u00E5 valde nodar
+plugins/TimeManagement.xml_Cancel = Avbryt
+plugins/TimeManagement.xml_cancelButton = Avbryt
+plugins/TimeManagement.xml_closeButton = lukk
+plugins/TimeManagement.xml_Goto = Goto[translate me]
+plugins/TimeManagement.xml_hour = Time:
+plugins/TimeManagement.xml_minute = Minutt:
+plugins/TimeManagement.xml_reminderButton = Varsla denne datoen
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>N\u00E5r trykt ned vil nedteljinga g\u00E5 til den gjevne datoen. Blinkande ikon vil d\u00E5 varsla.<br> Lukker du kartet vil teljarane setjast i gang att neste gong du opnar det.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>For tida kan det berre vera eitt varsel per node. <br>Noverande varsel er planlagt til {0,date} {0,time}, valet ditt var {1,date} {1,time}. <br><br>\u00D8nskjer du \u00E5 endra varseltida til noden (JA) <br>eller vil du bruka den gamle (NEI)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Planlagt varsel {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Fjern varsel
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Fjern alle varsel knytte til dei valde nodane.
+plugins/TimeManagement.xml_todayButton = I dag
+plugins/TimeManagement.xml_WindowTitle = Tidsstyring
+preferences = Innstillingar
+PrintAction.text = Skriv ut ...
+PrintDirectAction.text = Skriv ut
+printing_settings = Utskriftskalering
+PropertyAction.text = Innstillingar ...
+QuitAction.text = Avslutt
+read_only = Berre lesing
+RedoAction.text = Gjer om att
+RedoFilterAction.text = Gjer om att
+ReminderHookAction.text = Fjern varsel
+ReminderHookAction.tooltip = Fjerna varsel fr\u00E5 ein node
+RemoveAllIconsAction.text = Fjern alle ikon
+RemoveIconAction.text = Fjern siste ikon
+repair_link = Reparer peikar
+repair_link_question = Klarte ikkje \u00E5 lasta det lenkja kartet. Vil du reparera peikaren manuelt?
+ResetNodeLocationAction.text = Nullstill posisjon
+save_failed = Klarte ikkje \u00E5 lagra kartet {0}.
+save_unsaved = Lagra tankekartet?:
+SaveAction.text = Lagra
+SaveAsAction.text = Lagra som ...
+saved = Lagra
+scheme_evaluate = Evaluer!
+select_favorites_folder = Vel mappa der favorittane dine er
+select_folder_for_importing = Vel mappa du vil importera
+SelectAllAction.text = Vel alle synlege
+SelectBranchAction.text = Vis synleg grein
+selection_method_by_click = Klikk \u00E9in gong for \u00E5 velja
+selection_method_delayed = Forseinka automatisk val
+selection_method_direct = Peik for \u00E5 velja
+SetImageByFileChooserAction.text = Bilete (filveljaren eller peikar) ...
+SetLinkByFileChooserAction.text = Hyperlenkje (filveljaren) ...
+SetLinkByTextFieldAction.text = Hyperlenkje (tekstfelt) ...
+SetNoteWindowPosition.bottom.text = Bottom[translate me]
+ShowAncestorsAction.text = vis fordre
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+simplyhtml.borderWidthLabel = Breidd
+simplyhtml.cancelBtnName = Avbryt
+simplyhtml.cellMarginTabLabel = Margin[translate me]
+simplyhtml.close = lukk
+simplyhtml.closeBtnName = lukk
+simplyhtml.copyLabel = Kopier
+simplyhtml.cTagNameLink = Link[translate me]
+simplyhtml.cutLabel = Klypp ut
+simplyhtml.editLabel = endra
+simplyhtml.fontBoldLabel = Feit
+simplyhtml.fontDialogTitle = Format Font[translate me]
+simplyhtml.fontItalicLabel = Kursiv
+simplyhtml.fontTabLabel = Skrifttype
+simplyhtml.fontUnderlineLabel = Strek under
+simplyhtml.formatLabel = Format[translate me]
+simplyhtml.helpLabel = Hjelp
+simplyhtml.listIndentTitle = Indent\:[translate me]
+simplyhtml.listTypeLabel = Type\:[translate me]
+simplyhtml.listTypeNone = none[translate me]
+simplyhtml.noLineLabel = none[translate me]
+simplyhtml.okBtnName = OK
+simplyhtml.pasteLabel = Lim inn
+simplyhtml.redoLabel = Gjer om att
+simplyhtml.replaceAll = Alle
+simplyhtml.replaceNo = Nei
+simplyhtml.replaceYes = Ja
+simplyhtml.standardStyleName = standard[translate me]
+simplyhtml.styleLabel = Stil
+simplyhtml.textIndentLabel = Indent\:[translate me]
+simplyhtml.topLabel = top\:[translate me]
+simplyhtml.uLineLabel = Strek under
+simplyhtml.undoLabel = Angra
+simplyhtml.valignBaseline = baseline[translate me]
+split = Splitt
+SplitNode.text = Split Node[translate me]
+style = Stil
+svg = SVG[translate me]
+TimeListAction.text = Vis tidsplanleggarlista ...
+TimeListAction.tooltip = Vis alle planlagte tider og tilh\u00F8rande noder.
+TimeManagementAction.text = Vis kalender ...
+TimeManagementAction.tooltip = <html>Viser kalendermodulen til Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Barn brett saman/brett ut
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Samanbretta av/p\u00E5
+ToggleLeftToolbarAction.text = Venstre verkt\u00F8ylinje av/p\u00E5
+ToggleMenubarAction.text = Menylinja av/p\u00E5
+ToggleToolbarAction.text = Verkt\u00F8ylinja av/p\u00E5
+undefined_error = Det oppstod ein uventa feil. Pr\u00F8v \u00E5 laga ein feilrapport.
+underline = Strek under
+underlined = Undertreka
+UndoAction.text = Angra
+UndoFilterAction.text = Angra
+unfold = Brett ut
+UnfoldAllAction.text = Brett ut alle
+UnfoldAllAction.tooltip = <html>Bretter ut alle valde nodar og alle barna deira.</html>
+UnfoldOneLevelAction.text = Brett ut eitt niv\u00E5
+UnfoldOneLevelAction.tooltip = <html>Bretter ut dei valde nodane med eitt niv\u00E5.</html>
+url_error = Ugyldig adresse (URL)
+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):
+width = Breidd
+yes = Ja
+ZoomInAction.text = Gjer st\u00F8rre
+ZoomOutAction.text = Gjer mindre
diff --git a/freeplane/resources/translations/Resources_pl.properties b/freeplane/resources/translations/Resources_pl.properties
new file mode 100644
index 0000000..904c62a
--- /dev/null
+++ b/freeplane/resources/translations/Resources_pl.properties
@@ -0,0 +1,1688 @@
+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
+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_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.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Anuluj
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Stan szyfrowania mo\u017Cna prze\u0142\u0105cza\u0107 tylko dla zaszyfrowanego w\u0119z\u0142a, kt\u00F3ry mo\u017Cesz wstawi\u0107 z menu Narz\u0119dzia.
+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_Applet.text = Do apletu Javy ...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Eksportuj map\u0119 do apletu javy.
+accessories/plugins/ExportWithXSLT_Flash.text = Do animacji Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Eksportuj map\u0119 do aplikacji flash.
+accessories/plugins/ExportWithXSLT_HTML.text = Do dokumentu XHTML (wersja JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Do dokumentu XHTML (widok ca\u0142ej mindmapy)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Zasoby z w\u0119z\u0142a RESOURCES do pliku TJI...
+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}
+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...
+AddOnDetailsPanel.authored.by = autorstwa {0}
+AddOnDetailsPanel.header.function = Funkcja
+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.groovy.script.name = Nazwa skryptu {0} nie ko\u0144czy si\u0119 na ".groovy"
+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.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.translation = Brakuj\u0105ce t\u0142umaczenie {0} dla lokalizacji {1}
+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.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.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><em>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.</em></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
+always = Zawsze
+AlwaysUnfoldedNodeAction.text = Zawsze rozwini\u0119ty w\u0119ze\u0142 (w\u0142./wy\u0142.)
+antialias_all = Antyaliasing wszystkiego
+antialias_edges = Antyaliasing ga\u0142\u0119zi
+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.
+ApplyNoFilteringAction.text = Nie filtruj
+ApplySelectedViewConditionAction.text = Filtruj wybrane w\u0119z\u0142y
+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...
+attribute_delete = Usu\u0144 wszystkie warto\u015Bci
+attribute_delete_value = Usu\u0144 warto\u015B\u0107
+attribute_font_size_tooltip = Rozmiar czcionki atrybut\u00F3w
+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_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_edit = Edytuj
+attributes_edit_tooltip = Edytuj zestaw
+attributes_for_selected = Zaznaczone w\u0119z\u0142y
+attributes_for_visible = Wszystkie widoczne w\u0119z\u0142y
+attributes_import = Importuj
+attributes_import_tooltip = Importuj atrybuty z innych otwartych map
+attributes_no_import_candidates_found = Nie znaleziono nowych atrybut\u00F3w
+attributes_popup_delete = Usu\u0144
+attributes_popup_down = D\u00F3\u0142
+attributes_popup_edit = Edytuj
+attributes_popup_hide = Ukryj
+attributes_popup_new = Nowy atrybut
+attributes_popup_optimal_width = Optymalna szeroko\u015B\u0107
+attributes_popup_up = G\u00F3ra
+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_values_tooltip = Ogranicz zakres warto\u015Bci dla aktywnego atrybutu.
+attributes_restriction = Ograniczony zbi\u00F3r warto\u015Bci
+attributes_select_all = Wszystkie
+attributes_select_all_tooltip = Zaznacz / Odzancz wszystkie
+attributes_show = Poka\u017C
+attributes_skip_root = Pomi\u0144 korze\u0144
+attributes_visible = Zazanczone widoczne
+attributes_visible_tooltip = Zazanczone widoczne
+automatic_layout = Uk\u0142ad automatyczny
+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.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.null.text = wy\u0142\u0105czone
+BackAction.text = Wstecz
+BackAction.tooltip = Przechodzi do poprzednio zaznaczonego w\u0119z\u0142a
+background = T\u0142o
+bitmaps = Bitmapy
+black = Czarny
+BlinkingNodeHookAction.text = Migaj\u0105cy w\u0119ze\u0142
+BlinkingNodeHookAction.tooltip = <html> Spowoduje, \u017Ce w\u0119ze\u0142 b\u0119dzie miga\u0107. B\u0105d\u017A ostro\u017Cny. Nie u\u017Cywaj na zbyt wielu w\u0119z\u0142ach i <strong>nie razem z innym formatowaniem automatycznym</strong></html>
+blue = Niebieski
+BoldAction.text = Pogrubienie
+boldify_branch = Pogrubienie
+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
+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_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.
+CenterAction.text = Wy\u015Brodkuj
+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.LINE.text = Linia
+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
+ChangeNodeLevelRightsAction.tooltip = Je\u017Celi w\u0119z\u0142y s\u0105 z prawej strony to staj\u0105 si\u0119 potomkami swojego, znajduj\u0105cego si\u0119 powy\u017Cej s\u0105siada. Id\u0105c w lewo w\u0119z\u0142y przemieszczaj\u0105 si\u0119 wy\u017Cej, a gdy s\u00B9 najwy\u017Cszego poziomu zmieniaj\u0105 po\u0142o\u017Cenie na lew\u0105 stron\u0119.
+choose_background_color = Wybierz kolor t\u0142a:
+choose_cloud_color = Wybierz kolor chmurki:
+choose_edge_color = Wybierz kolor ga\u0142\u0119zi
+choose_map_background_color = Wybierz kolor t\u0142a mapy
+choose_node_background_color = Wybierz kolor t\u0142a w\u0119z\u0142a:
+choose_node_color = Wybierz kolor w\u0119z\u0142a:
+close_btn = Zamknij
+CloseAction.text = Zamknij
+CloudAction.text = Chmurka
+CloudColorAction.text = Kolor chmurki...
+CloudShapeAction.ARC.text = \u0141uk
+CloudShapeAction.RECT.text = Prostok\u0105t
+CloudShapeAction.ROUND_RECT.text = Zaokr\u0105glony prostok\u0105t
+CloudShapeAction.STAR.text = Gwiazda
+ColorProperty.ResetColor = Domy\u015Blny
+combined = Ramka/bez ramki
+condition = Warunek
+confirmation = Potwierdzenie
+connector = Po\u0142\u0105czenie
+connector_arrows = Strza\u0142ki po\u0142\u0105czenia
+connector_label = Etykieta po\u0142\u0105czenia
+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
+CopyAttributes.text = Kopiuj atrybuty
+CopyIDAction.text = Kopiuj ID w\u0119z\u0142a
+CopyMapStylesAction.text = Kopiuj style mapy z...
+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
+CreateConjunctConditionAction.text = I (And)
+CreateDisjunctConditionAction.text = Lub (Or)
+CreateNotSatisfiedConditionAction.text = Nie (Not)
+CreationModificationPluginAction.text = Poka\u017C czas modyfikacji (po wskazaniu myszk\u0105)
+CreationModificationPluginAction.tooltip = <html> Ta funkcja \u015Bledzi czas tworzenia i modyfikacji w\u0119z\u0142\u00F3w</html>
+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
+defaultstyle.details = Detale
+defaultstyle.floating = Swobodny w\u0119ze\u0142
+defaultstyle.note = Notatka
+delete = Usu\u0144
+delete_child = Usu\u0144 w\u0119ze\u0142
+DeleteAction.text = Usu\u0144 w\u0119ze\u0142
+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
+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.
+DirectHtmlFlavorHandler = HTML jako pojedynczy w\u0119ze\u0142
+DocumentationAction.text = Dokumentacja
+down = D\u00f3\u0142
+download = Pobierz
+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.horizontal.text = Pionowa
+EdgeStyleAction.linear.text = Linia
+EdgeStyleAction.sharp_bezier.text = Ostra krzywa B\u00E9ziera
+EdgeStyleAction.sharp_linear.text = Ostra linia
+EdgeStyleAsParentAction.text = Jak rodzic
+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_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_long_node = Edytor tekstu w\u0119z\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
+EditAction.text = Edytuj tekst w\u0119z\u0142a
+EditAttributesAction.text = Edytuj atrybuty
+EditDetailsAction.text = Edytuj detale w\u0119z\u0142a in-line
+EditDetailsInDialogAction.text = Edytor detali w\u0119z\u0142a...
+EditFilterAction.text = Edytuj filtr
+EditLongAction.text = Edytor tekstu w\u0119z\u0142a...
+EditNoteInDialogAction.text = Edytor notatki...
+EditScript = Edytor skryptu...
+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_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
+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
+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
+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...
+ExportBranchToHTMLAction.text = Ga\u0142\u0105\u017A do dokumentu HTML...
+exported_file = Plik {0}
+ExportPdf.text = Do dokumentu PDF...
+ExportSvg.text = Do obrazu SVG...
+ExportToHTMLAction.text = Do dokumentu HTML...
+ExportToImage.jpg.text = Do obrazu JPEG...
+ExportToImage.png.text = Do obrazu PNG...
+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_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
+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:
+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_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:
+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.question = Znaleziono wersje {0}
+FileRevisionsDialog.restore = Odtw\u00f3rz
+FileRevisionsDialog.restore.tooltip = Zamienia {0} na {1}
+FileRevisionsDialog.title = Wersje plik\u00f3w
+filter = Filtr
+filter_add = Dodaj
+filter_and = I
+filter_any_text = Tekst, detale lub notatka
+filter_conditions = Filtry
+filter_contains = Zawiera
+filter_created_after = Stworzono po
+filter_created_before = Stworzono przed
+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_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_modified_after = Zmodyfikowano po
+filter_modified_before = Zmodyfikowano przed
+filter_no_filtering = Nie filtruj
+filter_node = Tekst w\u0119z\u0142a
+filter_node_level = Poziom w\u0119z\u0142a
+filter_not = Nie jest
+filter_note = Notatka
+filter_odd_level = W\u0119ze\u0142 parzystego poziomu
+filter_or = Lub
+filter_parent = Tekst rodzica
+filter_periodic_level = Okresowo
+filter_priority = Priorytet
+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_root = Korze\u0144
+filter_script = Skrypt
+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:
+FindAction.text = Znajd\u017A...
+FirstGroupNodeAction.text = W\u0119ze\u0142 zbiorczy (pocz\u0105tek grupy)
+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
+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
+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:
+FollowLinkAction.text = Otw\u00F3rz odno\u015Bnik
+font = Czcionka
+FontFamilyAction.text = Czcionka
+FontSizeAction.text = Rozmiar
+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
+format_menu_edge_widths = Szeroko\u015B\u0107 ga\u0142\u0119zi
+format_panel = Formatowanie
+FormatCopy.text = Kopiuj formatowanie
+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.EvaluateAllAction.text = Wykonaj wszystko
+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.)
+Freeplane.progress.buildScreen = Budowanie interfejsu...
+Freeplane.progress.createController = Tworzenie kontrolera...
+Freeplane.progress.createInitialMode = Tryb inicjacji...
+Freeplane.progress.endStartup = Uruchamianie...
+Freeplane.progress.gettingPreferenceDirectories = Pobieranie katalogow ustawie\u00F1...
+Freeplane.progress.gettingPreferences = Pobieranie ustawie\u00F1...
+Freeplane.progress.loadMaps = Wczytywanie map...
+Freeplane.progress.propagateLookAndFeel = Ustawianie Look And Feel...
+Freeplane.progress.settingPreferences = Wczytywanie ustawie\u00F1...
+Freeplane.progress.startCreateController = Start kontrolera...
+Freeplane.progress.updateLookAndFeel = Aktualizowanie Look And Feel...
+freeplane_reverted = Freeplane_odtworzona_
+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...
+GrabKeyDialog.common.cancel = Anuluj
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Przypisany do
+GrabKeyDialog.grab-key.assigned-to.none = Obecnie nie przypisany
+GrabKeyDialog.grab-key.clear = Wyczy\u015B\u0107
+GrabKeyDialog.grab-key.remove = Usu\u0144
+GrabKeyDialog.grab-key.remove-ask = Czy na pewno chcesz usun\u0105\u0107 ten skr\u00F3t klawiszowy?
+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>
+HideAllAttributesAction.text = Ukryj wszystkie atrybuty
+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
+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
+html_export_no_folding = Eksport HTML - bez zwijania
+html_problem = <html>Nie mog\u0119 przetworzy\u0107 kodu HTML<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Dodawanie
+icon_attach = Za\u0142\u0105cznik
+icon_back = Wstecz
+icon_bee = Freeplane
+icon_bell = Pami\u0119taj
+icon_bookmark = Wspania\u0142e
+icon_broken-line = Przerwane
+icon_button_cancel = \u0179le
+icon_button_ok = OK
+icon_calendar = Data
+icon_checked = Zaznaczone
+icon_clanbomber = Niebezpieczne
+icon_clock = Czas
+icon_clock2 = Przypomnienie
+icon_closed = Zakaz wej\u015bcia
+icon_decrypted = Odbezpieczone
+icon_desktop_new = Nie zapomnij
+icon_division = Dzielenie
+icon_down = D\u00F3\u0142
+icon_edit = Poprawka
+icon_encrypted = Zabezpieczone
+icon_family = Rodzina
+icon_fema = Kobiety
+icon_female1 = Kobieta1
+icon_female2 = Kobieta2
+icon_females = Kobiety
+icon_flag = Flaga
+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_folder = Katalog
+icon_forward = Dalej
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Priorytet 0
+icon_full-1 = Priorytet 1
+icon_full-2 = Priorytet 2
+icon_full-3 = Priorytet 3
+icon_full-4 = Priorytet 4
+icon_full-5 = Priorytet 5
+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_gohome = Dom
+icon_group = Grupa
+icon_help = Pytanie
+icon_hourglass = Oczekuj\u0105cy
+icon_icon_not_found = Ikona nie znaleziona
+icon_idea = Pomys\u0142
+icon_info = Informacja
+icon_kaddressbook = Telefon
+icon_kmail = E-Mail
+icon_knotify = Muzyka
+icon_korn = Skrzynka pocztowa
+icon_ksmiletris = Szcz\u0119\u015Bliwy
+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_menu = Ikony
+icon_messagebox_warning = Uwaga!
+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_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-sign = Stop
+icon_subtraction = Odejmowanie
+icon_unchecked = Niezaznaczone
+icon_up = G\u00F3ra
+icon_user_icon = Ikony u\u017cytkownika
+icon_very_negative = Bardzo negatywne
+icon_very_positive = Bardzo pozytywne
+icon_wizard = Magiczny
+icon_xmag = Do przemy\u015Blenia
+icon_yes = Uwaga!
+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.nature.text = Natura
+IconGroupPopupAction.numbers.text = Priorytety
+IconGroupPopupAction.office.text = Biuro
+IconGroupPopupAction.people.text = Ludzie
+IconGroupPopupAction.rating.text = Ocena
+IconGroupPopupAction.signs.text = Znaki
+IconGroupPopupAction.smiley.text = Emotikony
+IconGroupPopupAction.time.text = Czas
+IconGroupPopupAction.user.text = Ikony u\u017cytkownika
+IconProgressExtended10Action.text = Znacznik post\u0119pu +10%
+IconProgressExtended25Action.text = Znacznik postepu +25%
+IconProgressIconDownAction.text = Ikona post\u0119pu: dalej
+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
+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.
+ImportAction.text = Importuj
+ImportBranchAction.text = Mindmapy jako nowej ga\u0142\u0119zi...
+ImportExplorerFavoritesAction.text = Ulubionych z Internet Explorer...
+ImportFolderStructureAction.text = Struktury katalog\u00F3w...
+ImportLinkedBranchAction.text = Odno\u015Bnika z zaznaczonego w\u0119z\u0142a...
+ImportLinkedBranchWithoutRootAction.text = Odno\u015Bnika z zaznaczonego w\u0119z\u0142a (bez korzenia)...
+ImportMindmanagerFiles.text = Mindmapa programu MindManager X5...
+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_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...
+less_than_two_selected_nodes = Wybierz co najmniej dwa w\u0119z\u0142y, aby utworzy\u0107 po\u0142\u0105czenie.
+license = Licencja
+license_text = Freeplane - Program do tworzenia i przegl\u0105dania map pami\u0119ci
+LicenseAction.text = Licencja
+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}.
+load = Wczytywanie
+LoadAcceleratorPresetsAction.textPatterns.text = Wzorce tekstowe
+locking_failed_by_open = Zablokowanie mindmapy {0} niemo\u017Cliwe. Otwieram tylko do odczytu.
+locking_failed_by_save_as = Zablokowanie mindmapy {0} niemo\u017Cliwe. Polecenie "Zapisz jako..." anulowane.
+locking_old_lock_removed = Mindmapa {0} by\u0142a zablokowana przez u\u017Cytkownika {1}. Blokada zosta\u0142a usuni\u0119ta, bo jest zbyt stara.
+long_node_changed_cancel = W\u0119ze\u0142 zosta\u0142 zmieniony. Porzuci\u0107 zmiany?
+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}.
+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.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}.
+ManageAddOnsDialog.configure = Konfiguruj
+ManageAddOnsDialog.deactivate = Wy\u0142\u0105cz
+ManageAddOnsDialog.deactivation.success = {0} b\u0119dzie wy\u0142\u0105czony po ponowym uruchomieniu programu.
+ManageAddOnsDialog.deinstall = Odinstaluj
+ManageAddOnsDialog.deinstallation.success = {0} b\u0119dzie odinstalowany po ponownym uruchomieniu programu.
+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.map.not.opened = Mapa {0} nie jest otwarta.
+ManageAddOnsDialog.really.deinstall = Czy na pewno odinstalowa\u0107 {0}?
+ManageAddOnsDialog.search = Przeszukuj dodatki
+ManageAddOnsDialog.search.file = Szukaj
+ManageAddOnsDialog.select.tooltip = Zaznacz plik
+ManageAddOnsDialog.status.downloading = Pobieranie pliku...
+ManageAddOnsDialog.status.installing = Instalowanie dodatku...
+ManageAddOnsDialog.status.success = {0} poprawnie zainstalowany.
+ManageAddOnsDialog.tab.install = Szukaj i zainstaluj
+ManageAddOnsDialog.tab.install.tooltip = Szukaj i instaluj nowe dodatki
+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...
+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?
+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
+menu_applyStyle = Zastosuj styl
+menu_attributes = Atrybuty
+menu_clouds = Chmurki
+menu_copy = Kopiuj
+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_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_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_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
+mindmaps = Mapy
+mindmaps_desc = Mindmapy (*.mm)
+mindmaps_filter_desc = Filtry (*.mmfilter)
+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_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.MindMap.text = Edytor mapy
+most_recent_files = Ostatnio otwierane
+MoveToRootAction.text = Przejd\u017A do korzenia
+NameConditionAction.text = Ustaw nazw\u0119
+NavigationNextMapAction.text = Nast\u0119pna mapa
+NavigationPreviousMapAction.text = Poprzednia mapa
+new = Nowa mapa
+new_map_from_user_templates.text = Nowa mapa z szablonu...
+new_mindmap = Nowa mindmapa
+new_node = Nowy w\u0119ze\u0142
+new_node_as_sibling_not_possible_for_the_root = Nie mo\u017Cna utworzy\u0107 w\u0119z\u0142a r\u00F3wnorz\u0119dnego z korzeniem.
+new_version_available = Dost\u0119pna nowa wersja ''{0}''
+NewChildAction.text = Nowy w\u0119ze\u0142 potomny
+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.question = Znaleziono nowsze wersje {0}!
+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
+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)
+no = Nie
+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.
+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_selector_message = Kliknij dwa razy aby zaznaczy\u0107 w\u0119ze\u0142
+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.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_link_error = Mindmapa musi zosta\u0107 zapisana przed wybraniem odno\u015Bnika do pliku.
+note_window_location = Po\u0142o\u017cenie okna notatnika
+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
+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
+OptionalDontShowMeAgainDialog.ok = Tak
+OptionalDontShowMeAgainDialog.rememberMyDescision = Zapami\u0119taj moj\u0105 decyzj\u0119
+OptionPanel.absolute = bezwzgl\u0119dny
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Formatowanie automatyczne
+OptionPanel.ADD_CHILD = Dodaj potomka
+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_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_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>
+OptionPanel.antialias_all = Antyaliasing wszystkiego
+OptionPanel.antialias_edges = Antyaliasing ga\u0142\u0119zi
+OptionPanel.antialias_none = brak
+OptionPanel.Appearance = Wygl\u0105d
+OptionPanel.ar = Arabski
+OptionPanel.ARC = \u0141uk
+OptionPanel.as_parent = Jak rodzic
+OptionPanel.ask = Pytaj
+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.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.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.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.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.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.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.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_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
+OptionPanel.default_browser_command_other_os.tooltip = <html> G\u0142\u00F3wnie odnosi si\u0119 do Linuxa</html>
+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.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.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.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.el = Grecki
+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
+OptionPanel.el__min_default_window_height = Minimalna wysoko\u015B\u0107 okna
+OptionPanel.el__min_default_window_width = Minimalna szeroko\u015B\u0107 okna
+OptionPanel.el__position_window_below_node = Umie\u015B\u0107 okno pod edytowanym w\u0119z\u0142em
+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_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_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_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.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.Files = Pliki
+OptionPanel.first = pierwsza
+OptionPanel.foldingsymbolwidth = \u015Arednica symbolu zwini\u0119tych w\u0119z\u0142\u00F3w
+OptionPanel.foldingsymbolwidth.tooltip = <html> \u015Arednica okr\u0119gu obok zwini\u0119tych w\u0119z\u0142\u00F3w</html>
+OptionPanel.fork = bez ramki
+OptionPanel.format_locale = Lokalizacja formatowania
+OptionPanel.format_locale.tooltip = Ustawienia lokalizacji dla formatowania i przetwarzania danych
+OptionPanel.formula_disable_caching = Wy\u0142\u0105cz cache'owanie wykonywania formu\u0142
+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.gtk = Gtk
+OptionPanel.hide_edge = ukryj kraw\u0119d\u017a
+OptionPanel.horizontal = poziomo
+OptionPanel.hr = Horwacki
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = jako esej
+OptionPanel.html_export_fold_all = Zwi\u0144 wszystko
+OptionPanel.html_export_fold_currently_folded = zwi\u0144 obecnie zwini\u0119te
+OptionPanel.html_export_folding = Zwijanie dokument\u00F3w HTML
+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.id = Indonezyjski
+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.Keystrokes = Klawiatura
+OptionPanel.ko = Korea\u0144ski
+OptionPanel.label_font_family = Rodzina czcionek
+OptionPanel.label_font_size = Rozmiar czcionki
+OptionPanel.language = J\u0119zyk
+OptionPanel.language.tooltip = <html> To jest j\u0119zyk, kt\u00F3ry powinien zosta\u0107 u\u017Cyty przez program. 'automatyczny' pr\u00F3buje za\u0142adowa\u0107 j\u0119zyk systemowy</html>
+OptionPanel.last = ostatnia
+OptionPanel.last_opened_list_length = D\u0142ugo\u015B\u0107 listy ostatnio otwieranych
+OptionPanel.layout_map_on_text_change = Aktualizuj uk\u0142ad mapy podczas edycji
+OptionPanel.layout_map_on_text_change.tooltip = Wy\u0142\u0105cz, aby program dzia\u0142a\u0142 p\u0142ynniej
+OptionPanel.linear = liniowy
+OptionPanel.links = Odno\u015Bnik
+OptionPanel.links.tooltip = <html> Tworzenie wzgl\u0119dnych lub bezwzgl\u0119dnych odno\u015Bnik\u00F3w</html>
+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.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_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.metal = Metal
+OptionPanel.min_node_width = Minimalna szeroko\u015b\u0107 w\u0119z\u0142a
+OptionPanel.motif = Motif
+OptionPanel.nb = Norweski Bokm\u00e5l
+OptionPanel.never_save_folding = nigdy
+OptionPanel.nl = Du\u0144ski, Flamandzki
+OptionPanel.nn = Norweski Nynorsk
+OptionPanel.nodebackgroundcolor = Kolor t\u0142a w\u0119z\u0142a...
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Kolor w\u0119z\u0142a
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+OptionPanel.nodefontbold = Pogrubienie czcionki
+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.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_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.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.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.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.patternname = Nazwa
+OptionPanel.patternname.tooltip = Unikatowa nazwa szablonu
+OptionPanel.pl = *Polski*
+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.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.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.revision_color = Kolor wersji
+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_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.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
+OptionPanel.selection_method_delayed = z op\u00F3\u017Anieniem
+OptionPanel.selection_method_direct = bezpo\u015Brednio
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Szablony
+OptionPanel.separator.anti_alias = Antyaliasing
+OptionPanel.separator.attributes = Atrybuty
+OptionPanel.separator.automatic_save = Automatyczne zapisywanie
+OptionPanel.separator.behaviour = Spos\u00F3b dzia\u0142ania
+OptionPanel.separator.browser = Domy\u015Blne polecenie przegl\u0105dania
+OptionPanel.separator.CloudControls = Chmurki
+OptionPanel.separator.commands_for_the_program = Polecenia programu
+OptionPanel.separator.connectors = Po\u0142\u0105czenia
+OptionPanel.separator.data_formats = Formatowanie i przetwarzanie danych
+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.editing = Ustawienia edytora
+OptionPanel.separator.files = Pliki
+OptionPanel.separator.formula = Formu\u0142y
+OptionPanel.separator.General = Og\u00F3lne
+OptionPanel.separator.html_export = Eksport HTML
+OptionPanel.separator.html_import = Import Html
+OptionPanel.separator.hyperlink_types = Typ odno\u015Bnika
+OptionPanel.separator.icon_properties = Ikony
+OptionPanel.separator.icons = Ikony w "Wybierz ikon\u0119..."
+OptionPanel.separator.initial_map_size = Pocz\u0105tkowy rozmiar mapy
+OptionPanel.separator.inline_editor = Edytor in-line w\u0119z\u0142a
+OptionPanel.separator.key_typing = Klawiatura
+OptionPanel.separator.language = J\u0119zyk
+OptionPanel.separator.load = Wczytaj
+OptionPanel.separator.look_and_feel = Look and Feel
+OptionPanel.separator.mouse_wheel = K\u00F3\u0142ko myszy
+OptionPanel.separator.new_node_commands = Polecenia tworzenia nowych w\u0119z\u0142\u00F3w
+OptionPanel.separator.node_editing_commands = Polecenia edycji w\u0119z\u0142\u00F3w
+OptionPanel.separator.node_navigation_commands = Polecenia nawigacyjne
+OptionPanel.separator.NodeColors = Kolory w\u0119z\u0142a
+OptionPanel.separator.NodeFont = Czcionka w\u0119z\u0142a
+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.other_defaults = Inne ustawienia domy\u015Blne
+OptionPanel.separator.others = Inne skr\u00F3ty klawiszowe
+OptionPanel.separator.outline_view = Widok konspektu
+OptionPanel.separator.patterns = Szablony
+OptionPanel.separator.root_node_appearance = Wygl\u0105d w\u0119z\u0142a korzenia (Root)
+OptionPanel.separator.save = Zapisz ustawienia
+OptionPanel.separator.scripting = Skrypty
+OptionPanel.separator.scrollbar = Pasek przewijania
+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.spelling = Opcje sprawdzania pisowni
+OptionPanel.separator.status = Wiersz statusu
+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.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.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.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_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.sr = Serbski
+OptionPanel.standard_template = Standardowy szablon
+OptionPanel.standardbackgroundcolor = Kolor t\u0142a
+OptionPanel.standardbackgroundcolor.tooltip = <html> Domy\u015Blny kolor t\u0142a (zapis HTML - #RRGGBB z warto\u015Bciami szestnastkowymi)</html>
+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.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>
+OptionPanel.standardlinkestyle = Styl po\u0142\u0105czenia
+OptionPanel.standardlinkestyle.tooltip = <html> Domy\u015Blny styl po\u0142\u0105czenia. Obecnie tylko "Krzywa B\u00E9ziera" jest obs\u0142ugiwana</html>
+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.STAR = Gwiazda
+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.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.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.uk_UA = Ukrai\u0144ski
+OptionPanel.undefined_font = Niezdefiniowana czcionka
+OptionPanel.undo_levels = Ilo\u015B\u0107 zapami\u0119tanych operacji
+OptionPanel.undo_levels.tooltip = <html> Opisuje ile ostatnich operacji mo\u017Ce zosta\u0107 cofni\u0119tych</html>
+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.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.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.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.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.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?
+PageAction.text = Ustawienia strony...
+password_is_not_ascii = Has\u0142o nie jest ASCII
+PasteAction.text = Wklej
+PasteAttributes.text = Wklej atrybuty
+PatternNewNameProperty = Nowy szablon
+PatternToString.backgroundColor = Kolor t\u0142a
+PatternToString.Child = Styl w\u0119z\u0142a potomnego
+PatternToString.color = Kolor
+PatternToString.EdgeColor = Kolor ga\u0142\u0119zi
+PatternToString.EdgeStyle = Styl ga\u0142\u0119zi
+PatternToString.EdgeWidth = Szeroko\u015B\u0107 ga\u0142\u0119zi
+PatternToString.FontBold = Pogrubienie
+PatternToString.FontItalic = Kursywa
+PatternToString.FontName = Nazwa czcionki
+PatternToString.Icon = Ikona
+PatternToString.NodeFontSize = Rozmiar czcionki
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = dni
+PeriodUnit.HOUR = godzin
+PeriodUnit.MINUTE = minut
+PeriodUnit.MONTH = miesi\u0119cy
+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/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.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/TimeList.xml_Created = Utworzony
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = Ikony
+plugins/TimeList.xml_Modified = Zmieniony
+plugins/TimeList.xml_Notes = Notatki
+plugins/TimeList.xml_Text = Tekst
+plugins/TimeManagement.xml_appendButton = Dodaj dat\u0119 do wybranych w\u0119z\u0142\u00F3w
+plugins/TimeManagement.xml_Cancel = Anuluj
+plugins/TimeManagement.xml_cancelButton = Anuluj
+plugins/TimeManagement.xml_closeButton = Zamknij
+plugins/TimeManagement.xml_Export = Eksportuj zaznaczone w\u0119z\u0142y
+plugins/TimeManagement.xml_Find = Znajd\u017A
+plugins/TimeManagement.xml_Goto = Id\u017A do
+plugins/TimeManagement.xml_hour = Godzina:
+plugins/TimeManagement.xml_menu_actions = Akcje
+plugins/TimeManagement.xml_minute = Minuta:
+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_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
+plugins/TimeManagement.xml_Replace_All = Zamie\u0144 wszystko
+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
+preferences = Preferencje...
+print_preview_title = Podgl\u0105d wydruku
+PrintAction.text = Drukuj...
+PrintDirectAction.text = Drukuj
+printing_settings = Ustawienia drukowania
+PrintPreviewAction.text = Podgl\u0105d wydruku...
+PropertyAction.dialog = Preferencje
+PropertyAction.text = Preferencje...
+QuickFilterAction.text = Szybki filtr
+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
+QuitAction.text = Zako\u0144cz
+read_only = Tylko do odczytu
+ReadScriptError.text = B\u0142\u0105d podczas czytania skryptu
+really_convert_to_current_version = <html>Ta mapa zosta\u0142a utworzona w starszej wersji Freeplane. <br>Czy powinna zosta\u0107 skonwertowana (zalecane)? <br>(W przeciwnym przypadku nie ma gwarancji poprawnego dzia\u0142ania.) </html>
+really_cut_node = Wyci\u0105\u0107 w\u0119ze\u0142 (w\u0119z\u0142y)?
+really_execute_script = Czy wykona\u0107 skrypty zawarte w tej mapie? Skrypty mog\u0105 by\u0107 niebezpieczne dla Twojego komputera.
+really_remove_node = Usun\u0105\u0107 w\u0119ze\u0142 (w\u0119z\u0142y)?
+really_remove_notes = Usun\u0105\u0107 notatk\u0119 (notatki)?
+ReapplyFilterAction.text = Zastosuj ponownie
+red = Czerwony
+RedefineStyleAction.text = Przedefiniuj styl
+RedoAction.text = Powt\u00F3rz
+RedoFilterAction.text = Powt\u00F3rz
+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?
+RemoveAllIconsAction.text = Usu\u0144 wszystkie ikony
+RemoveConnectorAction.text = Usu\u0144 po\u0142\u0105czenie
+RemoveEncryption.text = Usu\u0144 has\u0142o
+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>
+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?
+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
+RequestFeatureAction.text = Zaproponuj now\u0105 funkcj\u0119
+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
+save_failed = Zapisywanie mapy {0} nie powiod\u0142o si\u0119.
+save_unsaved = Zapisa\u0107 nast\u0119puj\u0105c\u0105 mindmap\u0119? :
+save_unsaved_styles = Zapisa\u0107 style?
+SaveAcceleratorPresetsAction.text = Zapisz zestaw skr\u00f3t\u00f3w klawiszowych
+SaveAction.text = Zapisz
+SaveAll.text = Zapisz wszystko
+SaveAll.tooltip = Zapisz wszystkie otwarte mapy.
+SaveAsAction.text = Zapisz jako...
+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)
+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_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_folder_for_importing = Wska\u017C katalog do zaimportowania
+select_icon = Wybierz ikon\u0119
+select_menu_item_dialog = Wybierz pozycj\u0119 z menu
+select_menu_item_root_node = Menu
+SelectAllAction.text = Zaznacz wszystkie widoczne w\u0119z\u0142y
+SelectBranchAction.text = Zaznacz potomk\u00F3w wybranego w\u0119z\u0142a
+SelectedPasteAction.text = Wklej jako...
+selection_method_by_click = Zaznaczanie przez pojedyncze klikni\u0119cie
+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
+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
+SetNoteWindowPosition.left.text = Lewo
+SetNoteWindowPosition.right.text = Prawo
+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
+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.
+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
+simplyhtml.aboutFrameTitle = O programie
+simplyhtml.aboutLabel = O SimplyHTML...
+simplyhtml.alignCenter = do \u015Brodka
+simplyhtml.alignLabel = Wyr\u00F3wnanie:
+simplyhtml.alignLeft = do lewej
+simplyhtml.alignRight = do prawej
+simplyhtml.allCellsRangeLabel = wszystkich kom\u00F3rek
+simplyhtml.allOccurrencesReplaced = Zamieniono wszystkie wyst\u0105pienia
+simplyhtml.appendTableColLabel = Dodaj kolumn\u0119
+simplyhtml.appendTableRowLabel = Dodaj wiersz
+simplyhtml.applyCellAttrLabel = Zastosuj do
+simplyhtml.backgroundLabel = T\u0142o:
+simplyhtml.boldItalicName = wyt\u0142uszczony+kursywa
+simplyhtml.boldName = wyt\u0142uszczony
+simplyhtml.borderColorLabel = Kolor ramki:
+simplyhtml.borderWidthLabel = Szeroko\u015B\u0107 ramki:
+simplyhtml.bottomLabel = na dole:
+simplyhtml.cancelBtnName = Anuluj
+simplyhtml.cellBorderTabLabel = Obramowanie
+simplyhtml.cellGenTabLabel = Og\u00F3lne
+simplyhtml.cellMarginTabLabel = Margines kom\u00F3rki
+simplyhtml.cellPanelTitle = Format kom\u00F3rki
+simplyhtml.clearFormatLabel = Usu\u0144 formatowanie
+simplyhtml.clearFormatTip = Usu\u0144 formatowanie
+simplyhtml.close = Zamknij
+simplyhtml.closeBtnName = Zamknij
+simplyhtml.colorLabel = Kolor
+simplyhtml.copyLabel = Kopiuj
+simplyhtml.copyTip = kopiuj do schowka
+simplyhtml.cTagNameHead1 = Nag\u0142\u00F3wek 1
+simplyhtml.cTagNameHead2 = Nag\u0142\u00F3wek 2
+simplyhtml.cTagNameHead3 = Nag\u0142\u00F3wek 3
+simplyhtml.cTagNameHead4 = Nag\u0142\u00F3wek 4
+simplyhtml.cTagNameHead5 = Nag\u0142\u00F3wek 5
+simplyhtml.cTagNameHead6 = Nag\u0142\u00F3wek 6
+simplyhtml.cTagNameLink = Hiper\u0142\u0105cze
+simplyhtml.cTagNameOL = Lista numerowana
+simplyhtml.cTagNamePara = Akapit
+simplyhtml.cTagNameUL = Lista wypunktowana
+simplyhtml.cutLabel = Wytnij
+simplyhtml.cutTip = wytnij do schowka
+simplyhtml.defaultDocName = Bez tytu\u0142u
+simplyhtml.deleteTableColLabel = Skasuj kolumn\u0119
+simplyhtml.deleteTableRowLabel = Skasuj wiersz
+simplyhtml.docTitleQuery = Ustaw tytu\u0142 na:
+simplyhtml.docTitleTitle = Edycja tytu\u0142u dokumentu
+simplyhtml.editLabel = Edytuj
+simplyhtml.effectLabel = Efekt
+simplyhtml.familyLabel = Rodzina
+simplyhtml.findNext = Znajd\u017A nast\u0119pne...
+simplyhtml.findReplaceDialogTitle = Znajd\u017A i zamie\u0144
+simplyhtml.findReplaceLabel = Znajd\u017A i zamie\u0144
+simplyhtml.findReplaceTip = znajd\u017A i zast\u0105p fragment tekstu
+simplyhtml.fontBoldLabel = Pogrubienie
+simplyhtml.fontBoldTip = w\u0142\u0105cz/wy\u0142\u0105cz wyt\u0142uszczenie
+simplyhtml.fontColorLabel = Kolor tekstu
+simplyhtml.fontColorTip = Kolor tekstu
+simplyhtml.fontDialogTitle = Formatuj czcionk\u0119
+simplyhtml.fontItalicLabel = Pochylenie
+simplyhtml.fontItalicTip = w\u0142\u0105cz/wy\u0142\u0105cz kursyw\u0119
+simplyhtml.fontLabel = Czcionka...
+simplyhtml.fontTabLabel = Czcionka
+simplyhtml.fontTip = Formatuj czcionk\u0119...
+simplyhtml.fontUnderlineLabel = Podkre\u015Blenie
+simplyhtml.fontUnderlineTip = w\u0142\u0105cz/wy\u0142\u0105cz podkre\u015Blenie
+simplyhtml.foregroundLabel = Tekst:
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = zmiana formatu listy
+simplyhtml.formatParaLabel = Akapit...
+simplyhtml.formatParaTip = Zmiana format akapitu
+simplyhtml.formatTableLabel = Tabela...
+simplyhtml.formatTableTip = formatuj tabel\u0119
+simplyhtml.helpLabel = Pomoc
+simplyhtml.htmlTabTitle = Kod HTML
+simplyhtml.imageFileDesc = Pliki z obrazkami
+simplyhtml.insertTableColLabel = Wstaw kolumn\u0119
+simplyhtml.insertTableLabel = Tabela...
+simplyhtml.insertTableMsg = Ile kolumn?
+simplyhtml.insertTableRowLabel = Wstaw wiersz
+simplyhtml.insertTableTitle = Wstaw tabel\u0119
+simplyhtml.italicName = kursywa
+simplyhtml.layoutTabTitle = Podgl\u0105d
+simplyhtml.leftLabel = po lewej:
+simplyhtml.listDialogTitle = Format listy
+simplyhtml.listIndentTitle = Wysuni\u0119cie:
+simplyhtml.listPosInside = wewn\u0105trz
+simplyhtml.listPositionLabel = Pozycja:
+simplyhtml.listPosOutside = na zewn\u0105trz
+simplyhtml.listTypeCircle = okr\u0105g\u0142e wypunktowanie
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = wypunktowanie symbolem pliku
+simplyhtml.listTypeLabel = Typ:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = brak
+simplyhtml.listTypeSquare = kwadratowe wypunktowanie
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Zewn\u0119trzny
+simplyhtml.matchCase = Rozr\u00F3\u017Cniaj du\u017Ce/ma\u0142e litery
+simplyhtml.newStyleDefaultName = nowy styl
+simplyhtml.nextTableCellLabel = Nast\u0119pna kom\u00F3rka
+simplyhtml.noLineLabel = brak
+simplyhtml.noMoreOccurrencesFound = nie ma (wi\u0119cej) wyst\u0105pie\u0144
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Wewn\u0119trzny
+simplyhtml.paraAlignCenterLabel = Do \u015Brodka
+simplyhtml.paraAlignCenterTip = Wyr\u00F3wnaj akapit do \u015Brodka
+simplyhtml.paraAlignLeftLabel = Do lewej
+simplyhtml.paraAlignLeftTip = Wyr\u00F3wnaj akapit do lewej
+simplyhtml.paraAlignRightLabel = Do prawej
+simplyhtml.paraAlignRightTip = Wyr\u00F3wnaj akapit do prawej
+simplyhtml.paraStyleDialogTitle = Styl akapitu
+simplyhtml.paraTabLabel = Akapit
+simplyhtml.pasteLabel = Wklej
+simplyhtml.pasteTip = wklej ze schowka
+simplyhtml.plainName = zwyk\u0142y
+simplyhtml.previewLabel = Podgl\u0105d
+simplyhtml.previewText = Tekst pogl\u0105du
+simplyhtml.prevTableCellLabel = Poprzednia kom\u00F3rka
+simplyhtml.printLabel = Drukuj...
+simplyhtml.redoLabel = Powt\u00F3rz
+simplyhtml.redoTip = powt\u00F3rz
+simplyhtml.replace = Zamie\u0144...
+simplyhtml.replaceAll = Wszystkie
+simplyhtml.replaceDone = Wykonane
+simplyhtml.replaceNo = Nie
+simplyhtml.replaceThisQuery = zamieni\u0107 to wyst\u0105pienie
+simplyhtml.replaceWith = Zast\u0105p przez:
+simplyhtml.replaceYes = Tak
+simplyhtml.rightLabel = po prawej:
+simplyhtml.searchDown = Szukaj w prz\u00F3d
+simplyhtml.searchFromStart = Szukaj od pocz\u0105tku
+simplyhtml.searchUp = Szukaj wstecz
+simplyhtml.selectAllLabel = Wybierz wszystko
+simplyhtml.sizeLabel = Rozmiar
+simplyhtml.standardStyleName = standardowy
+simplyhtml.strikeLabel = Przekre\u015Blenie
+simplyhtml.styleLabel = Styl
+simplyhtml.styleNameInputText = Nazwa nowego stylu?
+simplyhtml.styleNameInputTitle = Zapisz styl
+simplyhtml.tableBgColLabel = Kolor t\u0142a:
+simplyhtml.tableDialogTitle = Formatuj tabel\u0119
+simplyhtml.tableLabel = Tabela
+simplyhtml.tablePanelTitle = Format tabeli
+simplyhtml.tableWidthLabel = Szeroko\u015B\u0107:
+simplyhtml.textIndentLabel = Wysuni\u0119cie:
+simplyhtml.textToFind = Tekst do odnalezienia:
+simplyhtml.thisCellRangeLabel = tej kom\u00F3rki
+simplyhtml.thisColRangeLabel = tej kolumny
+simplyhtml.thisRowRangeLabel = tego wiersza
+simplyhtml.toggleBulletsLabel = W\u0142\u0105cz/wy\u0142\u0105cz wypunktowanie
+simplyhtml.toggleBulletsTip = w\u0142\u0105cz/wy\u0142\u0105cz wypunktowanie
+simplyhtml.toggleNumbersLabel = W\u0142\u0105cz/wy\u0142\u0105cz numerowanie
+simplyhtml.toggleNumbersTip = w\u0142\u0105cz/wy\u0142\u0105cz numerowanie
+simplyhtml.topLabel = u g\u00F3ry:
+simplyhtml.uLineLabel = Podkre\u015Blenie
+simplyhtml.unableToOpenFileError = Nie uda\u0142o sie otworzy\u0107 pliku
+simplyhtml.unableToRedoError = Nie da si\u0119 powt\u00F3rzy\u0107:
+simplyhtml.unableToUndoError = Nie da si\u0119 wycofa\u0107:
+simplyhtml.undoLabel = Cofnij
+simplyhtml.undoTip = cofnij
+simplyhtml.valignBaseline = do linii
+simplyhtml.valignBottom = do do\u0142u
+simplyhtml.valignLabel = Wyr\u00F3wnanie pionowe:
+simplyhtml.valignMiddle = do \u015Brodka
+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
+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
+style = Styl
+style_already_exists = Styl ju\u017c istnieje.
+styledialog.cancel.text = Anuluj
+styledialog.ok.text = OK
+styles = Style
+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.key = Klucz
+styles.list = Lista
+styles.needs_action = Wymaga dzia\u0142ania
+styles.note = Notatka
+styles.ok = OK
+styles.pending = Zawieszony
+styles.predefined = Style predefiniowane
+styles.question = Pytanie
+styles.quotation = Cytat
+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.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.
+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.)
+svg = SVG
+template_dir = Szablony standardowe
+TimeListAction.text = Poka\u017C zaplanowane zadania...
+TimeListAction.tooltip = <html> Wy\u015Bwietla wszystkie zaplanowane zadania wraz z odpowiednimi w\u0119z\u0142ami</html>
+TimeManagementAction.text = Poka\u017C kalendarz...
+TimeManagementAction.tooltip = <html> Pokazuje modu\u0142 kalendarza autorstwa Kai Toedter</html>
+ToggleChildrenFoldedAction.text = Zwi\u0144/rozwi\u0144 w\u0119z\u0142y potomne
+ToggleDetailsAction.text = Ukryj detale
+ToggleFBarAction.text = Pasek klawiszy funkcyjnych (F-Bar)
+ToggleFoldedAction.text = Zwi\u0144/rozwi\u0144 w\u0119ze\u0142
+ToggleFullScreenAction.text = Tryb pe\u0142noekranowy
+ToggleLeftToolbarAction.text = Pasek ikon
+ToggleMenubarAction.text = W\u0142\u0105cz/wy\u0142\u0105cz menu
+ToggleStatusAction.text = Wiersz statusu
+ToggleToolbarAction.text = Pasek narz\u0119dzi
+undefined_error = Nieoczekiwany b\u0142\u0105d. Prosz\u0119 prze\u015Blij o nim wiadomo\u015B\u0107.
+underline = Podkre\u015Blenie
+UnderlineAction.text = Podkre\u015blenie
+underlined = Podkre\u015Blony
+UndoAction.text = Cofnij
+UndoFilterAction.text = Cofnij
+unfold = Rozwi\u0144
+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
+update_failed = Aktualizacja nie powiod\u0142a si\u0119 z komunikatem {0}
+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.
+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_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_zoom = Powi\u0119kszenie wydruku (0.0 - 2.0):
+version_up_to_date = Ju\u017c u\u017cywasz najnowszej wersji programu
+ViewerControllerAction.text = Obiekt zewn\u0119trzny...
+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}
+xslt_export.html = Dokument HTML
+xslt_export.latex = Dokument 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
+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
new file mode 100644
index 0000000..b0c485c
--- /dev/null
+++ b/freeplane/resources/translations/Resources_pt_BR.properties
@@ -0,0 +1,924 @@
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Muda a formata\u00E7\u00E3o dos n\u00F3s
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Altera padr\u00E3o
+accessories/plugins/EncryptNode.properties_0 = Escolha uma senha para o n\u00F3 criptografado
+accessories/plugins/EncryptNode.properties_1 = Senhas s\u00E3o diferentes ou muito curtas.
+accessories/plugins/EncryptNode.properties_2 = Digite a senha:
+accessories/plugins/EncryptNode.properties_3 = Redigite a senha:
+accessories/plugins/EncryptNode.properties_4 = Digite a sua senha.
+accessories/plugins/EncryptNode.properties_5 = <html>Lembre-se que a qualidade da criptografia<br> depende quase completamente da qualidade da sua senha</br>.</html>
+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 um n\u00F3 criptografado. 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_wrong_password = A senha est\u00E1 incorreta.
+accessories/plugins/ExportWithTWiki.text = Como TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Exporta o mapa como um documento TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Este \u00E9 um m\u00E9todo uniforme de exportar utilizando scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Como um applet Java...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporta o mapa como um applet Java
+accessories/plugins/ExportWithXSLT_Flash.text = Como Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporta o mapa como uma aplica\u00E7\u00E3o em Flash.
+accessories/plugins/ExportWithXSLT_HTML.text = Como XHTML (vers\u00E3o JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Como XHTML (Vers\u00E3o com uma imagem clic\u00E1vel)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Recursos do n\u00F3 RESOURCES para um arquivo do TaskJuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exporta recursos do n\u00F3 RESOURCES para o m\u00F3dulo do TaskJuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tarefas do n\u00F3 TASKS para um arquivo do TaskJuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exporta tarefas do n\u00F3 TASKS para o m\u00F3dulo TaskJuggler. </html>
+add = Adicionar
+AddLocalLinkAction.text = Adiciona um link local
+antialias_all = Suaviza tudo
+antialias_edges = Suaviza bordas
+antialias_none = Sem suaviza\u00E7\u00E3o
+apply = Aplicar
+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 pode ser alterado ao mesmo tempo.
+ApplyNoFilteringAction.text = Sem filtragem
+as_parent = Como o pai
+AssignAttributesAction.text = Atribuir atributos...
+attribute_delete = Apaga todos os valores
+attribute_delete_value = Apaga este valar
+attribute_font_size_tooltip = Tamanho de fonte do atributo
+attribute_list_box_label_text = Valores existentes
+attribute_replace = Substituir por
+attribute_top = Todos os atributos conhecidos para os n\u00F3s selecionados
+attributes_adding_empty_attribute_error = N\u00E3o posso usar vazio como nome de um atributo
+attributes_all = Todos os atributos
+attributes_attribute = Atributos
+attributes_close = Fechar
+attributes_deselect_all = Nenhum
+attributes_dialog_title = Gerenciador de Atributos
+attributes_edit = Editar
+attributes_edit_tooltip = Editar conjunto
+attributes_for_selected = N\u00F3s selecionados
+attributes_for_visible = Todos os n\u00F3s vis\u00EDveis
+attributes_import = Importar
+attributes_import_tooltip = Importar atributos de outros mapas abertos
+attributes_no_import_candidates_found = Nenhum atributo novo encontrado
+attributes_popup_delete = Deletar
+attributes_popup_down = Abaixo
+attributes_popup_edit = Editar
+attributes_popup_hide = Esconder
+attributes_popup_new = Novo atributo
+attributes_popup_optimal_width = Largura \u00F3tima
+attributes_popup_up = Acima
+attributes_refresh = Redesenhar
+attributes_restricted_attributes_tooltip = Restrinje conjunto de atributos
+attributes_restricted_values_tooltip = Restrinje conjunto de valores para o atributo atual
+attributes_restriction = Conjunto restrito
+attributes_select_all = Todos
+attributes_select_all_tooltip = Seleciona / Desceleciona tudo
+attributes_show = Mostrar
+attributes_skip_root = Exclui n\u00F3 raiz
+attributes_visible = Selecionar vis\u00EDveis
+attributes_visible_tooltip = Selecionar vis\u00EDveis
+automatically_save_message = Mapa foi salvo automaticamente (no arquivo {0}) ...
+AutomaticLayoutAction.text = Layout autom\u00E1tico
+AutomaticLayoutAction.tooltip = <html>Concerta o layout do mapa. <br>O primeiro n\u00EDvel \u00E9 preto, o segundo azul, etc</html>
+BackAction.text = Voltar
+BackAction.tooltip = Pula de volta para cadeia selecionada
+background = Fundo
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = N\u00F3 piscante
+BlinkingNodeHookAction.tooltip = <html>Isto torna o n\u00F3 piscante. Mas seja cuidadoso. N\u00E3o aplique isto a muitos n\u00F3s, e <strong>n\u00E3o com outras formata\u00E7\u00F5es autom\u00E1ticas ao mesmo n\u00F3</strong></html>
+BoldAction.text = Negrito
+boldify_branch = Galho em negrito
+branch = Galho
+cancel = Cancelar
+CancelAction.text = Cancelar
+cannot_add_parent_diff_parents = Todos os n\u00F3s precisam ter o mesmo pai para usar esta fun\u00E7\u00E3o.
+cannot_add_parent_to_root = O n\u00F3 raiz n\u00E3o pode ser adicionado a um pai.
+cannot_join_nodes_with_children = N\u00E3o pode unir n\u00F3 com seus filhos
+cannot_move_to_child = N\u00E3o posso mover o n\u00F3 para um de seus filhos.
+CenterAction.text = Centralizar
+ChangeConnectorArrowsAction.backward.text = Voltar
+ChangeNodeLevelLeftsAction.text = Node left
+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 = Escolha a cor de fundo:
+choose_cloud_color = Escolha a cor da nuvem:
+choose_edge_color = Escolha a cor da borda
+choose_node_background_color = Escolha a cor de fundo do n\u00F3:
+choose_node_color = Escolha a cor do n\u00F3:
+CloseAction.text = Fechar
+CloudAction.text = Nuvem
+CloudColorAction.text = Cor da nuvem...
+ColorProperty.ResetColor = Redefinir cor
+combined = Combinedo
+confirmation = Confirma??o
+CopyAction.text = Copiar
+CopyIDAction.text = Copy Node ID[translate me]
+CopySingleAction.text = Copiar Simples
+CreationModificationPluginAction.text = Mostra as datas de modifica\u00E7\u00E3o
+CreationModificationPluginAction.tooltip = <html>Esta fun\u00E7\u00E3o controla os tempos de cria\u00E7\u00E3o e modifica\u00E7\u00E3o dos n\u00F3s.</html>
+CutAction.text = Recortar
+decrease_branch_font_size = Fonte Menor
+DecreaseNodeFontAction.text = Fonte Menor
+delete = Deletar
+delete_child = Apagar n\u00F3
+DeleteAction.text = Remover n\u00F3
+DeleteConditionAction.text = Deletar
+DocumentationAction.text = Documenta\u00E7\u00E3o
+edge = Borda
+edge_style = Estilo da borda
+edge_width = largura da borda
+EdgeColorAction.text = Cor da borda...
+EdgeStyleAction.bezier.text = curva Bezier
+EdgeStyleAction.horizontal.text = Horizontal[translate me]
+EdgeStyleAction.linear.text = Linear
+EdgeStyleAction.sharp_bezier.text = Sharp Bezier
+EdgeStyleAction.sharp_linear.text = Sharp Linear
+EdgeStyleAsParentAction.text = Como o pai
+EdgeWidthAction_width_parent.text = Igual ao pai
+EdgeWidthAction_width_thin.text = Fina
+edit = Editar
+edit.decision = Editor HTML
+edit.edit_rich_text = Deseja usar formata??o como negrito e italico?
+edit_link_manually = Editar link manualmente...
+edit_middle_label = Edit Middle Label[translate me]
+edit_source_label = Edit Source Label[translate me]
+edit_target_label = Edit Target Label[translate me]
+EditAction.text = Editar n\u00F3
+EditAttributesAction.text = Editar atributos
+EditFilterAction.text = Editar
+EditLongAction.text = Editar n\u00F3 longo...
+EncryptedMap.text = Criar mapa criptografado ...
+EncryptedMap.tooltip = Criar um novo mapa criptografado
+enter_base_url = Colar link relativo. Por favor informe a URL de base.
+enter_confirms = Enter Confirma
+EnterPassword.text = (Des)criptografa n\u00F3
+error = Erro
+error_applying_template = Erro aplicando template XSL.
+error_creating_directory = N\u00E3o foi poss\u00EDvel criar o diret\u00F3rio para exportar.
+ExecuteScripts.text = Scripts[translate me]
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Exportar
+ExportBranchToHTMLAction.text = Exportar galho para HTML
+ExportPdf.text = Como PDF...
+ExportSvg.text = Como SVG...
+ExportToHTMLAction.text = Como HTML
+ExportToImage.jpg.text = Como JPEG...
+ExportToImage.png.text = Como PNG...
+ExportToOoWriter.text = Como documento do Open Office Writer ...
+ExportToOoWriter.tooltip = N\u00F3s expandidos formam a estrutura, n\u00F3s contra\u00EDdos formam o conte\u00FAdo do documento.
+extension_menu = Estilo f\u00EDsico
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = FAQ
+file = Arquivo
+file_already_exists = O arquivo {0} j\u00E1 existe. Voc\u00EA quer apag\u00E1-lo?
+file_not_found = Arquivo {0} n\u00E3o encontrado
+filter = Filtro
+filter_add = Adicionar
+filter_and = E
+filter_conditions = Filtros
+filter_contains = Cont\u00E9m
+filter_delete = Deletar
+filter_dialog = Composi\u00E7\u00E3o de filtros
+filter_does_not_exist = N\u00E3o existe
+filter_edit_description = Editar lista de filtros
+filter_enter_value = Digite o valor
+filter_exist = Existe
+filter_icon = \u00CDcone
+filter_is_equal_to = \u00C9 igual a
+filter_is_not_equal_to = N\u00E3o \u00E9 igual a
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Sem filtragem
+filter_node = N\u00F3 de texto
+filter_not = N\u00E3o
+filter_or = Ou
+filter_select = Selecionar
+filter_selected_node_view = N\u00F3s selecionados no momento
+find_what = Procurar por
+FindAction.text = Procurar...
+fit_map_to_page = Justar para uma 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 = Enla\u00E7ar
+FoldAllAction.text = Contrai todos
+FoldAllAction.tooltip = <html>Contrai o n\u00F3 selecionado e todos os seus filhos.</html>
+FoldOneLevelAction.text = Contrai um n\u00EDvel
+FoldOneLevelAction.tooltip = <html>Contrai os n\u00F3s selecionados um n\u00EDvel.</html>
+FollowLinkAction.text = Follow Link[translate me]
+font = Fonte
+FontFamilyAction.text = fam\u00EDlia da fonte
+FontSizeAction.text = tamanho da fonte
+format_menu_edge_styles = Estilo da bordas
+format_menu_edge_widths = Largura da bordas
+FormatCopy.text = Copia a formata\u00E7\u00E3o
+FormatCopy.tooltip = <html>Copia a formata\u00E7\u00E3o de um n\u00F3.</html>
+FormatPaste.text = Cola formata\u00E7\u00E3o
+FormatPaste.tooltip = <html>Cola a formata\u00E7\u00E3o de um n\u00F3.</html>
+ForwardAction.tooltip = Pula para frente para cadeia selecionada
+Freeplane.progress.buildScreen = Construindo telas...
+Freeplane.progress.createController = Criando controlador...
+Freeplane.progress.createInitialMode = Criando modo inicial...
+Freeplane.progress.endStartup = Fim da inicializa\u00E7\u00E3o.
+Freeplane.progress.gettingPreferenceDirectories = Obtendo diret\u00F3rios de prefer\u00EAncias...
+Freeplane.progress.gettingPreferences = Obtendo prefer\u00EAncias...
+Freeplane.progress.loadMaps = Carregando mapas...
+Freeplane.progress.propagateLookAndFeel = Propagando Look And Feel...
+Freeplane.progress.settingPreferences = Definindo prefer\u00EAncias...
+Freeplane.progress.startCreateController = Inicializando controlador de cria\u00E7\u00E3o...
+Freeplane.progress.updateLookAndFeel = Atualizando Look And Feel...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = Ajuda...
+FreeplaneHelpStarter.tooltip = Ajuda ampliada do Freeplane
+GotoLinkNodeAction.text = Vai para o link
+GrabKeyDialog.common.cancel = Cancelar
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Atribu\u00EDdo para
+GrabKeyDialog.grab-key.assigned-to.none = Atualmente n\u00E3o atribu\u00EDdo
+GrabKeyDialog.grab-key.clear = Limpar
+GrabKeyDialog.grab-key.remove = Remove
+GrabKeyDialog.grab-key.remove-ask = Voc\u00EA est\u00E1 seguro que deseja remover esta tecla de atalho?
+GrabKeyDialog.grab-key.title = Digite nova tecla
+help = Ajuda
+HideAllAttributesAction.text = Esconder todos os atributos
+HierarchicalIconsAction.text = Mostra os \u00EDcones hierarquicamente
+HierarchicalIconsAction.tooltip = Se um dos meus filhos (netos) tem um \u00EDcone, eu mostrarei este \u00EDcone pequeno tamb\u00E9m.
+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
+html_export_no_folding = Exportar HTML - Sem enlace
+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]
+icon_attach = Veja aqui
+icon_back = Voltar
+icon_bee = Freeplane[translate me]
+icon_bell = Lembrar
+icon_bookmark = Excelente
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Cancelar
+icon_button_ok = OK
+icon_calendar = Data
+icon_clanbomber = Perigoso
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = N\u00E3o Esque\u00E7a
+icon_down = Abaixo
+icon_family = Fam\u00EDlia
+icon_female1 = Female1[translate me]
+icon_flag = Bandeira
+icon_flag-black = Black Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioridade 1
+icon_full-2 = Prioridade 2
+icon_full-3 = Prioridade 3
+icon_full-4 = Prioridade 4
+icon_full-5 = Prioridade 5
+icon_full-6 = Prioridade 6
+icon_full-7 = Prioridade 7
+icon_go = Green Traffic Light[translate me]
+icon_gohome = Casa
+icon_help = Pergunta
+icon_idea = Id\u00E9ia
+icon_info = Info[translate me]
+icon_kaddressbook = Telefone
+icon_kmail = E-Mail[translate me]
+icon_knotify = M\u00FAsica
+icon_korn = Caixa de correio
+icon_ksmiletris = Estou feliz
+icon_licq = Legal
+icon_Mail = Correio
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = \u00CDcones
+icon_messagebox_warning = Importante
+icon_password = Senha
+icon_pencil = Deve ser melhorado
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = N\u00E3o \u00E9 engra\u00E7ado
+icon_stop = Pare
+icon_up = Acima
+icon_wizard = M\u00E1gica
+icon_xmag = Para ser discutido
+icon_yes = Importante
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Selecionar \u00EDcone...
+IconSelectionPlugin.tooltip = <html>Aqui voc\u00EA pode selecionar um \u00EDcone usando uma janela.</html>
+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...
+ImportExplorerFavoritesAction.text = Favoritos IE...
+ImportFolderStructureAction.text = Estrutura de pastas...
+ImportLinkedBranchAction.text = Galhos referenciados
+ImportLinkedBranchWithoutRootAction.text = (Galhos referenciados) Sem ra\u00EDz...
+ImportMindmanagerFiles.text = MindManager X5 Map...
+increase_branch_font_size = Fonte maior
+IncreaseNodeFontAction.text = Fonte maior
+ItalicAction.text = It\u00E1lica
+italicise_branch = It\u00E1lico
+JoinNodesAction.text = Unir n\u00F3s
+less_than_two_selected_nodes = \u00C9 preciso selecionar ao menos dois n\u00F3s para estabelecer um link.
+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.
+locking_failed_by_open = Travamento do mapa {0} falhou. Abrindo somente para leitura.
+locking_failed_by_save_as = Travamento do mapa {0} falhou. A\u00E7\u00E3o de Salvar como abortada.
+locking_old_lock_removed = O Mapa {0} foi travado pelo usu\u00E1rio {1}. O travamento foi removido pois era antigo.
+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?
+map_already_exists = Esse mapa j\u00E1 existe. Voc\u00EA gostaria de sobrescrev\u00EA-lo?
+map_corrupted = Mapa corrompido. Ver detalhes?
+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.
+MapBackgroundColorAction.text = Map Background[translate me]
+menu_attributes = Atributos
+menu_extras = Ferramentas
+menu_file_import = Importar
+menu_format = Formatar
+menu_insert = Inserir
+menu_navigate = Navegar
+menu_view = Visualizar
+mindmap = Mapa
+mindmaps = Mapas
+mindmaps_desc = Mapas (*.mm)
+mode_Browse = Browse Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Modo n\u00E3o dispon\u00EDvel
+mode_status = Modo trocado para modo {0}
+mode_title = Freeplane - Modo {0}
+modes = Modos
+ModesMenuAction.Browse.text = Map Browser[translate me]
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Arquivos mais recentes
+MoveToRootAction.text = Mover para raiz
+NavigationNextMapAction.text = Pr\u00F3ximo mapa
+NavigationPreviousMapAction.text = Mapa anterior
+new_mindmap = Novo mapa da mente
+new_node = Novo n\u00F3
+new_node_as_sibling_not_possible_for_the_root = Novo n\u00F3 irm\u00E3o, n\u00E3o \u00E9 poss\u00EDvel para o n\u00F3 ra\u00EDz.
+NewChildAction.text = Novo n\u00F3 filho
+NewMapAction.text = Novo
+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
+no = N\u00E3o
+no_format_copy_before_format_paste = Voc\u00EA n\u00E3o pode colar uma formata\u00E7\u00E3o antes de ter copiado uma.
+no_found_from = <html>N\u00E3o foi encontrado <b>{0}</b> de <b>{1}</b>.
+no_more_found_from = <html>N\u00E3o foi encontrado mais nenhum <b>{0}</b> de <b>{1}</b>.
+no_previous_find = Sem busca anterior.
+node = N\u00F3
+node_changed_discard_changes = Voc\u00EA mudou o n\u00F3. Voc\u00EA quer descartar as mudan\u00E7as?
+node_location_help = Arrastar muda localizacao do n\u00F3, ctrl+arrastar muda distancia, duplo clique e ctrl+duplo clique reinicializam-os.
+NodeBackgroundColorAction.text = Cor de fundo do n\u00F3...
+NodeColorAction.text = Cor do n\u00F3...
+NodeColorBlendAction.text = Cor da mistura
+NodeDownAction.text = Descer o 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 = Subir o n\u00F3
+nonboldify_branch = Retirar o negrito
+nonitalicise_branch = Retirar o it\u00E1lico
+normal = Normal
+not_saved_for_link_error = O mapa precisa ser salvo antes que voc\u00EA possa setar uma refer\u00EAncia pelo seletor de arquivos
+ok = OK
+OKAction.text = OK
+OpenAction.text = Abrir...
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Para ver os efeitos das mudan\u00E7as de configura\u00E7\u00E3o o Freeplane provavelmente dever\u00E1 ser reiniciado.
+OptionalDontShowMeAgainDialog.cancel = &N?o
+OptionalDontShowMeAgainDialog.dontShowAgain = &Nao me pergunte novamente.
+OptionalDontShowMeAgainDialog.ok = &Sim
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Lembre minha decis?o.
+OptionPanel.absolute = Absoluto
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Faz o layout autom\u00E1tico dos padr\u00F5es
+OptionPanel.antialias = Suaviza\u00E7\u00E3o
+OptionPanel.antialias.tooltip = <html>Determina a qualidade visual do mapa. Mais suaviza\u00E7\u00E3o precisa de mais tempo.</html>
+OptionPanel.antialias_all = Suaviza tudo
+OptionPanel.antialias_edges = Suaviza bordas
+OptionPanel.antialias_none = Sem suaviza\u00E7\u00E3o
+OptionPanel.Appearance = Apar\u00EAncia
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Como o pai
+OptionPanel.ask = Perguntar
+OptionPanel.automatic = Autom\u00E1tico
+OptionPanel.automaticFormat_level = Estilos de layout autom\u00E1tico
+OptionPanel.automaticFormat_level1 = Formata\u00E7\u00E3o do n\u00F3 raiz
+OptionPanel.automaticFormat_level2 = Formata n\u00F3s do primeiro n\u00EDvel
+OptionPanel.Behaviour = Comportamento
+OptionPanel.bezier = bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Cancelar
+OptionPanel.childpattern = Padr\u00E3o do filho
+OptionPanel.childpattern.tooltip = O padr\u00E3o selecionado ser\u00E1 aplicado para todos os filhos.
+OptionPanel.clear_all_setters = Muda todos
+OptionPanel.clear_all_setters.tooltip = Ativa ou desativa todas as indica\u00E7\u00F5es de mudan\u00E7a.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Combinedo
+OptionPanel.convert_to_current_version = <html>Automaticamente converta mapas de versoes antigas do Freeplane<br> para a versao atual?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>Apenas para mapas grandes que nao precisam ser convertidos <br>(este e um conhecimento de expert) voc\u00EA pode abrir os mapas sem converte-los.</html>
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Padr\u00E3o
+OptionPanel.default_browser_command_mac = Comando padr\u00E3o para o browser no MacOS
+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 o que deve ser usado para o 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_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_charset = Charset[translate me]
+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.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.edgecolor = Cor da borda
+OptionPanel.edgecolor.tooltip = Propriedade da borda do n\u00F3 pai (tamb\u00E9m ser\u00E1 aplicada a todos os n\u00F3s filhos)
+OptionPanel.edgestyle = Estilo da borda
+OptionPanel.edgestyle.tooltip = Propriedade da borda do n\u00F3 pai (tamb\u00E9m ser\u00E1 aplicada a todos os n\u00F3s filhos)
+OptionPanel.edgewidth = Largura da borda
+OptionPanel.edgewidth.tooltip = Propriedade da borda do n\u00F3 pai (tamb\u00E9m ser\u00E1 aplicada a todos os n\u00F3s filhos)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Enter confirma por padr\u00E3o
+OptionPanel.el__max_default_window_height = Altura padr\u00E3o m\u00E1xima da janela
+OptionPanel.el__max_default_window_width = Largura padr\u00E3o m\u00E1xima da janela
+OptionPanel.el__min_default_window_height = Altura padr\u00E3o m\u00EDnima da janela
+OptionPanel.el__min_default_window_width = Largura padr\u00E3o m\u00EDnima da janela
+OptionPanel.el__position_window_below_node = Posiciona janela abaixo do n\u00F3
+OptionPanel.en = En
+OptionPanel.Environment = Ambiente
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.execute_scripts_without_asking = Scripts devem ser executados sem confirmacao?
+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.experimental_file_locking_on = Travamento experimental de arquivo
+OptionPanel.experimental_file_locking_on.tooltip = <html> Recurso experimental</html>
+OptionPanel.export_icons_in_html = Exporta \u00EDcones para HTML
+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.Files = Arquivos
+OptionPanel.first = Primeiro
+OptionPanel.foldingsymbolwidth = Largura do s\u00EDmbolo de contra\u00EDdo
+OptionPanel.foldingsymbolwidth.tooltip = <html>Largura do s\u00EDmbolo de marca\u00E7\u00E3o de galho contra\u00EDdo</html>
+OptionPanel.fork = Fork[translate me]
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl
+OptionPanel.gtk = Gtk
+OptionPanel.horizontal = horizontal[translate me]
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Baseado nos cabe\u00E7alhos
+OptionPanel.html_export_fold_all = Contrai todos
+OptionPanel.html_export_fold_currently_folded = Contra\u00ED os atualmente contra\u00EDdos
+OptionPanel.html_export_folding = Exporta os contra\u00EDdos para HTML
+OptionPanel.html_export_no_folding = Sem enlaces
+OptionPanel.hu = Hu
+OptionPanel.icon = \u00CDcone
+OptionPanel.icon.tooltip = Se aplicado, o n\u00F3 ter\u00E1 exatamente este \u00EDcone.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Teclas de atalhoo
+OptionPanel.ko = Kr
+OptionPanel.label_font_family = Font Family[translate me]
+OptionPanel.label_font_size = Tamanho da fonte
+OptionPanel.language = Idioma
+OptionPanel.language.tooltip = <html>Este \u00E9 o idioma que ser\u00E1 utilizado no programa. 'automatico' tenta carregar a linguagem atual do usu\u00E1rio. </html>
+OptionPanel.last = \u00DAltimo
+OptionPanel.last_opened_list_length = Comprimento da lista de arquivos abertos recentemente
+OptionPanel.linear = linear[translate me]
+OptionPanel.links = Links
+OptionPanel.links.tooltip = <html>Define os links como relativos ou absolutos </html>
+OptionPanel.load_last_map = Abre 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.lookandfeel = Look and Feel
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Largura m\u00E1xima do n\u00F3
+OptionPanel.max_node_width.tooltip = <html>A largura m\u00E1xima do n\u00F3 em pixels</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Cor de fundo do n\u00F3
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Cor do n\u00F3
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+OptionPanel.nodefontbold = Negrito
+OptionPanel.nodefontitalic = It\u00E1lico
+OptionPanel.nodefontname = Fonte do n\u00F3
+OptionPanel.nodefontsize = Fonte do n\u00F3
+OptionPanel.nodeshape = Estilo do n\u00F3
+OptionPanel.nodeshape.tooltip = nodeshape.tooltip
+OptionPanel.nodetext = Texto do n\u00F3
+OptionPanel.nodetext.tooltip = nodetext.tooltip
+OptionPanel.nothing = Nenhum
+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
+OptionPanel.patternname = Nome
+OptionPanel.patternname.tooltip = Nome \u00FAnico de padr\u00E3o
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Posi\u00E7\u00E3o dos novos galhos
+OptionPanel.placenewbranches.tooltip = <html>Onde posicionar os novos galhos. Valores v\u00E1lidos s\u00E3o 'primeiro' e '\u00FAltimo' </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relativo
+OptionPanel.ru = Ru
+OptionPanel.selection_method = M\u00E9todo de sele\u00E7\u00E3o
+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 = Por clique
+OptionPanel.selection_method_delayed = Atrasado
+OptionPanel.selection_method_direct = Direto
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Padr\u00F5es
+OptionPanel.separator.anti_alias = Suaviza\u00E7\u00E3o
+OptionPanel.separator.attributes = Atributos
+OptionPanel.separator.automatic_save = Salvar autom\u00E1tico
+OptionPanel.separator.behaviour = Comportamento
+OptionPanel.separator.browser = Browser
+OptionPanel.separator.CloudControls = Clouds[translate me]
+OptionPanel.separator.commands_for_the_program = Comandos para o programa
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Cores padr\u00E3o
+OptionPanel.separator.default_fonts = Fontes padr\u00E3o
+OptionPanel.separator.default_styles = Estilos padr\u00E3o
+OptionPanel.separator.EdgeControls = Bordas
+OptionPanel.separator.edit_long_node_window = Janela de edi\u00E7\u00E3o de n\u00F3s longos
+OptionPanel.separator.files = Arquivos
+OptionPanel.separator.General = Geral
+OptionPanel.separator.html_export = Exportar para HTML
+OptionPanel.separator.hyperlink_types = Tipos de links
+OptionPanel.separator.icon_properties = \u00CDcones
+OptionPanel.separator.initial_map_size = Tamanho inicial do mapa
+OptionPanel.separator.key_typing = Digita\u00E7\u00E3o
+OptionPanel.separator.language = Idioma
+OptionPanel.separator.look_and_feel = Look and Feel
+OptionPanel.separator.mouse_wheel = Roda do mouse
+OptionPanel.separator.new_node_commands = Comandos de cria\u00E7\u00E3o de n\u00F3s
+OptionPanel.separator.node_editing_commands = Comandos de edi\u00E7\u00E3o de n\u00F3s
+OptionPanel.separator.node_navigation_commands = Comandos de navega\u00E7\u00E3o nos n\u00F3s
+OptionPanel.separator.NodeColors = Cor do n\u00F3s
+OptionPanel.separator.NodeFont = Fonte do n\u00F3
+OptionPanel.separator.notifications = Confirma??es
+OptionPanel.separator.other_defaults = Outros padr\u00E3o
+OptionPanel.separator.others = Outras teclas de atalho
+OptionPanel.separator.patterns = Padr\u00F5es
+OptionPanel.separator.save = Salvar
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = M\u00E9todo de sele\u00E7\u00E3o
+OptionPanel.separator.undo = Desfazer
+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.sharp_bezier = bezier "afiado"
+OptionPanel.sharp_linear = linear "afiado"
+OptionPanel.show_icon_for_attributes = Mostra \u00EDcones para atributos
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Cor padr\u00E3o do fundo
+OptionPanel.standardbackgroundcolor.tooltip = <html>A cor padr\u00E3o do fundo em nota\u00E7\u00E3o HTML </html>
+OptionPanel.standardcloudcolor = Cor padr\u00E3o da nuvem
+OptionPanel.standardcloudcolor.tooltip = <html>A cor padr\u00E3o da nuvem em nota\u00E7\u00E3o HTML </html>
+OptionPanel.standardcloudestyle = Estilo padr\u00E3o da nuvem
+OptionPanel.standardcloudestyle.tooltip = <html>O estilo padr\u00E3o da nuvem. No momento apenas 'bezier' \u00E9 suportado</html>
+OptionPanel.standardlinkcolor = Cor padr\u00E3o do link
+OptionPanel.standardlinkcolor.tooltip = <html>A cor padr\u00E3o do link em nota\u00E7\u00E3o HTML </html>
+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.sv = Se
+OptionPanel.time_for_automatic_save = Per\u00EDodo de salvamento autom\u00E1tico
+OptionPanel.time_for_automatic_save.tooltip = <html> tempo entre duas grava\u00E7\u00F5es autom\u00E1ticas consectivas (em ms). Para desativar a grava\u00E7\u00E3o autom\u00E1tica, defina este n\u00FAmero como 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tempo para sele\u00E7\u00E3o retardada
+OptionPanel.time_for_delayed_selection.tooltip = <html> Tempo at\u00E9 que o n\u00F3 sobre o qual o <it>mouse</it> est\u00E1 seja selecionado automaticamente (em milisegundos). Altere este valor para um caso se deseje sele\u00E7\u00E3o instantanea.</html>
+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.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Fonte n\u00E3o definida
+OptionPanel.undo_levels = N\u00EDveis de desfazer
+OptionPanel.undo_levels.tooltip = <html>Determina quantos n\u00EDveis podem ser defeitos com o "Desfazer".</html>
+OptionPanel.use_tabbed_pane = Usar abas
+OptionPanel.use_tabbed_pane.tooltip = Se selecionado os mapas sao mostrados em abas (como no FireFox :-) ).
+OptionPanel.vi = Vi[translate me]
+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.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Configurar p\u00E1gina...
+PasteAction.text = Colar
+PatternNewNameProperty = Novo padr\u00E3o
+PatternToString.backgroundColor = Cor de fundo
+PatternToString.color = Cores
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Estilo da borda
+PatternToString.EdgeWidth = largura da borda
+PatternToString.FontBold = Negrito
+PatternToString.Icon = \u00CDcone
+PatternToString.NodeFontSize = Tamanho da fonte
+plugins/ScriptEditor.exit = Sair
+plugins/ScriptEditor.menu_actions = A\u00E7\u00F5es
+plugins/ScriptEditor.new_script = New Script[translate me]
+plugins/ScriptEditor.run = Executar
+plugins/ScriptEditor/window.Result = Resultado:
+plugins/ScriptEditor/window.title = Editor de scripts
+plugins/TimeList.xml_Created = Criado
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = \u00CDcones
+plugins/TimeList.xml_Modified = Modificado
+plugins/TimeList.xml_Notes = Notas
+plugins/TimeList.xml_Text = Texto
+plugins/TimeManagement.xml_appendButton = Anexa a data ao n\u00F3 selecionado
+plugins/TimeManagement.xml_Cancel = Cancelar
+plugins/TimeManagement.xml_cancelButton = Cancelar
+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_menu_actions = A\u00E7\u00F5es
+plugins/TimeManagement.xml_minute = Minuto:
+plugins/TimeManagement.xml_reminderButton = Lembre-me nesta data
+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 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>
+plugins/TimeManagement.xml_reminderNode_tooltip = Alarme agendado para {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Remove alarme
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Remove todos os alarmes associados aos n\u00F3s selecionados.
+plugins/TimeManagement.xml_Replace = Substituir
+plugins/TimeManagement.xml_Replace_All = Substituir todos
+plugins/TimeManagement.xml_Replace_Selected = Substituir selecionados
+plugins/TimeManagement.xml_Select = Selecionar
+plugins/TimeManagement.xml_todayButton = Hoje
+plugins/TimeManagement.xml_WindowTitle = Gerenciamento de tempo
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Busca & substitui
+preferences = Prefer\u00EAncias
+PrintAction.text = Imprimir...
+PrintDirectAction.text = Imprimir
+printing_settings = Escala de impress\u00E3o
+PrintPreviewAction.text = Imprimir preview...
+PropertyAction.dialog = Preferences[translate me]
+PropertyAction.text = Prefer\u00EAncias ...
+QuitAction.text = Sair
+read_only = Apenas para leitura
+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>
+really_execute_script = Voc\u00EA deseja mesmo executar os scripts incluidos neste mapa? E possivel que eles prejudiquem seu computador.
+really_remove_node = Deseja mesmo remover n\u00F3(s)?
+RedoAction.text = Refazer
+RedoFilterAction.text = Refazer
+ReminderHookAction.text = Remove alarme
+ReminderHookAction.tooltip = Remove o alarme de um n\u00F3.
+RemoveAllIconsAction.text = Remover todos os \u00EDcones
+RemoveConnectorAction.text = Remove Connector[translate me]
+RemoveIconAction.text = Remover \u00FAltimo \u00EDcone
+repair_link = Recuperar link
+repair_link_question = N\u00E3o foi possivel carregar o mapa referenciado. Corrigir a refer\u00EAncia manualmente?
+replace = Substituir
+ReportBugAction.text = Report a Bug[translate me]
+RequestFeatureAction.text = Request a Feature[translate me]
+ResetNodeLocationAction.text = Redefinir posi\u00E7\u00E3o
+save_failed = Tentativa de salvar o mapa {0} falhou.
+save_unsaved = Salvar o seguinte mapa da mente? :
+SaveAction.text = Salvar
+SaveAll.text = Grava tudo
+SaveAll.tooltip = Grava todos os mapas abertos.
+SaveAsAction.text = Salvar como...
+saved = Salvo
+scheme_evaluate = Avaliar!
+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 ?
+select_favorites_folder = Selecione a pasta, onde est\u00E3o salvos seus favoritos
+select_folder_for_importing = Selecione a pasta para importar
+SelectAllAction.text = Selecionar todos os vis\u00EDveis
+SelectBranchAction.text = Selecionar n\u00F3s vis\u00EDveis
+selection_method_by_click = Um clique seleciona
+selection_method_delayed = Sele\u00E7\u00E3o autom\u00E1tica com atraso
+selection_method_direct = Apontar seleciona
+SelectNoteAction.text = Note Edit Switch
+SelectNoteAction.tooltip = Switch to resp. from note window
+SetImageByFileChooserAction.text = Indicar imagem (Seletor de arquivos ou refer\u00EAncia)...
+SetLinkByFileChooserAction.text = Indicar refer\u00EAncia (Seletor de arquivos)...
+SetLinkByTextFieldAction.text = Indicar refer\u00EAncia (Campo de texto)...
+ShowAllAttributesAction.text = Mostrar todos os atributos
+ShowAncestorsAction.text = Mostra ancestrais
+ShowAttributeDialogAction.text = Gerenciador de atributos
+ShowDescendantsAction.text = Mostra descendentes
+ShowHideNoteAction.text = Mostra/esconde janela de notas
+ShowHideNoteAction.tooltip = Is a menu short cut for the little arrows on the splitting line.
+ShowSelectedAttributesAction.text = Mostrar n\u00F3s selecionadoos
+simplyhtml.aboutFrameTitle = Sobre esta aplica\u00E7\u00E3o
+simplyhtml.alignCenter = centro
+simplyhtml.alignLabel = Alinhamentoo:
+simplyhtml.alignLeft = esquerda
+simplyhtml.alignRight = direita
+simplyhtml.allCellsRangeLabel = todas as c\u00E9lulas
+simplyhtml.allOccurrencesReplaced = Todas as ocorr\u00EAncias foram substitu\u00EDdas
+simplyhtml.appendTableColLabel = Adicionar coluna
+simplyhtml.appendTableRowLabel = Adicionar linha
+simplyhtml.applyCellAttrLabel = Aplicar em
+simplyhtml.backgroundLabel = Plano de fundo:
+simplyhtml.boldItalicName = Negrito it\u00E1lico
+simplyhtml.boldName = Negrito
+simplyhtml.borderColorLabel = Cor:
+simplyhtml.borderWidthLabel = Largura
+simplyhtml.bottomLabel = abaixo:
+simplyhtml.cancelBtnName = Cancelar
+simplyhtml.cellBorderTabLabel = Bordas
+simplyhtml.cellGenTabLabel = Geral
+simplyhtml.cellMarginTabLabel = Margem
+simplyhtml.cellPanelTitle = Formatar c\u00E9lula
+simplyhtml.clearFormatLabel = Remover formata\u00E7\u00E3o
+simplyhtml.clearFormatTip = Remover formata\u00E7\u00E3o
+simplyhtml.close = Fechar
+simplyhtml.closeBtnName = Fechar
+simplyhtml.colorLabel = Cores
+simplyhtml.copyLabel = Copiar
+simplyhtml.copyTip = Copiar
+simplyhtml.cTagNameHead1 = Cabe\u00E7alho 1
+simplyhtml.cTagNameHead2 = Cabe\u00E7alho 2
+simplyhtml.cTagNameHead3 = Cabe\u00E7alho 3
+simplyhtml.cTagNameHead4 = Cabe\u00E7alho 4
+simplyhtml.cTagNameHead5 = Cabe\u00E7alho 5
+simplyhtml.cTagNameHead6 = Cabe\u00E7alho 6
+simplyhtml.cTagNameLink = Link
+simplyhtml.cTagNameOL = Lista ordenada
+simplyhtml.cTagNamePara = Par\u00E1grafo
+simplyhtml.cTagNameUL = Lista n\u00E3o-ordenada
+simplyhtml.cutLabel = Recortar
+simplyhtml.cutTip = Cortar
+simplyhtml.defaultDocName = Sem nome
+simplyhtml.deleteTableColLabel = Apagar coluna
+simplyhtml.deleteTableRowLabel = Apagar linha
+simplyhtml.docTitleQuery = Altera t\u00EDtulo para:
+simplyhtml.docTitleTitle = Editar t\u00EDtulo do documento
+simplyhtml.editLabel = Editar
+simplyhtml.effectLabel = Efeito
+simplyhtml.familyLabel = Fam\u00EDlia
+simplyhtml.findNext = Buscar pr\u00F3xima...
+simplyhtml.findReplaceDialogTitle = Busca & substitui
+simplyhtml.findReplaceLabel = Busca & substitui
+simplyhtml.findReplaceTip = Busca & substitui
+simplyhtml.fontBoldLabel = Negrito
+simplyhtml.fontBoldTip = liga/desliga negrito
+simplyhtml.fontDialogTitle = Formatar fonte
+simplyhtml.fontItalicLabel = It\u00E1lica
+simplyhtml.fontItalicTip = Liga/desliga it\u00E1lico
+simplyhtml.fontLabel = Fonte...
+simplyhtml.fontTabLabel = Fonte
+simplyhtml.fontTip = Formatar fonte...
+simplyhtml.fontUnderlineLabel = Sublinhado
+simplyhtml.fontUnderlineTip = Liga/desliga sublinhado
+simplyhtml.foregroundLabel = Plano de frente:
+simplyhtml.formatLabel = Formatar
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = Muda formata\u00E7\u00E3o da lista
+simplyhtml.formatParaLabel = Par\u00E1grafo...
+simplyhtml.formatParaTip = Muda formata\u00E7\u00E3o do par\u00E1grafo
+simplyhtml.formatTableLabel = Tabela...
+simplyhtml.formatTableTip = Formatar tabela
+simplyhtml.helpLabel = Ajuda
+simplyhtml.htmlTabTitle = Ver c\u00F3digo HTML
+simplyhtml.imageFileDesc = Arquivos de imagem
+simplyhtml.insertTableColLabel = Inserir coluna
+simplyhtml.insertTableLabel = Tabela...
+simplyhtml.insertTableMsg = Quantas colunas?
+simplyhtml.insertTableRowLabel = Inserir linha
+simplyhtml.insertTableTitle = Inserir tabela
+simplyhtml.italicName = It\u00E1lico
+simplyhtml.layoutTabTitle = Ver layout
+simplyhtml.leftLabel = esquerda:
+simplyhtml.listDialogTitle = Formatar lista
+simplyhtml.listIndentTitle = Indenta\u00E7\u00E3o:
+simplyhtml.listPosInside = dentro
+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.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = nenhum
+simplyhtml.listTypeSquare = marcador quadrado
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Exterior
+simplyhtml.matchCase = Diferenciar mai\u00FAsculas de min\u00FAsculas
+simplyhtml.newStyleDefaultName = Novo estilo
+simplyhtml.nextTableCellLabel = Pr\u00F3xima c\u00E9lula
+simplyhtml.noLineLabel = nenhum
+simplyhtml.noMoreOccurrencesFound = n\u00E3o foram encontradas (outras) ocorr\u00EAncias
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Interior
+simplyhtml.paraAlignCenterLabel = Alinhar ao centro
+simplyhtml.paraAlignCenterTip = Definir alinhamento do par\u00E1grafo ao centro
+simplyhtml.paraAlignLeftLabel = Alinhar \u00E0 esquerda
+simplyhtml.paraAlignLeftTip = Definir alinhamento do par\u00E1grafo \u00E0 esquerda
+simplyhtml.paraAlignRightLabel = Alinhar \u00E0 direita
+simplyhtml.paraAlignRightTip = Definir alinhamento do par\u00E1grafo \u00E0 direita
+simplyhtml.paraStyleDialogTitle = Estilo do par\u00E1grafo
+simplyhtml.paraTabLabel = Par\u00E1grafo
+simplyhtml.pasteLabel = Colar
+simplyhtml.pasteTip = Colar
+simplyhtml.plainName = Normal
+simplyhtml.previewLabel = Visualizar
+simplyhtml.previewText = Visualizar texto
+simplyhtml.prevTableCellLabel = C\u00E9lula anterior
+simplyhtml.redoLabel = Refazer
+simplyhtml.redoTip = Refaza \u00FAltima a\u00E7\u00E3o
+simplyhtml.replace = Substituir...
+simplyhtml.replaceAll = Todos
+simplyhtml.replaceDone = Feito
+simplyhtml.replaceNo = N\u00E3o
+simplyhtml.replaceThisQuery = substitui esta ocorr\u00EAncia de
+simplyhtml.replaceWith = Substituir com:
+simplyhtml.replaceYes = Sim
+simplyhtml.rightLabel = direita:
+simplyhtml.searchDown = Para baixo
+simplyhtml.searchFromStart = A partir do in\u00EDcio
+simplyhtml.searchUp = Para cima
+simplyhtml.selectAllLabel = Seleciona tudo
+simplyhtml.sizeLabel = Tamanho
+simplyhtml.standardStyleName = padr\u00E3o
+simplyhtml.strikeLabel = Riscado
+simplyhtml.styleLabel = Estilo
+simplyhtml.styleNameInputText = Nome do novo estilo?
+simplyhtml.styleNameInputTitle = Gravar estilo
+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.thisCellRangeLabel = Esta c\u00E9lula
+simplyhtml.thisColRangeLabel = esta coluna
+simplyhtml.thisRowRangeLabel = esta linha
+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.uLineLabel = Sublinhado
+simplyhtml.unableToOpenFileError = Arquivo n\u00E3o p\u00F4de ser aberto
+simplyhtml.undoLabel = Desfazer
+simplyhtml.undoTip = Desfaz a \u00FAltima a\u00E7\u00E3o
+simplyhtml.valignBaseline = baseline
+simplyhtml.valignBottom = Base
+simplyhtml.valignLabel = Alinhamento vertical:
+simplyhtml.valignMiddle = Meio
+simplyhtml.valignTop = Topo
+simplyhtml.wholeWordsOnly = Apenas palavras inteiras
+SortNodes.text = Ordena filhos
+SortNodes.tooltip = Ordena todos os filhos de um n\u00F3 alfabeticamente.
+split = Dividir
+SplitNode.text = Divide n\u00F3
+SplitNode.tooltip = <html>N\u00F3 est\u00E1 dividido</html>
+style = Estilo
+svg = SVG[translate me]
+TimeListAction.text = Mostra a lista da agenda ...
+TimeListAction.tooltip = Mostra todos os tempos agendados e os n\u00F3s correspondentes.
+TimeManagementAction.text = Mostra calend\u00E1rio...
+TimeManagementAction.tooltip = <html>Mostra o m\u00F3dulo calend\u00E1rio feito por Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Fechar os filhos
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Fechar
+ToggleLeftToolbarAction.text = Ativar barra da esquerda
+ToggleMenubarAction.text = Ativar barra de menis
+ToggleToolbarAction.text = Ativar barra de ferramentas
+undefined_error = Um erro inesperado ocorreu. Por favor tente reportar um erro.
+underline = Sublinhado
+underlined = Sublinhado
+UndoAction.text = Desfazer
+UndoFilterAction.text = Desfazer
+unfold = Fechar
+UnfoldAllAction.text = Expande todos
+UnfoldAllAction.tooltip = <html>Expande o n\u00F3 atual e todos os seus filhos.</html>
+UnfoldOneLevelAction.text = Expande um n\u00EDvel
+UnfoldOneLevelAction.tooltip = <html>Expande os n\u00F3s selecionados um n\u00EDvel.</html>
+UpdateCheckAction.text = Check for Updates[translate me]
+url_error = Essa URL n\u00E3o \u00E9 bem formada!
+url_load_error = N\u00E3o posso ler o mapa da URL:
+UsePlainTextAction.text = Usa texto puro
+user_defined_zoom = Definido pelo usu\u00E1rio.
+user_defined_zoom_status_bar = Mudando a amplia\u00E7\u00E3o para {0}%.
+user_zoom = Fator de amplia\u00E7\u00E3o da impress\u00E3o (0.0 - 2.0):
+WebDocuAction.text = Documenta\u00E7\u00E3o na internet
+width = Largura
+yes = Sim
+ZoomInAction.text = Zoom In[translate me]
+ZoomOutAction.text = Zoom Out[translate me]
diff --git a/freeplane/resources/translations/Resources_pt_PT.properties b/freeplane/resources/translations/Resources_pt_PT.properties
new file mode 100644
index 0000000..0515413
--- /dev/null
+++ b/freeplane/resources/translations/Resources_pt_PT.properties
@@ -0,0 +1,922 @@
+AboutAction.text = Acerca de...
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Alterar formato dos n\u00F3s
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Alterar padr\u00F5es
+accessories/plugins/EncryptNode.properties_0 = Escolha uma password para o n\u00F3 encriptado
+accessories/plugins/EncryptNode.properties_1 = As passwords s\u00E3o muito curtas ou n\u00E3o coincidem.
+accessories/plugins/EncryptNode.properties_2 = Digite a Password:
+accessories/plugins/EncryptNode.properties_3 = Digite de novo a Password:
+accessories/plugins/EncryptNode.properties_4 = Digite a sua password.
+accessories/plugins/EncryptNode.properties_5 = <html>Lembre-se que o tamanho da encripta\u00E7\u00E3o<br> est\u00E1 directamente relacionado com a qualidade da sua password.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Cancelar
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = S\u00F3 pode alterar o estado de encripta\u00E7\u00E3o de um n\u00F3 encriptado. Insira um n\u00F3 desses a partir do menu Ferramentas.
+accessories/plugins/EncryptNode.properties_select_me = Seleccione-me para continuar!
+accessories/plugins/EncryptNode.properties_wrong_password = A password n\u00E3o est\u00E1 correcta.
+accessories/plugins/ExportWithTWiki.text = Como TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Exporta o mapa como um documento TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = Este \u00E9 um m\u00E9todo de exporta\u00E7\u00E3o \u00E9 uniforme que utiliza scripts XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Como Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exporta o mapa como applet java para o browser.
+accessories/plugins/ExportWithXSLT_Flash.text = Como Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exporta o mapa como aplica\u00E7\u00E3o flash.
+accessories/plugins/ExportWithXSLT_HTML.text = Como XHTML (vers\u00E3o JavaScript)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Como XHTML (vers\u00E3o imagem de mapa clic\u00E1vel)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Recursos do n\u00F3 RESOURCES para o ficheiro TaskJuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exporta recursos do n\u00F3 RESOURCES para o n\u00F3 do m\u00F3dulo Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tarefas do n\u00F3 TASKS para o ficheiro TaskJuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exporta as tarefas a partir do n\u00F3 TASKS para o n\u00F3 do m\u00F3dulo Taskjuggler. </html>
+add = Adicionar
+AddLocalLinkAction.text = Adicionar hiperliga\u00E7\u00E3o local
+antialias_all = "anti-alias" total
+antialias_edges = Linhas "anti-alias"
+antialias_none = Remover "anti-alias"
+apply = Aplicar
+ApplyAction.text = Aplicar
+ApplyFormatPlugin.text = &Alterar formato ...
+ApplyFormatPlugin.tooltip = Apresenta um di\u00E1logo no qual os atributos do n\u00F3 e do limite padem ser modificados de uma vez s\u00F3.
+ApplyNoFilteringAction.text = Sem filtragem
+as_parent = Como principal
+AssignAttributesAction.text = Atribuir atributos...
+attribute_delete = Apaga todos os valores
+attribute_delete_value = Apaga este valar
+attribute_font_size_tooltip = Tamanho da fonte do atributo
+attribute_list_box_label_text = Valores existentes
+attribute_replace = Substituir por
+attribute_top = Todos os atributos conhecidos para os n\u00F3s seleccionados
+attributes_adding_empty_attribute_error = N\u00E3o pode utilizar vazio como nome de um atributo
+attributes_all = Todos os atributos
+attributes_attribute = Atributos
+attributes_close = Fechar
+attributes_deselect_all = Nenhum
+attributes_dialog_title = Attribute Manager[translate me]
+attributes_edit = Editar
+attributes_edit_tooltip = Editar conjunto
+attributes_for_selected = N\u00F3s seleccionados
+attributes_for_visible = Todos os n\u00F3s vis\u00EDveis
+attributes_import = Importar
+attributes_import_tooltip = Importar atributos de outros mapas abertos
+attributes_popup_delete = Eliminar
+attributes_popup_down = Abaixo
+attributes_popup_edit = Editar
+attributes_popup_hide = Ocultar
+attributes_popup_new = Novo atributo
+attributes_popup_optimal_width = Largura ideal
+attributes_popup_up = Acima
+attributes_refresh = Redesenhar
+attributes_restricted_attributes_tooltip = Conjunto de atributos restritos
+attributes_restricted_values_tooltip = Conjunto restrito de valores para este atributo
+attributes_restriction = Conjunto restrito
+attributes_select_all = Todos
+attributes_select_all_tooltip = Seleccionar tudo / nada
+attributes_show = Mostrar
+attributes_skip_root = Ignora o n\u00F3 raiz
+attributes_visible = Seleccionar vis\u00EDveis
+attributes_visible_tooltip = Seleccionar vis\u00EDveis
+automatically_save_message = O mapa foi guardado automaticamente (com o nome {0}) ...
+AutomaticLayoutAction.text = Layout autom\u00E1tico
+AutomaticLayoutAction.tooltip = <html>Fixa o layout do mapa. <br>O primeiro n\u00EDvel \u00E9 preto, o segundo azul, etc.</html>
+BackAction.tooltip = Volta atr\u00E1s na cadeia seleccionada
+background = Fundo
+bitmaps = bitmaps[translate me]
+BlinkingNodeHookAction.text = N\u00F3 cintilante
+BlinkingNodeHookAction.tooltip = <html>Torna o n\u00F3 cintilante.Tenha cuidado. N\u00E3o associe a muitos n\u00F3s, e <strong> nunca com outras formata\u00E7\u00F5es autom\u00E1ticas no mesmo n\u00F3</strong></html>
+BoldAction.text = Negrito
+boldify_branch = Negrito
+branch = Ramo
+cancel = Cancelar
+CancelAction.text = Cancelar
+cannot_add_parent_diff_parents = Todos os n\u00F3s devem ter o mesmo parente para usar esta fun\u00E7\u00E3o.
+cannot_add_parent_to_root = O n\u00F3 de raiz n\u00E3o pode ser adicionado a um n\u00F3 principal.
+cannot_join_nodes_with_children = N\u00E3o \u00E9 poss\u00EDvel juntar n\u00F3s com descendentes
+cannot_move_to_child = N\u00E3o \u00E9 poss\u00EDvel mover um no para um dos seus descendentes.
+CenterAction.text = Centrar
+ChangeNodeLevelLeftsAction.text = N\u00F3 esquerdo
+ChangeNodeLevelLeftsAction.tooltip = \u00C0 esquerda dos n\u00F3s da raiz \u00E9/s\u00E3o empurrados para baixo. Torna/tornam-se descendentes das r\u00E9plicas acima. \u00C0 direita dos n\u00F3s da raiz \u00E9/s\u00E3o empurrados para cima. Directamente na raiz, os n\u00F3s mudam de lado.
+ChangeNodeLevelRightsAction.text = N\u00F3 direito
+ChangeNodeLevelRightsAction.tooltip = \u00C0 esquerda dos n\u00F3s da raiz \u00E9/s\u00E3o empurrados para baixo. Torna/tornam-se descendentes das r\u00E9plicas acima. \u00C0 direita dos n\u00F3s da raiz \u00E9/s\u00E3o empurrados para cima. Directamente na raiz, os n\u00F3s mudam de lado.
+choose_background_color = Seleccione a cor de fundo:
+choose_cloud_color = Seleccione a cor da Nuvem:
+choose_edge_color = Escolher cor do Limite
+choose_node_background_color = Seleccione a cor de fundo do n\u00F3:
+choose_node_color = Seleccione a cor do n\u00F3:
+CloseAction.text = Fechar
+CloudAction.text = Nuvem
+CloudColorAction.text = Nuvem colorida
+ColorProperty.ResetColor = Repor cor
+combined = Combinado
+confirmation = Confirma\u00E7\u00E3o
+CopyAction.text = Copiar
+CopyIDAction.text = Copy Node ID[translate me]
+CopySingleAction.text = Copiar simples
+CreationModificationPluginAction.text = Mostrar informa\u00E7\u00E3o das modifica\u00E7\u00F5es
+CreationModificationPluginAction.tooltip = <html>Esta fun\u00E7\u00E3o mant\u00E9m um registo da cria\u00E7\u00E3o dos n\u00F3s e dados de modifica\u00E7\u00E3o.</html>
+CutAction.text = Cortar
+decrease_branch_font_size = Letra menor
+DecreaseNodeFontAction.text = Letra menor
+delete = eliminar
+delete_child = Eliminar n\u00F3
+DeleteAction.text = Remover n\u00F3
+DeleteConditionAction.text = Eliminar
+DocumentationAction.text = Documenta\u00E7\u00E3o
+edge = Linha
+edge_style = Estilo do limite
+edge_width = Largura do limite
+EdgeColorAction.text = Cor da Linha
+EdgeStyleAction.bezier.text = B\u00E9zier
+EdgeStyleAction.horizontal.text = Horizontal[translate me]
+EdgeStyleAction.linear.text = Linear
+EdgeStyleAction.sharp_bezier.text = B\u00E9zier afiado
+EdgeStyleAction.sharp_linear.text = Linear afiado
+EdgeStyleAsParentAction.text = Como principal
+EdgeWidthAction_width_parent.text = Principal
+EdgeWidthAction_width_thin.text = Fina
+edit = Editar
+edit.decision = HTML Editor
+edit.edit_rich_text = Quer utilizar formata\u00E7\u00F5es como negrito e it\u00E1lico?
+edit_link_manually = Edi\u00E7\u00E3o manual
+edit_middle_label = Edit Middle Label[translate me]
+edit_source_label = Edit Source Label[translate me]
+edit_target_label = Edit Target Label[translate me]
+EditAction.text = Editar n\u00F3
+EditAttributesAction.text = Editar atributos
+EditFilterAction.text = Editar
+EditLongAction.text = Editar n\u00F3 longo
+EncryptedMap.text = Criar um Mapa encriptado ...
+EncryptedMap.tooltip = Criar num novo mapa encriptado
+enter_base_url = Vou colar endere\u00E7os relativos. Por favor indique a URL base.
+enter_confirms = Enter confirma
+EnterPassword.text = Alterna entre Encriptado/Desencriptado
+error_applying_template = Erro ao aplicar o modelo XSL.
+error_creating_directory = N\u00E3o \u00E9 poss\u00EDvel criar o direct\u00F3rio de exporta\u00E7\u00E3o.
+ExecuteScripts.text = Scripts[translate me]
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Exportar
+ExportBranchToHTMLAction.text = Exportar ramo para HTML
+ExportPdf.text = Como PDF...
+ExportSvg.text = Como SVG...
+ExportToHTMLAction.text = Exportar para HTML
+ExportToImage.jpg.text = Como JPEG...
+ExportToImage.png.text = Como PNG...
+ExportToOoWriter.text = Como documento do Office Writer...
+ExportToOoWriter.tooltip = N\u00F3s desdobrados da estrutura, dobram os n\u00F3s do conte\u00FAdo do documento.
+extension_menu = Estilo f\u00EDsico
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = FAQ
+file = Ficheiro
+file_already_exists = O ficheiro {0} j\u00E1 existe. Deseja substitu\u00ED-lo?
+file_not_found = Ficheiro {0} n\u00E3o encontrado
+filter = Filtro
+filter_add = Adicionar
+filter_and = E
+filter_conditions = Filtros
+filter_contains = Cont\u00E9m
+filter_delete = eliminar
+filter_dialog = Composi\u00E7\u00E3o de filtros
+filter_does_not_exist = N\u00E3o existe
+filter_edit_description = Editar lista de filtros
+filter_enter_value = Digite o valor
+filter_exist = Existe
+filter_icon = \u00CDcone
+filter_is_equal_to = \u00C9 igual a
+filter_is_not_equal_to = N\u00E3o \u00E9 igual a
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Sem filtragem
+filter_node = N\u00F3 de texto
+filter_not = N\u00E3o
+filter_or = Ou
+filter_select = Seleccionar
+filter_selected_node_view = N\u00F3s actualmente seleccionados
+find_what = Procurar...
+FindAction.text = Procurar
+fit_map_to_page = Uma pagina
+FitToPage.text = Zoom para ajuste de p\u00E1gina
+FitToPage.tooltip = Ajusta o zoom para que o mapa caiba todo na janela.
+fold = Expandir
+FoldAllAction.text = Dobrar todos
+FoldAllAction.tooltip = <html>Dobra os n\u00F3s seleccionados e todos os seus descendentes.</html>
+FoldOneLevelAction.text = Dobrar um n\u00EDvel
+FoldOneLevelAction.tooltip = <html>Dobra os n\u00F3s todos um n\u00EDvel.</html>
+FollowLinkAction.text = Follow Link[translate me]
+font = Tipo de letra
+FontFamilyAction.text = fam\u00EDlia do tipo de letra
+FontSizeAction.text = tamanho da letra
+format_menu_edge_styles = Estilo dos Limites
+format_menu_edge_widths = Espessura dos Limites
+FormatCopy.text = Copiar formato
+FormatCopy.tooltip = <html>Copia o formato de um n\u00F3.</html>
+FormatPaste.text = Colar formato
+FormatPaste.tooltip = <html>Cola o formato de um n\u00F3.</html>
+ForwardAction.tooltip = Avan\u00E7a na cadeia seleccionada
+Freeplane.progress.buildScreen = Criar ecr\u00E3...
+Freeplane.progress.createController = Criar controlador...
+Freeplane.progress.createInitialMode = Criar Modo Inicial...
+Freeplane.progress.endStartup = Finalizar inicia\u00E7\u00E3o.
+Freeplane.progress.gettingPreferenceDirectories = A obter prefer\u00EAncias de direct\u00F3rio...
+Freeplane.progress.gettingPreferences = A obter prefer\u00EAncias...
+Freeplane.progress.loadMaps = Carregar Mapas...
+Freeplane.progress.propagateLookAndFeel = Propagar aspecto e estilos...
+Freeplane.progress.settingPreferences = Definir prefer\u00EAncias...
+Freeplane.progress.startCreateController = Iniciar a cria\u00E7\u00E3o do controlador...
+Freeplane.progress.updateLookAndFeel = Actualizar aspecto e estilos...
+freeplane_reverted = Freeplane_Revertido_
+FreeplaneHelpStarter.text = Ajuda...
+FreeplaneHelpStarter.tooltip = Extens\u00E3o de Ajuda Freeplane
+GotoLinkNodeAction.text = Ir para o link
+GrabKeyDialog.common.cancel = Cancelar
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Associado a
+GrabKeyDialog.grab-key.assigned-to.none = Actualmente n\u00E3o atribu\u00EDdo
+GrabKeyDialog.grab-key.clear = Limpar
+GrabKeyDialog.grab-key.remove = Remover
+GrabKeyDialog.grab-key.remove-ask = Tem a certeza que deseja remover esta combina\u00E7\u00E3o de teclas?
+GrabKeyDialog.grab-key.title = Digite nova chave
+help = Ajuda
+HideAllAttributesAction.text = Ocultar todos os atributos
+HierarchicalIconsAction.text = Mostrar \u00EDcones hierarquicamente
+HierarchicalIconsAction.tooltip = Se um dos meus (grand)descendentes tiver um \u00EDcone, eu tamb\u00E9m mostro este \u00EDcone num formato pequeno.
+html_export_based_on_headings = Exportar HTML - Com cabe\u00E7alhos
+html_export_fold_all = Exportar HTML - Com n\u00F3s p/expans\u00E3o
+html_export_fold_currently_folded = Exportar HTML - Respeitar expandidos
+html_export_no_folding = Exportar HTML - Totalmente expandido
+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]
+icon_attach = Clip
+icon_bee = Freeplane[translate me]
+icon_bell = A Lembrar
+icon_bookmark = Excelente
+icon_broken-line = Broken[translate me]
+icon_button_cancel = N\u00E3o OK
+icon_button_ok = OK
+icon_calendar = Data
+icon_clanbomber = Perigoso
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = N\u00E3o esquecer
+icon_down = Abaixo
+icon_family = Fam\u00EDlia
+icon_female1 = Female1[translate me]
+icon_flag = Bandeira
+icon_flag-black = Black Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_folder = Folder[translate me]
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Prioridade 1
+icon_full-2 = Prioridade 2
+icon_full-3 = Prioridade 3
+icon_full-4 = Prioridade 4
+icon_full-5 = Prioridade 5
+icon_full-6 = Prioridade 6
+icon_full-7 = Prioridade 7
+icon_go = Green Traffic Light[translate me]
+icon_gohome = Casa
+icon_help = Quest\u00E3o
+icon_idea = Ideia
+icon_info = Info[translate me]
+icon_kaddressbook = Telefone
+icon_kmail = E-Mail[translate me]
+icon_knotify = M\u00FAsica
+icon_korn = Caixa de Correio
+icon_ksmiletris = Estou feliz
+icon_licq = Bonito
+icon_Mail = Correio
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = \u00CDcones
+icon_messagebox_warning = Importante
+icon_password = Chave
+icon_pencil = A Redefinir
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = N\u00E3o estou contente
+icon_stop = Stop
+icon_up = Acima
+icon_wizard = M\u00E1gico
+icon_xmag = A Discutir
+icon_yes = Importante
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Seleccionar \u00EDcone...
+IconSelectionPlugin.tooltip = <html>Aqui pode seleccionar um \u00EDcone usando uma sub-janela.</html>
+import = Importar
+import_linked_branch_no_link = O n\u00F3 seleccionado n\u00E3o tem nenhum link para importar.
+ImportAction.text = Importar
+ImportBranchAction.text = Importar ramo
+ImportExplorerFavoritesAction.text = Importar favoritos do "Explorador"
+ImportFolderStructureAction.text = Importar estrutura de pastas
+ImportLinkedBranchAction.text = Importar ramo concatenado
+ImportLinkedBranchWithoutRootAction.text = Importar sem raiz
+ImportMindmanagerFiles.text = MindManager X5 Map...
+increase_branch_font_size = Letra maior
+IncreaseNodeFontAction.text = Letra maior
+ItalicAction.text = It\u00E1lico
+italicise_branch = It\u00E1lico
+JoinNodesAction.text = Juntar n\u00F3s
+less_than_two_selected_nodes = Tem que seleccionar pelo menos dois n\u00F3s para criar links.
+link_not_available_any_more = O link j\u00E1 n\u00E3o \u00E9 v\u00E1lido. O n\u00F3 interm\u00E9dio foi eliminado.
+link_not_found = Link {0} n\u00E3o encontrado.
+locking_failed_by_open = Bloqueio do mapa {0} falhou. Vai ser aberto em modo s\u00F3 de leitura.
+locking_failed_by_save_as = Bloqueio do mapa {0} falhou. Opera\u00E7\u00E3o "guardar como" cancelada.
+locking_old_lock_removed = O mapa {0} estava bloqueado pelo utilizador {1}. O bloqueio foi removido por ser muito antigo.
+long_node_changed_cancel = O n\u00F3 foi modificado. Ignorar as altera\u00E7\u00F5es?
+lots_of_links_warning = V\u00E3o ser criadas muitas liga\u00E7\u00F5es ao mesmo n\u00F3. Quer continuar?
+map_already_exists = J\u00E1 existe um mapa com este nome. Quer substituir?
+map_corrupted = Mapa corrompido. Ver detalhes?
+map_locked_by_open = O mapa {0} est\u00E1 a ser editado pelo utilizador {1}. Vai ser aberto 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 "guardar como" cancelada.
+map_not_saved = O mapa ainda n\u00E3o foi guardado.
+MapBackgroundColorAction.text = Map Background[translate me]
+menu_attributes = Atributos
+menu_extras = Ferramentas
+menu_file_import = Importar
+menu_format = Formatar
+menu_insert = Inserir
+menu_navigate = Navegar
+menu_view = Ver
+mindmap = Mapa
+mindmaps = Mapas
+mindmaps_desc = Mapas (*.mm)
+mode_Browse = Browse Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Modo n\u00E3o dispon\u00EDvel
+mode_status = Modo alterado para "{0}"
+mode_title = Freeplane - Modo "{0}"
+modes = Modos
+ModesMenuAction.Browse.text = Map Browser[translate me]
+ModesMenuAction.File.text = File Explorer[translate me]
+ModesMenuAction.MindMap.text = Mind Map Editor[translate me]
+most_recent_files = Ficheiros recentes
+MoveToRootAction.text = Ir para a raiz
+NavigationNextMapAction.text = Mapa seguinte
+NavigationPreviousMapAction.text = Mapa anterior
+new_mindmap = Novo mapa
+new_node = Novo n\u00F3
+new_node_as_sibling_not_possible_for_the_root = Novo n\u00F3 (mesmo ramo) n\u00E3o \u00E9 poss\u00EDvel para a raiz
+NewChildAction.text = Novo n\u00F3 descendente
+NewMapAction.text = Novo
+NewParentNode.text = Novo n\u00F3 principal
+NewParentNode.tooltip = <html>Toda a selec\u00E7\u00E3o ser\u00E1 enviada para um n\u00F3 principal.</html>
+NewPreviousSiblingAction.text = Novo n\u00F3 acima
+NewSiblingAction.text = Novo n\u00F3 abaixo
+no = N\u00E3o
+no_format_copy_before_format_paste = N\u00E3o pode colar um formato sem ter copiado nenhum.
+no_found_from = "{0}" n\u00E3o encontrado a partir de "{1}".
+no_more_found_from = N\u00E3o existe mais "{0}" encontrados a partir de "{1}".
+no_previous_find = Sem ocorr\u00EAncia anterior.
+node = N\u00F3
+node_changed_discard_changes = O n\u00F3 foi modificado. Ignorar as altera\u00E7\u00F5es?
+NodeBackgroundColorAction.text = Cor de fundo do n\u00F3...
+NodeColorAction.text = Cor do n\u00F3
+NodeColorBlendAction.text = Misturar cor
+NodeDownAction.text = N\u00F3 para baixo
+NodeShapeAction.bubble.text = Bolha
+NodeShapeAction.fork.text = Forquilha
+NodeUpAction.text = N\u00F3 para cima
+nonboldify_branch = Anular Negrito
+nonitalicise_branch = Anular It\u00E1lico
+normal = Normal
+not_saved_for_link_error = O mapa tem que ser guardado antes de poder escolher um endere\u00E7o.
+ok = OK
+OKAction.text = OK
+OpenAction.text = Abrir
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Para ver o efeito das altera\u00E7\u00F5es efectuadas ter\u00E1, provavelmente, que reiniciar o Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &N\u00E3o
+OptionalDontShowMeAgainDialog.dontShowAgain = &N\u00E3o voltar a perguntar.
+OptionalDontShowMeAgainDialog.ok = &Sim
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Recordar a minha decis\u00E3o.
+OptionPanel.absolute = Absoluto
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Padr\u00F5es de layout atom\u00E1tico
+OptionPanel.antialias = Anti-alias
+OptionPanel.antialias.tooltip = <html>Determina a qualidade do mapa. Mais anti-alias demora mais tempo.</html>
+OptionPanel.antialias_all = "anti-alias" total
+OptionPanel.antialias_edges = Linhas "anti-alias"
+OptionPanel.antialias_none = Sem anti-alias
+OptionPanel.Appearance = Aspecto
+OptionPanel.ar = Ar
+OptionPanel.as_parent = Como principal
+OptionPanel.ask = Pergunte
+OptionPanel.automatic = Autom\u00E1tico
+OptionPanel.automaticFormat_level = Estilos de layout autom\u00E1tico
+OptionPanel.automaticFormat_level1 = Formato do n\u00F3 de raiz
+OptionPanel.automaticFormat_level2 = 1. Formato do n\u00EDvel do n\u00F3
+OptionPanel.Behaviour = Comportamento
+OptionPanel.bezier = bezier[translate me]
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Cancelar
+OptionPanel.childpattern = Padr\u00E3o filho
+OptionPanel.childpattern.tooltip = O padr\u00E3o seleccionado via ser aplicado a todos os descendentes.
+OptionPanel.clear_all_setters = Trocar tudo
+OptionPanel.clear_all_setters.tooltip = Activa ou desactiva todas as indica\u00E7\u00F5es de altera\u00E7\u00E3o.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Combinado
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Predefinido
+OptionPanel.default_browser_command_mac = Comando por defeito do Navegador Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> e MAC: (obrigado Nick!)</html>
+OptionPanel.default_browser_command_other_os = Comando por defeito do Navegador outro SO
+OptionPanel.default_browser_command_other_os.tooltip = <html>Normalmente Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Comando por defeito do Navegador Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Para o Windows (os "" sinais s\u00E3o necess\u00E1rios porque os links t\u00EAm "=" na URL).</html>
+OptionPanel.default_browser_command_windows_nt = Comando por fefeito do Navegador Windows Nt
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Para o Windows (os "" sinais s\u00E3o necess\u00E1rios porque os links t\u00EAm "=" na URL).</html>
+OptionPanel.default_charset = Charset[translate me]
+OptionPanel.Defaults = Predefinidos
+OptionPanel.delete_automatic_saves_at_exit = Apagar grava\u00E7\u00F5es autom\u00E1ticas ao sair
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> Se os ficheiros deverem ser eliminados automaticamente no encerramento normal do Freeplane defina esta vari\u00E1vel como verdadeira</html>
+OptionPanel.delete_nodes_without_question = Eliminar os n\u00F3s sem confirma\u00E7\u00E3o?
+OptionPanel.delete_nodes_without_question.tooltip = Se assinalar esta caixa de verifica\u00E7\u00E3o, os n\u00F3s ser\u00E3o eliminados sem confirma\u00E7\u00E3o. Pode causar perdas de informa\u00E7\u00E3o se pressionado sem inten\u00E7\u00E3o.
+OptionPanel.disable_cursor_move_paper = Desactivar Cursor para Mover Papel
+OptionPanel.disable_cursor_move_paper.tooltip = <html>N\u00E3o mostra o cursor 'mover' quando arrastaro papel</html>
+OptionPanel.edgecolor = Cor do limite
+OptionPanel.edgecolor.tooltip = Propriedade do limite do n\u00F3 principal (tamb\u00E9m \u00E9 aplicado aos n\u00F3s descendentes)
+OptionPanel.edgestyle = Estilo do limite
+OptionPanel.edgestyle.tooltip = Propriedade do limite do n\u00F3 principal (tamb\u00E9m \u00E9 aplicado aos n\u00F3s descendentes)
+OptionPanel.edgewidth = Largura do limite
+OptionPanel.edgewidth.tooltip = Propriedade do limite do n\u00F3 principal (tamb\u00E9m \u00E9 aplicado aos n\u00F3s descendentes)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Enter confirma por defeito
+OptionPanel.el__max_default_window_height = Altura Max predefinida da janela
+OptionPanel.el__max_default_window_width = Largura Max predefinida da janela
+OptionPanel.el__min_default_window_height = Altura Min predefinida da janela
+OptionPanel.el__min_default_window_width = Largura Min predefinida da janela
+OptionPanel.el__position_window_below_node = Posi\u00E7\u00E3o da janela abaixo do n\u00F3
+OptionPanel.en = En
+OptionPanel.Environment = Ambiente
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Bloqueio experimental de Ficheiro
+OptionPanel.experimental_file_locking_on.tooltip = <html> Caracter\u00EDstica experimental</html>
+OptionPanel.export_icons_in_html = Exportar \u00EDcones em HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Informa de o HTML exportado a partir do Freeplane deve conter \u00EDcones. O problema com os \u00EDcones \u00E9 que frequentemente os links para os \u00EDcones n\u00E3o s\u00E3o encontrados no HTML exportado.</html>
+OptionPanel.Files = Ficheiros
+OptionPanel.first = Primeiro
+OptionPanel.foldingsymbolwidth = Largura do S\u00EDmbolo de dobragem
+OptionPanel.foldingsymbolwidth.tooltip = <html>Largura do c\u00EDrculo de dobragem</html>
+OptionPanel.fork = Fork[translate me]
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl
+OptionPanel.gtk = Gtk
+OptionPanel.horizontal = horizontal[translate me]
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Baseado nos cabe\u00E7alhos
+OptionPanel.html_export_fold_all = Dobrar todos
+OptionPanel.html_export_fold_currently_folded = Manter as dobras actuais
+OptionPanel.html_export_folding = Dobragem para exportar HTML
+OptionPanel.html_export_no_folding = N\u00E3o dobrado
+OptionPanel.hu = Hu
+OptionPanel.icon = \u00CDcone
+OptionPanel.icon.tooltip = Se aplicado, o n\u00F3 exibir\u00E1 precisamente este \u00EDcone.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Atalhos
+OptionPanel.ko = Kr
+OptionPanel.label_font_family = Font Family[translate me]
+OptionPanel.label_font_size = Tamanho das letras
+OptionPanel.language = L\u00EDngua
+OptionPanel.language.tooltip = <html>Esta \u00E9 a L\u00EDngua usada pelo programa. 'autom\u00E1tico' tentar\u00E1 carregar o idioma actual do utilizador. </html>
+OptionPanel.last = \u00DAltimo
+OptionPanel.last_opened_list_length = Tamanho da \u00DAltima Lista Aberta
+OptionPanel.linear = linear[translate me]
+OptionPanel.links = Links
+OptionPanel.links.tooltip = <html>Define se os links s\u00E3o relativos ou absolutos </html>
+OptionPanel.load_last_map = Abrir automaticamente o \u00FAltimo mapa
+OptionPanel.load_last_map.tooltip = <html>Quando o Freeplane inicia, tenta abrir automaticamente o \u00FAltimo mapa utilizado.</html>
+OptionPanel.lookandfeel = Visual
+OptionPanel.lookandfeel.tooltip = <html>O Visual a utilizar. S\u00E3o aceites 'metal','windows','motivo', 'gtk', 'mac' s\u00F3 est\u00E1 dispon\u00EDvel em MacOS. Predefinido significa que ser\u00E1 usado o aspecto visual predefinido. Se quiser usar o seu pr\u00F3prio Visual, indique o nome de class e assegure-se que os correspondentes ficheiros jar est\u00E3o caregados. Se tiver problemas, escolha 'nada'. Funciona com applets</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Largura m\u00E1xima do n\u00F3
+OptionPanel.max_node_width.tooltip = <html>O valor m\u00E1ximo da largura do n\u00F3 em pixels</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motivo
+OptionPanel.nb = Nb[translate me]
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Cor de fundo do n\u00F3
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Cor do n\u00F3
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+OptionPanel.nodefontbold = Letars a negrito
+OptionPanel.nodefontitalic = Letras a it\u00E1lico
+OptionPanel.nodefontname = Tipo de letra do n\u00F3
+OptionPanel.nodefontsize = Tipo de letra do n\u00F3
+OptionPanel.nodeshape = Estilo do n\u00F3
+OptionPanel.nodeshape.tooltip = nodeshape.tooltip
+OptionPanel.nodetext = Texto do n\u00F3
+OptionPanel.nodetext.tooltip = nodetext.tooltip
+OptionPanel.nothing = Nenhum
+OptionPanel.number_of_different_files_for_automatic_save = N\u00FAmero de Ficheiros Diferentes para Grava\u00E7\u00F5es Autom\u00E1ticas
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> n\u00FAmero n de ficheiros diferentes receptores de mapas. A primeira grava\u00E7\u00E3o autom\u00E1tica ser\u00E1 feita no primeiro ficheiro, e por a\u00ED adiante at\u00E9 n+1-grava\u00E7\u00E3o que ser\u00E1 guardada no primeiro (c\u00EDclico)</html>
+OptionPanel.OK = Guardar
+OptionPanel.patternname = Nome
+OptionPanel.patternname.tooltip = Nome \u00FAnico do padr\u00E3o
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Colocar novos ramos
+OptionPanel.placenewbranches.tooltip = <html>Onde colocar novos bra\u00E7os. Nomes v\u00E1lidos s\u00E3o 'primeiro' e '\u00FAltimo' </html>
+OptionPanel.printonwhitebackground = <html>Fundo branco para impress\u00E3o</html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relativo
+OptionPanel.ru = Ru
+OptionPanel.selection_method = M\u00E9todo de selec\u00E7\u00E3o
+OptionPanel.selection_method.tooltip = <html> com o seguinte interruptor pode activar/desactivar o esquema de retardamento da selec\u00E7\u00E3o. Op\u00E7\u00F5es auto. N\u00E3o modifique estes par\u00E2metros pois ser\u00E3o guardados nas auto.properties de qualquer maneira.</html>
+OptionPanel.selection_method_by_click = Clicando
+OptionPanel.selection_method_delayed = Retardado
+OptionPanel.selection_method_direct = Directo
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Padr\u00F5es
+OptionPanel.separator.anti_alias = Anti-alias
+OptionPanel.separator.attributes = Atributos
+OptionPanel.separator.automatic_save = Grava\u00E7\u00E3o autom\u00E1tica
+OptionPanel.separator.behaviour = Comportamento
+OptionPanel.separator.browser = Navegador
+OptionPanel.separator.CloudControls = Clouds[translate me]
+OptionPanel.separator.commands_for_the_program = Comandos para o programa
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Cores predefinidas
+OptionPanel.separator.default_fonts = Tipo de letra predefinido
+OptionPanel.separator.default_styles = Estilos predefinidos
+OptionPanel.separator.EdgeControls = Limites
+OptionPanel.separator.edit_long_node_window = Janela de edi\u00E7\u00E3o de n\u00F3 longo
+OptionPanel.separator.files = Ficheiros
+OptionPanel.separator.General = Geral
+OptionPanel.separator.html_export = Exportar HTML
+OptionPanel.separator.hyperlink_types = Tipos de hiperliga\u00E7\u00E3o
+OptionPanel.separator.icon_properties = \u00CDcones
+OptionPanel.separator.initial_map_size = Tamanho inicial do Mapa
+OptionPanel.separator.key_typing = Teclas
+OptionPanel.separator.language = L\u00EDngua
+OptionPanel.separator.look_and_feel = Visual
+OptionPanel.separator.mouse_wheel = Roda do rato
+OptionPanel.separator.new_node_commands = Novos comandos do n\u00F3
+OptionPanel.separator.node_editing_commands = Comandos de edi\u00E7\u00E3o do n\u00F3
+OptionPanel.separator.node_navigation_commands = Comandos de navega\u00E7\u00E3o do n\u00F3
+OptionPanel.separator.NodeColors = Cores do n\u00F3
+OptionPanel.separator.NodeFont = Tipo de letra do n\u00F3
+OptionPanel.separator.notifications = Confirma\u00E7\u00F5es
+OptionPanel.separator.other_defaults = Outras predefini\u00E7\u00F5es
+OptionPanel.separator.others = Outros empacotamentos chave
+OptionPanel.separator.patterns = Padr\u00F5es
+OptionPanel.separator.save = Guardar
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_colors = Cores da selec\u00E7\u00E3o
+OptionPanel.separator.selection_method = M\u00E9todo de selec\u00E7\u00E3o
+OptionPanel.separator.undo = Anular
+OptionPanel.set_property_text = Alterar
+OptionPanel.set_property_text.tooltip = Vazio: N\u00E3o mexa; Menos=Remover propriedades (definir valores por defeito); Mais=Alterar propriedades
+OptionPanel.sharp_bezier = B\u00E9zier afiado
+OptionPanel.sharp_linear = Linear afiado
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.spelling_opt_case_sensitive = Case sensitive[translate me]
+OptionPanel.standardbackgroundcolor = Cor standard do fundo
+OptionPanel.standardbackgroundcolor.tooltip = <html>A cor standard do fundo em nota\u00E7\u00E3o HTML </html>
+OptionPanel.standardcloudcolor = Cor standard da Nuvem
+OptionPanel.standardcloudcolor.tooltip = <html>A cor standard da nuvem em nota\u00E7\u00E3o HTML </html>
+OptionPanel.standardcloudestyle = Estilo standard da Nuvem
+OptionPanel.standardcloudestyle.tooltip = <html>O estilo standard da nuvem. Actualmente apenas 'b\u00E9zier' \u00E9 suportado</html>
+OptionPanel.standarddrawrectangleforselection = Mostrar a selec\u00E7\u00E3o como rect\u00E2ngulo
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Assinalar o n\u00F3s seleccionados usando um rect\u00E2ngulo.</html>
+OptionPanel.standardlinkcolor = Cor standard do link
+OptionPanel.standardlinkcolor.tooltip = <html>A cor standard do link em nota\u00E7\u00E3o HTML </html>
+OptionPanel.standardlinkestyle = Estilo standard do link
+OptionPanel.standardlinkestyle.tooltip = <html>O estilo standard do link. Actualmente apenas 'b\u00E9zier' \u00E9 suportado</html>
+OptionPanel.standardselectednodecolor = Cor standard do n\u00F3 seleccionado
+OptionPanel.standardselectednodecolor.tooltip = <html>A cor standard do n\u00F3 seleccionado se mais nenhuma tiver sido especificada. Em nota\u00E7\u00E3o HTML (#RRGGBB valores hexadecimais) </html>
+OptionPanel.standardselectednoderectanglecolor = Cor do rect\u00E2ngulo de selec\u00E7\u00E3o
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>A cor standard do rect\u00E2ngulo que assinala os n\u00F3s seleccionados. Em nota\u00E7\u00E3o html (#RRGGBB em valores hex) </html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = Intervalo de tempo para Guardar automaticamente
+OptionPanel.time_for_automatic_save.tooltip = <html> tempo decorrido entre duas grava\u00E7\u00F5es autom\u00E1ticas (em mseg): Para desactivar grava\u00E7\u00F5es autom\u00E1ticas defina este n\u00FAmero para 2000000000.</html>
+OptionPanel.time_for_delayed_selection = Tempo para retardar a selec\u00E7\u00E3o
+OptionPanel.time_for_delayed_selection.tooltip = <html> O tempo de retardamento da selec\u00E7\u00E3o quando o rato passa sobre os n\u00F3s (em mseg). Altere este valor para 1 se pretender que a selec\u00E7\u00E3o se fa\u00E7a imediatamente ao passar do rato.</html>
+OptionPanel.toolTipManager.max_tooltip_width = Comprimento da ToolTip
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>A dimens\u00E3o por defeito da tooltip em pixels.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Tipo de letra indefinida
+OptionPanel.undo_levels = N\u00EDveis de anula\u00E7\u00E3o
+OptionPanel.undo_levels.tooltip = <html>Determina quantos passos ser\u00E3o guardados para anular atrav\u00E9s de "Anular".</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.use_tabbed_pane = Utilizar Separadores
+OptionPanel.use_tabbed_pane.tooltip = Se seleccionados os mapas s\u00E3o exibidos em separadores (como no FireFox :-) ).
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Velocidade
+OptionPanel.wheel_velocity.tooltip = Um valor alto resulta num movimento mais r\u00E1pido efeito dos movimentos da roda do rato no mapa.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Configurar p\u00E1gina
+PasteAction.text = Colar
+PatternNewNameProperty = Novo Padr\u00E3o
+PatternToString.backgroundColor = Cor de fundo
+PatternToString.color = Cor
+PatternToString.EdgeColor = Edge Color[translate me]
+PatternToString.EdgeStyle = Estilo do limite
+PatternToString.EdgeWidth = Largura do limite
+PatternToString.FontBold = Negrito
+PatternToString.Icon = \u00CDcone
+PatternToString.NodeFontSize = Tamanho das letras
+plugins/ScriptEditor.exit = Sair
+plugins/ScriptEditor.menu_actions = Ac\u00E7\u00F5es
+plugins/ScriptEditor.new_script = New Script[translate me]
+plugins/ScriptEditor.run = Executar
+plugins/ScriptEditor/window.Result = Resultado:
+plugins/ScriptEditor/window.title = Editor de Scripts
+plugins/TimeList.xml_Created = Criado
+plugins/TimeList.xml_Date = Data
+plugins/TimeList.xml_Icons = \u00CDcones
+plugins/TimeList.xml_Modified = Modificado
+plugins/TimeList.xml_Notes = Notas
+plugins/TimeList.xml_Text = Texto
+plugins/TimeManagement.xml_appendButton = Anexar a data aos n\u00F3s seleccionados
+plugins/TimeManagement.xml_Cancel = Cancelar
+plugins/TimeManagement.xml_cancelButton = Cancelar
+plugins/TimeManagement.xml_closeButton = Fechar
+plugins/TimeManagement.xml_Export = Exportar n\u00F3s seleccionados
+plugins/TimeManagement.xml_Find = Procurar
+plugins/TimeManagement.xml_Goto = Ir para
+plugins/TimeManagement.xml_hour = Horas:
+plugins/TimeManagement.xml_menu_actions = Ac\u00E7\u00F5es
+plugins/TimeManagement.xml_minute = Minutos:
+plugins/TimeManagement.xml_reminderButton = Lembrar-me nesta data
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Quando pressionado \u00E9 agendado um cron\u00F3metro para a data. Depois, os \u00EDcones cintilantes chamam-lhe a aten\u00E7\u00E3o.<br> Se fechar o mapa, os cron\u00F3metros s\u00E3o reactivados da pr\u00F3xima vez que o mapa for aberto.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Actualmente, s\u00F3 pode avir um alarme por cada n\u00F3. <br>O lembrete actual est\u00E1 definido para {0,date} {0,time}, a sua op\u00E7\u00E3o \u00E9 {1,date} {1,time}. <br><br>Pretende alterar a hora do lembrete (SIM) <br>ou pretende manter o anterior (N\u00C3O)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Lembrar agendamento em {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Remover lembrete
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Remover todos os lembretes associados aos n\u00F3s seleccionados.
+plugins/TimeManagement.xml_Replace = Substituir
+plugins/TimeManagement.xml_Replace_All = Substituir tudo
+plugins/TimeManagement.xml_Replace_Selected = Substituir seleccionados
+plugins/TimeManagement.xml_Select = Seleccionar
+plugins/TimeManagement.xml_todayButton = Hoje
+plugins/TimeManagement.xml_WindowTitle = Gest\u00E3o do Tempo
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Localizar & Substituir
+preferences = Prefer\u00EAncias
+PrintDirectAction.text = Imprimir...
+printing_settings = Escala
+PrintPreviewAction.text = Pr\u00E9-visualizar impress\u00E3o...
+PropertyAction.dialog = Preferences[translate me]
+PropertyAction.text = Prefer\u00EAncias ...
+QuitAction.text = Sair
+read_only = S\u00F3 Leitura
+really_remove_node = Confirma apagar o(s) n\u00F3(s)?
+RedoAction.text = Refazer
+RedoFilterAction.text = Refazer
+ReminderHookAction.text = Remover lembrete
+ReminderHookAction.tooltip = Remove o lembrete de um n\u00F3.
+RemoveAllIconsAction.text = Remover todos os \u00EDcones
+RemoveConnectorAction.text = Remove Connector[translate me]
+RemoveIconAction.text = Remover \u00FAltimo \u00EDcone
+repair_link = Corrigir Endere\u00E7o
+repair_link_question = Imposs\u00EDvel carregar o Mapa ligado. Reparar o endere\u00E7o de forma manual?
+replace = Substituir
+ReportBugAction.text = Report a Bug[translate me]
+RequestFeatureAction.text = Request a Feature[translate me]
+ResetNodeLocationAction.text = Repor a posi\u00E7\u00E3o
+save_failed = Tentativa de guardar o mapa {0} falhou.
+save_unsaved = Guardar este mapa? :
+SaveAction.text = Guardar
+SaveAll.text = Guardar &tudo
+SaveAll.tooltip = Guardar todos os mapas abertos.
+SaveAsAction.text = Guardar como...
+saved = Guardado
+scheme_evaluate = Avaliar!
+ScriptEditor.text = Editor de S&cripts...
+ScriptEditor.tooltip = Permite criar scripts grandes no Freeplane.
+ScriptEditorPanel.changed_cancel = Os scripts foram alterados. Confirma o abandono destas altera\u00E7\u00F5es?
+select_favorites_folder = Escolha a pasta em que se encontram os seus favoritos
+select_folder_for_importing = Escolha a pasta para importa\u00E7\u00E3o
+SelectAllAction.text = Seleccionar o que estiver vis\u00EDvel
+SelectBranchAction.text = Seleccionar o ramo vis\u00EDvel
+selection_method_by_click = Um clique para selecionar
+selection_method_delayed = Selec\u00E7\u00E3o autom\u00E1tica retardada
+selection_method_direct = Apontar selecciona
+SelectNoteAction.text = Passar para o Editor de Notas
+SelectNoteAction.tooltip = Mudar para a janela da nota
+SetImageByFileChooserAction.text = Incluir imagem (escolha ou "link")
+SetLinkByFileChooserAction.text = Incluir endere\u00E7o (procurar)
+SetLinkByTextFieldAction.text = Incluir endere\u00E7o (texto)
+ShowAllAttributesAction.text = Mostrar todos os atributos
+ShowAncestorsAction.text = Mostra ascendentes
+ShowAttributeDialogAction.text = Gestor de atributos
+ShowDescendantsAction.text = Mostra descendentes
+ShowHideNoteAction.text = Mostra/Oculta a janela de Notas
+ShowHideNoteAction.tooltip = \u00C9 um atalho de menu para as setas da linha divisora.
+ShowSelectedAttributesAction.text = Mostrar n\u00F3s seleccionadoos
+ShowSelectionAsRectangleAction.text = Mostra a selec\u00E7\u00E3o como rect\u00E2ngulo on/off
+simplyhtml.aboutFrameTitle = Acerca desta aplica\u00E7\u00E3o
+simplyhtml.aboutLabel = Acerca de SimplyHTML...
+simplyhtml.alignCenter = centro
+simplyhtml.alignLabel = Alinhamento:
+simplyhtml.alignLeft = esquerda
+simplyhtml.alignRight = direita
+simplyhtml.allCellsRangeLabel = todas as c\u00E9lulas
+simplyhtml.allOccurrencesReplaced = Todas as ocorr\u00EAncias substitu\u00EDdas
+simplyhtml.appendTableColLabel = Adicionar coluna
+simplyhtml.appendTableRowLabel = Adicionar linha
+simplyhtml.applyCellAttrLabel = Aplicar a
+simplyhtml.backgroundLabel = Fundo:
+simplyhtml.boldItalicName = negrito it\u00E1lico
+simplyhtml.boldName = negrito
+simplyhtml.borderColorLabel = Cor:
+simplyhtml.borderWidthLabel = Largura
+simplyhtml.bottomLabel = em baixo:
+simplyhtml.cancelBtnName = Cancelar
+simplyhtml.cellBorderTabLabel = Limites
+simplyhtml.cellGenTabLabel = Geral
+simplyhtml.cellMarginTabLabel = Margem
+simplyhtml.cellPanelTitle = Formato da c\u00E9lula
+simplyhtml.clearFormatLabel = Remover formata\u00E7\u00E3o
+simplyhtml.clearFormatTip = Remover formata\u00E7\u00E3o
+simplyhtml.close = Fechar
+simplyhtml.closeBtnName = Fechar
+simplyhtml.colorLabel = Cor
+simplyhtml.copyLabel = Copiar
+simplyhtml.copyTip = copiar
+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 = Lista ordenada
+simplyhtml.cTagNamePara = Par\u00E1grafo
+simplyhtml.cTagNameUL = Lista n\u00E3o ordenada
+simplyhtml.cutLabel = Cortar
+simplyhtml.cutTip = cortar
+simplyhtml.defaultDocName = Sem nome
+simplyhtml.deleteTableColLabel = Eliminar coluna
+simplyhtml.deleteTableRowLabel = Eliminar linha
+simplyhtml.docTitleQuery = T\u00EDtulo:
+simplyhtml.docTitleTitle = Editar T\u00EDtulo do Documento
+simplyhtml.editLabel = Editar
+simplyhtml.effectLabel = Efeitos
+simplyhtml.familyLabel = Fam\u00EDlia
+simplyhtml.findNext = Localizar seguinte...
+simplyhtml.findReplaceDialogTitle = Localizar & Substituir
+simplyhtml.findReplaceLabel = Localizar & Substituir
+simplyhtml.findReplaceTip = localizar & substituir
+simplyhtml.fontBoldLabel = Negrito
+simplyhtml.fontBoldTip = comutar negrito on/off
+simplyhtml.fontDialogTitle = Formatar tipo de letra
+simplyhtml.fontItalicLabel = It\u00E1lico
+simplyhtml.fontItalicTip = comutar it\u00E1lico on/off
+simplyhtml.fontLabel = Tipo de letra...
+simplyhtml.fontTabLabel = Tipo de letra
+simplyhtml.fontTip = Formatar fonte...
+simplyhtml.fontUnderlineLabel = Sublinhar
+simplyhtml.fontUnderlineTip = comutar sublinhar on/off
+simplyhtml.foregroundLabel = Primeiro plano:
+simplyhtml.formatLabel = Formatar
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = alterar o formato da lista
+simplyhtml.formatParaLabel = Par\u00E1grafo...
+simplyhtml.formatParaTip = Alterar o formato do par\u00E1grafo
+simplyhtml.formatTableLabel = Tabela...
+simplyhtml.formatTableTip = Formatar tabela
+simplyhtml.helpLabel = Ajuda
+simplyhtml.htmlTabTitle = Ver c\u00F3digo HTML
+simplyhtml.imageFileDesc = Ficheiros de imagem
+simplyhtml.insertTableColLabel = Inserir coluna
+simplyhtml.insertTableLabel = Tabela...
+simplyhtml.insertTableMsg = Quantas colunas?
+simplyhtml.insertTableRowLabel = Inserir linha
+simplyhtml.insertTableTitle = inserir Tabela
+simplyhtml.italicName = it\u00E1lico
+simplyhtml.layoutTabTitle = Vista de Layout
+simplyhtml.leftLabel = esquerda:
+simplyhtml.listDialogTitle = Formatar lista
+simplyhtml.listIndentTitle = Indentar:
+simplyhtml.listPosInside = dentro
+simplyhtml.listPositionLabel = Posi\u00E7\u00E3o:
+simplyhtml.listPosOutside = fora
+simplyhtml.listTypeCircle = marcador redondo
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = s\u00EDmbolo de ficheiro como marcador
+simplyhtml.listTypeLabel = Tipo:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = nenhum
+simplyhtml.listTypeSquare = marcador quadrado
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Exterior
+simplyhtml.matchCase = Coincidir
+simplyhtml.newStyleDefaultName = novo estilo
+simplyhtml.nextTableCellLabel = C\u00E9lula seguinte
+simplyhtml.noLineLabel = nenhum
+simplyhtml.noMoreOccurrencesFound = n\u00E3o foram encontradas (mais) ocorr\u00EAncias
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Interior
+simplyhtml.paraAlignCenterLabel = Alinhar ao centro
+simplyhtml.paraAlignCenterTip = Define alinhamento do par\u00E1grafo ao centro
+simplyhtml.paraAlignLeftLabel = Alinhar \u00E0 esquerda
+simplyhtml.paraAlignLeftTip = Define alinhamento do par\u00E1grafo \u00E0 esquerda
+simplyhtml.paraAlignRightLabel = Alinhar \u00E0 direita
+simplyhtml.paraAlignRightTip = Define alinhamento do par\u00E1grafo \u00E0 direita
+simplyhtml.paraStyleDialogTitle = Estilo de par\u00E1grafo
+simplyhtml.paraTabLabel = Par\u00E1grafo
+simplyhtml.pasteLabel = Colar
+simplyhtml.pasteTip = colar
+simplyhtml.plainName = simples
+simplyhtml.previewLabel = Pr\u00E9-visualizar
+simplyhtml.previewText = Pr\u00E9-visualizar texto
+simplyhtml.prevTableCellLabel = C\u00E9lula anterior
+simplyhtml.redoLabel = Refazer
+simplyhtml.redoTip = refazer
+simplyhtml.replace = Substituir...
+simplyhtml.replaceAll = Todos
+simplyhtml.replaceDone = Feito
+simplyhtml.replaceNo = N\u00E3o
+simplyhtml.replaceThisQuery = substituir estas ocorr\u00EAncias por
+simplyhtml.replaceWith = Substituir por:
+simplyhtml.replaceYes = Sim
+simplyhtml.rightLabel = direita:
+simplyhtml.searchDown = Procurar abaixo
+simplyhtml.searchFromStart = Procurar desde o in\u00EDcio
+simplyhtml.searchUp = Procurar acima
+simplyhtml.selectAllLabel = Seleccionar tudo
+simplyhtml.sizeLabel = Tamanho
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Riscado
+simplyhtml.styleLabel = Estilo
+simplyhtml.styleNameInputText = Nome do novo estilo?
+simplyhtml.styleNameInputTitle = Guardar estilo
+simplyhtml.tableBgColLabel = Cor de fundo:
+simplyhtml.tableDialogTitle = Formato da tabela
+simplyhtml.tableLabel = Tabela
+simplyhtml.tablePanelTitle = Formato da tabela
+simplyhtml.tableWidthLabel = Largura:
+simplyhtml.textIndentLabel = Indentar:
+simplyhtml.textToFind = Texto a procurar:
+simplyhtml.thisCellRangeLabel = esta c\u00E9lula
+simplyhtml.thisColRangeLabel = esta coluna
+simplyhtml.thisRowRangeLabel = esta linha
+simplyhtml.toggleBulletsLabel = Lista com marcas on/off
+simplyhtml.toggleBulletsTip = lista com marcas on/off
+simplyhtml.toggleNumbersLabel = Lista numerada on/off
+simplyhtml.toggleNumbersTip = lista numerada on/off
+simplyhtml.topLabel = em cima:
+simplyhtml.uLineLabel = Sublinhar
+simplyhtml.unableToOpenFileError = O ficheiro n\u00E3o pode ser aberto
+simplyhtml.unableToRedoError = Imposs\u00EDvel refazer:
+simplyhtml.unableToUndoError = Imposs\u00EDvel anular:
+simplyhtml.undoLabel = Anular
+simplyhtml.undoTip = anular
+simplyhtml.valignBaseline = na linha
+simplyhtml.valignBottom = em baixo
+simplyhtml.valignLabel = Alinhamento Vert.:
+simplyhtml.valignMiddle = ao centro
+simplyhtml.valignTop = em cima
+simplyhtml.wholeWordsOnly = Apenas palavras inteiras
+SortNodes.text = &Listar descendentes
+SortNodes.tooltip = Lista alfabeticamente todos os descendentes de um n\u00F3.
+split = Dividir
+SplitNode.text = Dividir o n\u00F3
+SplitNode.tooltip = <html>O n\u00F3 est\u00E1 dividido*</html>
+style = Estilo
+svg = SVG[translate me]
+TimeListAction.text = Mostra a lista de agendamentos ...
+TimeListAction.tooltip = Mostra todos os agendamentos e os n\u00F3s correspondentes.
+TimeManagementAction.text = Mostrar calend\u00E1rio...
+TimeManagementAction.tooltip = <html>Mostra o m\u00F3dulo Chat e calend\u00E1rio de Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Alternar descendentes
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Alternar pasta
+ToggleLeftToolbarAction.text = Alternar barra de ferramentas esquerda
+ToggleMenubarAction.text = Alternar barra de menu
+ToggleToolbarAction.text = Alternar barra de ferramentas
+undefined_error = Occureu um erro inesperado. Tente criar um relat\u00F3rio de erros.
+underline = Sublinhar
+underlined = Sublinhado
+UndoAction.text = Anular
+UndoFilterAction.text = Anular
+unfold = Expandir
+UnfoldAllAction.text = Desdobra todos
+UnfoldAllAction.tooltip = <html>Desdobra os n\u00F3s seleccionados e todos os seus descendentes.</html>
+UnfoldOneLevelAction.text = Desdobra um n\u00EDvel
+UnfoldOneLevelAction.tooltip = <html>Desdobra os n\u00F3s todos um n\u00EDvel.</html>
+UpdateCheckAction.text = Check for Updates[translate me]
+url_error = Endere\u00E7o mal escrito!
+url_load_error = Imposs\u00EDvel carregar mapa no endere\u00E7o:
+UsePlainTextAction.text = Utilizar Texto simples
+user_defined_zoom = Personalizado.
+user_defined_zoom_status_bar = Alterar o zoom personalizado para {0}%.
+user_zoom = Factor zoom (0.0 - 2.0):
+width = Largura
+yes = Sim
+ZoomInAction.text = Zoom +
+ZoomOutAction.text = Zoom -
diff --git a/freeplane/resources/translations/Resources_ru.properties b/freeplane/resources/translations/Resources_ru.properties
new file mode 100644
index 0000000..cce5438
--- /dev/null
+++ b/freeplane/resources/translations/Resources_ru.properties
@@ -0,0 +1,1591 @@
+AboutAction.text = \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...
+acceleratorPresets = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+accelerators_loading_error = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0437 {0}
+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 = \u041e\u041a
+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<br> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0443\u0437\u0435\u043b \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e"
+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>
+action_keystroke_in_use_error = \u0421\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 {0}, \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f {1} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f {2}
+active = \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439
+actual_map_styles = \u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u043a \u0443\u0437\u043b\u0443
+actual_node_styles = \u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0443\u0437\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u043a \u0443\u0437\u043b\u0443
+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
+AddMenuItemLinkAction.text = \u0413\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0430 (\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u0430 \u043c\u0435\u043d\u044e)...
+addons.installer.canceled = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430
+addons.installer.description = \u0423\u0437\u0435\u043b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+addons.installer.failed = \u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438: {0}
+addons.installer.freeplaneversion.format.error = \u041e\u0448\u0438\u0431\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 {0} (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {1})
+addons.installer.groovy.script.name = \u0421\u043a\u0440\u0438\u043f\u0442 {0} \u043d\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 ".groovy"
+addons.installer.html.script = \u0422\u0435\u043b\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u0430\u043a HTML
+addons.installer.map.structure = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u0430\u0440\u0442\u044b: {0}
+addons.installer.missing.child.nodes = \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b: {0}
+addons.installer.missing.permission.attribute = \u0421\u043a\u0440\u0438\u043f\u0442 {0}: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 {1}
+addons.installer.missing.properties = \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430: {0}
+addons.installer.missing.translation = \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 {0} \u0432 \u044f\u0437\u044b\u043a\u0435 {1}
+addons.installer.no.scripts = \u0421\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b
+addons.installer.success = \u0423\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430.\n\u041d\u043e\u0432\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.
+addons.installer.title = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439
+addons.installer.too.new = \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Freeplane {0} \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u043e\u0432\u0430\u044f. \u042d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 {1}
+addons.installer.too.old = \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Freeplane {0} \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0442\u0430\u0440\u0430\u044f. \u042d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432\u0435\u0440\u0441\u0438\u0438 {1}
+addons.installer.unknown.deinstallation.rules = \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f {0}
+AddStyleAttributes.text = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0442\u0438\u043b\u044f
+AddStyleAttributes.tooltip = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u0432\u043a\u0430 \u0441\u0442\u0438\u043b\u044f
+AllMapsNodeListAction.text = \u041d\u0430\u0439\u0442\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u0440\u0442\u0430\u0445
+always = \u0412\u0441\u0435\u0433\u0434\u0430
+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
+ApplyAction.text = &\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
+AskForHelp.text = \u0417\u0430\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u043c\u043e\u0449\u0438
+AssignAttributesAction.text = &\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b...
+attribute_delete = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
+attribute_delete_value = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
+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 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442
+attributes_AddAttributeAction.text = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u0435...
+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_assign_dialog = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \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 = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+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_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 = &\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+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_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_RemoveAllAttributesAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+attributes_RemoveFirstAttributeAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+attributes_RemoveLastAttributeAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+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 = \u0412\u0441\u0435
+attributes_select_all_tooltip = \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c / \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\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 = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435
+attributes_visible_tooltip = \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}) ...
+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
+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
+bitmaps = \u0422\u043e\u0447\u0435\u0447\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a
+black = \u0427\u0435\u0440\u043d\u044b\u0439
+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\u0437\u043b\u043e\u0432 \u0438 <strong> \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432</strong></html>
+blue = \u0421\u0438\u043d\u0438\u0439
+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
+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_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_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
+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
+ChangeConnectorArrowsAction.backward.text = \u041d\u0430\u0437\u0430\u0434
+ChangeConnectorArrowsAction.both.text = \u041d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043d\u0446\u0430\u0445
+ChangeConnectorArrowsAction.forward.text = \u0412\u043f\u0435\u0440\u0451\u0434
+ChangeConnectorArrowsAction.none.text = \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
+ChangeConnectorArrowsAction.text = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0438
+ChangeConnectorShapeAction.CUBIC_CURVE.text = \u041a\u0440\u0438\u0432\u0430\u044f
+ChangeConnectorShapeAction.EDGE_LIKE.text = \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430
+ChangeConnectorShapeAction.LINE.text = \u041b\u0438\u043d\u0438\u044f
+ChangeConnectorShapeAction.LINEAR_PATH.text = \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u0443\u0442\u044c
+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\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \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\u0432\u0435\u0440\u0445. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u0443\u0437\u043b\u044b \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.
+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\u0430\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \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\u0432\u0435\u0440\u0445. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u0443\u0437\u043b\u044b \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.
+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 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443
+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
+CloudShapeAction.RECT.text = \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a
+CloudShapeAction.ROUND_RECT.text = \u0417\u0430\u043a\u0440\u0443\u0433\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a
+CloudShapeAction.STAR.text = \u0417\u0432\u0435\u0437\u0434\u0430
+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
+condition = \u0423\u0441\u043b\u043e\u0432\u0438\u0435
+confirmation = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435
+connector = \u0421\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044c
+connector_arrows = \u0421\u0442\u0440\u0435\u043b\u043a\u0438 \u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044f
+connector_label = \u041c\u0435\u0442\u043a\u0430 \u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044f
+connector_lines = \u041b\u0438\u043d\u0438\u0438 \u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044f
+connector_shapes = \u0424\u043e\u0440\u043c\u044b \u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044f
+ConnectorColorAction.text = \u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438...
+CopyAction.text = &\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+CopyAction.tooltip = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0442\u0432\u044c
+CopyAttributes.text = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+CopyIDAction.text = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c ID \u0443\u0437\u043b\u0430
+CopyMapStylesAction.text = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u0430\u0440\u0442\u044b \u0438\u0437...
+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
+CopySingleAction.tooltip = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+CopyStyleExtensionsAction.text = \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0437 \u0441\u0442\u0438\u043b\u044f
+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
+CreateConjunctConditionAction.text = \u0418
+CreateDisjunctConditionAction.text = \u0418\u043b\u0438
+CreateNotSatisfiedConditionAction.text = \u041d\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>
+current_dir = \u041a\u0430\u0440\u0442\u044b
+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
+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.details = \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 (\u0434\u0435\u0442\u0430\u043b\u0438)
+defaultstyle.note = \u0417\u0430\u043c\u0435\u0442\u043a\u0430
+delete = &\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+delete_child = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+DeleteAction.text = &\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+DeleteConditionAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
+DeleteDetailsAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438
+DeleteLevelStyleAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0438\u043b\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439
+DeleteStyleAction.text = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
+DeleteUserStyleAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+DirectHtmlFlavorHandler = HTML \u043a\u0430\u043a \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+DocumentationAction.text = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f
+down = \u0412&\u043d\u0438\u0437
+download = \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+dropped_file_error = \u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0435\u0440\u0435\u0442\u044f\u043d\u0443\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \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\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0438\u043b\u0435\u043c. \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c.
+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_details = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0443\u0437\u043b\u0430
+edit_end_label = <html>\u041c\u0435\u0442\u043a\u0430<br>\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044f
+edit_label_font_family = \u0428\u0440\u0438\u0444\u0442
+edit_label_font_size = \u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+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
+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_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_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
+edit_transparency_label = \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c
+edit_width_label = \u0428\u0438\u0440\u0438\u043d\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
+EditDetailsAction.text = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0443\u0437\u043b\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435
+EditDetailsInDialogAction.text = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0443\u0437\u043b\u0430 \u0432 \u043e\u043a\u043d\u0435
+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...
+EditNoteInDialogAction.text = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c &\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435...
+EditScript = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442...
+EditStylesAction.text = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u0438
+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_condition_name = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f
+enter_confirms = \u041a\u043b\u0430\u0432\u0438\u0448\u0430 <&\u0412\u0412\u041e\u0414> \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+enter_keyset_name = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
+enter_new_style_name = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f
+enter_node_id = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 ID \u0443\u0437\u043b\u0430
+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
+errornumber = {0} \u043e\u0448\u0438\u0431\u043a\u0430(\u043e\u043a)
+ExecuteScriptError.text = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430:\n {0}\n\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043b\u043e\u0433 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f.
+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\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u043e\u0432\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b
+ExecuteScriptOnSelectedNode.text = \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c {0} \u043d\u0430 \u0432\u0441\u0435\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445
+ExecuteScriptOnSelectedNodeRecursively.text = \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c {0} \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
+ExecuteScriptOnSingleNode.text = \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c {0} \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0443\u0437\u043b\u0435
+ExecuteScripts.noScriptsAvailable = \u041d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b
+ExecuteScripts.text = \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b
+export_failed = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0443\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\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 = Freeplane \u044d\u043a\u0441\u043f\u043e\u0440\u0442
+ExportAction.text = &\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443
+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
+exported_file = {0} \u0444\u0430\u0439\u043b
+ExportPdf.text = \u041a\u0430\u043a PDF
+ExportSvg.text = \u041a\u0430\u043a SVG
+ExportToHTMLAction.text = \u041a\u0430\u043a HTML
+ExportToImage.jpg.text = \u041a\u0430\u043a JPEG
+ExportToImage.png.text = \u041a\u0430\u043a PNG
+ExportToOoWriter.text = \u041a\u0430\u043a Open Office Writer Document...
+extension_menu = &\u0421\u0442\u0438\u043b\u044c
+ExternalImage_popupMenu_Change = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c...
+ExternalImage_popupMenu_Open = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a\u0435
+ExternalImage_popupMenu_Remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
+ExternalImage_popupMenu_ResetZoom = \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431
+ExternalImageAddAction.text = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435
+ExternalImageChangeAction.text = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435
+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
+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
+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.
+FileListFlavorHandler = \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0444\u0430\u0439\u043b\u044b
+FileProperties_BranchLeafCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432 \u0441 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435(\u0430\u0445):
+FileProperties_BranchNodeCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435(\u0430\u0445):
+FileProperties_ChangesSinceLastSave = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0435\u043d\u0438\u044f:
+FileProperties_FileName = \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430:
+FileProperties_FileSaved = \u0424\u0430\u0439\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d:
+FileProperties_FileSize = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430:
+FileProperties_MainBranchCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432:
+FileProperties_NeverSaved = \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430\u0441\u044c
+FileProperties_NodeChildCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432:
+FileProperties_NodeSelectionCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432:
+FileProperties_TotalFilteredCount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0443:
+FileProperties_TotalLeafCount = \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432 \u0441 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438:
+FileProperties_TotalNodeCount = \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432:
+FilePropertiesAction.text = \u0421\u0432\u043e\u0439\u0441&\u0442\u0432\u0430...
+filter = \u0424\u0438\u043b\u044c\u0442\u0440
+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_details = \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438
+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_even_level = \u041d\u0435\u0447\u0435\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0437\u043b\u0430
+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_is_equal_to = \u0420\u0430\u0432\u0435\u043d
+filter_is_not_equal_to = \u041d\u0435\u0440\u0430\u0432\u0435\u043d
+filter_leaf = \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0443\u0437\u0435\u043b
+filter_link = \u0413\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0430
+filter_match_case = \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c &\u0440\u0435\u0433\u0438\u0441\u0442\u0440
+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_node_level = \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438
+filter_not = &\u041d\u0435
+filter_note = \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435
+filter_odd_level = \u0427\u0435\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0437\u043b\u0430
+filter_or = \u0418&\u043b\u0438
+filter_parent = \u0422\u0435\u043a\u0441\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
+filter_periodic_level = \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435
+filter_priority = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442
+filter_regexp_matches = \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e
+filter_reminder = \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+filter_reminder_after = \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u043b\u0435
+filter_reminder_before = \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043e
+filter_reminder_executed = \u0443\u0436\u0435 \u0443\u0432\u043e\u043b\u0438\u043b\u0438
+filter_reminder_later = \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0437\u0436\u0435
+filter_root = \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430
+filter_script = \u0424\u0438\u043b\u044c\u0442\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432
+filter_select = &\u0412\u044b\u0431\u0440\u0430\u0442\u044c
+filter_selected_node_view = \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\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
+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
+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
+FitToPage.text = \u0423\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e &\u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443
+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_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
+format_menu_edge_widths = \u0422&\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
+format_panel = \u0424\u043e\u0440\u043c\u0430\u0442
+FormatCopy.text = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a)
+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 (\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a)
+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>
+formats_not_loaded = \u0424\u043e\u0440\u043c\u0430\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b, \u0444\u0430\u0439\u043b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d
+formula.error.attributeValueIsNull = \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 "{0}" - \u043d\u0443\u043b\u0435\u0432\u043e\u0435.
+formula.error.circularReference = \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430: \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0432 \u0443\u0437\u043b\u0435 "{0}" \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f.
+formula.EvaluateAllAction.text = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0451
+formula.EvaluateAllAction.tooltip = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438
+formula.menuname = \u0424\u043e\u0440\u043c\u0443\u043b\u044b
+formula_editor = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443
+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
+FreeNodeAction.text = \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430/\u0441\u0431\u0440\u043e\u0441)
+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...
+GettingStartedAction.text = \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435
+GotoLinkNodeAction.text = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0432\u044f\u0437\u0438
+GotoNodeAction.text = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u0441 ID...
+GrabKeyDialog.common.cancel = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+GrabKeyDialog.common.ok = \u041e\u041a
+GrabKeyDialog.grab-key.assigned-to = \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e
+GrabKeyDialog.grab-key.assigned-to.none = \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
+GrabKeyDialog.grab-key.clear = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
+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
+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
+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
+hot_keys = \u0413\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+hot_keys_table = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
+HotKeyInfoAction.text = \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+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_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435
+icon_attach = \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435
+icon_back = \u041d\u0430\u0437\u0430\u0434
+icon_bee = Freeplane
+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 \u041e\u041a
+icon_button_ok = \u041e\u041a
+icon_calendar = \u0414\u0430\u0442\u0430
+icon_clanbomber = \u041e\u043f\u0430\u0441\u043d\u043e
+icon_clock = \u0412\u0440\u0435\u043c\u044f
+icon_clock2 = \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+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_division = \u0414\u0435\u043b\u0435\u043d\u0438\u0435
+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 = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+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_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_icon_not_found = \u0418\u043a\u043e\u043d\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043b\u0430
+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_multiplication = \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0430\u0446\u0438\u044f
+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 = \u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c
+icon_penguin = \u041b\u0438\u043d\u0443\u043a\u0441
+icon_positive = \u041f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u043e
+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 = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
+icon_stop-sign = \u0421\u0442\u043e\u043f
+icon_subtraction = \u0412\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435
+icon_up = \u0412\u0432\u0435\u0440\u0445
+icon_user_icon = \u0418\u043a\u043e\u043d\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+icon_very_negative = \u041e\u0447\u0435\u043d\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e
+icon_very_positive = \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u043e
+icon_wizard = \u041c\u0430\u0433\u0438\u044f
+icon_xmag = \u041e\u0431\u0441\u0443\u0434\u0438\u0442\u044c
+icon_yes = \u0412\u0430\u0436\u043d\u043e
+IconGroupPopupAction.arrows.text = \u0421\u0442\u0440\u0435\u043b\u043a\u0438
+IconGroupPopupAction.docs_folders.text = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0430\u043f\u043a\u0438
+IconGroupPopupAction.flags.text = \u0424\u043b\u0430\u0433\u0438
+IconGroupPopupAction.math.text = \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430
+IconGroupPopupAction.miscellaneous.text = \u0420\u0430\u0437\u043d\u044b\u0435
+IconGroupPopupAction.nature.text = \u041f\u0440\u0438\u0440\u043e\u0434\u0430
+IconGroupPopupAction.numbers.text = \u0427\u0438\u0441\u043b\u0430
+IconGroupPopupAction.office.text = \u041e\u0444\u0438\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 = \u0420\u043e\u0436\u0438\u0446\u044b
+IconGroupPopupAction.time.text = \u0412\u0440\u0435\u043c\u044f
+IconGroupPopupAction.user.text = \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438
+IconProgressExtended10Action.text = \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 10%
+IconProgressExtended25Action.text = \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 25%
+IconProgressIconDownAction.text = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437
+IconProgressIconDownAction.tooltip = \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c/ \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c/ \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (100% -> 75% -> 50% -> 25% -> 0% -> \u0423\u0434\u0430\u043b\u0438\u0442\u044c).
+IconProgressIconUpAction.text = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445
+IconProgressIconUpAction.tooltip = \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c/ \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (0% -> 25% -> 50% -> 75% -> 100% + OK).
+IconProgressRemoveAction.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435
+IconProgressRemoveAction.tooltip = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\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>
+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
+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...
+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
+internal_error_tooltip = \u0412\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 log \u0444\u0430\u0439\u043b {0} \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.
+invalid_uri = \u041e\u0448\u0438\u0431\u043a\u0430 URI {0}
+invalid_url = \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e URL
+invalid_url_msg = \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e URL \u0434\u043b\u044f {0}
+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
+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...
+LatexInsertLatexAction.text = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c &LaTeX \u0444\u043e\u0440\u043c\u0443\u043b\u0443...
+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
+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, \u0443\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.
+load = &\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
+locking_failed_by_open = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f
+locking_failed_by_save_as = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d.
+locking_old_lock_removed = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0431\u044b\u043b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1}. \u042d\u0442\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u043a\u0430\u043a \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f
+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?
+main_resource_directory = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b: {0}
+MainView.errorUpdateText = \u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u0432\u043e\u0434: {0}\n \u041e\u0448\u0438\u0431\u043a\u0430: {1}
+ManageAddOnsAction.text = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f
+ManageAddOnsDialog.actions = \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+ManageAddOnsDialog.activate = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c
+ManageAddOnsDialog.activation.success = {0} \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430.
+ManageAddOnsDialog.cannot.activate = \u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438: {0} \u0443\u0436\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d.
+ManageAddOnsDialog.cannot.configure = \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {0}.
+ManageAddOnsDialog.cannot.deactivate = \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438: {0} \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d.
+ManageAddOnsDialog.cannot.deinstall = \u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f {0}.
+ManageAddOnsDialog.deactivate = \u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c
+ManageAddOnsDialog.deactivation.success = {0} \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430.
+ManageAddOnsDialog.deinstall = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
+ManageAddOnsDialog.deinstallation.success = {0} \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430.
+ManageAddOnsDialog.description = \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+ManageAddOnsDialog.error = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435: {0}.
+ManageAddOnsDialog.install = &\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c
+ManageAddOnsDialog.map.not.opened = \u041a\u0430\u0440\u0442\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 {0}, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0430.
+ManageAddOnsDialog.name = \u0418\u043c\u044f
+ManageAddOnsDialog.PLUGIN = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435
+ManageAddOnsDialog.SCRIPT = \u0421\u043a\u0440\u0438\u043f\u0442
+ManageAddOnsDialog.select.tooltip = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b
+ManageAddOnsDialog.status.downloading = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430...
+ManageAddOnsDialog.status.installing = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f...
+ManageAddOnsDialog.status.success = \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e {0}.
+ManageAddOnsDialog.type = \u0422\u0438\u043f
+ManageAddOnsDialog.version = \u0412\u0435\u0440\u0441\u0438\u044f
+ManageConditionalStylesAction.text = \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u043a\u0430\u0440\u0442\u044b
+ManageNodeConditionalStylesAction.text = \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u0443\u0437\u043b\u0430
+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_locked_by_open = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0443\u0436\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1}. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.
+map_locked_by_save_as = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0443\u0436\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c {1} \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d.
+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
+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
+menu_copy = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+menu_coreFormat = \u042f\u0434\u0440\u043e \u0443\u0437\u043b\u0430
+menu_details = \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438
+menu_displayAttributes = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0443\u0437\u043b\u0430
+menu_encryption = \u0428\u0438\u0444\u0440\u043e\u0432\u0430\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...
+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_progress = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435
+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
+mindmap = \u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430
+MindMapNodesFlavorHandler = \u0414\u0435\u0440\u0435\u0432\u043e \u0443\u0437\u043b\u043e\u0432
+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
+ModesMenuAction.Browse.text = \u041e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0440\u0442
+ModesMenuAction.File.text = \u041e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044c \u0444\u0430\u0439\u043b\u043e\u0432
+ModesMenuAction.MindMap.text = \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u0430\u0440\u0442 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f
+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
+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
+new_map_from_user_templates.text = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443...
+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
+new_version_available = \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f ''{0}''
+NewChildAction.text = \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+NewerFileRevisionsFoundDialog.cancel = &\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c
+NewerFileRevisionsFoundDialog.cancel.tooltip = \u041d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b
+NewerFileRevisionsFoundDialog.file_last_modified = \u0428\u0442\u0430\u043c\u043f \u0432\u0440\u0435\u043c\u0435\u043d\u0438
+NewerFileRevisionsFoundDialog.file_name = \u0424\u0430\u0439\u043b
+NewerFileRevisionsFoundDialog.file_size = \u0411\u0430\u0439\u0442(\u043e\u0432)
+NewerFileRevisionsFoundDialog.open = &\u041e\u0442\u043a\u0440\u044b\u0442\u044c
+NewerFileRevisionsFoundDialog.open.tooltip = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0441\u0442\u0430\u0440\u0435\u043b
+NewerFileRevisionsFoundDialog.question = \u041d\u0430\u0439\u0434\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f {0}!\n\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c {0} (\u0441\u043c. \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443) \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e?\n\u0414\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b {0} \u0430\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430\n\u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0435\u0433\u043e \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c".
+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!
+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
+NewMapAction.text = \u0421\u043e\u0437\u0434&\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443
+NewMapViewAction.text = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 \u043a\u0430\u0440\u0442\u044b
+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
+NewSummaryAction.text = \u041d\u043e\u0432\u044b\u0439 \u0441\u0432\u043e\u0434\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+NewUserStyleAction.text = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0438\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e
+NextNodeAction.BACK.text = \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+NextNodeAction.BACK_N_FOLD.text = \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0448\u0438\u0439 \u0443\u0437\u0435\u043b (\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
+NextNodeAction.FORWARD.text = \u0421\u043b\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+NextNodeAction.FORWARD_N_FOLD.text = \u0421\u043b\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b (\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
+no = \u041d\u0435\u0442
+no_copy_attributes_before_paste_attributes = \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c.
+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_found_from = <html>\u0422\u0435\u043a\u0441\u0442 <u>{0}</u> \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 "{1}".
+no_more_found_from = <html>\u0422\u0435\u043a\u0441\u0442 <u>{0}</u> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 "{1}".
+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\u043c\u0438, \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0449\u0435\u043b\u0447\u043e\u043a \u0438 <ctrl>+\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0449\u0435\u043b\u0447\u043e\u043a \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u0438\u0445.
+node_selector = \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+node_selector_message = \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0449\u0435\u043b\u0447\u0451\u043a \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0443\u0437\u043b\u0435
+node_styles = \u0421\u0442\u0438\u043b\u0438 \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
+NodeExtensions.EditNodeExtensions = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430
+NodeExtensions.RemoveNodeExtensions = \u0423\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430
+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_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
+ok = &\u041e\u041a
+OKAction.text = &\u041e\u041a
+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 Freeplane
+OpenPathAction.text = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b
+OpenUserDirAction.text = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\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.ADD_CHILD = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b
+OptionPanel.ADD_SIBLING = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+OptionPanel.addons = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f
+OptionPanel.always_fold_all_after_load = \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.always_load_last_maps = \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438 \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b
+OptionPanel.always_load_last_maps.tooltip = \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0432\u044b\u0448\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 FP \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u043c.
+OptionPanel.always_save_folding = \u0412\u0441\u0435\u0433\u0434\u0430
+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_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\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.
+OptionPanel.always_unfold_all_after_load = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.antialias = \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\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.Appearance = \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434
+OptionPanel.ar = \u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439
+OptionPanel.ARC = \u0414\u0443\u0433\u0430
+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.backup_file_number = \u0427\u0438\u0441\u043b\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432
+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.ca = \u041a\u0430\u0442\u0430\u043b\u0430\u043d\u0441\u043a\u0438\u0439
+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.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
+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.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.clear_all_setters = \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435
+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.cloud = \u041e\u0431\u043b\u0430\u043a\u043e
+OptionPanel.cloudcolor = \u041e\u0431\u043b\u0430\u043a\u043e \u0438 \u0446\u0432\u0435\u0442
+OptionPanel.cloudshape = \u041e\u0431\u043b\u0430\u043a\u043e \u0438 \u0444\u043e\u0440\u043c\u044b
+OptionPanel.combined = \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
+OptionPanel.compare_as_number = \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u0430
+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.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\u0430\u0442\u0435\u043b\u0435\u0439) \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0431\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.</html>
+OptionPanel.cs = \u0427\u0435\u0448\u0441\u043a\u0438\u0439
+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.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\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0441\u0446\u0435\u043b\u044c\u043d\u043e.
+OptionPanel.da = \u0414\u0430\u0442\u0441\u043a\u0438\u0439
+OptionPanel.date_format = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b
+OptionPanel.date_format.tooltip = \u041b\u0438\u0431\u043e SHORT, MEDIUM, LONG \u0438\u043b\u0438 FULL \u0438\u043b\u0438 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 "MM/dd/yyyy"
+OptionPanel.datetime_format = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b/\u0432\u0440\u0435\u043c\u0435\u043d\u0438
+OptionPanel.datetime_format.tooltip = \u041b\u0438\u0431\u043e <datestyle>,<timestyle> (\u0441 SHORT, MEDIUM, LONG \u0438\u043b\u0438 FULL \u043a\u0430\u043a \u0441\u0442\u0438\u043b\u0435\u043c) \u0438\u043b\u0438 \u043f\u043e \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443 "M/d/yyyy hh:mm"
+OptionPanel.de = \u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
+OptionPanel.default = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442
+OptionPanel.default_browser_command_mac = \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Mac
+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_other_os = \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0438\u0445 \u041e\u0421
+OptionPanel.default_browser_command_other_os.tooltip = <html> \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e Linux:</html>
+OptionPanel.default_browser_command_windows_9x = \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows 9x
+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_nt = \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows NT
+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_charset = \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430
+OptionPanel.Defaults = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b
+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_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 \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</html>
+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.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\u043e\u0442\u0435\u0440\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0435\u043f\u0440\u0435\u0434\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e.
+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.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.display_inline_editor_for_all_new_nodes = \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.display_node_id = \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c ID \u0443\u0437\u043b\u0430
+OptionPanel.edgecolor = \u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
+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.edgestyle = \u0421\u0442\u0438\u043b\u044c \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.edgewidth = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \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.EDIT_CURRENT = \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435
+OptionPanel.editor_extra_width = \u041e\u0441\u043e\u0431\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0448\u0438\u0440\u0438\u043d\u044b
+OptionPanel.el = \u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
+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.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 = \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_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\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b.</html>
+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_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\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f(\!),<br>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\!</body></html>
+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_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\u044b\u0442\u044c, \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c(\!)),<br>\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\!</body></html>
+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.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\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e\!</body></html>
+OptionPanel.execute_scripts_without_write_restriction = \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438/\u0437\u0430\u043f\u0438\u0441\u044c (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>\u0415\u0441\u043b\u0438 \u0412\u0430\u0448\u0438\u043c Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043e\u0441\u0443\u043f \u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 (\u0437\u0430\u043f\u0438\u0441\u044c, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435(!)),<br>\u0442\u043e \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<br>But use it with care, as now malicious scripts can hurt your computer!\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u043e \u0441 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u0432\u0440\u0435\u0434 \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443!</body></html>
+OptionPanel.experimental_file_locking_on = \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442)
+OptionPanel.experimental_file_locking_on.tooltip = <html> \u041f\u0440\u043e\u0431\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f</html>
+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.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\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b </html>
+OptionPanel.Files = \u0424\u0430\u0439\u043b\u044b
+OptionPanel.first = \u041f\u0435\u0440\u0432\u044b\u0439
+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.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.fork = \u0412\u0435\u0442\u043a\u0430
+OptionPanel.format_locale = \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432
+OptionPanel.format_locale.tooltip = \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445
+OptionPanel.formula_disable_caching = \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0435\u0448 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u0443\u043b
+OptionPanel.formula_disable_plugin = \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b
+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.goto_note_end_on_edit = \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0432 \u043a\u043e\u043d\u0435\u0446
+OptionPanel.grid_size = \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0437\u043e\u0440\u0430 \u0441\u0435\u0442\u043a\u0438
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
+OptionPanel.horizontal = \u043b\u043e\u043c\u0430\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f
+OptionPanel.hr = \u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
+OptionPanel.HTML = HTML
+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.hu = \u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439
+OptionPanel.icon = \u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
+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 = \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.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\u043e\u043c ';'.
+OptionPanel.id = \u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439
+OptionPanel.IGNORE = \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c
+OptionPanel.il__enter_confirms_by_default = <\u0412\u0412\u041e\u0414> \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+OptionPanel.it = \u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439
+OptionPanel.ja = \u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439
+OptionPanel.key_type_action = \u041f\u0440\u0438 \u043d\u0430\u0431\u043e\u0440\u0435
+OptionPanel.Keystrokes = \u041a\u043b\u0430\u0432\u0438\u0448\u0438
+OptionPanel.ko = \u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439
+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.language = \u042f\u0437\u044b\u043a
+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.last = \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439
+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.layout_map_on_text_change = \u041c\u0430\u043a\u0435\u0442 \u043a\u0430\u0440\u0442\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
+OptionPanel.layout_map_on_text_change.tooltip = \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438
+OptionPanel.linear = \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439
+OptionPanel.links = \u0421\u0441\u044b\u043b\u043a\u0438
+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.load_folding = \u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435
+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_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.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_maps = \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b
+OptionPanel.lookandfeel = \u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f
+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\u043e \u043d\u0430 MacOS.<br>"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b).<br>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 .jar.<br>\u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c "\u041d\u0438\u0447\u0435\u0433\u043e". \u042d\u0442\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u0432.</html>
+OptionPanel.lt = \u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439
+OptionPanel.max_displayed_node_count = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+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.max_node_width.tooltip = <html>\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445</html>
+OptionPanel.max_shortened_text_length = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0443\u0437\u043b\u0430
+OptionPanel.metal = \u041c\u0435\u0442\u0430\u043b\u043b
+OptionPanel.motif = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+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 = \u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
+OptionPanel.nodebackgroundcolor.tooltip = \u0424\u043e\u043d \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.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.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.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>fork\: </td><td>\u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0440\u0430\u043c\u043a\u0438,</td></tr><tr><td>bubble\: </td><td> \u0443\u0437\u0435\u043b \u0441 \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u044e\u044e\u0449\u0435\u0439 \u0440\u0430\u043c\u043a\u043e\u0439,</td></tr><tr><td>As parent\: </td><td> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0443\u0437\u043b\u0430-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f <br>\u0438\u043b\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0438\u043b\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430,</td></tr><tr><td>Combined\: </td><td> \u041f\u0443\u0437\u044b\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u0443\u0437\u0435\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442, \u0438\u043d\u0430\u0447\u0435 - \u0431\u0435\u0437 \u0440\u0430\u043c\u043a\u0438.</td></tr></table></html>
+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
+OptionPanel.number_format = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438
+OptionPanel.number_format.tooltip = \u0428\u0430\u0431\u043b\u043e\u043d, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 '#' \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043b\u0438 '0 '\u0434\u043b\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0446\u0438\u0444\u0440. \u041f\u0440\u0438\u043c\u0435\u0440\u044b: "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\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439
+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\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f.</html>
+OptionPanel.OK = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+OptionPanel.org.freeplane.plugin.bugreport = \u041f\u0440\u0430\u0432\u0438\u043b\u0430
+OptionPanel.org.freeplane.plugin.bugreport.allowed = \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430
+OptionPanel.org.freeplane.plugin.bugreport.ask = \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u043e\u0442\u0447\u0435\u0442\u0430
+OptionPanel.org.freeplane.plugin.bugreport.denied = \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c
+OptionPanel.outline_hgap = \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438
+OptionPanel.outline_vgap = \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438
+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
+OptionPanel.parse_data = \u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438 \u0434\u0430\u0442\u0443/\u0432\u0440\u0435\u043c\u044f
+OptionPanel.path_property_may_not_be_empty = \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0443\u0442\u0438 \u043f\u0430\u043f\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c! \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u044b.
+OptionPanel.patternname = \u0418\u043c\u044f
+OptionPanel.patternname.tooltip = \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u0430
+OptionPanel.pl = \u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439
+OptionPanel.placenewbranches = \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+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.plugin.tooltip = \u041d\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.
+OptionPanel.plugins = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f
+OptionPanel.printonwhitebackground = <html>\u041f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u0435\u043b\u043e\u043c \u0444\u043e\u043d\u0435</html>
+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.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.RECT = \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a
+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 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e (\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442).<br>"\u0414\u0430" \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<br>"\u041d\u0435\u0442" \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 (\u043d\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439) \u0442\u0435\u043a\u0441\u0442.</html>
+OptionPanel.remind_use_rich_text_in_new_nodes = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+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.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\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u0431 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0446\u0435\u043b\u044c\u043d\u043e.
+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 = \u0426\u0432\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\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.ROUND_RECT = \u0417\u0430\u043a\u0440\u0443\u0433\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a
+OptionPanel.ru = \u0420\u0443\u0441\u0441\u043a\u0438\u0439
+OptionPanel.save_folding = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443
+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_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.script_classpath = \u041f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0430\u043f\u043e\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 JAR-\u0444\u0430\u0439\u043b\u043e\u0432 (\u0441\u043c. \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443)
+OptionPanel.script_classpath.tooltip = <html>\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043f\u043e\u043a JAR-\u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0444\u043e\u0440\u043c\u0443\u043b.<br>\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 ; (Windows) \u0438\u043b\u0438 : (Linux, Mac).<br>\u041f\u0430\u043f\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 .jar \u0438 .class \u0444\u0430\u0439\u043b\u043e\u0432.<br>\u041f\u0443\u0442\u0438 \u043f\u0430\u043f\u043e\u043a \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438, \u0430 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Freeplane.<br>\u0415\u0441\u043b\u0438 \u0412\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0435\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e!</html>
+OptionPanel.script_directories = \u041f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0430\u043f\u043e\u043a \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 (\u0441\u043c. \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443)
+OptionPanel.script_directories.tooltip = <html>C\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043f\u043e\u043a.<br>\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 ; (Windows) \u0438\u043b\u0438 : (Linux, Mac).<br>\u041f\u0443\u0442\u0438 \u043f\u0430\u043f\u043e\u043a \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438, \u0430 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Freeplane.</html>
+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_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 \u043a\u043b\u044e\u0447 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. <br>\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).</html>
+OptionPanel.scrollbar_increment = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+OptionPanel.selection_method = \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0443\u0437\u043b\u0430
+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\u0436\u043a\u043e\u0439. \u041d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u0435\u0451, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b auto.properties \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<br><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e.</i></html>
+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.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.CloudControls = \u041e\u0431\u043b\u0430\u043a\u0430
+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.connectors = \u0421\u0432\u044f\u0437\u0438
+OptionPanel.separator.data_formats = \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+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.editing = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430
+OptionPanel.separator.files = \u0424\u0430\u0439\u043b\u044b
+OptionPanel.separator.formula = \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0424\u043e\u0440\u043c\u0443\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.inline_editor = \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0443\u0437\u043b\u043e\u0432
+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.NodeShape = \u0424\u043e\u0440\u043c\u0430 \u0443\u0437\u043b\u0430
+OptionPanel.separator.NodeStyle = \u0421\u0442\u0438\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438
+OptionPanel.separator.NodeText = \u0422\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
+OptionPanel.separator.notifications = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
+OptionPanel.separator.org.freeplane.plugin.bugreport = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0447\u0435\u0442\u043e\u0432
+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.outline_view = \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u0438\u0434
+OptionPanel.separator.patterns = \u041e\u0431\u0440\u0430\u0437\u0446\u044b
+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.scripting = \u0421\u043a\u0440\u0438\u043f\u0442\u044b
+OptionPanel.separator.scrollbar = \u041f\u043e\u043b\u043e\u0441\u0430 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
+OptionPanel.separator.search = \u041f\u043e\u0438\u0441\u043a
+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.single_instance_mode = \u0417\u0430\u043f\u0443\u0441\u043a \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+OptionPanel.separator.size_limits = \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\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.separator.status = \u0421\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f
+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.separator.undo = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.separator.updates = \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f
+OptionPanel.set_property_text = \u0418\u0437\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.setscript = \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.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_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.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.show_styles_in_tooltip = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u0438 \u0443\u0437\u043b\u0430 \u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0435 (\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430)
+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.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\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.
+OptionPanel.single_backup_directory = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 1 \u043f\u0430\u043f\u043a\u0443 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439
+OptionPanel.single_backup_directory.tooltip = <html> \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434\u043f\u0430\u043f\u043e\u043a \u0432 \u043f\u0430\u043f\u043a\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430</html>
+OptionPanel.single_backup_directory_path = \u041f\u0430\u043f\u043a\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0432\u044b\u0448\u0435)
+OptionPanel.single_backup_directory_path.tooltip = <html>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance = \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435
+OptionPanel.single_instance_force = \u0417\u0430\u043f\u0440\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u0445
+OptionPanel.sk = \u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439
+OptionPanel.sl = \u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439
+OptionPanel.spelling_opt_case_sensitive = \u0427\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443
+OptionPanel.spelling_opt_ignore_all_caps_words = \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0432 \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 \u0446\u0438\u0444\u0440\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\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \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\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0432 \u043c\u0435\u043d\u044e
+OptionPanel.sr = \u0421\u0435\u0440\u0431\u0441\u043a\u0438\u0439 / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.standard_template = \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430
+OptionPanel.standardbackgroundcolor = \u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430
+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.standardcloudcolor = \u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432
+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 #RRGGBB)</html>
+OptionPanel.standardcloudestyle = \u0422\u0438\u043f \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.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.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.standardlinkcolor = \u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438
+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\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRGGBB)</html>
+OptionPanel.standardlinkestyle = \u0421\u0442\u0438\u043b\u044c \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.standardselectednodecolor = \u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\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.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.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\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.STAR = \u0417\u0432\u0435\u0437\u0434\u0430
+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.structured_icon_toolbar = \u041c\u0435\u043d\u044e \u0438\u043a\u043e\u043d\u043e\u043a
+OptionPanel.summary = \u0418\u0442\u043e\u0433[*]
+OptionPanel.sv = \u0428\u0432\u0435\u0434\u0441\u043a\u0438\u0439
+OptionPanel.text.use_ctrl_key = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 '\u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u044f\u0440\u043b\u044b\u043a' \u0438\u0437 \u043c\u0435\u043d\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\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_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\u0443\u043d\u0434\u0430\u0445. \u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f .</html>
+OptionPanel.time_for_delayed_selection = \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438
+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\u044f \u043d\u0430\u0434 \u043d\u0438\u043c (\u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445).<br>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431 \u0443\u0437\u0435\u043b \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.</html>
+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.initialDelay = \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430, \u043c\u0441
+OptionPanel.toolTipManager.max_tooltip_width = \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
+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.reshowDelay = \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0430, \u043c\u0441
+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 = \u0427\u0438\u0441\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439
+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.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.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.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_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\u0440\u0430\u043c\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b</html>
+OptionPanel.use_tabbed_pane = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438
+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.validate_classpath_needs_readaccess = \u0421\u043a\u0440\u0438\u043f\u0442\u044b: \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0443\u0442\u0438 \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u0444\u0430\u0439\u043b\u043e\u0432!
+OptionPanel.validate_invalid_date_format = \u041d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b
+OptionPanel.validate_invalid_datetime_format = \u041d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b/\u0432\u0440\u0435\u043c\u0435\u043d\u0438
+OptionPanel.validate_invalid_number_format = \u041d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0447\u0438\u0441\u043b\u0430
+OptionPanel.validate_write_without_read = \u0421\u043a\u0440\u0438\u043f\u0442\u044b: \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u0444\u0430\u0439\u043b\u0430 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u0444\u0430\u0439\u043b\u0430.
+OptionPanel.validation_error = <html><body>\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438(\u043e\u043a):<p><em>{0}</em><p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438(\u043e\u043a).</body></html>
+OptionPanel.validation_warning = <html><body>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438(\u043e\u043a):<p><em>{0}</em></body></html>
+OptionPanel.vi = \u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439
+OptionPanel.wheel_velocity = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+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.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
+org.freeplane.plugin.bugreport.agree = \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c
+org.freeplane.plugin.bugreport.always_agree = \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430
+org.freeplane.plugin.bugreport.always_deny = \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c
+org.freeplane.plugin.bugreport.deny = \u041d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c
+org.freeplane.plugin.bugreport.dialog.title = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0447\u0435\u0442\u043e\u0432
+org.freeplane.plugin.bugreport.freeplane_team = \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0430\u043d\u0434\u044b Freeplane
+org.freeplane.plugin.bugreport.lastreport = \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442
+org.freeplane.plugin.bugreport.never = \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043c\u043e\u0449\u0438
+org.freeplane.plugin.bugreport.question = <html>Freeplane \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043e \u0441\u0431\u043e\u044f\u0445.<br>\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f.<br>\u041e\u0442\u0447\u0435\u0442\u044b \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.
+org.freeplane.plugin.bugreport.report = \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0442\u0447\u0435\u0442
+org.freeplane.plugin.bugreport.wanted_bug = \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u043d\u0435\u0439. \u041c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u043d\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432 \u043d\u0430\u0448 Mantis \u0442\u0440\u0435\u043a\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u043e\u043a: \u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u0432\u0430\u0448\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0443. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 OK, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0442\u0440\u0435\u043a\u0435\u0440\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0412\u0430\u0448\u0443 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u0412\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Freeplane
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = \u0423\u0437\u0435\u043b {0} \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d
+out_of_memory = \u041d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u0438.
+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?
+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
+PasteAttributes.text = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0430\u0442&\u0440\u0438\u0431\u0443\u0442\u044b
+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
+periodic_formula = {0} * n + {1}
+plugins/latex/LatexNodeHook.editorTitle = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 LaTeX
+plugins/script_filter = \u0424\u0438\u043b\u044c\u0442\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 {0}
+plugins/script_filter_error = {0} \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 {1}, \u043d\u043e \u0432\u0435\u0440\u043d\u0443\u043b {2}
+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|7\#Delete|8\#Read|9\#Write}. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445.
+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/ScriptingEngine.illegalAccessToInternalAPI = \u041d\u0435\u043f\u0440\u0430\u0432\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c API (\u043f\u0430\u043a\u0435\u0442 {0}). - \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 Freeplane \u0435\u0441\u043b\u0438 API \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u044b\u043c.
+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 = \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c
+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\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430.<br>\u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u0430\u0439\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441\u043d\u043e\u0432\u0430.</html>
+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\u0442\u044c \u0434\u0430\u0442\u0443 (\u0414\u0410), <br>\u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0436\u043d\u044e\u044e \u0434\u0430\u0442\u0443 (\u041d\u0415\u0422)?</html>
+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 = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c
+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_Select = \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c
+plugins/TimeManagement.xml_todayButton = \u0421\u0435\u0433\u043e\u0434\u043d\u044f
+plugins/TimeManagement.xml_WindowTitle = \u0412\u0440\u0435\u043c\u044f
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = \u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
+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.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
+QuickFindAction.BACK.text = \u041d\u0430\u0439\u0442\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435
+QuickFindAction.FORWARD.text = \u041d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435
+QuickFindAllAction.text = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f
+QuitAction.text = \u0412&\u044b\u0445\u043e\u0434
+read_only = \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f
+ReadScriptError.text = \u041e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430.\n\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b \u043b\u043e\u0433\u0430 \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439.
+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 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439.) </html>
+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\u0441\u043d\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\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
+red = \u041a\u0440\u0430\u0441\u043d\u044b\u0439
+RedefineStyleAction.text = \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0438\u043b\u044f
+RedoAction.text = \u0412\u0435\u0440\u043d\u0443\u0442\u044c
+RedoFilterAction.text = \u0412\u0435\u0440\u043d\u0443\u0442\u044c
+regular_expressions = \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f
+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
+remove_file_from_list_on_error = \u0424\u0430\u0439\u043b {0} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432?
+remove_shortcut_question = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438?
+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
+RemoveEncryption.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+RemoveFormatAction.text = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442
+RemoveIcon_0_Action.text = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443
+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
+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
+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
+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_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?
+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
+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
+saving_canceled = \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e
+scanners_not_loaded = \u0421\u043a\u0430\u043d\u0435\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b, \u0444\u0430\u0439\u043b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d
+scheme_evaluate = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c!
+script_execution_disabled = \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d
+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?
+scripting_api_generator_legend = \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
+scripting_api_generator_proxy = \u041f\u0440\u043e\u043a\u0441\u0438
+scripting_api_generator_title = API \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432
+scripting_api_generator_utilities = \u0423\u0442\u0438\u043b\u0438\u0442\u044b
+scripting_api_generator_web = \u0412\u0435\u0431 \u0440\u0435\u0441\u0443\u0440\u0441\u044b
+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
+select_menu_item_dialog = \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u043d\u043a\u0442 \u043c\u0435\u043d\u044e
+select_menu_item_root_node = \u041c\u0435\u043d\u044e
+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
+SelectedPasteAction.text = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a...
+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
+set_accelerator_on_next_click_action = \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0440\u043b\u044b\u043a\u0430
+SetAcceleratorOnNextClickAction.text = \u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u044f\u0440\u043b\u044b\u043a
+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)
+SetNodeLink.text = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0443\u0437\u043b\u0430...
+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
+SetShortenerStateAction.text = \u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0443\u0437\u043b\u0430
+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?
+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 = \u041f\u0430\u043d\u0435\u043b\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438
+ShowFormatPanel.text = \u041f\u0430\u043d\u0435\u043b\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
+ShowFormatPanel.tooltip = \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0437\u0435\u043b \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.
+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.
+ShowNotesInMapAction.text = \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435
+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 = \u0441\u0438\u043c\u0432\u043e\u043b \u0444\u0430\u0439\u043b\u0430 \u043a\u0430\u043a \u043f\u0443\u043d\u043a\u0442
+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 = \u043a\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 = \u041e\u041a
+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 = \u043e\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.printLabel = \u041f\u0435\u0447\u0430\u0442\u044c...
+simplyhtml.redoLabel = \u0412\u0435\u0440\u043d\u0443\u0442\u044c
+simplyhtml.redoTip = \u0432\u0435\u0440\u043d\u0443\u0442\u044c
+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\u0451
+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
+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>
+stop_processing = \u0421\u0442\u043e\u043f
+StringFlavorHandler = \u0422\u0435\u043a\u0441\u0442 \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0437\u043b\u043e\u0432
+StructuredHtmlFlavorHandler = HTML \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0437\u043b\u043e\u0432
+style = \u0421\u0442\u0438\u043b\u044c
+style_already_exists = \u0421\u0442\u0438\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.
+styledialog.cancel.text = \u041e\u0442\u043c\u0435\u043d\u0430
+styledialog.ok.text = \u041e\u041a
+styles = \u0421&\u0442\u0438\u043b\u0438
+styles.AutomaticLayout = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430
+styles.connection = \u0421\u0432\u044f\u0437\u044c
+styles.date = \u0414\u0430\u0442\u0430
+styles.definition = \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435
+styles.description = \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
+styles.floating_node = \u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+styles.idea = \u0418\u0434\u0435\u044f
+styles.important = \u0412\u0430\u0436\u043d\u043e
+styles.key = \u041a\u043b\u044e\u0447
+styles.list = \u0421\u043f\u0438\u0441\u043e\u043a
+styles.needs_action = \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435
+styles.note = \u0417\u0430\u043c\u0435\u0442\u043a\u0430
+styles.ok = \u041e\u041a
+styles.pending = \u0412 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438
+styles.predefined = \u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438
+styles.question = \u0412\u043e\u043f\u0440\u043e\u0441
+styles.quotation = \u0426\u0438\u0442\u0430\u0442\u0430
+styles.root_node = \u0421\u0442\u0438\u043b\u0438
+styles.subsubtopic = \u041f\u043e\u0434\u043f\u043e\u0434\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a
+styles.subtopic = \u041f\u043e\u0434\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a
+styles.topic = \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a
+styles.user-defined = \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u043b\u0438
+styles.website = \u0421\u0430\u0439\u0442
+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...
+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
+ToggleDetailsAction.text = \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438
+ToggleFBarAction.text = \u041f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439 \u043a\u043b\u0430\u0432\u0438\u0448
+ToggleFoldedAction.text = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c / \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c
+ToggleFullScreenAction.text = \u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c
+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
+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
+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
+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 = \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.
+up = &\u0412\u0432\u0435\u0440\u0445
+update_failed = \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c {0}
+UpdateCheckAction.text = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f
+updatecheckdialog = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433
+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:
+url_open_error = \u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f URL {0}.
+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_config_folder = \u041f\u0430\u043f\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {0}
+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
+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_icon = \u0418\u043a\u043e\u043d\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f "{0}"
+user_template_dir = \u0428\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+user_zoom = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0435\u0447\u0430\u0442\u0438 (0.0 - 2.0):
+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...
+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
+wrong_regexp = \u0412 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 "{0}", \u043e\u0448\u0438\u0431\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\u043d\u0438\u0433\u0430
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 \u0438 \u0441\u0442\u0430\u0440\u0448\u0435) XML \u0444\u043e\u0440\u043c\u0430\u0442
+xslt_export.ms_project = MS Project (2003 \u0438 \u0441\u0442\u0430\u0440\u0448\u0435) XML \u0444\u043e\u0440\u043c\u0430\u0442
+xslt_export.ms_word = Word (2003 \u0438 \u0441\u0442\u0430\u0440\u0448\u0435) XML \u0444\u043e\u0440\u043c\u0430\u0442
+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
+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
new file mode 100644
index 0000000..8d523ae
--- /dev/null
+++ b/freeplane/resources/translations/Resources_sk.properties
@@ -0,0 +1,710 @@
+AboutAction.text = O programe
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Zme\u0148 form\u00E1t uzlov
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Zme\u0148 vzor
+accessories/plugins/EncryptNode.properties_0 = Nastav heslo pre za\u0161ifrovan\u00FD uzol
+accessories/plugins/EncryptNode.properties_1 = Hesl\u00E1 sa nerovnaj\u00FA alebo s\u00FA pr\u00EDli\u0161 kr\u00E1tke.
+accessories/plugins/EncryptNode.properties_2 = Zadajte heslo:
+accessories/plugins/EncryptNode.properties_3 = Zopakujte heslo:
+accessories/plugins/EncryptNode.properties_4 = Zadajte heslo.
+accessories/plugins/EncryptNode.properties_5 = <html>Pam\u00E4tajte, \u017Ee sila \u0161ifry<br> z\u00E1vis\u00ED do zna\u010Dnej miery od kvality hesla.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Storno
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Stav za\u0161ifrovania m\u00F4\u017Eete meni\u0165 iba na za\u0161ifrovanom uzle. Pros\u00EDm vlo\u017Ete tak\u00FDto uzol pomocou menu n\u00E1strojov.
+accessories/plugins/EncryptNode.properties_select_me = Vyber ma a pokra\u010Duj!
+accessories/plugins/EncryptNode.properties_wrong_password = Heslo je nespr\u00E1vne.
+accessories/plugins/ExportWithXSLT.tooltip = Toto je jednotn\u00E1 met\u00F3da exportu pomocou skriptov XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Ako Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Vyexportuje mapu ako applet v jazyku Java.
+accessories/plugins/ExportWithXSLT_Flash.text = Ako Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Vyexportuje mapu ako aplik\u00E1ciu v jazyku Flash
+accessories/plugins/ExportWithXSLT_HTML.text = Ako XHTML (verzia s JavaScriptom)...
+accessories/plugins/ExportWithXSLT_HTML3.text = Ako XHTML (verzia s klikate\u013Enou mapou)...
+add = Pridaj
+AddLocalLinkAction.text = Pridaj lok\u00E1lnu hyperlinku
+antialias_all = Vyhla\u010F v\u0161etko
+antialias_edges = Vyhla\u010F hrany
+antialias_none = Nevyhladzuj ni\u010D
+apply = Pou\u017Ei
+ApplyAction.text = Pou\u017Ei
+ApplyFormatPlugin.text = Zme\u0148 form\u00E1t...
+ApplyFormatPlugin.tooltip = Zobraz\u00ED dial\u00F3g, v ktorom mo\u017Eno naraz zmeni\u0165 vlastnosti uzlov aj hr\u00E1n.
+ApplyNoFilteringAction.text = Bez filtra
+as_parent = Ako rodi\u010D
+AskForHelp.text = Ask for Help[translate me]
+AssignAttributesAction.text = Prira\u010F atrib\u00FAty...
+attribute_delete = Vyma\u017E v\u0161etky hodnoty
+attribute_delete_value = Vyma\u017E t\u00FAto hodnotu
+attribute_font_size_tooltip = Ve\u013Ekos\u0165 p\u00EDsma atrib\u00FAtu
+attribute_list_box_label_text = Existuj\u00FAce hodnoty
+attribute_replace = Nahra\u010F
+attribute_top = V\u0161etky zn\u00E1me atrib\u00FAty na\u010D\u00EDtan\u00FDch m\u00E1p
+attributes_adding_empty_attribute_error = Nem\u00F4\u017Eem pou\u017Ei\u0165 pr\u00E1zdny text ako n\u00E1zov atrib\u00FAtu
+attributes_all = V\u0161etky atrib\u00FAty
+attributes_attribute = Atrib\u00FAty
+attributes_close = Zavri
+attributes_deselect_all = Ni\u010D
+attributes_edit = Edituj
+attributes_edit_tooltip = Edituj mno\u017Einu
+attributes_for_selected = Vybran\u00E9 uzly
+attributes_for_visible = V\u0161etky vidite\u013En\u00E9 uzly
+attributes_import = Importuj
+attributes_import_tooltip = Importuj atrib\u00FAty z ostatn\u00FDch na\u010D\u00EDtan\u00FDch m\u00E1p
+attributes_popup_delete = Vyma\u017E
+attributes_popup_down = Dole
+attributes_popup_edit = Edituj
+attributes_popup_hide = Skry
+attributes_popup_new = Nov\u00FD atrib\u00FAt
+attributes_popup_optimal_width = Optim\u00E1lna \u0161\u00EDrka
+attributes_popup_up = Hore
+attributes_refresh = Obnov
+attributes_restricted_attributes_tooltip = Obmedz mno\u017Einu atrib\u00FAtov
+attributes_restricted_values_tooltip = Obmedz mno\u017Einu hodn\u00F4t teraj\u0161ieho atrib\u00FAtu
+attributes_restriction = Obmedzen\u00E1 mno\u017Eina
+attributes_select_all = V\u0161etky
+attributes_select_all_tooltip = Ozna\u010D / Odzna\u010D v\u0161etky
+attributes_show = Uk\u00E1\u017E
+attributes_skip_root = Presko\u010D kore\u0148ov\u00FD uzol
+attributes_visible = Ozna\u010Den\u00E9 vidite\u013En\u00E9
+attributes_visible_tooltip = Ozna\u010Den\u00E9 vidite\u013En\u00E9
+automatically_save_message = Mapa bola automaticky ulo\u017Een\u00E1 (n\u00E1zov s\u00FAboru {0}) ...
+AutomaticLayoutAction.text = Automatick\u00E9 rozlo\u017Eenie
+AutomaticLayoutAction.tooltip = <html>Oprav\u00ED rozlo\u017Eenie mapy. <br>Prv\u00E1 \u00FArove\u0148 je \u010Dierna, druh\u00E1 modr\u00E1, at\u010F.</html>
+BackAction.text = Nasp\u00E4\u0165
+background = Pozadie
+BlinkingNodeHookAction.text = Blikaj\u00FAci uzol
+BlinkingNodeHookAction.tooltip = <html>Teraz bude uzol blika\u0165. Opatrne. Nenastavuje to pr\u00EDli\u0161 mnoh\u00FDm uzlom, a <strong> nie spolu s \u010Fal\u0161\u00EDmi automatick\u00FDmi form\u00E1tmi na rovnakom uzle</strong></html>
+BoldAction.text = Tu\u010Dn\u00E9
+boldify_branch = Zme\u0148 na tu\u010Dn\u00E9
+branch = Vetva
+cancel = Storno
+CancelAction.text = Storno
+cannot_add_parent_diff_parents = V\u0161etky uzly musia ma\u0165 rovnak\u00E9ho rodi\u010Da, aby sa dala pou\u017Ei\u0165 t\u00E1to funkcia.
+cannot_add_parent_to_root = Kore\u0148ov\u00FD uzol nemo\u017Eno prida\u0165 pod nov\u00E9ho rodi\u010Da.
+cannot_join_nodes_with_children = Nem\u00F4\u017Eem spoji\u0165 uzly s de\u0165mi
+cannot_move_to_child = Nem\u00F4\u017Eem posun\u00FA\u0165 uzol do jedn\u00E9ho z jeho det\u00ED.
+CenterAction.text = Centruj
+ChangeConnectorArrowsAction.backward.text = Nasp\u00E4\u0165
+ChangeConnectorArrowsAction.forward.text = Dopredu
+ChangeNodeLevelLeftsAction.text = Uzol do\u013Eava
+ChangeNodeLevelLeftsAction.tooltip = Uzly na\u013Eavo od kore\u0148a sa posun\u00FA nadol. Stan\u00FA sa poduzlami uzla, ktor\u00FD bol nad nimi. Uzly napravo od kore\u0148a sa posun\u00FA nahor. Priamo pri koreni uzly zmenia stranu.
+ChangeNodeLevelRightsAction.text = Uzol doprava
+ChangeNodeLevelRightsAction.tooltip = Uzly napravo od kore\u0148a sa posun\u00FA nadol. Stan\u00FA sa poduzlami uzla, ktor\u00FD bol nad nimi. Uzly na\u013Eavo od kore\u0148a sa posun\u00FA nahor. Priamo pri koreni uzly zmenia stranu.
+choose_background_color = Vyber farbu pozadia
+choose_cloud_color = Vyber farbu oblaku:
+choose_edge_color = Vyber farbu hrany
+choose_node_background_color = Vyber farbu pozadia uzla:
+choose_node_color = Vyber farbu uzla:
+CloseAction.text = Zavri
+CloudAction.text = Oblak
+CloudColorAction.text = Farba oblaku...
+ColorProperty.ResetColor = Vr\u00E1\u0165 p\u00F4vodn\u00FA farbu
+combined = Kombinovan\u00E1
+CopyAction.text = Kop\u00EDruj
+CopySingleAction.text = Kop\u00EDruj jeden
+CreationModificationPluginAction.text = Zobraz \u010Das zmeny
+CreationModificationPluginAction.tooltip = <html>T\u00E1to funkcia zaznamen\u00E1va \u010Das vytvorenia a \u00FApravy uzla.</html>
+CutAction.text = Vystrihni
+decrease_branch_font_size = Men\u0161ie p\u00EDsmo
+DecreaseNodeFontAction.text = Men\u0161ie p\u00EDsmo
+delete = Vyma\u017E
+delete_child = Vyma\u017E uzol
+DeleteAction.text = Odstr\u00E1\u0148 uzol
+DeleteConditionAction.text = Vyma\u017E
+DocumentationAction.text = Dokument\u00E1cia
+edge = Hrana
+edge_style = \u0160t\u00FDl hrany
+edge_width = Hr\u00FAbka hrany
+EdgeColorAction.text = Farba hrany...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.linear.text = Line\u00E1rne
+EdgeStyleAction.sharp_bezier.text = Ostr\u00E1 bezi\u00E9rova
+EdgeStyleAction.sharp_linear.text = Ostr\u00E1 line\u00E1rna
+EdgeStyleAsParentAction.text = Ako rodi\u010D
+EdgeWidthAction_width_parent.text = Rodi\u010D
+EdgeWidthAction_width_thin.text = Tenk\u00E1
+edit = Edituj
+edit_link_manually = Edituj hyperlinku ru\u010Dne...
+edit_middle_label = Edit Middle Label[translate me]
+EditAction.text = Edituj uzol
+EditAttributesAction.text = Edituj atrib\u00FAty
+EditFilterAction.text = Edituj
+EditLongAction.text = Edituj dlh\u00FD uzol...
+EncryptedMap.text = Vytvor za\u0161ifrovan\u00FA mapu...
+EncryptedMap.tooltip = Vytvor nov\u00FA za\u0161ifrovan\u00FA mapu.
+enter_base_url = Idem vlo\u017Ei\u0165 relat\u00EDvne linky. Pros\u00EDm zadajte z\u00E1kladn\u00E9 URL.
+enter_confirms = Enter potvrdzuje
+EnterPassword.text = Zme\u0148 vidite\u013En\u00E9 / za\u0161ifrovan\u00E9
+error = Chyba
+error_applying_template = Chyba pri pou\u017Eit\u00ED \u0161abl\u00F3ny XSL
+error_creating_directory = Neviem vytvori\u0165 adres\u00E1r na export.
+export_pdf_text = Prenosn\u00FD form\u00E1t dokumentu (PDF)
+export_svg_text = \u0160k\u00E1lovate\u013En\u00E1 vektorov\u00E1 grafika (SVG)
+ExportAction.text = Exportuj
+ExportBranchToHTMLAction.text = Vetva ako HTML
+ExportPdf.text = Ako PDF...
+ExportSvg.text = Ako SVG...
+ExportToHTMLAction.text = Ako HTML
+ExportToImage.jpg.text = Ako JPEG...
+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
+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_add = Pridaj
+filter_and = A
+filter_conditions = Filtre
+filter_contains = Obsahuje
+filter_delete = Vyma\u017E
+filter_dialog = N\u00E1vrh filtra
+filter_does_not_exist = Neexistuje
+filter_edit_description = Edituj zoznam filtrov
+filter_enter_value = Vlo\u017E hodnotu
+filter_exist = Existuje
+filter_icon = Ikona
+filter_is_equal_to = Sa rovn\u00E1
+filter_is_not_equal_to = Sa nerovn\u00E1
+filter_link = Hyperlink[translate me]
+filter_no_filtering = Bez filtra
+filter_node = Text uzla
+filter_not = Nie
+filter_or = Alebo
+filter_select = V\u00FDber
+filter_selected_node_view = Moment\u00E1lne vybran\u00E9 uzly
+find_what = N\u00E1jdi \u010Do
+FindAction.text = N\u00E1jdi...
+fit_map_to_page = Zmesti na jednu stranu
+FitToPage.text = Zaostri na str\u00E1nku
+FitToPage.tooltip = Prisp\u00F4sob\u00ED zaostrenie, aby sa cel\u00E1 mapa zmestila do s\u00FA\u010Dasn\u00E9ho okna.
+fold = Zba\u013E
+FoldAllAction.text = Zba\u013E v\u0161etko
+FoldAllAction.tooltip = <html>Zbal\u00ED ozna\u010Den\u00FD uzol a v\u0161etky jeho poduzly.</html>
+FoldOneLevelAction.text = Zba\u013E jednu \u00FArove\u0148
+FoldOneLevelAction.tooltip = <html>Zbal\u00ED ozna\u010Den\u00E9 uzly o jednu \u00FArove\u0148.</html>
+FollowLinkAction.text = Otvor hyperlinku:
+font = P\u00EDsmo
+FontFamilyAction.text = typ p\u00EDsma
+FontSizeAction.text = ve\u013Ekos\u0165 p\u00EDsma
+format_menu_edge_styles = \u0160t\u00FDly hr\u00E1n
+format_menu_edge_widths = Hr\u00FAbky hr\u00E1n
+FormatCopy.text = Kop\u00EDruj form\u00E1t
+FormatCopy.tooltip = <html>Skop\u00EDruje form\u00E1t uzla.</html>
+FormatPaste.text = Vlo\u017E form\u00E1t
+FormatPaste.tooltip = <html>Vlo\u017E\u00ED form\u00E1t uzla.</html>
+ForwardAction.text = Dopredu
+Freeplane.progress.buildScreen = Zostavujem obrazovku...
+Freeplane.progress.createController = Vytv\u00E1ram ovl\u00E1da\u010D...
+Freeplane.progress.createInitialMode = Vytv\u00E1ram po\u010Diato\u010Dn\u00FD re\u017Eim...
+Freeplane.progress.endStartup = Dokon\u010Dujem \u0161tart.
+Freeplane.progress.gettingPreferenceDirectories = Zis\u0165ujem adres\u00E1re s nastaveniami...
+Freeplane.progress.gettingPreferences = Zis\u0165ujem nastavenia...
+Freeplane.progress.loadMaps = Na\u010D\u00EDtavam mapy...
+Freeplane.progress.propagateLookAndFeel = Preber\u00E1m v\u00FDzor a spr\u00E1vanie...
+Freeplane.progress.settingPreferences = Aplikujem nastavenia...
+Freeplane.progress.startCreateController = Za\u010D\u00EDnam vytv\u00E1ra\u0165 ovl\u00E1da\u010D...
+Freeplane.progress.updateLookAndFeel = Aktualizujem v\u00FDzor a spr\u00E1vanie...
+freeplane_reverted = Freeplane_Reverted_[translate me]
+FreeplaneHelpStarter.text = Pomoc...
+FreeplaneHelpStarter.tooltip = Podrobn\u00E1 pomoc k programu Freeplane
+GotoLinkNodeAction.text = Cho\u010F na linku
+GrabKeyDialog.common.cancel = Storno
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Pridelen\u00E9 k
+GrabKeyDialog.grab-key.assigned-to.none = Moment\u00E1lne nepridelen\u00E9
+GrabKeyDialog.grab-key.clear = Vy\u010Disti
+GrabKeyDialog.grab-key.remove = Odstr\u00E1\u0148
+GrabKeyDialog.grab-key.remove-ask = Ur\u010Dite chcete odstr\u00E1ni\u0165 t\u00FAto kl\u00E1vesu?
+GrabKeyDialog.grab-key.title = Zadajte nov\u00FA kl\u00E1vesu
+help = Pomoc
+HideAllAttributesAction.text = Ukry v\u0161etky atrib\u00FAty
+HierarchicalIconsAction.text = Zobraz ikony hierarchicky
+HierarchicalIconsAction.tooltip = Ak m\u00E1 niektor\u00FD z mojich pod(pod)uzlov ikonu, zobraz\u00EDm t\u00FAto ikonu v malom form\u00E1te aj ja.
+html_export_based_on_headings = Export do HTML - pod\u013Ea hlavi\u010Diek
+html_export_fold_all = Export do HTML - zba\u013E v\u0161etko
+html_export_fold_currently_folded = Export do HTML - zba\u013E moment\u00E1lne zbalen\u00E9
+html_export_no_folding = Export do HTML - nezba\u013E ni\u010D
+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]
+icon_attach = Pozri sem
+icon_back = Nasp\u00E4\u0165
+icon_bee = Freeplane[translate me]
+icon_bell = Pam\u00E4taj
+icon_bookmark = Vynikaj\u00FAce
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Nie OK
+icon_button_ok = OK
+icon_calendar = D\u00E1tum
+icon_clanbomber = Nebezpe\u010Dn\u00E9
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Nezabudni
+icon_down = Dole
+icon_fema = Females[translate me]
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_females = Females[translate me]
+icon_flag = Vlajka
+icon_flag-black = Black Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_forward = Dopredu
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = Priorita 1
+icon_full-2 = Priorita 2
+icon_full-3 = Priorita 3
+icon_full-4 = Priorita 4
+icon_full-5 = Priorita 5
+icon_full-6 = Priorita 6
+icon_full-7 = Priorita 7
+icon_gohome = Domov
+icon_help = Ot\u00E1zka
+icon_idea = N\u00E1pad
+icon_info = Info[translate me]
+icon_kaddressbook = Telef\u00F3n
+icon_kmail = E-Mail[translate me]
+icon_knotify = Hudba
+icon_korn = Schr\u00E1nka
+icon_ksmiletris = Som vesel\u00FD
+icon_licq = Pekn\u00E9
+icon_Mail = Po\u0161ta
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = Ikony
+icon_messagebox_warning = D\u00F4le\u017Eit\u00E9
+icon_password = K\u013E\u00FA\u010D
+icon_pencil = Treba upresni\u0165
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = To ma nebav\u00ED
+icon_stop = Stop
+icon_stop-sign = Stop[translate me]
+icon_up = Hore
+icon_wizard = K\u00FAzlo
+icon_xmag = Treba prediskutova\u0165
+icon_yes = D\u00F4le\u017Eit\u00E9
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+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_linked_branch_no_link = Ozna\u010Den\u00FD uzol nem\u00E1 linku, z ktorej by sa dalo importova\u0165.
+ImportAction.text = Importuj
+ImportBranchAction.text = Vetva...
+ImportExplorerFavoritesAction.text = Ob\u013E\u00FAben\u00E9 polo\u017Eky z Explorera...
+ImportFolderStructureAction.text = Adres\u00E1rov\u00E1 \u0161trukt\u00FAra...
+ImportLinkedBranchAction.text = Linkovan\u00E1 vetva
+ImportLinkedBranchWithoutRootAction.text = (Linkovan\u00E1 vetva) Bez kore\u0148a...
+ImportMindmanagerFiles.text = Mapa programu MindManager X5...
+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}.
+LoadAcceleratorPresetsAction.textPatterns.text = Text Patterns[translate me]
+locking_failed_by_open = Nepodarilo sa zamkn\u00FA\u0165 mapu {0}. Otv\u00E1ram ju iba na \u010D\u00EDtanie.
+locking_failed_by_save_as = Nepodarilo sa zamkn\u00FA\u0165 mapu {0}. Akcia Ulo\u017E ako zru\u0161en\u00E1.
+locking_old_lock_removed = Mapu {0} u\u017E zamkol pou\u017E\u00EDvate\u013E {1}. Z\u00E1mok bol zru\u0161en\u00FD, preto\u017Ee je star\u00FD.
+long_node_changed_cancel = Zmenili ste uzol. Chcete zru\u0161i\u0165 tieto zmeny?
+lots_of_links_warning = Idete vytvori\u0165 mnoho liniek na rovnak\u00FD uzol. Naozaj chcete vytvori\u0165 tieto linky?
+map_already_exists = Mapa u\u017E existuje. Chcete ju prep\u00EDsa\u0165?
+map_corrupted = Mapa je po\u0161koden\u00E1. Zobrazi\u0165 podrobnosti?
+map_locked_by_open = Mapu {0} u\u017E edituje pou\u017E\u00EDvate\u013E {1}. Otv\u00E1ram iba na \u010D\u00EDtanie.
+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)
+mode_na = Re\u017Eim nie je k dispoz\u00EDcii
+mode_status = Re\u017Eim zmenen\u00FD na re\u017Eim {0}
+mode_title = Freeplane - Re\u017Eim {0}
+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
+NavigationNextMapAction.text = \u010Eal\u0161ia mapa
+NavigationPreviousMapAction.text = Predch\u00E1dzaj\u00FAca mapa
+new_mindmap = Nov\u00E1 mapa my\u0161lienok
+new_node = Nov\u00FD uzol
+new_node_as_sibling_not_possible_for_the_root = Nemo\u017Eno vytvori\u0165 nov\u00FD uzol ved\u013Ea kore\u0148a
+NewChildAction.text = Nov\u00FD poduzol
+NewMapAction.text = Nov\u00FD
+NewParentNode.text = Nov\u00FD rodi\u010Dovsk\u00FD uzol
+NewParentNode.tooltip = <html>V\u0161etky ozna\u010Den\u00E9 uzly sa po\u0161l\u00FA k nov\u00E9mu rodi\u010Dovsk\u00E9mu.</html>
+NewPreviousSiblingAction.text = Nov\u00FD predch\u00E1dzaj\u00FAci s\u00FArodeneck\u00FD uzol
+NewSiblingAction.text = Nov\u00FD s\u00FArodeneck\u00FD uzol
+no = Nie
+no_format_copy_before_format_paste = Aby ste vlo\u017Eili form\u00E1t, mus\u00EDte najprv nejak\u00FD skop\u00EDrova\u0165.
+no_found_from = <html>Nena\u0161lo sa \u017Eiadne <b>{0}</b> od <b>{1}</b>.
+no_more_found_from = <html>Nena\u0161lo sa \u010Fal\u0161ie <b>{0}</b> od <b>{1}</b>.
+no_previous_find = Nena\u0161lo sa predch\u00E1dzaj\u00FAce.
+node = Uzol
+node_changed_discard_changes = Zmenili ste uzol. Chcete zru\u0161i\u0165 tieto zmeny?
+NodeBackgroundColorAction.text = Farba pozadia uzla...
+NodeColorAction.text = Farba uzla...
+NodeColorBlendAction.text = Zmie\u0161aj farbu
+NodeDownAction.text = Uzol nadol
+NodeListAction.text = Uk\u00E1\u017E hist\u00F3riu mapy...
+NodeListAction.tooltip = Uk\u00E1\u017Ee v\u0161etky uzly s d\u00E1tumami vytvorenia/zmeny
+NodeShapeAction.bubble.text = Bublina
+NodeShapeAction.fork.text = Vetva
+NodeUpAction.text = Uzol nahor
+nonboldify_branch = Zru\u0161 tu\u010Dn\u00E9
+nonitalicise_branch = Zru\u0161 kurz\u00EDvu
+normal = Norm\u00E1lne
+not_saved_for_link_error = Mapa mus\u00ED by\u0165 ulo\u017Een\u00E1 sk\u00F4r ako nastav\u00EDte linku v\u00FDberom s\u00FAboru
+ok = OK
+OKAction.text = OK
+OpenAction.text = Otvor...
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Aby ste videli \u00FA\u010Dinok zmenen\u00FDch nastaven\u00ED, mus\u00EDte asi re\u0161tartova\u0165 Freeplane.
+OptionPanel.absolute = Absol\u00FAtne
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatick\u00E9 vzory rozlo\u017Eenia
+OptionPanel.antialias = Antialias
+OptionPanel.antialias.tooltip = <html>Ur\u010Duje kvalitu mapy. V\u00E4\u010D\u0161ie antialiasovanie vy\u017Eaduje viac \u010Dasu.</html>
+OptionPanel.antialias_all = Vyhla\u010F v\u0161etko
+OptionPanel.antialias_edges = Vyhla\u010F hrany
+OptionPanel.antialias_none = Bez antialiasingu
+OptionPanel.Appearance = V\u00FDzor
+OptionPanel.ar = Ar[translate me]
+OptionPanel.as_parent = Ako rodi\u010Dovsk\u00FD uzol
+OptionPanel.automatic = Automatick\u00E9
+OptionPanel.automaticFormat_level = Automatick\u00E9 \u0161t\u00FDly rozlo\u017Eenia
+OptionPanel.automaticFormat_level1 = Form\u00E1t kore\u0148ov\u00E9ho uzla
+OptionPanel.automaticFormat_level2 = Form\u00E1t uzla 1. \u00FArovne
+OptionPanel.Behaviour = Spr\u00E1vanie
+OptionPanel.bubble = Bubble[translate me]
+OptionPanel.Cancel = Storno
+OptionPanel.childpattern = Vzor poduzla
+OptionPanel.childpattern.tooltip = Vybran\u00FD vzor je pou\u017Eit\u00FD na v\u0161etky poduzly.
+OptionPanel.clear_all_setters = Prepni v\u0161etko
+OptionPanel.clear_all_setters.tooltip = Zapne alebo vypne v\u0161etky indik\u00E1tory zmeny.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Kombinovan\u00E1
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = \u0160tandardn\u00E9
+OptionPanel.default_browser_command_mac = \u0160tandardn\u00FD pr\u00EDkaz prezera\u010Da pre Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> a MAC: (v\u010Faka, Nick!)</html>
+OptionPanel.default_browser_command_other_os = \u0160tandardn\u00FD pr\u00EDkaz prezera\u010Da pre in\u00FD OS
+OptionPanel.default_browser_command_other_os.tooltip = <html>Toto je zvy\u010Dajne Linux:</html>
+OptionPanel.default_browser_command_windows_9x = \u0160tandardn\u00FD pr\u00EDkaz prezera\u010Da pre Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Pre Windows (znamienka "" s\u00FA potrebn\u00E9 kv\u00F4li link\u00E1m, ktor\u00E9 maj\u00FA "=" v URL).</html>
+OptionPanel.default_browser_command_windows_nt = \u0160tandardn\u00FD pr\u00EDkaz prezera\u010Da pre Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Pre Windows (znamienka "" s\u00FA potrebn\u00E9 kv\u00F4li link\u00E1m, ktor\u00E9 maj\u00FA "=" v URL).</html>
+OptionPanel.Defaults = \u0160tandardn\u00E9
+OptionPanel.delete_automatic_saves_at_exit = Vyma\u017E automaticky ulo\u017Een\u00E9 s\u00FAbory pri skon\u010Den\u00ED
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html>Ak by mali by\u0165 s\u00FAbory automaticky vymazan\u00E9 pri norm\u00E1lnom vypnut\u00ED programu Freeplane, nastavte t\u00FAto premenn\u00FA na 'true'</html>
+OptionPanel.disable_cursor_move_paper = Vypni kurzor pri pos\u00FAvan\u00ED papiera
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Nezobrazuj kurzor 'pohyb' po\u010Das pos\u00FAvania papiera</html>
+OptionPanel.edgecolor = Farba hrany
+OptionPanel.edgecolor.tooltip = Vlastnos\u0165 hrany rodi\u010Dovsk\u00E9ho uzla (sa pou\u017Eije aj na v\u0161etky podzuly)
+OptionPanel.edgestyle = \u0160t\u00FDl hrany
+OptionPanel.edgestyle.tooltip = Vlastnos\u0165 hrany rodi\u010Dovsk\u00E9ho uzla (sa pou\u017Eije aj na v\u0161etky podzuly)
+OptionPanel.edgewidth = Hr\u00FAbka hrany
+OptionPanel.edgewidth.tooltip = Vlastnos\u0165 hrany rodi\u010Dovsk\u00E9ho uzla (sa pou\u017Eije aj na v\u0161etky podzuly)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Enter \u0161tandardne potvrdzuje
+OptionPanel.el__max_default_window_height = Max \u0161tandardn\u00E1 v\u00FD\u0161ka okna
+OptionPanel.el__max_default_window_width = Max \u0161tandardn\u00E1 \u0161\u00EDrka okna
+OptionPanel.el__min_default_window_height = Min \u0161tandardn\u00E1 v\u00FD\u0161ka okna
+OptionPanel.el__min_default_window_width = Min \u0161tandardn\u00E1 \u0161\u00EDrka okna
+OptionPanel.el__position_window_below_node = Umiestni okno pod uzlom
+OptionPanel.en = En
+OptionPanel.Environment = Prostredie
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Experiment\u00E1lna zamykanie s\u00FAborov
+OptionPanel.experimental_file_locking_on.tooltip = <html>Experiment\u00E1lna vlastnos\u0165</html>
+OptionPanel.export_icons_in_html = Exportuj ikony v HTML
+OptionPanel.export_icons_in_html.tooltip = <html>\u010Ci by mali HTML s\u00FAbory exportovan\u00E9 z programu Freeplane obsahova\u0165 ikony. Probl\u00E9m s ikonami je, \u017Ee sa v exportovanom HTML \u010Dasto nen\u00E1jdu linky na ikony.</html>
+OptionPanel.Files = S\u00FAbory
+OptionPanel.first = Prv\u00FD
+OptionPanel.foldingsymbolwidth = \u0160\u00EDrka symbolu zbalenia
+OptionPanel.foldingsymbolwidth.tooltip = <html>\u0160\u00EDrka kolieska ozna\u010Duj\u00FAceho zbalenie</html>
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Pod\u013Ea hlavi\u010Dky
+OptionPanel.html_export_fold_all = Zba\u013E v\u0161etko
+OptionPanel.html_export_fold_currently_folded = Zba\u013E moment\u00E1lne zbalen\u00E9
+OptionPanel.html_export_folding = Balenie pri exporte do HTML
+OptionPanel.html_export_no_folding = Bez balenia
+OptionPanel.hu = Hu
+OptionPanel.icon = Ikona
+OptionPanel.icon.tooltip = Ak sa pou\u017Eije, uzol bude ma\u0165 pr\u00E1ve t\u00FAto ikonu.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = Kl\u00E1vesy
+OptionPanel.ko = Kr
+OptionPanel.label_font_size = Ve\u013Ekos\u0165 p\u00EDsma
+OptionPanel.language = Jazyk
+OptionPanel.language.tooltip = <html>Toto je jazyk, ktor\u00FD by mal program pou\u017E\u00EDva\u0165. 'automatic' sa pok\u00FAsi na\u010D\u00EDta\u0165 jazyk aktu\u00E1lneho pou\u017E\u00EDvate\u013Ea. </html>
+OptionPanel.last = Posledn\u00FD
+OptionPanel.last_opened_list_length = D\u013A\u017Eka naposledy otvoren\u00E9ho zoznamu
+OptionPanel.links = Linky
+OptionPanel.links.tooltip = <html>Nastav\u00ED linky bu\u010F na relat\u00EDvne alebo absol\u00FAtne</html>
+OptionPanel.load_folding = On Load[translate me]
+OptionPanel.load_last_map = Automaticky otvor posledn\u00FA mapu
+OptionPanel.load_last_map.tooltip = <html>Ke\u010F program Freeplane \u0161tartuje, automaticky na\u010D\u00EDta naposledy otvoren\u00FA mapu, ak je toto zapnut\u00E9.</html>
+OptionPanel.lookandfeel = V\u00FDzor a spr\u00E1vanie
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Max \u0161\u00EDrka uzla
+OptionPanel.max_node_width.tooltip = <html>\u0160tandardn\u00E1 maxim\u00E1lna \u0161\u00EDrka uzla v pixeloch</html>
+OptionPanel.metal = Kov
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb[translate me]
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn
+OptionPanel.nodebackgroundcolor = Farba pozadia uzla
+OptionPanel.nodecolor = Farba uzla
+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
+OptionPanel.OK = Ulo\u017E
+OptionPanel.patternname = N\u00E1zov
+OptionPanel.patternname.tooltip = Jedine\u010Dn\u00FD n\u00E1zov vzoru
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Umiestni nov\u00E9 vetvy
+OptionPanel.placenewbranches.tooltip = <html>Kam umiestni\u0165 nov\u00E9 vetvy. Mo\u017En\u00E9 hodnoty s\u00FA 'first' (ako prv\u00E9) a 'last' (ako posledn\u00E9)</html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Relat\u00EDvne
+OptionPanel.ru = Ru
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = Met\u00F3da vyberania
+OptionPanel.selection_method_by_click = Kliknut\u00EDm
+OptionPanel.selection_method_delayed = Spomalen\u00E9
+OptionPanel.selection_method_direct = Priamo
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Vzory
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Atrib\u00FAty
+OptionPanel.separator.automatic_save = Automatick\u00E9 ulo\u017Eenie
+OptionPanel.separator.behaviour = Spr\u00E1vanie
+OptionPanel.separator.browser = Prezera\u010D
+OptionPanel.separator.commands_for_the_program = Pr\u00EDkazy programu
+OptionPanel.separator.default_colors = \u0160tandardn\u00E9 farby
+OptionPanel.separator.default_fonts = \u0160tandardn\u00E9 p\u00EDsma
+OptionPanel.separator.default_styles = \u0160tandardn\u00E9 \u0161t\u00FDly
+OptionPanel.separator.EdgeControls = Hrany
+OptionPanel.separator.edit_long_node_window = Edituj dlh\u00FD uzol v okne
+OptionPanel.separator.files = S\u00FAbory
+OptionPanel.separator.General = V\u0161eobecn\u00E9
+OptionPanel.separator.html_export = Export do HTML
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Druhy hyperliniek
+OptionPanel.separator.icon_properties = Ikony
+OptionPanel.separator.initial_map_size = Po\u010Diato\u010Dn\u00E9 rozmery mapy
+OptionPanel.separator.key_typing = P\u00EDsanie z kl\u00E1vesnice
+OptionPanel.separator.language = Jazyk
+OptionPanel.separator.look_and_feel = V\u00FDzor a spr\u00E1vanie
+OptionPanel.separator.new_node_commands = Pr\u00EDkazy na nov\u00FD uzol
+OptionPanel.separator.node_editing_commands = Pr\u00EDkazy na editovanie uzla
+OptionPanel.separator.node_navigation_commands = Pr\u00EDkazy na navig\u00E1ciu uzla
+OptionPanel.separator.NodeColors = Farby uzlov
+OptionPanel.separator.NodeFont = P\u00EDsmo uzla
+OptionPanel.separator.other_defaults = Ostatn\u00E9 \u0161tandardn\u00E9
+OptionPanel.separator.others = Ostatn\u00E9 kl\u00E1vesov\u00E9 skratky
+OptionPanel.separator.patterns = Vzory
+OptionPanel.separator.save = Ulo\u017E
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = Met\u00F3da vyberania
+OptionPanel.separator.undo = Sp\u00E4\u0165
+OptionPanel.set_property_text = Zme\u0148
+OptionPanel.set_property_text.tooltip = Pr\u00E1zdne: nechyta\u0165; m\u00EDnus=zru\u0161 vlastnos\u0165 (nastav \u0161tandardn\u00E9 hodnoty); plus=zme\u0148 vlastnos\u0165
+OptionPanel.show_icon_for_attributes = Zobraz ikony vlastnost\u00ED
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = \u0160tandardn\u00E1 farba pozadia
+OptionPanel.standardbackgroundcolor.tooltip = <html>\u0160tandardn\u00E1 farba pozadia vo form\u00E1te HTML</html>
+OptionPanel.standardcloudcolor = \u0160tandardn\u00E1 farba oblaku
+OptionPanel.standardcloudcolor.tooltip = <html>\u0160tandardn\u00E1 farba oblaku vo form\u00E1te HTML</html>
+OptionPanel.standardcloudestyle = \u0160tandardn\u00FD \u0161t\u00FDl oblaku
+OptionPanel.standardcloudestyle.tooltip = <html>\u0160tandardn\u00FD \u0161t\u00FDl oblaku; moment\u00E1lne iba 'bezier'</html>
+OptionPanel.standardlinkcolor = \u0160tandardn\u00E1 farba linky
+OptionPanel.standardlinkcolor.tooltip = <html>\u0160tandardn\u00E1 farba linky vo form\u00E1te HTML</html>
+OptionPanel.standardlinkestyle = \u0160tandardn\u00FD \u0161t\u00FDl linky
+OptionPanel.standardlinkestyle.tooltip = <html>\u0160tandardn\u00FD \u0161t\u00FDl linky; moment\u00E1lne iba 'bezier'</html>
+OptionPanel.standardselectednodecolor = \u0160tandardn\u00E1 farba ozna\u010Den\u00E9ho uzla
+OptionPanel.standardselectednodecolor.tooltip = <html>\u0160tandardn\u00E1 farba ozna\u010Den\u00E9ho uzla vo form\u00E1te HTML (#\u010C\u010CZZMM v \u0161estn\u00E1stkov\u00FDch \u010D\u00EDslach)</html>
+OptionPanel.sv = Se
+OptionPanel.time_for_automatic_save = \u010Casov\u00FD interval automatick\u00E9ho ulo\u017Eenia
+OptionPanel.time_for_automatic_save.tooltip = <html>\u010Das medzi dvoma nasleduj\u00FAcimi automatick\u00FDmi ulo\u017Eeniami (v milisekund\u00E1ch); automatick\u00E9 uklaanie sa vypne pomocou hodnoty 2000000000.</html>
+OptionPanel.time_for_delayed_selection = \u010Cas oneskorenia ozna\u010Denia
+OptionPanel.time_for_delayed_selection.tooltip = <html>Pauza pred ozna\u010Den\u00EDm uzla, ke\u010F nad n\u00EDm prech\u00E1dza my\u0161 (v milisekund\u00E1ch). Nastavte t\u00FAto hodnotu na 1, ak chcete pri prechode my\u0161ou ponad uzol hne\u010F ozna\u010Di\u0165.</html>
+OptionPanel.tr = Tr
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Nedefinovan\u00E9 p\u00EDsmo
+OptionPanel.undo_levels = Po\u010Det n\u00E1vratov
+OptionPanel.undo_levels.tooltip = <html>Ur\u010Duje ko\u013Eko krokov je ulo\u017Een\u00FDch, aby sa dali vr\u00E1ti\u0165 pr\u00EDkazom "Sp\u00E4\u0165".</html>
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Speed[translate me]
+OptionPanel.windows = Okn\u00E1
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Nastavenie strany...
+PasteAction.text = Vlo\u017E
+PatternNewNameProperty = Nov\u00FD vzor
+PatternToString.backgroundColor = Farba pozadia
+PatternToString.EdgeStyle = \u0160t\u00FDl hrany
+PatternToString.EdgeWidth = Hr\u00FAbka hrany
+PatternToString.FontBold = Tu\u010Dn\u00E9
+PatternToString.FontName = Font Name[translate me]
+PatternToString.Icon = Ikona
+PatternToString.NodeFontSize = Ve\u013Ekos\u0165 p\u00EDsma
+plugins/ScriptEditor.new_script = New Script[translate me]
+plugins/ScriptEditor/window.title = Script Editor[translate me]
+plugins/TimeList.xml_Created = Vytvoren\u00E9
+plugins/TimeList.xml_Date = D\u00E1tum
+plugins/TimeList.xml_Icons = Ikony
+plugins/TimeList.xml_Modified = Zmenen\u00E9
+plugins/TimeList.xml_Notes = Notes[translate me]
+plugins/TimeList.xml_Text = Text
+plugins/TimeManagement.xml_appendButton = Pripoj d\u00E1tum k ozna\u010Den\u00FDm uzlom
+plugins/TimeManagement.xml_Cancel = Storno
+plugins/TimeManagement.xml_cancelButton = Storno
+plugins/TimeManagement.xml_closeButton = Zavri
+plugins/TimeManagement.xml_Export = Exportuj ozna\u010Den\u00E9 uzly
+plugins/TimeManagement.xml_Find = N\u00E1jdi
+plugins/TimeManagement.xml_Goto = Cho\u010F na
+plugins/TimeManagement.xml_hour = Hodina:
+plugins/TimeManagement.xml_minute = Min\u00FAta:
+plugins/TimeManagement.xml_reminderButton = Pripome\u0148 mi v tento d\u00E1tum
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Po stla\u010Den\u00ED sa napl\u00E1nuje \u010Dasova\u010D na dan\u00FD d\u00E1tum. Potom v\u00E1s upozorn\u00ED blikaj\u00FAca ikona.<br> Ak zavriete mapu, \u010Dasova\u010De sa znovu aktivuj\u00FA nabud\u00FAce po jej otvoren\u00ED.</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Napl\u00E1novan\u00E1 pripomienka na {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Odstr\u00E1\u0148 pripomienku
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Odstr\u00E1\u0148 v\u0161etky pripomienky spojen\u00E9 s ozna\u010Den\u00FDmi uzlami.
+plugins/TimeManagement.xml_Replace = Nahra\u010F
+plugins/TimeManagement.xml_Replace_All = Nahra\u010F v\u0161etko
+plugins/TimeManagement.xml_Replace_Selected = Nahra\u010F ozna\u010Den\u00E9
+plugins/TimeManagement.xml_Select = Vyber
+plugins/TimeManagement.xml_todayButton = Dnes
+plugins/TimeManagement.xml_WindowTitle = Riadenie \u010Dasu
+preferences = Nastavenia
+PrintDirectAction.text = Tla\u010D...
+printing_settings = Mierka tla\u010De
+PrintPreviewAction.text = Uk\u00E1\u017Eka tla\u010De...
+PropertyAction.text = Nastavenia...
+QuitAction.text = Ukon\u010Di
+read_only = Iba na \u010D\u00EDtanie
+RedoAction.text = Znova
+RedoFilterAction.text = Znova
+ReminderHookAction.text = Odstr\u00E1\u0148 pripomienku
+ReminderHookAction.tooltip = Odstr\u00E1ni pozn\u00E1mku z uzla
+RemoveAllIconsAction.text = Odstr\u00E1\u0148 v\u0161etky ikony
+RemoveIconAction.text = Odstr\u00E1\u0148 posledn\u00FA ikonu
+repair_link = Oprav linku
+repair_link_question = Nem\u00F4\u017Eem na\u010D\u00EDta\u0165 linkovan\u00FA mapu. Oprav\u00EDte linku ru\u010Dne?
+replace = Nahra\u010F
+ResetNodeLocationAction.text = Vr\u00E1\u0165 poz\u00EDciu
+save_failed = Nepodarilo sa ulo\u017Ei\u0165 mapu {0}.
+save_unsaved = Ulo\u017Ei\u0165 nasleduj\u00FAcu mapu my\u0161lienok? :
+SaveAction.text = Ulo\u017E
+SaveAll.text = Ulo\u017E v\u0161etky
+SaveAll.tooltip = Ulo\u017E\u00ED v\u0161etky otvoren\u00E9 mapy.
+SaveAsAction.text = Ulo\u017E ako...
+saved = Ulo\u017Een\u00E9
+scheme_evaluate = Vyhodno\u0165!
+select_favorites_folder = Vyberte adres\u00E1r, kde sa nach\u00E1dzaj\u00FA va\u0161e ob\u013E\u00FAben\u00E9 polo\u017Eky
+select_folder_for_importing = Vyberte adres\u00E1r na import
+SelectAllAction.text = Ozna\u010D v\u0161etky vidite\u013En\u00E9
+SelectBranchAction.text = Ozna\u010D vidite\u013En\u00FA vetvu
+selection_method_by_click = Ozna\u010Dte jednoduch\u00FDm kliknut\u00EDm
+selection_method_delayed = Spomalen\u00E9 automatick\u00E9 ozna\u010Dovanie
+selection_method_direct = Ozna\u010Dte uk\u00E1zan\u00EDm
+SetImageByFileChooserAction.text = Obr\u00E1zok (vyberte s\u00FAbor alebo linku)...
+SetLinkByFileChooserAction.text = Hyperlinka (vyberte s\u00FAbor)...
+SetLinkByTextFieldAction.text = Hyperlinka (zadajte text)...
+ShowAllAttributesAction.text = Uk\u00E1\u017E v\u0161etky atrib\u00FAty
+ShowAncestorsAction.text = Uk\u00E1\u017E predkov
+ShowAttributeDialogAction.text = Spr\u00E1vca atrib\u00FAtov
+ShowDescendantsAction.text = Uk\u00E1\u017E potomkov
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+ShowSelectedAttributesAction.text = Uk\u00E1\u00FD ozna\u010Den\u00E9 atrib\u00FAty
+simplyhtml.boldName = bold[translate me]
+simplyhtml.borderWidthLabel = \u0160\u00EDrka
+simplyhtml.cancelBtnName = Storno
+simplyhtml.cellGenTabLabel = V\u0161eobecn\u00E9
+simplyhtml.close = Zavri
+simplyhtml.closeBtnName = Zavri
+simplyhtml.copyLabel = Kop\u00EDruj
+simplyhtml.cutLabel = Vystrihni
+simplyhtml.defaultDocName = Untitled[translate me]
+simplyhtml.editLabel = Edituj
+simplyhtml.effectLabel = Effect[translate me]
+simplyhtml.fontBoldLabel = Tu\u010Dn\u00E9
+simplyhtml.fontItalicLabel = Kurz\u00EDva
+simplyhtml.fontTabLabel = P\u00EDsmo
+simplyhtml.fontUnderlineLabel = Pod\u010Diarkni
+simplyhtml.helpLabel = Pomoc
+simplyhtml.okBtnName = OK
+simplyhtml.pasteLabel = Vlo\u017E
+simplyhtml.plainName = plain[translate me]
+simplyhtml.redoLabel = Znova
+simplyhtml.replaceAll = V\u0161etky
+simplyhtml.replaceNo = Nie
+simplyhtml.replaceYes = \u00C1no
+simplyhtml.styleLabel = \u0160t\u00FDl
+simplyhtml.uLineLabel = Pod\u010Diarkni
+simplyhtml.undoLabel = Sp\u00E4\u0165
+split = Rozde\u013E
+style = \u0160t\u00FDl
+svg = SVG[translate me]
+TimeListAction.text = Zobraz zoznam pl\u00E1nova\u010Da \u010Dasu...
+TimeListAction.tooltip = Zobraz v\u0161etky napl\u00E1novan\u00E9 \u010Dasy a zodpovedaj\u00FAce uzly.
+TimeManagementAction.text = Zobraz kalend\u00E1r...
+TimeManagementAction.tooltip = <html>Zobraz\u00ED kalend\u00E1rov\u00FD modul od Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = Rozba\u013E / Zba\u013E deti
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Prepni zbalen\u00E9
+ToggleLeftToolbarAction.text = Prepni \u013Eav\u00E9 menu
+ToggleMenubarAction.text = Prepni menu
+ToggleToolbarAction.text = Prepni n\u00E1strojov\u00FA li\u0161tu
+undefined_error = Nastava ne\u010Dakan\u00E1 chyba. Pros\u00EDm pok\u00FAste sa nahl\u00E1si\u0165 chybov\u00FA spr\u00E1vu.
+underline = Pod\u010Diarkni
+underlined = Pod\u010Diarknut\u00E9
+UndoAction.text = Sp\u00E4\u0165
+UndoFilterAction.text = Sp\u00E4\u0165
+unfold = Rozba\u013E
+UnfoldAllAction.text = Rozba\u013E v\u0161etky
+UnfoldAllAction.tooltip = <html>Rozbal\u00ED ozna\u010Den\u00FD uzol a v\u0161etky jeho poduzly.</html>
+UnfoldOneLevelAction.text = Rozba\u013E jednu \u00FArove\u0148
+UnfoldOneLevelAction.tooltip = <html>Rozbal\u00ED ozna\u010Den\u00E9 uzly o jednu \u00FArove\u0148.</html>
+url_error = Toto URL je nespr\u00E1vne zap\u00EDsan\u00E9!
+url_load_error = Neviem na\u010D\u00EDta\u0165 mapu z URL:
+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):
+width = \u0160\u00EDrka
+yes = \u00C1no
+ZoomInAction.text = Zv\u00E4\u010D\u0161i zaostrenie
+ZoomOutAction.text = Zmen\u0161i zaostrenie
diff --git a/freeplane/resources/translations/Resources_sl.properties b/freeplane/resources/translations/Resources_sl.properties
new file mode 100644
index 0000000..367d8ce
--- /dev/null
+++ b/freeplane/resources/translations/Resources_sl.properties
@@ -0,0 +1,971 @@
+AboutAction.text = O programu
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/ApplyFormatPlugin.dialog.title = Spremeni obliko vozli\u0161\u010D
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Spremeni vzorec
+accessories/plugins/EncryptNode.properties_0 = Izberite geslo za \u0161ifrirano vozli\u0161\u010De
+accessories/plugins/EncryptNode.properties_1 = Gesli se ne ujemata ali pa sta prekratki.
+accessories/plugins/EncryptNode.properties_2 = Vnesite geslo:
+accessories/plugins/EncryptNode.properties_3 = Ponovno vnesite geslo:
+accessories/plugins/EncryptNode.properties_4 = Vnesite svoje geslo.
+accessories/plugins/EncryptNode.properties_5 = <html>Zapomnite si, da je mo\u010D \u0161ifriranja<br> odvisna skoraj povsem od kvalitete va\u0161ega gesla.
+accessories/plugins/EncryptNode.properties_6 = V redu
+accessories/plugins/EncryptNode.properties_7 = Prekli\u010Di
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Preklapljate lahko le stanje \u0161ifriranja \u0161ifrirnega na\u010Dina. Prosimo vstavite tak\u0161no vozli\u0161\u010De s pomo\u010Djo menija orodja.
+accessories/plugins/EncryptNode.properties_select_me = Izberite za nadaljevanje!
+accessories/plugins/EncryptNode.properties_wrong_password = Geslo ni pravilno.
+accessories/plugins/ExportWithTWiki.text = Kot TWiki ...
+accessories/plugins/ExportWithTWiki.tooltip = Izvozi miselni vzorec kot dokument TWiki.
+accessories/plugins/ExportWithXSLT.tooltip = To je uniformna metoda izvoza z uporabo skript XSLT.
+accessories/plugins/ExportWithXSLT_Applet.text = Kot program\u010Dek v Javi ...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Izvozi miselni vzorec kot program\u010Dek za brskalnik v javi.
+accessories/plugins/ExportWithXSLT_Flash.text = Kot flash ...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Izvozi miselni vzorec kot aplikacijo v flashu.
+accessories/plugins/ExportWithXSLT_HTML.text = Kot XHTML (razli\u010Dica JavaScript) ...
+accessories/plugins/ExportWithXSLT_HTML3.text = Kot XHTML (razli\u010Dica klikalne slike vzorca) ...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Viri iz vozli\u0161\u010Da RESOURCES v datoteko TaskJuggler ...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Izvori vire iz vozli\u0161\u010Da RESOURCES v modul Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Opravki iz vozli\u0161\u010Da TASKS v datoteko TaskJuggler ...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Izvozi opravila iz vozli\u0161\u010Da TASKS v modul Taskjuggler. </html>
+add = dodaj
+AddLocalLinkAction.text = Dodaj krajevno hiperpovezavo
+antialias_all = Pogladi robove vsega
+antialias_edges = Pogladi le robove
+antialias_none = Ne gladi robov
+apply = Uporabi
+ApplyAction.text = Uporabi
+ApplyFormatPlugin.text = Spremeni obliko ...
+ApplyFormatPlugin.tooltip = Predstavi pogovorno okno, v katerem lahko naenkrat spremenite atribute vozli\u0161\u010Da in robov.
+ApplyNoFilteringAction.text = Brez filtriranja
+as_parent = Kot star\u0161
+AssignAttributesAction.text = Dodeli atribute ...
+attribute_delete = Izbri\u0161i vse vrednosti
+attribute_delete_value = Izbri\u0161i to vrednost
+attribute_font_size_tooltip = Velikost pisave atributa
+attribute_list_box_label_text = Obstoje\u010De vrednosti
+attribute_replace = Zamenjaj z
+attribute_top = Vse znane atribute za nalo\u017Eene miselne vzorce
+attributes_adding_empty_attribute_error = Za ime atributa ni mogo\u010De uporabiti praznega niza
+attributes_all = Vsi atributi
+attributes_attribute = Atributi
+attributes_close = Zapri
+attributes_deselect_all = ni\u010D
+attributes_dialog_title = Upravljalec atributov
+attributes_edit = Uredi
+attributes_edit_tooltip = Uredi mno\u017Eico
+attributes_for_selected = izbrana vozli\u0161\u010Da
+attributes_for_visible = vsa vidna vozli\u0161\u010Da
+attributes_import = Uvozi
+attributes_import_tooltip = Uvozi atribute iz drugih nalo\u017Eenih miselnih vzorcev
+attributes_no_import_candidates_found = Ni najdenih novih atributov
+attributes_popup_delete = Izbri\u0161i
+attributes_popup_down = Navzdol
+attributes_popup_edit = Uredi
+attributes_popup_hide = Skrij
+attributes_popup_new = Nov atribut
+attributes_popup_optimal_width = Optimalna \u0161irina
+attributes_popup_up = Navzgor
+attributes_refresh = osve\u017Ei
+attributes_restricted_attributes_tooltip = Omeji mno\u017Eico atributov
+attributes_restricted_values_tooltip = Omeji mno\u017Eico vrednosti za trenutne atribute
+attributes_restriction = omejena mno\u017Eica
+attributes_select_all = vse
+attributes_select_all_tooltip = Izberi / razberi vse
+attributes_show = Poka\u017Ei
+attributes_skip_root = Presko\u010Di korensko vozli\u0161\u010De
+attributes_visible = Vidno
+attributes_visible_tooltip = Vidno
+automatically_save_message = Miselni vzorec je bil samodejno shranjen (z uporabo imena datoteke {0}) ...
+AutomaticLayoutAction.text = Samodejna postavitev
+AutomaticLayoutAction.tooltip = <html>Popravi izgled miselnega vzorca. <br>Prva stopnja je \u010Drna, druga modra itn.</html>
+BackAction.text = Nazaj
+BackAction.tooltip = Sko\u010Di nazaj v izbrani verigi
+background = Ozadje
+BlinkingNodeHookAction.text = Utripajo\u010Di na\u010Din
+BlinkingNodeHookAction.tooltip = <html>S tem pri\u010Dne vozli\u0161\u010De utripati. Vendar bodite pozorni. Me povezujte ga s preve\u010D vozli\u0161\u010Di in <strong> ne z drugimi samodejnimi oblikovanji k istemu vozli\u0161\u010Du</strong></html>
+BoldAction.text = Krepko
+boldify_branch = Okrepi
+branch = Veja
+cancel = Razveljavi
+CancelAction.text = Razveljavi
+cannot_add_parent_diff_parents = Vsa vozli\u0161\u010Da morajo imeti istega star\u0161a za uporabo te funkcije.
+cannot_add_parent_to_root = Korenskega vozli\u0161\u010Da ni mo\u017Eno dodati k novemu star\u0161u.
+cannot_delete_root = Korenskega vozli\u0161\u010Da ni mo\u017Eno izbrisati ali izrezati.
+cannot_join_nodes_with_children = Vozli\u0161\u010D ni mogo\u010De zdru\u017Eiti z otroci
+cannot_move_to_child = Vozli\u0161\u010Da ni mo\u017Eno premakniti k enemu njegovih otrok.
+CenterAction.text = Sredinski
+ChangeConnectorArrowsAction.backward.text = Nazaj
+ChangeConnectorArrowsAction.forward.text = Naprej
+ChangeNodeLevelLeftsAction.text = Vozli\u0161\u010De na levi
+ChangeNodeLevelLeftsAction.tooltip = Tisti levo od korenskega(ih) vozli\u0161\u010D(a) je/so zamaknjeni navzdol. Postane(jo) otroci svojega gornjega bratskega vozli\u0161\u010Da. Tisti desno od korenskega(ih) vozli\u0161\u010D(a) so zamaknjeni navzgor. Neposredno ob korenu vozli\u0161\u010Da zamenjajo strani.
+ChangeNodeLevelRightsAction.text = Vozli\u0161\u010De na desni
+ChangeNodeLevelRightsAction.tooltip = Tisti desno od korenskega(ih) vozli\u0161\u010D(a) je/so zamaknjeni navzdol. Postane(jo) otroci svojega gornjega bratskega vozli\u0161\u010Da. Tisti levo od korenskega(ih) vozli\u0161\u010D(a) so zamaknjeni navzgor. Neposredno ob korenu vozli\u0161\u010Da zamenjajo strani.
+choose_background_color = Izberite barvo ozadja:
+choose_cloud_color = Izberite barvo obla\u010Dka:
+choose_edge_color = Izberi barvo robu
+choose_node_background_color = Izberite barvo ozadja vozli\u0161\u010Da:
+choose_node_color = Izberite barvo vozli\u0161\u010Da:
+CloseAction.text = Zapri
+CloudAction.text = Obla\u010Dek
+CloudColorAction.text = Barva obla\u010Dka ...
+ColorProperty.ResetColor = Ponastavi barvo
+combined = Zdru\u017Eeno
+confirmation = Potrditev
+connector = Connector[translate me]
+connector_label = Connector Label[translate me]
+CopyAction.text = Kopiraj
+CopySingleAction.text = Kopiraj posami\u010Dno
+CreationModificationPluginAction.text = Prika\u017Ei \u010Dase sprememb
+CreationModificationPluginAction.tooltip = <html>Ta funkcija bele\u017Ei nastanek vozli\u0161\u010Da in \u010Dase spreminjanja.</html>
+CutAction.text = Izre\u017Ei
+decrease_branch_font_size = Manj\u0161a pisava
+DecreaseNodeFontAction.text = Manj\u0161a pisava
+delete = izbri\u0161i
+delete_child = Izbri\u0161i vozli\u0161\u010De
+DeleteAction.text = Odstrani vozli\u0161\u010De
+DeleteConditionAction.text = Izbri\u0161i
+DocumentationAction.text = Dokumentacija
+edge = Obroba
+edge_style = Slog roba
+edge_width = \u0160irina roba
+EdgeColorAction.text = Barva obrobe ...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.horizontal.text = Horizontal[translate me]
+EdgeStyleAction.linear.text = Linearno
+EdgeStyleAction.sharp_bezier.text = ostro Bezier
+EdgeStyleAction.sharp_linear.text = ostro linearno
+EdgeStyleAsParentAction.text = Kot star\u0161
+EdgeWidthAction_width_parent.text = Star\u0161a
+EdgeWidthAction_width_thin.text = Tanek
+edit = Uredi
+edit.decision = Urejevalnik HTML
+edit.edit_rich_text = \u017Delite uporabiti oblikovanje, kot je krepko in le\u017Ee\u010De?
+edit_link_manually = Ro\u010Dno uredi hiperpovezavo ...
+edit_long_node = Edit Long Node[translate me]
+edit_middle_label = Edit Middle Label[translate me]
+edit_target_label = Edit Target Label[translate me]
+EditAction.text = Uredi vozli\u0161\u010De
+EditAttributesAction.text = Uredi atribute
+EditFilterAction.text = Uredi
+EditLongAction.text = Uredi dolgo vozli\u0161\u010De ...
+EncryptedMap.text = Ustvari \u0161ifriran miselni vzorec ...
+EncryptedMap.tooltip = Ustvari nov \u0161ifriran miselni vzorec
+enter_base_url = Prilepljene bodo relativne povezave. Prosimo, vnesite osnovni URL.
+enter_confirms = Tipka Enter potrdi
+EnterPassword.text = Preklopi \u0161ifrirano / ne\u0161ifrirano
+error = Napaka
+error_applying_template = Napaka pri uveljavljanju predloge XSL.
+error_creating_directory = Imenika za izvoz ni mogo\u010De ustvariti.
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+ExportAction.text = Izvozi
+ExportBranchToHTMLAction.text = Razvejaj kot HTML
+ExportPdf.text = Kot PDF ...
+ExportSvg.text = Kot SVG ...
+ExportToHTMLAction.text = Kot HTML
+ExportToImage.jpg.text = Kot JPEG ...
+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
+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_add = dodaj
+filter_and = in
+filter_conditions = Filtri
+filter_contains = vsebuje
+filter_delete = izbri\u0161i
+filter_dialog = Sestavljalec filtrov
+filter_does_not_exist = ne obstaja
+filter_edit_description = Uredi seznam filtrov
+filter_enter_value = Vnesite vrednost
+filter_exist = obstaja
+filter_icon = Ikona
+filter_is_equal_to = je enako
+filter_is_not_equal_to = ni enako
+filter_no_filtering = Brez filtriranja
+filter_node = besedilo vozli\u0161\u010Da
+filter_not = ne
+filter_or = ali
+filter_select = izberi
+filter_selected_node_view = Trenutno izbrana vozli\u0161\u010Da
+find_what = Najdi niz
+FindAction.text = Najdi ...
+fit_map_to_page = Prilagodi velikosti ene strani
+FitToPage.text = Prilagodi velikosti strani
+FitToPage.tooltip = Prilagodi zoom tako, da celoten miselni vzorec sodi v trenutno okno.
+fold = Prepogni
+FoldAllAction.text = Prepogni vse
+FoldAllAction.tooltip = <html>Prepogne izbrana vozli\u0161\u010Da in vse njihove otroke.</html>
+FoldOneLevelAction.text = Prepogni eno stopnjo
+FoldOneLevelAction.tooltip = <html>Prepogne izbrana vozli\u0161\u010Da za eno stopnjo.</html>
+follow_graphical_link = Pojdi na:
+FollowLinkAction.text = Follow Link[translate me]
+font = Pisava
+FontFamilyAction.text = dru\u017Eina pisav
+FontSizeAction.text = velikost pisave
+format_menu_edge_styles = Slogi robov
+format_menu_edge_widths = \u0160irine robov
+FormatCopy.text = Kopiraj obliko
+FormatCopy.tooltip = <html>Kopira obliko vozli\u0161\u010Da.</html>
+FormatPaste.text = Prilepi obliko
+FormatPaste.tooltip = <html>Prilepi obliko vozli\u0161\u010Da.</html>
+ForwardAction.text = Naprej
+ForwardAction.tooltip = Sko\u010Di naprej v izbrani verigi
+Freeplane.progress.buildScreen = Zaslon gradnje ...
+Freeplane.progress.createController = Ustvarjanje kontrolnika ...
+Freeplane.progress.createInitialMode = Ustvarjanje za\u010Detnega na\u010Dina ...
+Freeplane.progress.endStartup = Dokon\u010Danje zagona.
+Freeplane.progress.gettingPreferenceDirectories = Pridobivanje nastavitev miselnih vzorcev ...
+Freeplane.progress.gettingPreferences = Pridobivanje nastavitev ...
+Freeplane.progress.loadMaps = Nalaganje miselnih vzorcev ...
+Freeplane.progress.propagateLookAndFeel = Uveljavljanje videza in ob\u010Dutka ...
+Freeplane.progress.settingPreferences = Nastavljanje ...
+Freeplane.progress.startCreateController = Za\u010Detek ustvarjanja kontrolnika ...
+Freeplane.progress.updateLookAndFeel = Posodabljanje videza in ob\u010Dutka ...
+freeplane_reverted = Freeplane_Preobrnjeno_
+FreeplaneHelpStarter.text = Pomo\u010D ...
+FreeplaneHelpStarter.tooltip = Raz\u0161irjena pomo\u010D Freeplane
+GotoLinkNodeAction.text = Pojdi na povezavo
+GrabKeyDialog.common.cancel = Prekli\u010Di
+GrabKeyDialog.common.ok = V redu
+GrabKeyDialog.grab-key.assigned-to = Dodeljeno k
+GrabKeyDialog.grab-key.assigned-to.none = Trenutno nedodeljeno
+GrabKeyDialog.grab-key.clear = Po\u010Disti
+GrabKeyDialog.grab-key.remove = Odstrani
+GrabKeyDialog.grab-key.remove-ask = Ste prepri\u010Dani, da ho\u010Dete odstraniti to akcijo tipke?
+GrabKeyDialog.grab-key.title = Vnesi novo tipko
+help = Pomo\u010D
+HideAllAttributesAction.text = Skrij vse atribute
+HierarchicalIconsAction.text = Prika\u017Ei ikone hierarhi\u010Dno
+HierarchicalIconsAction.tooltip = \u010Ce ima kateri od otrok/vnukov ikono, to ikono prika\u017Ee tudi v majhni obliki.
+HotKeyInfoAction.text = Key Reference[translate me]
+html_export_based_on_headings = Izvoz HTML - Glede na naslove
+html_export_fold_all = Izvoz HTML - Prepogni vse
+html_export_fold_currently_folded = Izvoz HTML - Prepogni trenutno prepognjene
+html_export_no_folding = Izvoz HTML - Brez prepogibanja
+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]
+icon_attach = Poglej sem
+icon_back = Nazaj
+icon_bee = Freeplane[translate me]
+icon_bell = Zapomni si
+icon_bookmark = Izvrstno
+icon_broken-line = Broken[translate me]
+icon_button_cancel = Ni v redu
+icon_button_ok = V redu
+icon_calendar = Datum
+icon_clanbomber = Nevarno
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Ne pozabi
+icon_down = Navzdol
+icon_family = Dru\u017Eina
+icon_fema = Females[translate me]
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_females = Females[translate me]
+icon_flag = Zastavica
+icon_flag-black = Black Flag[translate me]
+icon_flag-green = Green Flag[translate me]
+icon_flag-orange = Orange Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_flag-yellow = Yellow Flag[translate me]
+icon_forward = Naprej
+icon_full-1 = 1. prioriteta
+icon_full-2 = 2. prioriteta
+icon_full-3 = 3. prioriteta
+icon_full-4 = 4. prioriteta
+icon_full-5 = 5. prioriteta
+icon_full-6 = 6. prioriteta
+icon_full-7 = 7. prioriteta
+icon_go = Green Traffic Light[translate me]
+icon_gohome = Domov
+icon_help = Vpra\u0161anje
+icon_hourglass = Waiting[translate me]
+icon_idea = Ideja
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_kmail = E-Mail[translate me]
+icon_knotify = Glasba
+icon_korn = Po\u0161tni nabiralnik
+icon_ksmiletris = Sre\u010Den sem
+icon_licq = Krasno
+icon_list = List[translate me]
+icon_Mail = Po\u0161ta
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_males = Males[translate me]
+icon_menu = Ikone
+icon_messagebox_warning = Pomembno
+icon_password = Klju\u010D
+icon_pencil = Za izbolj\u0161ati
+icon_penguin = Linux
+icon_prepare = Yellow Traffic Light[translate me]
+icon_smiley-neutral = No Mind[translate me]
+icon_smily_bad = Mi ni sme\u0161no
+icon_stop = Ustavi
+icon_up = Navzgor
+icon_wizard = \u010Carovnija
+icon_xmag = Potrebna je razprava
+icon_yes = Pomembno
+IconGroupPopupAction.arrows.text = Arrows[translate me]
+IconGroupPopupAction.docs_folders.text = Docs & Folders[translate me]
+IconGroupPopupAction.numbers.text = Numbers[translate me]
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.signs.text = Signs[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Izberi ikono ...
+IconSelectionPlugin.tooltip = <html>Tukaj lahko izberete ikono z uporabo podokna.</html>
+import = Uvozi
+import_linked_branch_no_link = Izbrano vozli\u0161\u010De nima nobene povezave za uvoz.
+ImportAction.text = Uvozi
+ImportBranchAction.text = Veja ...
+ImportExplorerFavoritesAction.text = Priljubljeni ...
+ImportFolderStructureAction.text = Struktura map ...
+ImportLinkedBranchAction.text = Povezana veja
+ImportLinkedBranchWithoutRootAction.text = (Povezana veja) brez korenine ...
+ImportMindmanagerFiles.text = Miselni vzorec MindManager X5 ...
+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.
+load = Nalo\u017Ei
+locking_failed_by_open = Zaklep miselnega vzorca {0} ni uspel. Odpiranje samo za branje.
+locking_failed_by_save_as = Zaklep miselnega vzorca {0} ni uspel. Dejanje shranjevanja kot je bilo prekinjeno.
+locking_old_lock_removed = Miselni vzorec {0} je zaklenil uporabnik {1}. Zaklep je bil odstranjen, saj je star.
+long_node_changed_cancel = Spremenili ste vozli\u0161\u010De. \u017Delite zavre\u010Di spremembe?
+long_node_changed_submit = Spremenili ste vozli\u0161\u010De. \u017Delite shraniti spremembe?
+lots_of_links_warning = Ustvarili boste veliko povezav z istim vozli\u0161\u010Dem. Resni\u010Dno \u017Eelite ustvariti te povezave?
+map_already_exists = ;Miselni vzorec \u017Ee obstaja. Ga \u017Eelite prepisati?
+map_corrupted = Miselni vzorec je okvarjen. Si \u017Eelite ogledati podrobnosti?
+map_locked_by_open = Miselni vzorec {0} je \u017Ee urejevan s strani uporabnika {1}. Odpiranje samo za branje.
+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)
+mindmaps_filter_desc = Filtri (*.mmfilter)
+mode_Browse = Browse Mode[translate me]
+mode_File = File Mode[translate me]
+mode_MindMap = MindMap Mode[translate me]
+mode_na = Na\u010Din ni na voljo
+mode_status = Na\u010Din spremenjen v na\u010Din {0}
+mode_title = Freeplane - Na\u010Din {0}
+modes = Na\u010Dini
+ModesMenuAction.Browse.text = Map Browser[translate me]
+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
+NavigationNextMapAction.text = Naslednji vzorec
+NavigationPreviousMapAction.text = Prej\u0161nji vzorec
+new_mindmap = Nov miselni vzorec
+new_node = Novo vomgpidpipidzli\u0161\u010De
+new_node_as_sibling_not_possible_for_the_root = Novo vozli\u0161\u010De kot bratsko ni mo\u017Eno kot korensko vozli\u0161\u010De
+NewChildAction.text = Novo otro\u0161ko vozli\u0161\u010De
+NewMapAction.text = Nova
+NewParentNode.text = Novo star\u0161evsko vozli\u0161\u010De
+NewParentNode.tooltip = <html>Vsi izbrani so poslani k novemu star\u0161u.</html>
+NewPreviousSiblingAction.text = Novo predhodno bratsko vozli\u0161\u010De
+NewSiblingAction.text = Novo bratsko vozli\u0161\u010De
+no = Ne
+no_format_copy_before_format_paste = Oblike ne morete prilepiti, \u010De je niste prej kje kopirali.
+no_found_from = "{0}" ni mogo\u010De najti v "{1}".
+no_more_found_from = Nobenih "{0}" ve\u010D ni bilo najdenih v "{1}".
+no_previous_find = Ni bilo zadetkov od prej.
+node = Vozli\u0161\u010De
+node_changed_discard_changes = Spremenili ste vozli\u0161\u010De. \u017Delite zavre\u010Di spremembe?
+node_location_help = Vleka spremeni polo\u017Eaj vozli\u0161\u010Da, ctrl+vleka spremeni razdalje, dvoklik in ctrl+dvoklik ponastavi vozli\u0161\u010De.
+NodeBackgroundColorAction.text = Barva ozadja vozli\u0161\u010Da ...
+NodeColorAction.text = Barva vozli\u0161\u010Da ...
+NodeColorBlendAction.text = Zlij barvo
+NodeDownAction.text = Vozli\u0161\u010De navzdol
+NodeListAction.text = Najdi in zamenjaj ...
+NodeListAction.tooltip = Poka\u017Ei vsa vozli\u0161\u010Da kot iskalni seznam s filtrom lastnosti.
+NodeShapeAction.bubble.text = Mehur\u010Dek
+NodeShapeAction.fork.text = Razvejaj
+NodeUpAction.text = Vozli\u0161\u010De navzgor
+nonboldify_branch = Razveljavi krepko
+nonitalicise_branch = Razveljavi le\u017Ee\u010De
+normal = Obi\u010Dajno
+not_saved_for_link_error = Miselni vzorec mora biti shranjen, preden lahko nastavite povezavo z izbirnikom datotek
+ok = V redu
+OKAction.text = V redu
+OpenAction.text = Odpri ...
+OpenPathAction.text = Open File[translate me]
+option_changes_may_require_restart = Da bi videli u\u010Dinek spremenjenih nastavitev, morate najverjetneje ponovno zagnati Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &Ne
+OptionalDontShowMeAgainDialog.dontShowAgain = &Ne spra\u0161uj ve\u010D.
+OptionalDontShowMeAgainDialog.ok = &Da
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Zapomni si moj odgovor.
+OptionPanel.absolute = absolutne
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Samodejni vzorci postavitve
+OptionPanel.antialias = Glajenje
+OptionPanel.antialias.tooltip = <html>Dolo\u010Da kvaliteto vzorca. Ve\u010D glajenja zahteva ve\u010D \u010Dasa.</html>
+OptionPanel.antialias_all = Pogladi robove vsega
+OptionPanel.antialias_edges = Pogladi le robove
+OptionPanel.antialias_none = brez glajenja
+OptionPanel.Appearance = Izgled
+OptionPanel.ar = arabski
+OptionPanel.as_parent = kot star\u0161
+OptionPanel.ask = Vpra\u0161aj
+OptionPanel.automatic = samodejno
+OptionPanel.automaticFormat_level = Samodejni slogi postavitve
+OptionPanel.automaticFormat_level1 = Oblika korenskega vozli\u0161\u010Da
+OptionPanel.automaticFormat_level2 = Oblika vozli\u0161\u010D 1. ravni
+OptionPanel.Behaviour = Vedenje
+OptionPanel.bezier = Bezier[translate me]
+OptionPanel.bubble = mehur\u010Dek
+OptionPanel.Cancel = Prekli\u010Di
+OptionPanel.childpattern = Vzorec otroka
+OptionPanel.childpattern.tooltip = Izbrani vzorec bo uporabljen na vseh otrocih.
+OptionPanel.clear_all_setters = Preklopi vse
+OptionPanel.clear_all_setters.tooltip = Omogo\u010Di ali onemogo\u010Di vse ozna\u010Dbe sprememb.
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Zdru\u017Eeno
+OptionPanel.convert_to_current_version = <html>Samodejno pretvori miselne vzorce iz starej\u0161ih razli\u010Dic Freeplane <br>v trenutno razli\u010Dico?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>Samo zelo obse\u017Ene miselne vzorce, ki ne potrebujejo pretvorbe <br>(to je izvedensko mnenje), lahko odprete brez pretvorbe.</html>
+OptionPanel.cs = \u010De\u0161ki
+OptionPanel.cut_nodes_without_question = \u017Delite izrezati vozli\u0161\u010Da brez potrditve?
+OptionPanel.cut_nodes_without_question.tooltip = \u010Ce je to polje potrjeno, bodo vozli\u0161\u010Da izrezana brez potrditve. \u010Ce gumb pritisnete nenamerno, lahko povzro\u010Dite izgubo informacij.
+OptionPanel.da = danski
+OptionPanel.de = nem\u0161ki
+OptionPanel.default = privzeto
+OptionPanel.default_browser_command_mac = Privzeti ukaz brskalnika - Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> in MAC: (hvala, Nick!)</html>
+OptionPanel.default_browser_command_other_os = Privzeti ukaz brskalnika - drugi OS
+OptionPanel.default_browser_command_other_os.tooltip = <html> To je tipi\u010Dno Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Privzeti ukaz brskalnika - Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Za Windows (znaki "" so obvezni zaradi povezav, ki vsebujejo "=" v svojem naslovu URL).</html>
+OptionPanel.default_browser_command_windows_nt = Privzeti ukaz brskalnika - Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Za Windows (znaki "" so obvezni zaradi povezav, ki vsebujejo "=" v svojem naslovu URL).</html>
+OptionPanel.Defaults = Privzeto
+OptionPanel.delete_automatic_saves_at_exit = Ob izhodu izbri\u0161i samodejno shranjeno
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> \u010Ce naj bodo datoteke samodejno izbrisane ob normalnem zaprtju programa Freeplane, nastavite to spremenljivko na true (resni\u010Dno).</html>
+OptionPanel.delete_nodes_without_question = \u017Delite izbrisati vozli\u0161\u010Da brez potrditve?
+OptionPanel.delete_nodes_without_question.tooltip = \u010Ce je to polje potrjeno, se vozli\u0161\u010Da izbri\u0161ejo brez potrditve. Povzro\u010Dite lahko izgubo podatkov, \u010De nehote pritisnete gumb.
+OptionPanel.disable_cursor_move_paper = Onemogo\u010Di premikanje podlage s kazalko
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Ne prika\u017Ei kazalke 'premakni' med vleko papirja.</html>
+OptionPanel.display_node_id = Display node ID[translate me]
+OptionPanel.edgecolor = Barva robov
+OptionPanel.edgecolor.tooltip = Lastnost roba star\u0161evskega vozli\u0161\u010Da (velja tudi za vsa otro\u0161ka vozli\u0161\u010Da)
+OptionPanel.edgestyle = Slog robov
+OptionPanel.edgestyle.tooltip = Lastnost roba star\u0161evskega vozli\u0161\u010Da (velja tudi za vsa otro\u0161ka vozli\u0161\u010Da)
+OptionPanel.edgewidth = \u0160irina robov
+OptionPanel.edgewidth.tooltip = Lastnost roba star\u0161evskega vozli\u0161\u010Da (velja tudi za vsa otro\u0161ka vozli\u0161\u010Da)
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Tipka Enter potrdi izbiro
+OptionPanel.el__max_default_window_height = Privzeta maksimalna vi\u0161ina okna
+OptionPanel.el__max_default_window_width = Privzeta maksimalna \u0161irina okna
+OptionPanel.el__min_default_window_height = Privzeta minimalna vi\u0161ina okna
+OptionPanel.el__min_default_window_width = Privzeta minimalna \u0161irina okna
+OptionPanel.el__position_window_below_node = Postavi okno pod vozli\u0161\u010De
+OptionPanel.en = angle\u0161ki
+OptionPanel.Environment = Okolje
+OptionPanel.es = \u0161panski
+OptionPanel.et = Et[translate me]
+OptionPanel.execute_scripts_without_asking = Skripti naj bodo izvedeni brez potrditve?
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Skripti Freeplane so ve\u010Dinoma sposobni izvesti poljubno dejanje na va\u0161em ra\u010Dunalniku. <br>Zato ni pametno izvajati skriptov, katerih varnosti ne morete oceniti.</html>
+OptionPanel.experimental_file_locking_on = Poskusno zaklepanje datotek
+OptionPanel.experimental_file_locking_on.tooltip = <html> Eksperimentalne mo\u017Enosti</html>
+OptionPanel.export_icons_in_html = Izvozi ikone v HTML
+OptionPanel.export_icons_in_html.tooltip = <html> Dolo\u010Dite, \u010De naj izvo\u017Eeni HTML iz Freeplane-a vsebuje ikone. Te\u017Eava z ikonami je, da povezave z ikonami v izvo\u017Eenem HTML pogosto ne delujejo.</html>
+OptionPanel.Files = Datoteke
+OptionPanel.first = kot prve
+OptionPanel.foldingsymbolwidth = \u0160irina simbola prepogibanja
+OptionPanel.foldingsymbolwidth.tooltip = <html>\u0160irina krogca, ki ozna\u010Duje prepognjenost drevesa.</html>
+OptionPanel.fork = Fork[translate me]
+OptionPanel.fr = francoski
+OptionPanel.gl = galicijski
+OptionPanel.gtk = Gtk
+OptionPanel.hr = hrva\u0161ki
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = glede na naslove
+OptionPanel.html_export_fold_all = Prepogni vse
+OptionPanel.html_export_fold_currently_folded = prepogni trenutno prepognjene
+OptionPanel.html_export_folding = Prepogibanje pri izvozu v HTML
+OptionPanel.html_export_no_folding = brez prepogibanja
+OptionPanel.hu = mad\u017Earski
+OptionPanel.icon = Ikona
+OptionPanel.icon.tooltip = \u010Ce je polje ozna\u010Deno, bo imelo vozli\u0161\u010De natanko to ikono.
+OptionPanel.id = Id[translate me]
+OptionPanel.it = italijanski
+OptionPanel.ja = japonski
+OptionPanel.Keystrokes = Bli\u017Enjice
+OptionPanel.ko = korejski
+OptionPanel.label_font_family = Font Family[translate me]
+OptionPanel.label_font_size = Velikost pisave
+OptionPanel.language = Jezik
+OptionPanel.language.tooltip = <html>To je jezik, ki naj bo uporabljen v programu. 'samodejno' sku\u0161a nalo\u017Eiti trenutni uporabni\u0161ki jezik. </html>
+OptionPanel.last = kot zadnje
+OptionPanel.last_opened_list_length = Dol\u017Eina nazadnje odprtih datotek
+OptionPanel.linear = linearno
+OptionPanel.links = Povezave
+OptionPanel.links.tooltip = <html>Nastavitev povezav kot relativnih ali absolutnih.</html>
+OptionPanel.load_folding = On Load[translate me]
+OptionPanel.load_last_map = Samodejno odpri zadnji odprti miselni vzorec
+OptionPanel.load_last_map.tooltip = <html>Ko se Freeplane za\u017Eene, samodejno odpre nazadnje odprti miselni vzorec.</html>
+OptionPanel.lookandfeel = Izgled in ob\u010Dutek
+OptionPanel.lookandfeel.tooltip = <html>Izgled in ob\u010Dutek, ki naj bo uporabljen. 'meal','windows','motif', 'gtk' so podprti, 'mac' je na voljo le na MacOS. 'privzeto' pomeni, da je uporabljen privzeti izgled in ob\u010Dutek. \u010Ce \u017Eelite nastaviti svoj lasten L&F, prosimo vnesite ime razreda tukaj in zagotovite, da je/so ustrezna/e datoteka/e jar nalo\u017Eena/e. \u010Ce so z izgledom in ob\u010Dutkom problemi, potem tukaj izberite 'ni\u010D'. To deluje za program\u010Dke.</html>
+OptionPanel.lt = litovski
+OptionPanel.max_node_width = Najve\u010Dja \u0161irina vozli\u0161\u010Da
+OptionPanel.max_node_width.tooltip = <html>Privzeta najve\u010Dja \u0161irina vozli\u0161\u010Da v pikslih.</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb[translate me]
+OptionPanel.nl = nizozemski
+OptionPanel.nn = norve\u0161ki Nynorsk
+OptionPanel.nodebackgroundcolor = Barva ozadja vozli\u0161\u010Da
+OptionPanel.nodebackgroundcolor.tooltip = nodebackgroundcolor.tooltip
+OptionPanel.nodecolor = Barva vozli\u0161\u010Da
+OptionPanel.nodecolor.tooltip = nodecolor.tooltip
+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
+OptionPanel.number_of_different_files_for_automatic_save = \u0160tevilo datotek samodejnega shranjevanja
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> \u0161tevilo n razli\u010Dnih datotek, v katere se shranjujejo miselni vzorci. Prvo samodejno shranjevanje se izvede v prvo datoteko itn. do n+1-shranjevanja, ki se spet izvede v prvo datoteko (cikli\u010Dno).</html>
+OptionPanel.OK = Shrani
+OptionPanel.patternname = Ime
+OptionPanel.patternname.tooltip = Unikatno ime vzorca
+OptionPanel.pl = poljski
+OptionPanel.placenewbranches = Postavi nove veje
+OptionPanel.placenewbranches.tooltip = <html>Kam naj bodo postavljene nove veje. Veljavne vrednosti so 'prve' in 'zadnje' </html>
+OptionPanel.printonwhitebackground = <html>Belo ozadje pri tiskanju</html>
+OptionPanel.printonwhitebackground.tooltip = <html>Vedno uporabi belo ozadje za tiskanje</html>
+OptionPanel.pt_BR = portugalski BR
+OptionPanel.pt_PT = portugalski PT
+OptionPanel.relative = relativne
+OptionPanel.ru = ruski
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = Metoda izbire
+OptionPanel.selection_method.tooltip = <html> z naslednjim preklopnikom lahko omogo\u010Dite/onemogo\u010Dite shemo zakasnjenega izbiranja. Samodejne mo\u017Enosti. Teh ne spreminjajte, saj bodo ne glede na to shranjene v auto.properties.</html>
+OptionPanel.selection_method_by_click = s klikom
+OptionPanel.selection_method_delayed = zakasnjeno
+OptionPanel.selection_method_direct = neposredno
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Vzorci
+OptionPanel.separator.anti_alias = Glajenje
+OptionPanel.separator.attributes = Atributi
+OptionPanel.separator.automatic_save = Samodejno shranjevanje
+OptionPanel.separator.behaviour = Vedenje
+OptionPanel.separator.browser = Brskalnik
+OptionPanel.separator.commands_for_the_program = Ukazi programa
+OptionPanel.separator.connectors = Connectors[translate me]
+OptionPanel.separator.default_colors = Privzete barve
+OptionPanel.separator.default_fonts = Privzete pisave
+OptionPanel.separator.default_styles = Privzeti slogi
+OptionPanel.separator.EdgeControls = Robovi
+OptionPanel.separator.edit_long_node_window = Uredi dolgo okno vozli\u0161\u010Da
+OptionPanel.separator.files = Datoteke
+OptionPanel.separator.General = Splo\u0161no
+OptionPanel.separator.html_export = Izvoz HTML
+OptionPanel.separator.html_import = Html Import[translate me]
+OptionPanel.separator.hyperlink_types = Vrste hiperpovezav
+OptionPanel.separator.icon_properties = Ikone
+OptionPanel.separator.icons = Ikone v "Izberi ikono ..."
+OptionPanel.separator.initial_map_size = Za\u010Detna velikost miselnega vzorca
+OptionPanel.separator.inline_editor = In-line node editor[translate me]
+OptionPanel.separator.key_typing = Tipkanje
+OptionPanel.separator.language = Jezik
+OptionPanel.separator.look_and_feel = Izgled in ob\u010Dutek
+OptionPanel.separator.mouse_wheel = Mi\u0161kin kole\u0161\u010Dek
+OptionPanel.separator.new_node_commands = Ukazi novega vozli\u0161\u010Da
+OptionPanel.separator.node_editing_commands = Ukazi urejanja vozli\u0161\u010Da
+OptionPanel.separator.node_navigation_commands = Ukazi krmarjenja vozli\u0161\u010Da
+OptionPanel.separator.NodeColors = Barve vozli\u0161\u010Da
+OptionPanel.separator.NodeFont = Pisava vozli\u0161\u010Da
+OptionPanel.separator.notifications = Potrditve
+OptionPanel.separator.other_defaults = Druge privzete vrednosti
+OptionPanel.separator.others = Druge tipke za bli\u017Enjice
+OptionPanel.separator.patterns = Vzorci
+OptionPanel.separator.root_node_appearance = Videz korenskega vozli\u0161\u010Da
+OptionPanel.separator.save = Shrani
+OptionPanel.separator.selection_colors = Barve izbora
+OptionPanel.separator.selection_method = Metoda izbire
+OptionPanel.separator.undo = Razveljavi
+OptionPanel.set_property_text = Spremeni
+OptionPanel.set_property_text.tooltip = Empty: Don't touch; Minus=Remove property (set default values); Plus=Spremeni lastnost
+OptionPanel.setscript = Spremeni?
+OptionPanel.setscript.tooltip = Skriptu lahko dodelite slog.
+OptionPanel.sharp_bezier = ostro bezier
+OptionPanel.sharp_linear = ostro linearno
+OptionPanel.show_icon_for_attributes = Poka\u017Ei ikono za atribute
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = slovenski
+OptionPanel.standardbackgroundcolor = Barva ozadja
+OptionPanel.standardbackgroundcolor.tooltip = <html>Standardna barva ozadja v zapisu html </html>
+OptionPanel.standardcloudcolor = Barva obla\u010Dka
+OptionPanel.standardcloudcolor.tooltip = <html>Standardna barva obla\u010Dka v zapisu html </html>
+OptionPanel.standardcloudestyle = Slog obla\u010Dka
+OptionPanel.standardcloudestyle.tooltip = <html>Standardni slog obla\u010Dka. Trenutno je podprt le 'bezier'.</html>
+OptionPanel.standarddrawrectangleforselection = Prika\u017Ei izbrana vozli\u0161\u010Da v obla\u010Dkih
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Ozna\u010Di izbrana vozli\u0161\u010Da z obsegajo\u010Dim obla\u010Dkom.</html>
+OptionPanel.standardlinkcolor = Barva povezave
+OptionPanel.standardlinkcolor.tooltip = <html>Standardna barva povezave v zapisu html </html>
+OptionPanel.standardlinkestyle = Slog povezave
+OptionPanel.standardlinkestyle.tooltip = <html>Standardni slog povezave. Trenutno je podprt le 'bezier'.</html>
+OptionPanel.standardselectednodecolor = Barva izbranega vozli\u0161\u010Da
+OptionPanel.standardselectednodecolor.tooltip = <html>Standardna barva vozli\u0161\u010Da, \u010De je izbran. V zapisu HTML (#RRGGBB v \u0161estnajsti\u0161kih vrednostih) </html>
+OptionPanel.standardselectednoderectanglecolor = Barva izbranega obla\u010Dka vozli\u0161\u010Da
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>Barva obla\u010Dka, ki ozna\u010Duje izbrana vozli\u0161\u010Da. V zapisu html (#RRGGBB v \u0161estnajsti\u0161kih vrednostih) </html>
+OptionPanel.sv = \u0161vedski
+OptionPanel.time_for_automatic_save = Interval samodejnega shranjevanja
+OptionPanel.time_for_automatic_save.tooltip = <html> \u010Cas med dvema zaporednima samodejnima shranjevalnima akcijama (v ms): za onemogo\u017Eitev samodejnega shranjevanja to vrednost nastavite na 2000000000.</html>
+OptionPanel.time_for_delayed_selection = \u010Cas za zakasnjeno izbiro
+OptionPanel.time_for_delayed_selection.tooltip = <html> \u010Casovna zakasnitev izbire vozli\u0161\u010D, ko je mi\u0161ka prek (v ms). Spremenite to vrednost na 1, \u010De \u017Eelite neposredno izbiro ob prekritju z mi\u0161ko.</html>
+OptionPanel.toolTipManager.max_tooltip_width = \u0160irina okenca nasveta
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>Privzeta \u0161irina okenca nasveta v slikovnih to\u010Dkah.</html>
+OptionPanel.tr = tur\u0161ki
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Nedolo\u010Dena pisava
+OptionPanel.undo_levels = Ravni razveljavitve
+OptionPanel.undo_levels.tooltip = <html>Dolo\u010Da, koliko korakov je shranjenih, da jih lahko razveljavite z "Razveljavi".</html>
+OptionPanel.unfold_on_paste = Razpostri vozli\u0161\u010De ob lepljenju
+OptionPanel.unfold_on_paste.tooltip = Razpostri vozli\u0161\u010De ob lepljenju ali povleci-in-spusti
+OptionPanel.use_common_out_point_for_root_node = Robovi se za\u010Dnejo v eni to\u010Dki v korenskem vozli\u0161\u010Du
+OptionPanel.use_common_out_point_for_root_node.tooltip = Robovi se za\u010Dnejo v eni to\u010Dki v korenskem vozli\u0161\u010Du
+OptionPanel.use_tabbed_pane = Uporabi zavihke
+OptionPanel.use_tabbed_pane.tooltip = Ob izboru naj bodo miselni vzorci prikazani v zavihkih (kot v Firefoxu :-) ).
+OptionPanel.vi = Vi[translate me]
+OptionPanel.wheel_velocity = Odzivnost
+OptionPanel.wheel_velocity.tooltip = Vi\u0161ja vrednost povzro\u010Di hitrej\u0161e premike mi\u0161kinega kole\u0161\u010Dcka po vzorcu.
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = kitajski CN
+OptionPanel.zh_TW = kitajski
+PageAction.text = Nastavitev strani ...
+PasteAction.text = Prilepi
+PatternNewNameProperty = Nov vzorec
+PatternToString.backgroundColor = Barva ozadja
+PatternToString.Child = Slog otro\u0161kega vozli\u0161\u010Da
+PatternToString.color = Barva
+PatternToString.EdgeColor = Barva roba
+PatternToString.EdgeStyle = Slog roba
+PatternToString.EdgeWidth = \u0160irina roba
+PatternToString.FontBold = Krepko
+PatternToString.FontItalic = Le\u017Ee\u010De
+PatternToString.FontName = Ime pisave
+PatternToString.Icon = Ikona
+PatternToString.NodeFontSize = Velikost pisave
+plugins/ScriptEditor.cancel = &Prekli\u010Di
+plugins/ScriptEditor.exit = I&zhod
+plugins/ScriptEditor.menu_actions = &Dejanja
+plugins/ScriptEditor.new_script = Nov skript
+plugins/ScriptEditor.run = Za&\u017Eeni
+plugins/ScriptEditor/window.Result = Rezultat:
+plugins/ScriptEditor/window.title = Urejevalnik skriptov
+plugins/TimeList.xml_Created = Ustvarjeno
+plugins/TimeList.xml_Date = Datum
+plugins/TimeList.xml_Icons = Ikone
+plugins/TimeList.xml_Modified = Spremenjeno
+plugins/TimeList.xml_Notes = Opombe
+plugins/TimeList.xml_Text = Besedilo
+plugins/TimeManagement.xml_appendButton = Dodaj datum k izbranim vozli\u0161\u010Dem
+plugins/TimeManagement.xml_Cancel = Prekli\u010Di
+plugins/TimeManagement.xml_cancelButton = Prekli\u010Di
+plugins/TimeManagement.xml_closeButton = Zapri
+plugins/TimeManagement.xml_Export = Izvozi izbrana vozli\u0161\u010Da
+plugins/TimeManagement.xml_Find = Najdi
+plugins/TimeManagement.xml_Goto = Pojdi na
+plugins/TimeManagement.xml_hour = Ura:
+plugins/TimeManagement.xml_menu_actions = Dejanja
+plugins/TimeManagement.xml_minute = Minuta:
+plugins/TimeManagement.xml_reminderButton = Spomni me na ta dan
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Ob pritisku se za\u017Eene \u010Dasovno od\u0161tevanje na dani datum. Utripajo\u010De ikone opozarjajo na iztek \u010Dasa.<br>\u010Ce zaprete miselni vzorec, se od\u0161tevanje reaktivira naslednji\u010D, ko odprete miselni vzorec.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Trenutno je morda lahko le en opomnik na vozli\u0161\u010De. <br>Trenutni opomnik je na\u010Drtovan ob {0,date} {0,time}, va\u0161a izbira je bila {1,date} {1,time}. <br><br>\u017Delite spremeniti opomnilni \u010Das vozli\u0161\u010Da (DA) <br>ali \u017Eelite ohraniti starega (NE)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Opomnik na\u010Drtovan za {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Odstrani opomnik
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Ostrani vse opomnike, povezane z izbranimi vozli\u0161\u010Di.
+plugins/TimeManagement.xml_Replace = Zamenjaj
+plugins/TimeManagement.xml_Replace_All = Zamenjaj vse
+plugins/TimeManagement.xml_Replace_Selected = Zamenjaj izbrano
+plugins/TimeManagement.xml_Select = Izberi
+plugins/TimeManagement.xml_todayButton = Danes
+plugins/TimeManagement.xml_WindowTitle = \u010Casovni na\u010Drtovalec
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Najdi in zamenjaj
+preferences = Nastavitve
+print_preview_title = Predogled tiskanja
+PrintDirectAction.text = Natisni ...
+printing_settings = Umerjanje tiskanja
+PrintPreviewAction.text = Predogled tiskanja ...
+PropertyAction.dialog = Preferences[translate me]
+PropertyAction.text = Lastnosti ...
+QuitAction.text = Izhod
+read_only = Samo za branje
+really_convert_to_current_version = <html>Ta miselni vzorec je nastal s staro razli\u010Dico programa Freeplane. <br>Ga \u017Eelite pretvoriti (priporo\u010Deno)? <br>(Sicer bo obravnavan tak, kakr\u0161en je, brez zagotovil.) </html>
+really_cut_node = Resni\u010Dno \u017Eelite izrezati vozli\u0161\u010Da?
+really_execute_script = Resni\u010Dno \u017Eelite izvesti skripte, vklju\u010Dene v ta miselni vzorec? Mogo\u010De je, da lahko \u0161kodijo va\u0161emu ra\u010Dunalniku.
+really_remove_node = Resni\u010Dno \u017Eelite izbrisati vozli\u0161\u010Da?
+RedoAction.text = Ponovi
+RedoFilterAction.text = Ponovi
+ReminderHookAction.text = Odstrani opomnik
+ReminderHookAction.tooltip = Odstrani opomnik z vozli\u0161\u010Da.
+RemoveAllIconsAction.text = Odstrani vse ikone
+RemoveIconAction.text = Odstrani zadnjo ikono
+RemoveNoteAction.text = Odstrani opombe
+RemoveNoteAction.tooltip = <html>Odstrani vsebino opomb tudi ve\u010D opomb hkrati.</html>
+repair_link = Popravi povezavo
+repair_link_question = Povezanega miselnega vzorca ni mo\u017Eno nalo\u017Eiti. \u017Delite popraviti povezavo ro\u010Dno?
+replace = Zamenjaj
+reset_to_default = Use default[translate me]
+ResetNodeLocationAction.text = Ponastavi polo\u017Eaj
+save_failed = Poskus shranjevanja miselnega vzorca {0} ni uspel.
+save_unsaved = \u017Delite shraniti naslednji miselni vzorec? :
+SaveAction.text = Shrani
+SaveAll.text = Shrani vse
+SaveAll.tooltip = Shrani vse odprte miselne vzorce.
+SaveAsAction.text = Shrani kot ...
+saved = Shranjeno
+scheme_evaluate = Ovrednoti!
+ScriptEditor.text = Urejevalnik skriptov ...
+ScriptEditor.tooltip = Omogo\u010Da pisanje ve\u010Djih skriptov v okviru Freeplane-a.
+ScriptEditorPanel.changed_cancel = Skripti so bili spremenjeni. Res \u017Eelite opustiti te spremembe?
+select_favorites_folder = Izberite mapo, v kateri se nahajajo va\u0161i priljubljeni
+select_folder_for_importing = Izberite mapo za uvoz
+SelectAllAction.text = Izberi vse vidne
+SelectBranchAction.text = Izberi vidno vejo
+selection_method_by_click = Enkrat klikni za izbiro
+selection_method_delayed = Zakasnjena samodejna izbira
+selection_method_direct = Poka\u017Ei izbiro
+SelectNoteAction.text = Preklopi urejanje opombe
+SelectNoteAction.tooltip = Preklopi na ustrezno okno z opombe
+SetImageByFileChooserAction.text = Slika (izbirnik datotek ali povezava) ...
+SetLinkByFileChooserAction.text = Hiperpovezava (izbirnik datotek) ...
+SetLinkByTextFieldAction.text = Hiperpovezava (polje z besedilom) ...
+ShowAllAttributesAction.text = Poka\u017Ei vse atribute
+ShowAncestorsAction.text = poka\u017Ei prednike
+ShowAttributeDialogAction.text = Upravljalec atributov
+ShowFilterToolbarAction.text = Filter Toolbar[translate me]
+ShowHideNoteAction.text = Okno opombe
+ShowHideNoteAction.tooltip = Okno opomb se pojavi oz. izgine.
+ShowSelectedAttributesAction.text = Poka\u017Ei izbrane atribute
+ShowSelectionAsRectangleAction.text = Pravokotni izbor
+simplyhtml.aboutFrameTitle = O tej aplikaciji
+simplyhtml.aboutLabel = O programu SimplyHTML ...
+simplyhtml.alignCenter = sredinska
+simplyhtml.alignLabel = Poravnava:
+simplyhtml.alignLeft = leva
+simplyhtml.alignRight = desna
+simplyhtml.allCellsRangeLabel = vse celice
+simplyhtml.allOccurrencesReplaced = Vse pojavitve so bile zamenjane
+simplyhtml.appendTableColLabel = Dodaj stolpec
+simplyhtml.appendTableRowLabel = Dodaj vrstico
+simplyhtml.applyCellAttrLabel = Uporabi za
+simplyhtml.backgroundLabel = Ozadje:
+simplyhtml.boldItalicName = krepko le\u017Ee\u010De
+simplyhtml.boldName = krepko
+simplyhtml.borderColorLabel = Barva:
+simplyhtml.borderWidthLabel = \u0160irina
+simplyhtml.bottomLabel = dno:
+simplyhtml.cancelBtnName = Prekli\u010Di
+simplyhtml.cellBorderTabLabel = Obrobe
+simplyhtml.cellGenTabLabel = Splo\u0161no
+simplyhtml.cellMarginTabLabel = Robovi
+simplyhtml.cellPanelTitle = Oblika celice
+simplyhtml.clearFormatLabel = Odstrani oblikovanje
+simplyhtml.clearFormatTip = Odstrani oblikovanje
+simplyhtml.close = Zapri
+simplyhtml.closeBtnName = Zapri
+simplyhtml.colorLabel = Barva
+simplyhtml.copyLabel = Kopiraj
+simplyhtml.copyTip = Kopiraj
+simplyhtml.cTagNameHead1 = Naslov 1
+simplyhtml.cTagNameHead2 = Naslov 2
+simplyhtml.cTagNameHead3 = Naslov 3
+simplyhtml.cTagNameHead4 = Naslov 4
+simplyhtml.cTagNameHead5 = Naslov 5
+simplyhtml.cTagNameHead6 = Naslov 6
+simplyhtml.cTagNameLink = Povezava
+simplyhtml.cTagNameOL = O\u0161tevil\u010Den seznam
+simplyhtml.cTagNamePara = Odstavek
+simplyhtml.cTagNameUL = Neo\u0161tevil\u010Den seznam
+simplyhtml.cutLabel = Izre\u017Ei
+simplyhtml.cutTip = Izre\u017Ei
+simplyhtml.defaultDocName = Neimenovano
+simplyhtml.deleteTableColLabel = Izbri\u0161i stolpec
+simplyhtml.deleteTableRowLabel = Izbri\u0161i vrstico
+simplyhtml.docTitleQuery = Naslov naj bo:
+simplyhtml.docTitleTitle = Uredi naslov dokumenta
+simplyhtml.editLabel = Uredi
+simplyhtml.effectLabel = U\u010Dinek
+simplyhtml.familyLabel = Dru\u017Eina
+simplyhtml.findNext = Najdi naslednje ...
+simplyhtml.findReplaceDialogTitle = Najdi in zamenjaj
+simplyhtml.findReplaceLabel = Najdi in zamenjaj
+simplyhtml.findReplaceTip = Najdi in zamenjaj
+simplyhtml.fontBoldLabel = Krepko
+simplyhtml.fontBoldTip = Vklju\u010Di/izklju\u010Di krepko pisavo
+simplyhtml.fontDialogTitle = Oblikovanje pisave
+simplyhtml.fontItalicLabel = Le\u017Ee\u010De
+simplyhtml.fontItalicTip = Vklju\u010Di/izklju\u010Di le\u017Ee\u010Do pisavo
+simplyhtml.fontLabel = Pisava ...
+simplyhtml.fontTabLabel = Pisava
+simplyhtml.fontTip = Oblikuj pisavo ...
+simplyhtml.fontUnderlineLabel = Pod\u010Drtano
+simplyhtml.fontUnderlineTip = Vklju\u010Di/izklju\u010Di pod\u010Drtano pisavo
+simplyhtml.foregroundLabel = Ospredje:
+simplyhtml.formatLabel = Oblika
+simplyhtml.formatListLabel = Seznam ...
+simplyhtml.formatListTip = Spremeni obliko seznama
+simplyhtml.formatParaLabel = Odstavek ...
+simplyhtml.formatParaTip = Spremeni obliko odstavka
+simplyhtml.formatTableLabel = Tabela ...
+simplyhtml.formatTableTip = Oblikovanje tabele
+simplyhtml.helpLabel = Pomo\u010D
+simplyhtml.htmlTabTitle = Pogled kode HTML
+simplyhtml.imageFileDesc = Datoteke slik
+simplyhtml.insertTableColLabel = Vstavi stolpec
+simplyhtml.insertTableLabel = Tabela ...
+simplyhtml.insertTableMsg = Koliko stolpcev?
+simplyhtml.insertTableRowLabel = Vstavi vrstico
+simplyhtml.insertTableTitle = vstaviTabelo
+simplyhtml.italicName = le\u017Ee\u010De
+simplyhtml.layoutTabTitle = Pogled postavitve
+simplyhtml.leftLabel = levo:
+simplyhtml.listDialogTitle = Oblikovanje seznama
+simplyhtml.listIndentTitle = Zamik:
+simplyhtml.listPosInside = znotraj
+simplyhtml.listPositionLabel = Polo\u017Eaj:
+simplyhtml.listPosOutside = zunaj
+simplyhtml.listTypeCircle = okrogla oznaka
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = simbol za datoteko kot oznaka
+simplyhtml.listTypeLabel = Vrsta:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = brez
+simplyhtml.listTypeSquare = kvadratna oznaka
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Zunanja
+simplyhtml.matchCase = Razlikuj male/velike \u010Drke
+simplyhtml.newStyleDefaultName = nov slog
+simplyhtml.nextTableCellLabel = Naslednja celica
+simplyhtml.noLineLabel = brez
+simplyhtml.noMoreOccurrencesFound = ni (ve\u010D) zadetkov
+simplyhtml.okBtnName = V redu
+simplyhtml.paddingLabel = Notranja
+simplyhtml.paraAlignCenterLabel = Poravnaj sredinsko
+simplyhtml.paraAlignCenterTip = Odstavku dolo\u010Di sredinsko poravnavo
+simplyhtml.paraAlignLeftLabel = Poravnaj levo
+simplyhtml.paraAlignLeftTip = Odstavku dolo\u010Di levo poravnavo
+simplyhtml.paraAlignRightLabel = Poravnaj desno
+simplyhtml.paraAlignRightTip = Odstavku dolo\u010Di desno poravnavo
+simplyhtml.paraStyleDialogTitle = Slog odstavka
+simplyhtml.paraTabLabel = Odstavek
+simplyhtml.pasteLabel = Prilepi
+simplyhtml.pasteTip = Prilepi
+simplyhtml.plainName = navadno
+simplyhtml.previewLabel = Predogled
+simplyhtml.previewText = Predogled besedila
+simplyhtml.prevTableCellLabel = Prej\u0161nja celica
+simplyhtml.redoLabel = Ponovi
+simplyhtml.redoTip = Ponovi
+simplyhtml.replace = Zamenjaj ...
+simplyhtml.replaceAll = vse
+simplyhtml.replaceDone = Opravljeno
+simplyhtml.replaceNo = Ne
+simplyhtml.replaceThisQuery = zamenjaj to pojavitev
+simplyhtml.replaceWith = Zamenjaj z:
+simplyhtml.replaceYes = Da
+simplyhtml.rightLabel = desno:
+simplyhtml.searchDown = I\u0161\u010Di proti koncu
+simplyhtml.searchFromStart = I\u0161\u010Di od zac\u010Detka
+simplyhtml.searchUp = I\u0161\u010Di proti zacetku
+simplyhtml.selectAllLabel = Izberi vse
+simplyhtml.sizeLabel = Velikost
+simplyhtml.standardStyleName = navaden
+simplyhtml.strikeLabel = Pre\u010Drtano
+simplyhtml.styleLabel = Slog
+simplyhtml.styleNameInputText = Ime novega sloga?
+simplyhtml.styleNameInputTitle = Shrani slog
+simplyhtml.tableBgColLabel = Barva ozadja:
+simplyhtml.tableDialogTitle = Oblikovanje tabele
+simplyhtml.tableLabel = Tabela
+simplyhtml.tablePanelTitle = Oblika tabele
+simplyhtml.tableWidthLabel = \u0160irina:
+simplyhtml.textIndentLabel = Zamik:
+simplyhtml.textToFind = Iskano besedilo:
+simplyhtml.thisCellRangeLabel = to celico
+simplyhtml.thisColRangeLabel = ta stolpec
+simplyhtml.thisRowRangeLabel = to vrstico
+simplyhtml.toggleBulletsLabel = Ozna\u010Den seznam vklju\u010Den/izklju\u010Den
+simplyhtml.toggleBulletsTip = Ozna\u010Den seznam vklju\u010Den/izklju\u010Den
+simplyhtml.toggleNumbersLabel = O\u0161tevil\u010Den seznam vklju\u010Den/izklju\u010Den
+simplyhtml.toggleNumbersTip = O\u0161tevil\u010Den seznam vklju\u010Den/izklju\u010Den
+simplyhtml.topLabel = vrh:
+simplyhtml.uLineLabel = Pod\u010Drtano
+simplyhtml.unableToOpenFileError = Datoteke ni mogo\u010De odpreti
+simplyhtml.unableToRedoError = Ni mogo\u010De ponoviti:
+simplyhtml.unableToUndoError = Ni mogo\u010De razveljaviti:
+simplyhtml.undoLabel = Razveljavi
+simplyhtml.undoTip = Razveljavi
+simplyhtml.valignBaseline = na osnovno \u010Drto
+simplyhtml.valignBottom = na dno
+simplyhtml.valignLabel = Navp. poravnava:
+simplyhtml.valignMiddle = sredinska
+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
+SplitNode.text = Razdeli vozli\u0161\u010De
+SplitNode.tooltip = <html>Vozli\u0161\u010De je razdeljeno</html>
+style = Slog
+svg = SVG[translate me]
+TimeListAction.text = Prika\u017Ei seznam \u010Dasovnega na\u010Drtovalca ...
+TimeListAction.tooltip = Prika\u017Ee vse na\u010Drtovane \u010Dase in ustrezajo\u010Da vozli\u0161\u010Da.
+TimeManagementAction.text = Prika\u017Ei koledar ...
+TimeManagementAction.tooltip = <html>Prika\u017Ee koledarski modul, avtor Kai Toedter.</html>
+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
+ToggleMenubarAction.text = Menijska 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
+UndoAction.text = Razveljavi
+UndoFilterAction.text = Razveljavi
+unfold = Razpostri
+UnfoldAllAction.text = Razpostri vse
+UnfoldAllAction.tooltip = <html>Razpostre izbrana vozli\u0161\u010Da in vse njihove otroke.</html>
+UnfoldOneLevelAction.text = Razpostri za eno stopnjo
+UnfoldOneLevelAction.tooltip = <html>Razpostre izbrana vozli\u0161\u010Da za eno stopnjo.</html>
+updatecheckdialog = Update Check Dialog[translate me]
+url_error = Ta URL je nepravilno oblikovan!
+url_load_error = Ni mogo\u010De nalo\u017Eiti miselnega vzorca z URL:
+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):
+WebDocuAction.text = Spletna dokumentacija
+width = \u0160irina
+yes = Da
+ZoomInAction.text = Pove\u010Daj
+ZoomOutAction.text = Pomanj\u0161aj
diff --git a/freeplane/resources/translations/Resources_sr.properties b/freeplane/resources/translations/Resources_sr.properties
new file mode 100644
index 0000000..2d14281
--- /dev/null
+++ b/freeplane/resources/translations/Resources_sr.properties
@@ -0,0 +1,1782 @@
+\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 \u0443\u0431\u0430\u0446\u0438\u0442\u0435 \u0442\u0430\u043a\u0430\u0432 \u0447\u0432\u043e\u0440 \u043a\u043e\u0440\u0438\u0441\u0442\u0435\u045b\u0438 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a \u0430\u043b\u0430\u0442\u043a\u0435
+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.groovy.script.name = \u0421\u043a\u0440\u0438\u043f\u0442\u0430 {0} \u043d\u0435 \u0437\u0430\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u0430 \u0438\u043c\u0435\u043d\u043e\u043c ".groovy"
+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\u0435 \u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0435?
+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><em>\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\u0435\u0440\u043d\u0438 \u0441\u043e\u0444\u0442\u0432\u0435\u0440 \u043c\u043e\u0436\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043e\u0448\u0442\u0435\u045b\u0435\u045a\u0435 \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430 \u0438\u043b\u0438 \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u0438 \u0432\u0430\u0448\u0443 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442.</em></body></html>
+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
+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_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_popup_delete = \u0418\u0437\u0431\u0440\u0438\u0448\u0438
+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_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\u043c \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438\u043c \u043e\u0431\u043b\u0438\u0446\u0438\u043c\u0430 \u0443 \u0438\u0441\u0442\u043e\u043c \u0447\u0432\u043e\u0440\u0443.</html>
+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\u0432\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0438\u0437\u043d\u0430\u0434. \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 \u0433\u043e\u0440\u0435. \u0414\u0438\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430 \u043a\u043e\u0440\u0435\u043d\u0443 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u043c\u0435\u045a\u0430\u0458\u0443 \u0441\u0442\u0440\u0430\u043d\u0435.
+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\u0430\u0432\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0438\u0437\u043d\u0430\u0434. \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 \u0433\u043e\u0440\u0435. \u0414\u0438\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430 \u043a\u043e\u0440\u0435\u043d\u0443 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u043c\u0435\u045a\u0430\u0458\u0443 \u0441\u0442\u0440\u0430\u043d\u0435.
+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-2012 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
+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
+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
+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
+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}
+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 \u0440\u0443\u0431.</html>
+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)
+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
+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}
+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
+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_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_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...
+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
+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\u043e\u0452\u0435.
+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_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_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_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_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_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_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
+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.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\u0435/\u0443\u043a\u043b\u0430\u045a\u0430 \u0458\u0435.</html>
+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\u045a\u0430 \u0458\u0435.</html>
+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\u0442\u0430\u043a\u0430.
+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\u0446\u0435\u043d\u0446\u0435<br>\u043a\u043e\u0458\u0443 \u0458\u0435 \u043e\u0431\u0458\u0430\u0432\u0438\u043b\u0430 \u0417\u0430\u0434\u0443\u0436\u0431\u0438\u043d\u0430 \u0437\u0430 \u0441\u043b\u043e\u0431\u043e\u0434\u043d\u0438 \u0441\u043e\u0444\u0442\u0432\u0435\u0440; \u0438\u043b\u0438 \u043f\u043e \u0432\u0435\u0440\u0437\u0438\u0458\u0438 2<br>\u041b\u0438\u0446\u0435\u043d\u0446\u0435, \u0438\u043b\u0438 (\u043f\u043e \u0432\u0430\u0448\u0435\u043c \u0438\u0437\u0431\u043e\u0440\u0443) \u0431\u0438\u043b\u043e \u043a\u043e\u0458\u0435 \u043a\u0430\u0441\u043d\u0438\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435.<br><br>\u041e\u0432\u0430\u0458 \u043f\u0440\u043e\u0433\u0440\u0430\u043c \u0441\u0435 \u0440\u0430\u0441\u043f\u043e\u0434\u0435\u0459\u0443\u0458\u0435 \u0443 \u043d\u0430\u0434\u0438 \u0434\u0430 \u045b\u0435 \u0431\u0438\u0442\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d,<br>\u0430\u043b\u0438 \u0411\u0415\u0417 \u0418\u041a\u0410\u041a\u0412\u0415 \u0413\u0410\u0420\u0410\u041d\u0426\u0418\u0408\u0415; \u0447\u0430\u043a \u0438 \u0431\u0435\u0437 \u0438\u043c\u043f\u043b\u0438\u0446\u0438\u0442\u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0446\u0438\u0458\u0435<br>\u0423\u043f\u043e\u0442\u0440\u0435\u0431\u0459\u0438\u0432\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u0430\u0433\u043e\u0452\u0435\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0458 \u043d\u0430\u043c\u0435\u043d\u0438. \u041f\u043e\u0433\u043b\u0435\u0434\u0430\u0458\u0442\u0435<br>GNU-\u043e\u0432\u0443 \u041e\u043f\u0448\u0442\u0443 \u0458\u0430\u0432\u043d\u0443 \u043b\u0438\u0446\u0435\u043d\u0446\u0443 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430<br><br>\u0422\u0440\u0435\u0431\u0430\u043b\u043e \u0431\u0438 \u0434\u0430 \u0441\u0442\u0435 \u0434\u043e\u0431\u0438\u043b\u0438 \u043a\u043e\u043f\u0438\u0458\u0443 GNU-\u043e\u0432\u0435 \u041e\u043f\u0448\u0442\u0435 \u0458\u0430\u0432\u043d\u0435 \u043b\u0438\u0446\u0435\u043d\u0446\u0435<br>\u0437\u0430\u0458\u0435\u0434\u043d\u043e \u0441\u0430 \u043e\u0432\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043e\u043c; \u0410\u043a\u043e \u043d\u0438\u0441\u0442\u0435 \u043f\u0438\u0448\u0438\u0442\u0435 \u043d\u0430 Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+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
+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
+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_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}
+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}!
+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\u0435.)
+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\u0438\u0442\u043d\u0438 \u043f\u043e\u043b\u043e\u0436\u0430\u0458.
+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
+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.
+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\u043c \u043c\u0430\u043f\u043e\u043c \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435.
+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\u043f\u0435.
+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\u0435\u0431\u0430\u045a\u0430<br/>\u043e\u0434 \u0442\u0435\u0440\u043c\u0438\u043d\u0430 \u0437\u0430 \u043f\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u045b\u0435 \u0441\u0435 \u043d\u0430\u045b\u0438)</html>
+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\u043e \u0437\u043d\u0430\u045a\u0435), \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u0432\u0430\u0440\u0430\u0442\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0442\u0432\u0430\u0440\u0430\u045a\u0430.</html>
+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\u0438\u0442\u0430\u043a \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430 \u0443\u043a\u043e\u043b\u0438\u043a\u043e \u043d\u0438\u0441\u043c\u043e \u043f\u0430\u0436\u0459\u0438\u0432\u0438 \u043a\u043e\u0434 \u0431\u0440\u0438\u0441\u0430\u045a\u0430.
+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 \u043f\u043e\u0442\u0432\u0440\u0434\u0443</html>
+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\u0438\u0442\u0430\u043a \u043e\u0431\u0430\u0432\u0435\u0448\u0442\u0435\u045a\u0430 \u0443\u043a\u043e\u043b\u0438\u043a\u043e \u043d\u0438\u0441\u043c\u043e \u043f\u0430\u0436\u0459\u0438\u0432\u0438 \u043a\u043e\u0434 \u0431\u0440\u0438\u0441\u0430\u045a\u0430.
+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\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u043b\u0438 \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u0442\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0437\u0430 \u043a\u043e\u0458\u0435 \u043d\u0435 \u0437\u043d\u0430\u0442\u0435 \u0458\u0435\u0441\u0443 \u043b\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043d\u0435.</html>
+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\u0435\u0433\u043b\u0435\u0434\u0430\u0447) \u0431\u0435\u0437 \u043f\u0438\u0442\u0430\u045a\u0430(!),<br>\u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u043e\u0432\u0430\u0458 \u0438\u0437\u0431\u043e\u0440. <br> \u0410\u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043f\u0430\u0436\u0459\u0438\u0432\u043e \u0458\u0435\u0440 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u043d\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u043d\u0435\u0442\u0438 \u0448\u0442\u0435\u0442\u0443 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443!</body></html>
+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\u0438\u0442\u0430\u0458 (!),<br>\u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u043e\u0432\u0430\u0458 \u0438\u0437\u0431\u043e\u0440. <br> \u0410\u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043f\u0430\u0436\u0459\u0438\u0432\u043e \u0458\u0435\u0440 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u043d\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u043d\u0435\u0442\u0438 \u0448\u0442\u0435\u0442\u0443 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443!</body></html>
+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\u0438\u0442\u0438 \u043e\u0432\u0430\u0458 \u0438\u0437\u0431\u043e\u0440. <br> \u0410\u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043f\u0430\u0436\u0459\u0438\u0432\u043e \u0458\u0435\u0440 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u043d\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0433\u0443 \u043e\u0442\u043a\u0440\u0438\u0442\u0438 \u0432\u0430\u0448\u0435 \u0442\u0430\u0458\u043d\u0435 !</body></html>
+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\u0442\u0438(!)),<br> \u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u043e\u0432\u0430\u0458 \u0438\u0437\u0431\u043e\u0440. <br>\u0423\u043e\u0431\u0438\u0447\u0430\u0458\u0435\u043d\u043e \u0441\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438 \u0437\u0430 \u0447\u0438\u0442\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430<br>\u0410\u043a\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0443 \u0434\u0440\u0443\u0433\u0435 \u0441\u0432\u0440\u0445\u0435 \u0431\u0443\u0434\u0438\u0442\u0435 \u043f\u0430\u0436\u0459\u0438\u0432\u0438<br>\u0458\u0435\u0440 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u043d\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u043d\u0435\u0442\u0438 \u0448\u0442\u0435\u0442\u0443 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443!</body></html>
+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 HTML \u0438\u0437\u0432\u043e\u0437\u0443, \u0447\u0435\u0441\u0442\u043e \u0441\u0443 \u0432\u0435\u0437\u0435 \u043f\u0440\u0435\u043c\u0430 \u0438\u043a\u043e\u043d\u0430\u043c\u0430 \u043f\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u0435.</html>
+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.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.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\u0430\u0458\u0443 \u0431\u0438\u0442\u0438 \u043e\u0434\u0432\u043e\u0458\u0435\u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c ';'.
+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\u0440\u0435\u043d\u0443\u0442\u043d\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0447\u0438\u043a\u0438 \u0458\u0435\u0437\u0438\u043a. </html>
+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 \u0437\u0430 MacOS. \u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0438, \u0434\u0430 \u0458\u0435 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0459\u0435\u043d \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d \u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0443\u043c\u0435\u0442\u043d\u0443\u0442\u0438 \u0441\u0432\u043e\u0458 \u0432\u043b\u0430\u0441\u0442\u0438\u0442\u0438 \u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458, \u043c\u043e\u043b\u0438\u043c \u0443\u043f\u0438\u0448\u0438\u0442\u0435 \u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0435\u0434\u0430 \u043e\u0432\u0434\u0435 \u0438 \u043e\u0441\u0438\u0433\u0443\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u043e\u0434\u0433\u043e\u0432\u0430\u0440\u0430\u0458\u0443\u045b\u0430 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 .jar \u0431\u0443\u0434\u0435 \u0443\u0447\u0438\u0442\u0430\u043d\u0430. \u0410\u043a\u043e \u043f\u043e\u0441\u0442\u043e\u0458\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0430 \u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458 \u043e\u0434\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0432\u0434\u0435 '\u043d\u0438\u0448\u0442\u0430'. \u041e\u0432\u043e \u0434\u0435\u043b\u0443\u0458\u0435 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0435.</html>
+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\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u045a\u0435 \u0434\u0430\u0442\u0443\u043c\u0430 \u0438 \u0431\u0440\u043e\u0458\u0435\u0432\u0430</em> - \u043f\u043e\u0433\u043b\u0435\u0434\u0430\u0458 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u043e\u043c \u043f\u043e\u0459\u0443</ul></html>
+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\u0438\u045b: </td><td> \u0447\u0432\u043e\u0440 \u0441\u0430 \u0437\u0430\u043e\u0431\u0459\u0435\u043d\u0438\u043c \u0440\u0443\u0431\u043e\u043c,</td></tr><tr><td>\u041a\u0430\u043e \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438: </td><td> \u0441\u0442\u0438\u043b \u0441\u0435 \u043f\u0440\u0435\u043d\u043e\u0441\u0438 \u0441\u0430 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 <br>\u0438\u043b\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u0441\u0442\u0438\u043b \u0438\u0437\u0432\u043e\u0440\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 \u043d\u0430 \u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u0447\u0432\u043e\u0440,</td></tr><tr><td>\u041a\u043e\u043c\u0431\u0438\u043d\u043e\u0432\u0430\u043d\u043e: </td><td> \u041c\u0435\u0445\u0443\u0440\u0438\u045b \u043a\u0430\u0434 \u0458\u0435 \u0447\u0432\u043e\u0440 \u0440\u0430\u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d - \u0438\u043d\u0430\u0447\u0435 \u0458\u0435 \u0440\u0430\u0447\u0432\u0430 .</td></tr></table></html>
+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 \u0443 \u043f\u0440\u0432\u043e\u0458 \u0434\u0430\u0442\u043e\u0442\u0435\u0446\u0438 \u0438\u0442\u0434. \u0434\u043e n+1 \u0447\u0443\u0432\u0430\u045a\u0435 \u043a\u043e\u0458\u0435 \u0441\u0435 \u043e\u043f\u0435\u0442 \u0438\u0437\u0432\u043e\u0434\u0438 \u0438\u0434\u0435 \u0443 \u043f\u0440\u0432\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 (\u043a\u0440\u0443\u0436\u043d\u043e)</html>
+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\u0440\u0438\u043c\u0435\u0440\u0438: 100,000.00, 12/31, 12/31/99, 1999-12-31 \u0438 1999-12-31 23:59
+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\u0437\u0443\u0458 \u0458\u0435\u0434\u043d\u043e\u0441\u0442\u0430\u0432\u043d\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u043d\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447.</html>
+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. \u041e\u0432\u043e \u043c\u043e\u0436\u0435 \u043f\u0440\u043e\u0443\u0437\u0440\u043e\u043a\u043e\u0432\u0430\u0442\u0438 \u0433\u0443\u0431\u0438\u0442\u0430\u043a \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430 \u0443\u043a\u043e\u043b\u0438\u043a\u043e \u043d\u0438\u0441\u043c\u043e \u043f\u0430\u0436\u0459\u0438\u0432\u0438 \u043a\u043e\u0434 \u0431\u0440\u0438\u0441\u0430\u045a\u0430.
+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\u0458\u0430\u045a\u0435 \u0443\u043d\u043e\u0441\u0430.<br>Frepplane \u045b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0430\u0432\u0430\u0442\u0438 \u043f\u043e\u0441\u0442\u043e\u0458\u0430\u045a\u0435 JAR \u0438\u043b\u0438 .class \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430.<br>\u041f\u0443\u0442\u0430\u045a\u0435 \u043a\u043e\u0458\u0435 \u043d\u0438\u0441\u0443 \u0430\u043f\u0441\u043e\u043b\u0443\u0442\u043d\u0435, \u0431\u0438\u045b\u0435 \u0443\u0441\u043c\u0435\u0440\u0435\u043d\u0435 \u043d\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0443 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443 Freeplane.<br>\u0410\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 classpath \u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0438!</html>
+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 \u0430\u043f\u0441\u043e\u043b\u0443\u0442\u043d\u0435, \u0431\u0438\u045b\u0435 \u0443\u0441\u043c\u0435\u0440\u0435\u043d\u0435 \u043d\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0443 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443 Freeplane..</html>
+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 \u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430 \u0443 \u0431\u0430\u0437\u0438 \u043a\u0459\u0443\u0447\u0435\u0432\u0430. <br>\u041b\u043e\u0437\u0438\u043d\u043a\u0430 \u043a\u0459\u0443\u0447\u043d\u043e\u0433 \u0442\u0430\u0458\u043d\u043e\u0433 \u043a\u0459\u0443\u0447\u0430 \u043c\u043e\u0440\u0430 \u0441\u0435 \u043f\u043e\u0434\u0443\u0434\u0430\u0440\u0430\u0442\u0438 \u0441 \u043b\u043e\u0437\u0438\u043d\u043a\u043e\u043c \u0443 \u0431\u0430\u0437\u0438 \u043a\u0459\u0443\u0447\u0435\u0432\u0430 (\u0442\u043e \u0458\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e).</html>
+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. \u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0435 \u043c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u043c\u043e\u0458\u0442\u0435 \u0458\u0435 \u043c\u0435\u045a\u0430\u0442\u0438 \u0458\u0435\u0440 \u045b\u0435 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430 \u0443 auto.properties \u0443 \u0441\u0432\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0458\u0443</html>
+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.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.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.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\u0438\u0447\u0435\u045a\u0430.
+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\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430 \u0443 \u043f\u043e\u0434\u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0438 \u043c\u0430\u043f\u0435 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0435 .</html>
+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\u0443\u0432\u0430\u045a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u043e\u0432\u0443 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043d\u0430 2000000000.</html>
+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\u043c\u0430). \u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043e\u0432\u0430\u0458 \u0438\u0437\u043d\u043e\u0441 \u043d\u0430 1 \u0430\u043a\u043e \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0434\u0430\u0431\u0440\u0430\u0442\u0438 \u0447\u0432\u043e\u0440 \u043a\u0430\u0434 \u0458\u0435 \u043c\u0438\u0448 \u0438\u0437\u043d\u0430\u0434.</html>
+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.tr = \u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u043a\u0438 / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+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\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430.
+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
+pdfKeyDocLocation = ./doc/FM_Key_Mappings_Quick_Guide.pdf
+periodic_formula = {0} * n + {1}
+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
+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|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write} {2}. \u0412\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0432\u043e \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0438 \u0443 \u043f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0438\u043c\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430.
+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\u043e\u0432\u043e\u0459\u043d\u043e \u043f\u043e\u0434\u0440\u0436\u0430\u043d\u0435.
+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_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\u0440\u0435\u043c\u0435\u043d\u0430 \u0442\u0440\u0435\u043f\u045b\u0443\u045b\u0430 \u0438\u043a\u043e\u043d\u0430 \u0434\u0430\u0458\u0435 \u0437\u043d\u0430\u043a \u043e \u0438\u0441\u0442\u0435\u043a\u0443.<br> \u0410\u043a\u043e \u0437\u0430\u0442\u0432\u043e\u0440\u0438\u0442\u0435 \u043c\u0430\u043f\u0443, \u043e\u0434\u0431\u0440\u043e\u0458\u0430\u0432\u0430\u045a\u0435 \u0441\u0435 \u043f\u043e\u043d\u043e\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430 \u043a\u043e\u0434 \u043e\u0442\u0432\u0430\u0440\u0430\u045a\u0430 \u043c\u0430\u043f\u0435.</html>
+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\u0448 \u0438\u0437\u0431\u043e\u0440 \u0458\u0435 \u0431\u0438\u043e {1,date} {1,time}. <br><br>\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0438 \u0432\u0440\u0435\u043c\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u045a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a\u0430 (\u0414\u0430) <br>\u0438\u043b\u0438 \u0436\u0435\u043b\u0438\u0442\u0435 \u0437\u0430\u0434\u0440\u0436\u0430\u0442\u0438 \u0441\u0442\u0430\u0440\u043e \u0432\u0440\u0435\u043c\u0435 (\u041d\u0435)?</html>
+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\u0435 (\u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0443\u0458\u0435 \u0441\u0435)? <br> (\u0423 \u0441\u0443\u043f\u0440\u043e\u0442\u043d\u043e\u043c \u0442\u0440\u0435\u0431\u0430 \u0443\u0437\u0435\u0442\u0438 \u043a\u0430\u043a\u0432\u0430 \u0458\u0435, \u0431\u0435\u0437 \u0438\u043a\u0430\u043a\u0432\u0435 \u0433\u0430\u0440\u0430\u043d\u0446\u0438\u0458\u0435.) </html>
+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\u0430 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443?
+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
+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.. \u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0441\u0438\u0434\u0440\u043e:<br/>{0}
+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.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.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.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.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.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.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.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.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.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.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.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.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.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.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
+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.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.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)
+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
+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
+yes = \u0414\u0430
+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
new file mode 100644
index 0000000..4e39f31
--- /dev/null
+++ b/freeplane/resources/translations/Resources_sv.properties
@@ -0,0 +1,1365 @@
+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/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/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_Applet.text = Som Java Applet...
+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}
+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
+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.
+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
+AssignAttributesAction.text = Ange egenskaper
+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_top = Alla egenskaper i inl?sta tankekartor
+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_deselect_all = Ingenting
+attributes_dialog_title = Egenskapshanteraren
+attributes_edit = Redigera
+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_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_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_select_all = Alla
+attributes_select_all_tooltip = Markera / avmarkera alla
+attributes_show = Visa
+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>
+BackAction.text = Backa
+BackAction.tooltip = G\u00e5r bak\u00e5t i historiken p\u00e5 valda grenar
+background = Bakgrund
+bitmaps = Bitmap-bilder
+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?
+BoldAction.text = Fet
+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
+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_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_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.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
+CloudAction.text = Moln
+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
+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...
+CopyAction.text = Kopiera
+CopyIDAction.text = Kopiera gren-ID
+CopyMapStylesAction.text = Kopiera kartstil fr\u00e5n...
+CopySingleAction.text = Kopiera enskild
+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>
+current_dir = Kartor
+CutAction.text = Klipp ut
+decrease_branch_font_size = Minska teckensnitt
+DecreaseNodeFontAction.text = Minska teckensnitt
+default = Standard
+DefaultColorAction.text = Standard f?rg
+delete = Ta bort
+delete_child = Ta bort gren
+DeleteAction.text = Ta bort gren
+DeleteConditionAction.text = Ta bort
+DeleteDetailsAction.text = Ta bort grenens extrainformation
+DeleteLevelStyleAction.text = Ta bort automatiska mallar
+DeleteStyleAction.text = Ta bort mall
+DeleteUserStyleAction.text = Ta bort egen mall
+DirectHtmlFlavorHandler = HTML som en enda gren
+DocumentationAction.text = Dokumentation
+down = Ner
+download = H?mta
+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_style = Kantlinjens format
+edge_width = Kantlinjens bredd
+EdgeColorAction.text = F\u00e4rg p\u00e5 kantlinje...
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.hide_edge.text = D\u00f6lj kanten
+EdgeStyleAction.horizontal.text = Horisontell
+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
+EdgeWidthAction_width_thin.text = Tunn
+edit = Redigera
+edit.decision = HTML-redigerare
+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_middle_label = Etikett
+edit_source_label = Etikett vid starten
+edit_target_label = Etikett vid slutet
+EditAction.text = Redigera gren
+EditAttributesAction.text = Redigera egenskaper
+EditDetailsAction.text = Redigera grenens extrainformation
+EditFilterAction.text = Redigera
+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_new_style_name = Ange nytt mall namn
+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
+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
+ExportBranchAction.text = Gren som ny karta...
+ExportBranchToHTMLAction.text = Gren som HTML
+exported_file = {0} fil
+ExportPdf.text = Som PDF...
+ExportSvg.text = Som SVG...
+ExportToHTMLAction.text = Som HTML
+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
+f_button_unassigned = <inget>
+FaqOpenURLAction.text = FAQ
+file = Arkiv
+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
+filter_and = Och
+filter_conditions = Filter
+filter_contains = Inneh\u00e5ller
+filter_created_after = Skapad efter
+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_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_match_case = Skilj p? versaler/gemena
+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_not = I&nte
+filter_note = Anteckning
+filter_odd_level = J\u00e4mna gren niv\u00e5er
+filter_or = Eller
+filter_parent = F\u00f6r\u00e4ldratext
+filter_periodic_level = Periodisk
+filter_priority = Prioritet
+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
+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:
+font = Teckensnitt
+FontFamilyAction.text = Teckensnitt
+FontSizeAction.text = Teckenstorlek
+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.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.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...
+Freeplane.progress.endStartup = Avslutar uppstart.
+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_reverted = Freeplane_Reverted_
+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.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
+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_no_folding = HTML Export - Visa alla
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_attach = Bilaga
+icon_back = Tillbaka
+icon_bee = Freeplane
+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_closed = St?ngd
+icon_decrypted = Uppl\u00e5st
+icon_desktop_new = Kom ih?g
+icon_down = Ned
+icon_edit = Redigera
+icon_encrypted = L\u00e5st
+icon_family = Familj
+icon_fema = Par
+icon_female1 = Kvinna1
+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-orange = Orange flagga
+icon_flag-pink = Rosa flagga
+icon_flag-yellow = Gul flagga
+icon_folder = Katalog
+icon_forward = Fram\u00e5t
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Prioritet 0
+icon_full-1 = Prioritet 1
+icon_full-2 = Prioritet 2
+icon_full-3 = Prioritet 3
+icon_full-4 = Prioritet 4
+icon_full-5 = Prioritet 5
+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_gohome = Hem
+icon_group = Grupp
+icon_help = Fr\u00e5ga
+icon_hourglass = V\u00e4nta
+icon_icon_not_found = Ikon sakans
+icon_idea = Id\u00e9
+icon_info = Info
+icon_kaddressbook = Telefon
+icon_kmail = E-post
+icon_knotify = Musik
+icon_korn = Brevl\u00e5da
+icon_ksmiletris = Glad
+icon_launch = Lyft
+icon_licq = Bra
+icon_list = Lista
+icon_Mail = Post
+icon_male1 = Man1
+icon_male2 = Man2
+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_penguin = Linux
+icon_positive = Positiv
+icon_prepare = Gult ljus
+icon_smiley-angry = Arg
+icon_smiley-neutral = Neutral
+icon_smiley-oh = \u00d6verraskad
+icon_smily_bad = Ledsen
+icon_stop = Stopp
+icon_stop-sign = Stopp
+icon_up = Upp
+icon_user_icon = Egna ikoner
+icon_very_negative = Mer negativ
+icon_very_positive = Mer positiv
+icon_wizard = Trollbind
+icon_xmag = Diskutera
+icon_yes = Notera
+IconGroupPopupAction.arrows.text = Pilar
+IconGroupPopupAction.docs_folders.text = Dokument
+IconGroupPopupAction.flags.text = Flaggor
+IconGroupPopupAction.miscellaneous.text = Diverse
+IconGroupPopupAction.nature.text = Natur
+IconGroupPopupAction.numbers.text = Siffror
+IconGroupPopupAction.office.text = Kontor
+IconGroupPopupAction.people.text = Personer
+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.
+ImportAction.text = Importera
+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...
+ImportMindmanagerFiles.text = MindManager X5 tankekarta...
+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}
+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.
+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.
+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?
+main_resource_directory = Katalog: {0}
+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_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.
+MapBackgroundColorAction.text = Bakgrund
+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
+MoveToRootAction.text = Hoppa till rotgren
+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
+NewChildAction.text = Ny undergren
+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.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.tooltip = Ersatt {0} av {1}
+NewerFileRevisionsFoundDialog.title = Nyare fil finns!
+NewLevelStyleAction.text = L\u00e4gg till automatiskt niv\u00e5mall
+NewMapAction.text = Ny
+NewMapViewAction.text = Ny kartvy
+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
+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)
+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.
+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.
+NodeShapeAction.bubble.text = Bubbla
+NodeShapeAction.fork.text = Enkel
+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
+ok = OK
+OKAction.text = OK
+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
+OptionalDontShowMeAgainDialog.cancel = &Nej
+OptionalDontShowMeAgainDialog.dontShowAgain = &Fr\u00e5ga inte igen.
+OptionalDontShowMeAgainDialog.ok = &Ja
+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_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_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_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.Appearance = Format
+OptionPanel.ar = Ar
+OptionPanel.ARC = Rundad
+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.bezier = Bezier
+OptionPanel.bubble = Bubbla
+OptionPanel.ca = Katalanska
+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.clear_all_setters = Byt alla
+OptionPanel.clear_all_setters.tooltip = Visar eller tar bort alla angivna f\u00f6r\u00e4ndringar.
+OptionPanel.cloud = Moln
+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.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.da = Danska
+OptionPanel.de = Tyska
+OptionPanel.default = Standard
+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.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.display_node_id = Visa gren-ID
+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.edgewidth = Kantbredd
+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.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_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.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.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.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.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.formula_disable_caching = Avaktivera formel cachen
+OptionPanel.fr = Franska
+OptionPanel.gl = Gl
+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.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_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.id = Indonesiska
+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.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.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.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.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.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.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.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.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.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.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.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.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.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_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_direct = Direkt
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Mall
+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.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.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.files = Arkiv
+OptionPanel.separator.formula = Formel Plugin
+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.icon_properties = Ikoner
+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.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.NodeFont = Grenteckensnitt
+OptionPanel.separator.NodeShape = Grenform
+OptionPanel.separator.NodeStyle = Grenmall
+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.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_method = Markering av grenar
+OptionPanel.separator.single_instance_mode = Endast en kopia av programmet startas
+OptionPanel.separator.size_limits = Storleksgr\u00e4ns
+OptionPanel.separator.spelling = Stavningskontroll
+OptionPanel.separator.tooltip = Tips-rutor
+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.setscript.tooltip = A script can be associated to the style.
+OptionPanel.sharp_bezier = Skarp Bezier
+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.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.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_force = Starta endast en kopia av programmet
+OptionPanel.sk = Slovakiska
+OptionPanel.sl = Sl
+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_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.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.standardcloudestyle = Standard molnstil
+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.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.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.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.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.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.vi = Vietnamesiska
+OptionPanel.wheel_velocity = Hastighet
+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
+org.freeplane.plugin.bugreport.agree = Skicka
+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.lastreport = Senaste rapport mottagen
+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...
+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.EdgeStyle = Kantlinjens stil
+PatternToString.EdgeWidth = Kantlinjens bredd
+PatternToString.FontBold = Fet
+PatternToString.FontItalic = Kursiv
+PatternToString.FontName = Typsnittsnamn
+PatternToString.Icon = Ikon
+PatternToString.NodeFontSize = Teckensnittstorlek
+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.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.sign = Signera skript...
+plugins/ScriptEditor/window.Result = Resultat:
+plugins/ScriptEditor/window.title = Skriptredigerare
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Illegal access to the internal API (package {0}). - Please contact the Freeplane team if the scripting API is not powerful enough.
+plugins/TimeList.xml_Created = Skapad
+plugins/TimeList.xml_Date = Datum
+plugins/TimeList.xml_Icons = Ikoner
+plugins/TimeList.xml_Modified = Modifierad
+plugins/TimeList.xml_Notes = Anteckningar
+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_Export = Exportera markerade grenar
+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_todayButton = Idag
+plugins/TimeManagement.xml_WindowTitle = Tidsstyrning
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = S\u00f6k och ers\u00e4tt
+preferences = Inst?llningar
+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 ...
+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.
+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_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.
+remove_file_from_list_on_error = File {0} not opened. Remove it from the last opened file list?
+remove_shortcut_question = Ers\u00e4tt snabbkommando?
+RemoveAllIconsAction.text = Ta bort alla ikoner
+RemoveConnectorAction.text = Ta bort f\u00f6rbindelse
+RemoveFormatAction.text = Ta bort format
+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.
+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
+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.
+save_unsaved = Spara tankekarta?
+save_unsaved_styles = Spara mall?
+SaveAcceleratorPresetsAction.text = Spara snabbkommandoupps\u00e4ttning
+SaveAction.text = Spara
+SaveAll.text = Spara alla
+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
+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
+select_menu_item_root_node = Meny
+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
+SetAcceleratorOnNextClickAction.text = Nytt snabbkommando
+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
+SetShortenerStateAction.text = Visa/D?lj markering f?r extrainformation
+sf_login_required = SourceForge-login kr\u00e4vs. Forts\u00e4tta?
+ShowAllAttributesAction.text = Visa alla egenskaper
+ShowAncestorsAction.text = Visa f\u00f6r\u00e4ldragren
+ShowAttributeDialogAction.text = Egenskapshanterare
+ShowDescendantsAction.text = Visa undergren
+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.
+ShowNotesInMapAction.text = Visa anteckning i karta
+ShowSelectedAttributesAction.text = Visa markerade egenskaper
+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.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.backgroundLabel = Bakgrund:
+simplyhtml.boldItalicName = Fet+kursiv
+simplyhtml.boldName = Fet
+simplyhtml.borderColorLabel = F\u00e4rg:
+simplyhtml.borderWidthLabel = Bredd
+simplyhtml.bottomLabel = Nederst:
+simplyhtml.cancelBtnName = Avbryt
+simplyhtml.cellBorderTabLabel = Kantlinjer
+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.copyLabel = Kopiera
+simplyhtml.copyTip = Kopiera
+simplyhtml.cTagNameHead1 = Rubrik 1
+simplyhtml.cTagNameHead2 = Rubrik 2
+simplyhtml.cTagNameHead3 = Rubrik 3
+simplyhtml.cTagNameHead4 = Rubrik 4
+simplyhtml.cTagNameHead5 = Rubrik 5
+simplyhtml.cTagNameHead6 = Rubrik 6
+simplyhtml.cTagNameLink = L\u00e4nk
+simplyhtml.cTagNameOL = Numrerad lista
+simplyhtml.cTagNamePara = Stycke
+simplyhtml.cTagNameUL = Onumrerad lista
+simplyhtml.cutLabel = Klipp ut
+simplyhtml.cutTip = Klipp ut
+simplyhtml.defaultDocName = Dokumentnamn
+simplyhtml.deleteTableColLabel = Ta bort kolumn
+simplyhtml.deleteTableRowLabel = Ta bort rad
+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.fontBoldLabel = Fet
+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.fontLabel = Teckensnitt...
+simplyhtml.fontTabLabel = Teckensnitt
+simplyhtml.fontTip = Val av teckensnitt...
+simplyhtml.fontUnderlineLabel = Understruken
+simplyhtml.fontUnderlineTip = Understruken av/p\u00e5
+simplyhtml.foregroundLabel = F\u00f6rgrund:
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = Lista...
+simplyhtml.formatListTip = \u00c4ndra listformat
+simplyhtml.formatParaLabel = Stycke...
+simplyhtml.formatParaTip = \u00c4ndra styckeformat
+simplyhtml.formatTableLabel = Tabell...
+simplyhtml.formatTableTip = Formattera tabell
+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.insertTableRowLabel = Infoga rad
+simplyhtml.insertTableTitle = Infoga tabell
+simplyhtml.italicName = Kursiv
+simplyhtml.layoutTabTitle = Formatvy
+simplyhtml.leftLabel = V\u00e4nster:
+simplyhtml.listDialogTitle = Formatera lista
+simplyhtml.listIndentTitle = Indrag:
+simplyhtml.listPosInside = Inuti
+simplyhtml.listPositionLabel = Position:
+simplyhtml.listPosOutside = Utanf\u00f6r
+simplyhtml.listTypeCircle = Rund punkt
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = Filsymbol som punkt
+simplyhtml.listTypeLabel = Listtyp:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = Ingen
+simplyhtml.listTypeSquare = Fyrkantig punkt
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+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.noLineLabel = Ingen
+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.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.replaceAll = Alla
+simplyhtml.replaceDone = F\u00e4rdig
+simplyhtml.replaceNo = Nej
+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.selectAllLabel = Markera alla
+simplyhtml.sizeLabel = Storlek
+simplyhtml.standardStyleName = Standard
+simplyhtml.strikeLabel = Genomstruken
+simplyhtml.styleLabel = Mall
+simplyhtml.styleNameInputText = Namn p\u00e5 ny mall?
+simplyhtml.styleNameInputTitle = Spara mall
+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.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.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.valignBaseline = Baslinjen
+simplyhtml.valignBottom = Underst
+simplyhtml.valignLabel = Vert. justerad:
+simplyhtml.valignMiddle = Mitten
+simplyhtml.valignTop = \u00d6verst
+simplyhtml.wholeWordsOnly = Enbart hela ord
+SortNodes.text = Sortera undergrenar
+SortNodes.tooltip = Sortera alla undergrenar i alfabetisk ordning.
+split = Dela
+SplitConditionAction.text = Dela upp
+SplitNode.text = Dela upp gren
+SplitNode.tooltip = <html>Gren delas upp</html>
+stop_processing = Avbryt
+StringFlavorHandler = Ren text som grenhierarki
+StructuredHtmlFlavorHandler = HTML som grenhierarki
+style = Mall
+style_already_exists = Utseendet finns redan.
+styledialog.cancel.text = Avbryt
+styledialog.ok.text = OK
+styles = Mallar
+styles.AutomaticLayout = Automatiskt mall
+styles.connection = F?rbindelse
+styles.date = Datum
+styles.definition = Definition
+styles.description = Beskrivning
+styles.floating_node = Flytande gren
+styles.idea = Id?
+styles.important = Viktig
+styles.key = Nyckel
+styles.list = Lista
+styles.needs_action = \u00c5tg\u00e4rda
+styles.note = Anteckning
+styles.ok = OK
+styles.pending = Vilande
+styles.predefined = Definerade mallar
+styles.question = Fr\u00e5ga
+styles.quotation = Citat
+styles.root_node = Utseende
+styles.subsubtopic = Rubrik 3
+styles.subtopic = Rubrik 2
+styles.topic = Rubrik 1
+styles.user-defined = Egna mallar
+styles.website = Webplats
+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.
+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
+ToggleMenubarAction.text = Menyrad
+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
+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>
+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}
+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_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
+WebDocuAction.text = Webbdokumentation
+width = Bredd
+wrong_regexp = Wrong regular expression "{0}", error {1}
+xslt_export_not_possible = Freeplane XSLT export not possible
+yes = Ja
+ZoomInAction.text = Zooma in
+ZoomOutAction.text = Zooma ut
diff --git a/freeplane/resources/translations/Resources_tr.properties b/freeplane/resources/translations/Resources_tr.properties
new file mode 100644
index 0000000..97da631
--- /dev/null
+++ b/freeplane/resources/translations/Resources_tr.properties
@@ -0,0 +1,558 @@
+AboutAction.text = Hakk\u0131nda
+acceleratorPresets = Hot Key Presets[translate me]
+accessories/plugins/EncryptNode.properties_0 = \u015Eifreli d\u00FC\u011F\u00FCm i\u00E7in bir \u015Fifre belirleyin
+accessories/plugins/EncryptNode.properties_1 = \u015Eifreler uyu\u015Fmuyor ya da \u00E7ok k\u0131sa.
+accessories/plugins/EncryptNode.properties_2 = \u015Eifre Gir:
+accessories/plugins/EncryptNode.properties_3 = Yeniden Gir:
+accessories/plugins/EncryptNode.properties_4 = \u015Eifrenizi girin.
+accessories/plugins/EncryptNode.properties_5 = <html>Unutmay\u0131n ki \u015Fifrelemenin g\u00FCc\u00FCn\u00FC neredeyse<br> tamamen \u015Fifrenizin kalitesine ba\u011Fl\u0131d\u0131r.
+accessories/plugins/EncryptNode.properties_6 = Tamam
+accessories/plugins/EncryptNode.properties_7 = \u0130ptal
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = Yaln\u0131zca \u015Fifreli bir d\u00FC\u011F\u00FCm\u00FCn \u015Fifre durumunu de\u011Fi\u015Ftirebilirsiniz. L\u00FCtfen ara\u00E7lar men\u00FCs\u00FCn\u00FC kullanarak bu t\u00FCr bir d\u00FC\u011F\u00FCm olu\u015Fturun.
+accessories/plugins/EncryptNode.properties_select_me = Devam etmek i\u00E7in buray\u0131 se\u00E7in!
+accessories/plugins/EncryptNode.properties_wrong_password = \u015Eifre yanl\u0131\u015F.
+accessories/plugins/ExportWithXSLT.tooltip = Bu, XSLT betiklerini kullanan d\u00FCzenli bir d\u0131\u015Fa aktarma y\u00F6ntemidir.
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML Olarak (JavaScript s\u00FCr\u00FCm\u00FC)...
+accessories/plugins/ExportWithXSLT_HTML3.text = XHTML Olarak (T\u0131klanabilir harita resmi s\u00FCr\u00FCm\u00FC)...
+AddLocalLinkAction.text = Yerel Ba\u011Flant\u0131 Ekle
+antialias_all = Hepsini d\u00FCzg\u00FCnle\u015Ftir
+antialias_edges = S\u0131n\u0131rlar\u0131 d\u00FCzg\u00FCnle\u015Ftir
+antialias_none = Hi\u00E7 d\u00FCzg\u00FCnle\u015Ftirme
+as_parent = Ebeveyn Olarak
+attributes_deselect_all = Hi\u00E7bir \u015Fey
+attributes_refresh = Refresh[translate me]
+AutomaticLayoutAction.text = Otomatik Plan
+AutomaticLayoutAction.tooltip = <html> Haritan\u0131n plan\u0131n\u0131 tamir eder. <br>\u0130lk seviye siyah, ikincisi mavi, vb.</html>
+BackAction.text = Geri
+background = Arkaplan
+BlinkingNodeHookAction.text = Yan\u0131p S\u00F6nen D\u00FC\u011F\u00FCm
+BlinkingNodeHookAction.tooltip = <html>Bu, d\u00FC\u011F\u00FCm\u00FC yan\u0131p s\u00F6ner hale getirir. Ama dikkatli olun. \u00C7ok fazla d\u00FC\u011F\u00FCmde ve <strong>di\u011Fer otomatik bi\u00E7imlendirmelerle birlikte bunu kullanmay\u0131n</strong><html>
+BoldAction.text = Koyu
+boldify_branch = Dal\u0131 koyula\u015Ft\u0131r
+branch = Dal
+cancel = \u0130ptal
+CancelAction.text = \u0130ptal
+cannot_add_parent_diff_parents = Bu i\u015Flevin \u00E7al\u0131\u015Fmas\u0131 i\u00E7in b\u00FCt\u00FCn d\u00FC\u011F\u00FCmlerin ayn\u0131 ebeveyne sahip olmas\u0131 gerekir.
+cannot_add_parent_to_root = K\u00F6k d\u00FC\u011F\u00FCm\u00FC yeni bir ebeveyne eklenemez.
+cannot_join_nodes_with_children = \u00C7ocuklu d\u00FC\u011F\u00FCmler birle\u015Ftirilemez
+cannot_move_to_child = D\u00FC\u011F\u00FCm \u00E7ocuklar\u0131ndan birine ta\u015F\u0131namad\u0131.
+CenterAction.text = Ortala
+ChangeConnectorArrowsAction.backward.text = Geri
+ChangeConnectorArrowsAction.forward.text = \u0130leri
+choose_background_color = Arkaplan Rengini De\u011Fi\u015Ftir
+choose_cloud_color = Bulut Rengini De\u011Fi\u015Ftir:
+choose_edge_color = S\u0131n\u0131r Rengi Se\u00E7
+choose_node_background_color = D\u00FC\u011F\u00FCm Arkaplan Rengini Se\u00E7
+choose_node_color = D\u00FC\u011F\u00FCm Rengini Se\u00E7in:
+CloseAction.text = Kapat
+CloudAction.text = Bulut
+CloudColorAction.text = Bulut Rengi
+ColorProperty.ResetColor = Rengi S\u0131f\u0131rla
+combined = Birle\u015Fik
+CopyAction.text = Kopyala
+CopySingleAction.text = Birini Kopyala
+CreationModificationPluginAction.text = De\u011Fi\u015Ftirme Zamanlar\u0131n\u0131 G\u00F6ster
+CreationModificationPluginAction.tooltip = <html>Bu i\u015Flev d\u00FC\u011F\u00FCm yap\u0131m ve de\u011Fi\u015Ftirme zamanlarini takip eder.</html>
+CutAction.text = Kes
+decrease_branch_font_size = Yaz\u0131tipini K\u00FC\u00E7\u00FClt
+DecreaseNodeFontAction.text = Yaz\u0131tipini K\u00FC\u00E7\u00FClt
+delete_child = D\u00FC\u011F\u00FCm\u00FC Sil
+DeleteAction.text = D\u00FC\u011F\u00FCm\u00FC Kald\u0131r
+DocumentationAction.text = Belgeler
+edge = S\u0131n\u0131r
+edge_style = S\u0131n\u0131r Bi\u00E7emi
+edge_width = S\u0131n\u0131r Geni\u015Fli\u011Fi
+EdgeColorAction.text = S\u0131n\u0131r Rengi
+EdgeStyleAction.bezier.text = E\u011Fri
+EdgeStyleAction.linear.text = Do\u011Fru
+EdgeStyleAction.sharp_bezier.text = E\u011Friyi keskinle\u015Ftir
+EdgeStyleAction.sharp_linear.text = Do\u011Fruyu keskinle\u015Ftir
+EdgeStyleAsParentAction.text = Ebeveyn Olarak
+EdgeWidthAction_width_parent.text = Ebeveyn
+EdgeWidthAction_width_thin.text = \u0130nce
+edit = D\u00FCzen
+edit.decision = HTML Editor[translate me]
+edit_link_manually = Ba\u011Flant\u0131y\u0131 elle d\u00FCzenle
+EditAction.text = D\u00FC\u011F\u00FCm\u00FC D\u00FCzenle
+EditLongAction.text = Uzun bir d\u00FC\u011F\u00FCm\u00FC d\u00FCzenle
+EncryptedMap.text = \u015Eifreli Harita Olu\u015Ftur ...
+EncryptedMap.tooltip = Yeni bir \u015Fifreli harita olu\u015Ftur
+enter_base_url = Ba\u011F\u0131ml\u0131 ba\u011Flant\u0131lar yap\u0131\u015Ft\u0131r\u0131lacak. L\u00FCtfen referans URL'si girin.
+enter_confirms = Onaylar\u0131 girin
+EnterPassword.text = Ge\u00E7i\u015F yap \u015Eifrelenmi\u015F / \u015Eifrelenmemi\u015F
+error_creating_directory = D\u0131\u015Fa aktarmak i\u00E7in dizin olu\u015Fturulam\u0131yor.
+ExecuteScripts.text = Scripts[translate me]
+export_pdf_text = Ta\u015F\u0131nabilir Belge Bi\u00E7imi (PDF)
+export_svg_text = \u00D6l\u00E7eklenebilir Vekt\u00F6r Grafi\u011Fi (SVG)
+ExportAction.text = D\u0131\u015Fa Aktar
+ExportBranchToHTMLAction.text = Dal\u0131 HTML Olarak Aktar
+ExportPdf.text = PDF olarak...
+ExportSvg.text = SVG olarak...
+ExportToHTMLAction.text = HTML Olarak D\u0131\u015Fa Aktar
+ExportToImage.jpg.text = JPEG Olarak...
+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
+f_button_unassigned = <no action>[translate me]
+FaqOpenURLAction.text = SSS
+file = Dosya
+file_already_exists = {0} zaten var. \u00DCzerine yazmak ister misiniz?
+file_not_found = {0} bulunamad\u0131
+filter_does_not_exist = Not Exist[translate me]
+filter_icon = Icon[translate me]
+find_what = Neyi bul
+FindAction.text = Bul
+fit_map_to_page = Bir sayfaya s\u0131\u011Fd\u0131r
+FitToPage.text = Sayfaya S\u0131\u011Fd\u0131rmak i\u00E7in Yak\u0131nla\u015Ft\u0131r
+FitToPage.tooltip = Yak\u0131nla\u015Ft\u0131rmay\u0131 t\u00FCm haritan\u0131n \u015Fu anki pencereye s\u0131\u011Fabilece\u011Fi \u015Fekilde de\u011Fi\u015Ftirir.
+fold = Daralt
+FoldAllAction.text = T\u00FCm\u00FCn\u00FC Daralt
+FoldAllAction.tooltip = <html>Se\u00E7ili d\u00FC\u011F\u00FCmleri ve \u00E7ocuklar\u0131n\u0131 daralt\u0131r.</html>
+FoldOneLevelAction.text = Bir Seviye Daralt
+FoldOneLevelAction.tooltip = <html>Se\u00E7ili d\u00FC\u011F\u00FCmleri bir seviye daralt\u0131r.</html>
+follow_graphical_link = Go to\:[translate me]
+FollowLinkAction.text = Git:
+font = Yaz\u0131tipi
+FontFamilyAction.text = yaz\u0131tipi ailesi
+FontSizeAction.text = yaz\u0131tipi boyutu
+format_menu_edge_styles = S\u0131n\u0131r Bi\u00E7emleri
+format_menu_edge_widths = S\u0131n\u0131r Geni\u015Flikleri
+FormatCopy.text = Bi\u00E7imi Kopyala
+FormatCopy.tooltip = <html>Bir d\u00FC\u011F\u00FCm\u00FCn bi\u00E7imini kopyalar.</html>
+FormatPaste.text = Bi\u00E7imi Yap\u0131\u015Ft\u0131r
+FormatPaste.tooltip = <html>Bir d\u00FC\u011F\u00FCm\u00FCn bi\u00E7imini yap\u0131\u015Ft\u0131r\u0131r.</html>
+ForwardAction.text = \u0130leri
+freeplane_reverted = Freeplane_Eski_Hali_
+FreeplaneHelpStarter.text = Yard\u0131m...
+FreeplaneHelpStarter.tooltip = Freeplane Geni\u015Fletilmi\u015F Yard\u0131m
+GotoLinkNodeAction.text = Ba\u011Flant\u0131ya Git
+GrabKeyDialog.common.cancel = \u0130ptal
+GrabKeyDialog.common.ok = Tamam
+GrabKeyDialog.grab-key.assigned-to = Atanm\u0131\u015F
+GrabKeyDialog.grab-key.assigned-to.none = \u015Eu an atanmam\u0131\u015F
+GrabKeyDialog.grab-key.clear = Temizle
+GrabKeyDialog.grab-key.remove = Kald\u0131r
+GrabKeyDialog.grab-key.remove-ask = Bu k\u0131sayolu kald\u0131rmak istedi\u011Finizden emin misiniz?
+GrabKeyDialog.grab-key.title = Yeni tu\u015Fu girin
+help = Yard\u0131m
+HierarchicalIconsAction.text = Simgeleri hiyerar\u015Fik g\u00F6ster
+HierarchicalIconsAction.tooltip = E\u011Fer \u00E7ocuk ve torunlar\u0131mdan birinin simgesi varsa, ben de bunu k\u00FC\u00E7\u00FClt\u00FClm\u00FC\u015F olarak g\u00F6steririm.
+html_export_based_on_headings = HTML Olarak D\u0131\u015Fa Aktar - Ba\u015Fl\u0131klara g\u00F6re
+html_export_fold_all = HTML Olarak D\u0131\u015Fa Aktar - T\u00FCm\u00FCn\u00FC daralt
+html_export_fold_currently_folded = HTML Olarak D\u0131\u015Fa Aktar - \u015Eu ankiler daralt\u0131lm\u0131\u015F
+html_export_no_folding = HTML Olarak D\u0131\u015Fa Aktar - Daraltmadan
+icon_0% = 0%[translate me]
+icon_100% = 100%[translate me]
+icon_attach = Buraya bak
+icon_back = Geri
+icon_bee = Freeplane[translate me]
+icon_bell = Hat\u0131rla
+icon_bookmark = Heyecenl\u0131
+icon_broken-line = Broken[translate me]
+icon_button_cancel = \u0130ptal
+icon_button_ok = Tamam
+icon_calendar = Tarih
+icon_clanbomber = Tehlikeli
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+icon_desktop_new = Unutma
+icon_female1 = Female1[translate me]
+icon_female2 = Female2[translate me]
+icon_flag = Bayrak
+icon_flag-black = Black Flag[translate me]
+icon_flag-pink = Pink Flag[translate me]
+icon_forward = \u0130leri
+icon_freemind_butterfly = FreeMind[translate me]
+icon_full-1 = \u00D6ncelik 1
+icon_full-2 = \u00D6ncelik 2
+icon_full-3 = \u00D6ncelik 3
+icon_full-4 = \u00D6ncelik 4
+icon_full-5 = \u00D6ncelik 5
+icon_full-6 = \u00D6ncelik 6
+icon_full-7 = \u00D6ncelik 7
+icon_gohome = Ev
+icon_help = Soru
+icon_idea = Fikir
+icon_info = Info[translate me]
+icon_kaddressbook = Telefon
+icon_knotify = Muzik
+icon_korn = Posta Kutusu
+icon_ksmiletris = Mutluyum
+icon_licq = \u0130yi
+icon_list = List[translate me]
+icon_Mail = Posta
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = Simgeler
+icon_messagebox_warning = \u00D6nemli
+icon_password = Anahtar
+icon_pencil = D\u00FCzeltilecek
+icon_penguin = Linux
+icon_smiley-neutral = No Mind[translate me]
+icon_stop = Dur
+icon_wizard = Sihir
+icon_xmag = Tart\u0131\u015F\u0131lacak
+icon_yes = \u00D6nemli
+IconGroupPopupAction.office.text = Office[translate me]
+IconGroupPopupAction.smiley.text = Smiley[translate me]
+IconSelectionPlugin.text = Simge Se\u00E7...
+IconSelectionPlugin.tooltip = <html>Burada alt pencere kullanarak simge se\u00E7ebilirsiniz.</html>
+import = \u0130\u00E7e Aktar
+import_linked_branch_no_link = Se\u00E7ili d\u00FC\u011F\u00FCm\u00FCn i\u00E7e aktar\u0131lacak ba\u011Flant\u0131s\u0131 yok.
+ImportBranchAction.text = Dal\u0131 \u0130\u00E7e Aktar
+ImportExplorerFavoritesAction.text = Gezgin Yerimlerini \u0130\u00E7e Aktar
+ImportFolderStructureAction.text = Dizin Yap\u0131s\u0131n\u0131 \u0130\u00E7e Aktar
+ImportLinkedBranchAction.text = Ba\u011Flant\u0131l\u0131 Dal\u0131 \u0130\u00E7e Aktar
+ImportLinkedBranchWithoutRootAction.text = K\u00F6k Olmadan \u0130\u00E7e Aktar
+ImportMindmanagerFiles.text = MindManager X5 Haritas\u0131...
+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.
+locking_failed_by_save_as = {0} haritas\u0131n\u0131n kilitlenmesi ba\u015Far\u0131s\u0131z oldu. Farkl\u0131 Kaydetme \u0130ptal Edildi.
+locking_old_lock_removed = {0} haritas\u0131 {1} kullan\u0131c\u0131s\u0131 tarafondan kilitlenmi\u015Ftir. Eski oldu\u011Fu i\u00E7in kilit kald\u0131r\u0131lm\u0131\u015Ft\u0131r.
+long_node_changed_cancel = D\u00FC\u011F\u00FCm\u00FC dei\u011Fi\u015Ftirdiniz. De\u011Fi\u015Fiklikleri silmek istedi\u011Finizden emin misiniz?
+lots_of_links_warning = Bir d\u00FC\u011F\u00FCme bir\u00E7ok ba\u011Flant\u0131 yapacaks\u0131n\u0131z. Emin misiniz?
+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)
+mode_na = Mod uygun de\u011Fil
+mode_status = {0} Moduna ge\u00E7ildi
+mode_title = Freeplane - {0} Modu
+modes = Modlar
+most_recent_files = Son Kullan\u0131lanlar
+MoveToRootAction.text = K\u00F6ke ta\u015F\u0131
+NavigationNextMapAction.text = Sonraki Harita
+NavigationPreviousMapAction.text = \u00D6nceki Harita
+new_mindmap = Yeni Zihin Haritas\u0131
+new_node = Yeni D\u00FC\u011F\u00FCm
+new_node_as_sibling_not_possible_for_the_root = K\u00F6k i\u00E7in karde\u015F d\u00FC\u011F\u00FCm yap\u0131lamaz
+NewChildAction.text = Yeni \u00C7ocuk D\u00FC\u011F\u00FCm
+NewMapAction.text = Yeni
+NewParentNode.text = Yeni Ebeveyn D\u00FC\u011F\u00FCm
+NewParentNode.tooltip = <html>Se\u00E7ili olanlar\u0131n t\u00FCm\u00FC yeni ebeveyne nakledildi.</html>
+NewPreviousSiblingAction.text = Yeni Karde\u015F D\u00FC\u011F\u00FCm(\u00D6nde)
+NewSiblingAction.text = Yeni Karde\u015F D\u00FC\u011F\u00FCm
+no = Hay\u0131r
+no_format_copy_before_format_paste = \u00D6nce bir bi\u00E7im kopyalamal\u0131s\u0131n\u0131z.
+no_found_from = "{1}"''de hi\u00E7 "{0}" bulunamad\u0131.
+no_more_found_from = "{1}"''de ba\u015Fka "{0}" bulunamad\u0131.
+no_previous_find = \u00D6nceki bulunamad\u0131.
+node = D\u00FC\u011F\u00FCm
+node_changed_discard_changes = D\u00FC\u011F\u00FCm\u00FC dei\u011Fi\u015Ftirdiniz. De\u011Fi\u015Fiklikleri silmek istedi\u011Finizden emin misiniz?
+NodeBackgroundColorAction.text = D\u00FC\u011F\u00FCm Arkaplan Rengi
+NodeColorAction.text = D\u00FC\u011F\u00FCm Rengi
+NodeColorBlendAction.text = Rengi Kar\u0131\u015Ft\u0131r
+NodeDownAction.text = Alt D\u00FC\u011F\u00FCm
+NodeListAction.text = Harita Ge\u00E7mi\u015Fini G\u00F6ster ...
+NodeListAction.tooltip = T\u00FCm d\u00FC\u011F\u00FCmleri olu\u015Fturma/d\u00FCzenleme tarihleriyle g\u00F6sterir.
+NodeShapeAction.bubble.text = Balon
+NodeShapeAction.fork.text = Dalland\u0131r
+NodeUpAction.text = \u00DCst D\u00FC\u011F\u00FCm
+nonboldify_branch = Koyula\u015Ft\u0131rmay\u0131 Kald\u0131r
+nonitalicise_branch = Yat\u0131kla\u015Ft\u0131rmay\u0131 Kald\u0131r
+normal = Normal
+not_saved_for_link_error = Dosyaya ba\u011Flant\u0131 vermeden \u00F6nce haritay\u0131 kaydetmelisiniz
+ok = Tamam
+OKAction.text = Tamam
+OpenAction.text = A\u00E7
+OpenFreeplaneSiteAction.text = Freeplane's Homepage[translate me]
+option_changes_may_require_restart = De\u011Fi\u015Fkliklerin etkisini g\u00F6rebilmek i\u00E7in Freeplane'\u0131 ba\u015Ftan ba\u015Flatman\u0131z gerekebilir.
+OptionPanel.absolute = Ba\u011F\u0131ms\u0131z
+OptionPanel.always_unfold_all_after_load = Unfold all[translate me]
+OptionPanel.antialias = D\u00FCzeltme
+OptionPanel.antialias.tooltip = <html>Haritan\u0131n kalitesini belirler. Daha \u00E7ok d\u00FCzeltme daha \u00E7ok zaman harcar.</html>
+OptionPanel.antialias_all = Hepsini d\u00FCzg\u00FCnle\u015Ftir
+OptionPanel.antialias_edges = S\u0131n\u0131rlar\u0131 d\u00FCzg\u00FCnle\u015Ftir
+OptionPanel.antialias_none = D\u00FCzeltme Yok
+OptionPanel.Appearance = G\u00F6r\u00FCn\u00FCm
+OptionPanel.ar = Ar[translate me]
+OptionPanel.as_parent = Ebeveyn Olarak
+OptionPanel.automatic = Otomatik
+OptionPanel.Behaviour = Davran\u0131\u015F
+OptionPanel.bezier = E\u011Fri
+OptionPanel.bubble = Balon
+OptionPanel.Cancel = \u0130ptal
+OptionPanel.cloud = Cloud[translate me]
+OptionPanel.combined = Birle\u015Fik
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = Varsay\u0131lan
+OptionPanel.default_browser_command_mac = Mac i\u00E7in Varsay\u0131lan Taray\u0131c\u0131 Komutu
+OptionPanel.default_browser_command_mac.tooltip = <html> ve MAC: (Nick'e te\u015Fekk\u00FCrler!)</html>
+OptionPanel.default_browser_command_other_os = Di\u011Fer \u0130\u015Fletim Sistemleri \u0130\u00E7in Taray\u0131c\u0131 Komutu
+OptionPanel.default_browser_command_other_os.tooltip = <html> Genelde Linux i\u00E7indir:</html>
+OptionPanel.default_browser_command_windows_9x = Windows 9x i\u00E7in Varsay\u0131lan Taray\u0131c\u0131
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>Windows i\u00E7in ( "" i\u015Faretleri, i\u00E7inde "=" olan ba\u011Flant\u0131lar i\u00E7in gereklidir).</html>
+OptionPanel.default_browser_command_windows_nt = Windows NT i\u00E7in Varsay\u0131lan Taray\u0131c\u0131
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>Windows i\u00E7in ( "" i\u015Faretleri, i\u00E7inde "=" olan ba\u011Flant\u0131lar i\u00E7in gereklidir).</html>
+OptionPanel.default_charset = Charset[translate me]
+OptionPanel.Defaults = Varsay\u0131lanlar
+OptionPanel.delete_automatic_saves_at_exit = \u00C7\u0131k\u0131\u015Fta Otokay\u0131tlar\u0131 Sil
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html>Freeplane'\u0131 notmal olarak kapatt\u0131\u011F\u0131n\u0131zda otomatik kay\u0131tlar\u0131n silinmesini sa\u011Flar</html>
+OptionPanel.disable_cursor_move_paper = \u0130mle\u00E7 Hareket Ka\u011F\u0131d\u0131n\u0131 Etkisizle\u015Ftir
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Ka\u011F\u0131d\u0131 s\u00FCr\u00FCklerken 'move' imlecini g\u00F6sterme</html>
+OptionPanel.el = El[translate me]
+OptionPanel.el__enter_confirms_by_default = Onaylar\u0131 Varsay\u0131lan Olarak Gir
+OptionPanel.el__max_default_window_height = Mak Varsay\u0131lan Pencere Y\u00FCksekli\u011Fi
+OptionPanel.el__max_default_window_width = Mak Varsay\u0131lan Pencere Geni\u015Fli\u011Fi
+OptionPanel.el__min_default_window_height = Min Varsay\u0131lan Pencere Y\u00FCksekli\u011Fi
+OptionPanel.el__min_default_window_width = Min Varsay\u0131lan Pencere Geni\u015Fli\u011Fi
+OptionPanel.el__position_window_below_node = Pencereyi D\u00FC\u011F\u00FCm\u00FCn Alt\u0131nda G\u00F6ster
+OptionPanel.en = En
+OptionPanel.Environment = Ortam
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+OptionPanel.experimental_file_locking_on = Deneysel Dosya Kilitleme
+OptionPanel.experimental_file_locking_on.tooltip = <html> Denenmemi\u015F \u00F6zellik</html>
+OptionPanel.export_icons_in_html = Simgeleri Html Olarak D\u0131\u015Fa Aktar
+OptionPanel.export_icons_in_html.tooltip = <html> Freeplane'\u0131n olu\u015Fturdu\u011Fu HTML'nin simge i\u00E7erip i\u00E7ermeyece\u011Fini belirler. Simgelerle olan sorun genelde simgelere olan ba\u011Flant\u0131lar\u0131n d\u0131\u015Fa aktar\u0131lan HTML'de ge\u00E7ersizle\u015Fmesidir.</html>
+OptionPanel.Files = Dosyalar
+OptionPanel.first = \u0130lk
+OptionPanel.foldingsymbolwidth = Daraltma Sembol\u00FC Geni\u015Fli\u011Fi
+OptionPanel.foldingsymbolwidth.tooltip = <html>Katlama i\u015Fareti \u00E7emberinin geni\u015Fli\u011Fi</html>
+OptionPanel.fork = \u00C7atal
+OptionPanel.fr = Fr
+OptionPanel.gl = Gl[translate me]
+OptionPanel.gtk = Gtk
+OptionPanel.hr = Hr[translate me]
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Ba\u015Fl\u0131klara G\u00F6re
+OptionPanel.html_export_fold_all = T\u00FCm\u00FCn\u00FC Daralt
+OptionPanel.html_export_fold_currently_folded = \u015Eu Anki Daralt\u0131lm\u0131\u015Flar\u0131 Daralt
+OptionPanel.html_export_folding = Html Olarak D\u0131\u015Fa Aktarmada Daraltma
+OptionPanel.html_export_no_folding = Daraltma Yok
+OptionPanel.hu = Hu
+OptionPanel.icon = Icon[translate me]
+OptionPanel.id = Id[translate me]
+OptionPanel.it = It
+OptionPanel.ja = Ja
+OptionPanel.Keystrokes = K\u0131sayol Tu\u015Flar\u0131
+OptionPanel.ko = Kr
+OptionPanel.language = Dil
+OptionPanel.language.tooltip = <html>Bu programda kullan\u0131lmas\u0131 gereken dildir. 'otomatik' yaparsan\u0131z kullan\u0131c\u0131n\u0131n dili y\u00FCklenmeye \u00E7al\u0131\u015F\u0131lacakt\u0131r. </html>
+OptionPanel.last = Son
+OptionPanel.last_opened_list_length = Son A\u00E7\u0131lanlar Listesi Uzunlu\u011Fu
+OptionPanel.linear = Do\u011Fru
+OptionPanel.links = Ba\u011Flant\u0131lar
+OptionPanel.links.tooltip = <html>Ba\u011Flant\u0131lar\u0131 ba\u011F\u0131ml\u0131 ya da ba\u011F\u0131ms\u0131z olarak ayarla </hmtl>
+OptionPanel.lookandfeel = G\u00F6r\u00FCn\u00FCm Bi\u00E7imi
+OptionPanel.lookandfeel.tooltip = <html>Kullan\u0131lacak G\u00F6r\u00FCn\u00FCm. 'metal','windows','motif', 'gtk' gelebilir, 'mac' sadece MacOS'ta \u00E7al\u0131\u015F\u0131r. E\u011Fer kendi bi\u00E7iminizi koyacaksan\u0131z bi\u00E7im dosyas\u0131n\u0131n ad\u0131n\u0131 yaz\u0131n ve ilgili jar dosyalar\u0131 y\u00FCklenir. G\u00F6r\u00FCn\u00FCmde sorunlar varsa buraya 'nothing' yaz\u0131n. Appletlerde i\u015Fe yarar</html>
+OptionPanel.lt = Lt
+OptionPanel.max_node_width = Mak D\u00FC\u011F\u00FCm Geni\u015Fli\u011Fi
+OptionPanel.max_node_width.tooltip = <html>Piksel cinsinden maksimum d\u00FC\u011F\u00FCm geni\u015Fli\u011Fi</html>
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Hay\u0131r
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn[translate me]
+OptionPanel.nothing = Hi\u00E7bir \u015Fey
+OptionPanel.number_of_different_files_for_automatic_save = Otokay\u0131t i\u00E7in Kullan\u0131lacak Dosya Miktar\u0131
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html>Haritalar\u0131 kaydedecek farkl\u0131 dosyalar\u0131n miktar\u0131. \u0130lk otomatik kay\u0131t birinci dosyaya yap\u0131l\u0131r ve b\u00F6ylr devam eder. n+1-kay\u0131t 'a gelindi\u011Finde birinci dosyan\u0131n \u00FCzerine yaz\u0131l\u0131r(d\u00F6ng\u00FC)</html>
+OptionPanel.OK = Kaydet
+OptionPanel.pl = Pl
+OptionPanel.placenewbranches = Yeni Dallar Yerle\u015Ftir
+OptionPanel.placenewbranches.tooltip = <html>Yeni kollar\u0131n yerle\u015Fimi. Ge\u00E7erli de\u011Ferler 'first' ve 'last' d\u0131r </html>
+OptionPanel.pt_BR = Pt BR
+OptionPanel.pt_PT = Pt PT
+OptionPanel.relative = Ba\u011F\u0131ml\u0131
+OptionPanel.ru = Ru
+OptionPanel.selection_method = Se\u00E7im Y\u00F6ntemi
+OptionPanel.selection_method.tooltip = <html> bu anahtarla gecikmeli se\u00E7im d\u00FCzenini kapat\u0131p a\u00E7abilirsiniz. Otomatik ayarlard\u0131r. Bunlar auto.properties'e kaydolaca\u011F\u0131 i\u00E7in de\u011Fi\u015Fiklik yapmay\u0131n\u0131z.</html>
+OptionPanel.selection_method_by_click = T\u0131klamayla
+OptionPanel.selection_method_delayed = Gecikmeli
+OptionPanel.selection_method_direct = Do\u011Frudan
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u00D6rnekler
+OptionPanel.separator.anti_alias = D\u00FCzeltme
+OptionPanel.separator.automatic_save = Otomatik Kaydet
+OptionPanel.separator.behaviour = Davran\u0131\u015F
+OptionPanel.separator.browser = Taray\u0131c\u0131
+OptionPanel.separator.CloudControls = Clouds[translate me]
+OptionPanel.separator.commands_for_the_program = Program i\u00E7in komutlar
+OptionPanel.separator.default_colors = Varsay\u0131lan Renkler
+OptionPanel.separator.default_fonts = Varsay\u0131lan Yaz\u0131tipleri
+OptionPanel.separator.default_styles = Varsay\u0131lan Bi\u00E7emler
+OptionPanel.separator.edit_long_node_window = Uzun D\u00FC\u011F\u00FCm Penceresinde D\u00FCzenle
+OptionPanel.separator.files = Dosyalar
+OptionPanel.separator.html_export = HTML Olarak Aktarma
+OptionPanel.separator.hyperlink_types = Ba\u011Flant\u0131 T\u00FCrleri
+OptionPanel.separator.icon_properties = Simgeler
+OptionPanel.separator.initial_map_size = \u0130lk Harita Boyutu
+OptionPanel.separator.key_typing = D\u00FC\u011Fmeye Basma
+OptionPanel.separator.language = Dil
+OptionPanel.separator.look_and_feel = G\u00F6r\u00FCn\u00FCm Bi\u00E7imi
+OptionPanel.separator.new_node_commands = Yeni d\u00FC\u011F\u00FCm komutlar\u0131
+OptionPanel.separator.node_editing_commands = D\u00FC\u011F\u00FCm d\u00FCzenleme komutlar\u0131
+OptionPanel.separator.node_navigation_commands = D\u00FC\u011F\u00FCm gezinme komutlar\u0131
+OptionPanel.separator.other_defaults = Di\u011Fer Varsay\u0131lanlar
+OptionPanel.separator.patterns = \u00D6rnekler
+OptionPanel.separator.save = Kaydet
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = Se\u00E7im Y\u00F6ntemi
+OptionPanel.separator.undo = Geri Al
+OptionPanel.sharp_bezier = Sharp bezier[translate me]
+OptionPanel.sk = Sk[translate me]
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = Standart Arkaplan Rengi
+OptionPanel.standardbackgroundcolor.tooltip = <html>HTML bi\u00E7imiyle varsay\u0131lan akra plan rengi</html>
+OptionPanel.standardcloudcolor = Standart Bulut Rengi
+OptionPanel.standardcloudcolor.tooltip = <html>HTML bi\u00E7imiyle varsay\u0131lan bulut rengi</html>
+OptionPanel.standardcloudestyle = Standart Bulut Bi\u00E7emi
+OptionPanel.standardcloudestyle.tooltip = <html>Varsay\u0131lan bulut bi\u00E7imi. \u015Eu an sadece 'bezier' gelebilir</html>
+OptionPanel.standardlinkcolor = Standart Ba\u011Flant\u0131 Rengi
+OptionPanel.standardlinkcolor.tooltip = <html>HTML bi\u00E7imiyle varsay\u0131lan ba\u011Flant\u0131 rengi </html>
+OptionPanel.standardlinkestyle = Standart Ba\u011Flant\u0131 Bi\u00E7emi
+OptionPanel.standardlinkestyle.tooltip = <html>Varsay\u0131lan ba\u011Flant\u0131 bi\u00E7imi. \u015Eu an sadece 'bezier' gelebilir</html>
+OptionPanel.standardselectednodecolor = Standart Se\u00E7ili D\u00FC\u011F\u00FCm Rengi
+OptionPanel.standardselectednodecolor.tooltip = <html>Se\u00E7iliyse standart d\u00FC\u011F\u00FCm rengi. HTML tarz\u0131nda (#KKYYMM gibi hex de\u011Ferler) </html>
+OptionPanel.sv = Se[translate me]
+OptionPanel.time_for_automatic_save = Otokay\u0131t S\u00FCresi
+OptionPanel.time_for_automatic_save.tooltip = <html>milisaniye olarak iki otomatik kay\u0131t aras\u0131nda ge\u00E7en s\u00FCre: Otomatik kay\u0131t\u0131 iptal etmek i\u00E7in buraya 2000000000 yaz\u0131n.</html>
+OptionPanel.time_for_delayed_selection = Gecikmeli Se\u00E7im i\u00E7in S\u00FCre
+OptionPanel.time_for_delayed_selection.tooltip = <html> Fare \u00FCzerine geldi\u011Finde d\u00FC\u011F\u00FCm\u00FCn se\u00E7ilmesi i\u00E7in ge\u00E7ecek s\u00FCre (milisn). Farenin hemen se\u00E7mesi i\u00E7in bunu 1 yap\u0131n.</html>
+OptionPanel.tr = Tr[translate me]
+OptionPanel.uk_UA = Uk UA[translate me]
+OptionPanel.undefined_font = Undefined font[translate me]
+OptionPanel.undo_levels = Geri Alma Seviyeleri
+OptionPanel.undo_levels.tooltip = <html>"Geri Al" komutunun ne kadar geri alabilece\u011Fini belirler.</html>
+OptionPanel.vi = Vi[translate me]
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = Sayfa D\u00FCzeni...
+PasteAction.text = Yap\u0131\u015Ft\u0131r
+PatternToString.color = Color[translate me]
+PatternToString.EdgeStyle = S\u0131n\u0131r Bi\u00E7emi
+PatternToString.EdgeWidth = S\u0131n\u0131r Geni\u015Fli\u011Fi
+PatternToString.FontBold = Koyu
+PatternToString.Icon = Icon[translate me]
+plugins/TimeList.xml_Created = Olu\u015Fturma
+plugins/TimeList.xml_Date = Tarih
+plugins/TimeList.xml_Icons = Simgeler
+plugins/TimeList.xml_Modified = De\u011Fi\u015Ftirme
+plugins/TimeList.xml_Text = Yaz\u0131
+plugins/TimeManagement.xml_appendButton = Se\u00E7ili D\u00FC\u011F\u00FCmlere Tarihi Ekle
+plugins/TimeManagement.xml_Cancel = \u0130ptal
+plugins/TimeManagement.xml_cancelButton = \u0130ptal
+plugins/TimeManagement.xml_Goto = Goto[translate me]
+plugins/TimeManagement.xml_hour = Saat:
+plugins/TimeManagement.xml_minute = Dakika:
+plugins/TimeManagement.xml_reminderButton = Bana Bu Zamanda Hat\u0131rlat
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>Bas\u0131ld\u0131\u011F\u0131nda verilen tarihe bir zamanlay\u0131c\u0131 ayarlan\u0131r. Zaman\u0131 gelince yan\u0131p s\u00F6nerek dikkatinizi \u00E7eker.<br> Haritay\u0131 kapat\u0131rsan\u0131z, tekrar a\u00E7t\u0131\u011F\u0131n\u0131zda zamanlay\u0131c\u0131lar yine aktif olacakt\u0131r.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Her d\u00FC\u011F\u00FCm i\u00E7in yaln\u0131zca bir hat\u0131rlat\u0131c\u0131 ayarlanabilir. <br>\u015Eu anki hat\u0131rlat\u0131c\u0131 {0,date} {0,time} zaman\u0131na ayarl\u0131, sizin se\u00E7ti\u011Finiz zaman {1,date} {1,time}. <br><br>D\u00FC\u011F\u00FCm\u00FCn hat\u0131rlatma zaman\u0131n\u0131 de\u011Fi\u015Ftirmek istiyor musunuz (EVET) <br>yoksa eskisi mi kals\u0131n (Hay\u0131r)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Hat\u0131rlat\u0131c\u0131 {0,date} {0,time} zaman\u0131na ayarland\u0131.
+plugins/TimeManagement.xml_removeReminderButton = Hat\u0131rlat\u0131c\u0131y\u0131 Kald\u0131r
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Se\u00E7ili d\u00FC\u011F\u00FCmlerle ilgili t\u00FCm hat\u0131rlat\u0131c\u0131lar\u0131 kald\u0131r.
+plugins/TimeManagement.xml_todayButton = Bug\u00FCn
+plugins/TimeManagement.xml_WindowTitle = Zaman Y\u00F6netimi
+preferences = Se\u00E7enekler
+PrintAction.text = Yazd\u0131r...
+PrintDirectAction.text = Yazd\u0131r
+printing_settings = \u00D6l\u00E7eklendirmeyi Yazd\u0131r
+PropertyAction.text = Se\u00E7enekler ...
+QuitAction.text = \u00C7\u0131k\u0131\u015F
+read_only = Salt Okunur
+RedoAction.text = Yinele
+RedoFilterAction.text = Yinele
+ReminderHookAction.text = Hat\u0131rlat\u0131c\u0131y\u0131 Kald\u0131r
+ReminderHookAction.tooltip = D\u00FC\u011F\u00FCmdeki hat\u0131rlat\u0131c\u0131y\u0131 kald\u0131r\u0131r.
+RemoveAllIconsAction.text = T\u00FCm Simgeleri Kald\u0131r
+RemoveIconAction.text = Son Simgeyi Kald\u0131r
+rename = Rename[translate me]
+repair_link = Ba\u011Flant\u0131y\u0131 tamir et
+repair_link_question = Ba\u011Flant\u0131l\u0131 harita y\u00FCklenemedi. Ba\u011Flant\u0131 elle d\u00FCzenlensin mi?
+ResetNodeLocationAction.text = Durumu S\u0131f\u0131rla
+save_failed = {0} kaydedilemedi.
+save_unsaved = Zihin haritas\u0131n\u0131 kaydet? :
+SaveAction.text = Kaydet
+SaveAsAction.text = Farkl\u0131 Kaydet
+saved = Kaydedildi
+scheme_evaluate = De\u011Ferlendir!
+select_favorites_folder = Yerimlerinizin bulundu\u011Fu dizini se\u00E7in
+select_folder_for_importing = Aktar\u0131lacak dizini se\u00E7in
+SelectAllAction.text = T\u00FCm G\u00F6r\u00FCn\u00FCrleri Se\u00E7
+SelectBranchAction.text = G\u00F6r\u00FCn\u00FCr Dal\u0131 Se\u00E7
+selection_method_by_click = Se\u00E7mek i\u00E7in t\u0131klay\u0131n
+selection_method_delayed = Gecikmeli Otomatik Se\u00E7im
+selection_method_direct = Se\u00E7ilecek nokta
+SetImageByFileChooserAction.text = Resmi Se\u00E7in (Dosya Se\u00E7ici veya Ba\u011Flant\u0131)
+SetLinkByFileChooserAction.text = Ba\u011F Olu\u015Ftur (Dosya se\u00E7ici)
+SetLinkByTextFieldAction.text = Ba\u011F Olu\u015Ftur (Metin alan\u0131)
+simplyhtml.alignLabel = Alignment\:[translate me]
+simplyhtml.appendTableColLabel = Append col[translate me]
+simplyhtml.borderColorLabel = Color\:[translate me]
+simplyhtml.borderWidthLabel = Geni\u015Flik
+simplyhtml.cancelBtnName = \u0130ptal
+simplyhtml.cellMarginTabLabel = Margin[translate me]
+simplyhtml.colorLabel = Color[translate me]
+simplyhtml.copyLabel = Kopyala
+simplyhtml.cutLabel = Kes
+simplyhtml.defaultDocName = Untitled[translate me]
+simplyhtml.fontBoldLabel = Koyu
+simplyhtml.fontItalicLabel = Yat\u0131k
+simplyhtml.fontTabLabel = Yaz\u0131tipi
+simplyhtml.fontUnderlineLabel = Alt\u0131n\u0131 \u00C7iz
+simplyhtml.foregroundLabel = Foreground\:[translate me]
+simplyhtml.formatLabel = Format[translate me]
+simplyhtml.helpLabel = Yard\u0131m
+simplyhtml.listIndentTitle = Indent\:[translate me]
+simplyhtml.okBtnName = Tamam
+simplyhtml.pasteLabel = Yap\u0131\u015Ft\u0131r
+simplyhtml.redoLabel = Yinele
+simplyhtml.redoTip = redo[translate me]
+simplyhtml.replaceNo = Hay\u0131r
+simplyhtml.replaceYes = Evet
+simplyhtml.styleLabel = Bi\u00E7em
+simplyhtml.textIndentLabel = Indent\:[translate me]
+simplyhtml.uLineLabel = Alt\u0131n\u0131 \u00C7iz
+simplyhtml.undoLabel = Geri Al
+simplyhtml.valignBaseline = baseline[translate me]
+simplyhtml.valignLabel = Vert. Alignment\:[translate me]
+split = B\u00F6l
+style = Bi\u00E7em
+svg = SVG[translate me]
+TimeListAction.text = Zamanlay\u0131c\u0131 Listesini G\u00F6ster ...
+TimeListAction.tooltip = T\u00FCm zamanlanm\u0131\u015F g\u00F6revleri ve ilgili d\u00FC\u011F\u00FCmleri g\u00F6sterir.
+TimeManagementAction.text = Takvimi G\u00F6ster...
+TimeManagementAction.tooltip = <html>Kai Toedter'in yapt\u0131\u011F\u0131 takvim mod\u00FCl\u00FCn\u00FC g\u00F6sterir.</html>
+ToggleChildrenFoldedAction.text = \u00C7ocuklar\u0131 Geni\u015Flet/Daralt
+ToggleFBarAction.text = F-Bar[translate me]
+ToggleFoldedAction.text = Daralt
+ToggleLeftToolbarAction.text = Sol Ara\u00E7 \u00C7ubu\u011Fu
+ToggleMenubarAction.text = Men\u00FC \u00C7ubu\u011Fu
+ToggleToolbarAction.text = Ara\u00E7 \u00C7ubu\u011Fu
+undefined_error = Beklenmeyen bir hata olu\u015Ftu. L\u00FCtfen hatay\u0131 bildirmeye \u00E7al\u0131\u015F\u0131n.
+underline = Alt\u0131n\u0131 \u00C7iz
+underlined = Alt\u0131 \u00C7izili
+UndoAction.text = Geri Al
+UndoFilterAction.text = Geri Al
+unfold = Geni\u015Flet
+UnfoldAllAction.text = T\u00FCm\u00FCn\u00FC Geni\u015Flet
+UnfoldAllAction.tooltip = <html>Se\u00E7ili d\u00FC\u011F\u00FCmleri ve \u00E7ocuklar\u0131n\u0131 geni\u015Fletir.</html>
+UnfoldOneLevelAction.text = Bir Seviye Geni\u015Flet
+UnfoldOneLevelAction.tooltip = <html>Se\u00E7ili d\u00FC\u011F\u00FCmleri bir seviye geni\u015Fletir.</html>
+url_error = Bozuk URL!
+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):
+width = Geni\u015Flik
+yes = Evet
+ZoomInAction.text = Yakla\u015F
+ZoomOutAction.text = Uzakla\u015F
diff --git a/freeplane/resources/translations/Resources_uk_UA.properties b/freeplane/resources/translations/Resources_uk_UA.properties
new file mode 100644
index 0000000..2d43935
--- /dev/null
+++ b/freeplane/resources/translations/Resources_uk_UA.properties
@@ -0,0 +1,522 @@
+AboutAction.text = \u041F\u0440\u043E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443...
+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_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_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 \u043C\u043E\u0436\u0435\u0442\u0435 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0442\u0430\u043A\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u0447\u0435\u0440\u0435\u0437 \u043C\u0435\u043D\u044E "\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E"
+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/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)...
+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
+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
+as_parent = \u042F\u043A \u0443 \u0431\u0430\u0442\u044C\u043A\u0430
+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
+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>
+BackAction.text = \u041D\u0430\u0437\u0430\u0434
+background = \u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443
+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\u043B\u0456\u0432 \u0456 <strong> \u0432\u0438\u043A\u043B\u044E\u0447\u0430\u0454 \u0431\u0443\u0434\u044C-\u044F\u043A\u0435 \u0456\u043D\u0448\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0430\u043A\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432 </strong></html>
+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
+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.
+CenterAction.text = \u0426\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438
+ChangeConnectorArrowsAction.backward.text = \u041D\u0430\u0437\u0430\u0434
+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
+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 ...
+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]
+CopyAction.text = \u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+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
+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>
+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
+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
+DocumentationAction.text = \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0456\u044F
+edge = \u041B\u0456\u043D\u0456\u044F
+edge_style = \u0422\u0438\u043F \u043B\u0456\u043D\u0456\u0457
+edge_width = \u0422\u043E\u0432\u0449\u0438\u043D\u0430
+EdgeColorAction.text = \u041A\u043E\u043B\u0456\u0440 \u043B\u0456\u043D\u0456\u0457...
+EdgeStyleAction.bezier.text = \u041A\u0440\u0438\u0432\u0430
+EdgeStyleAction.linear.text = \u041F\u0440\u044F\u043C\u0430
+EdgeStyleAction.sharp_bezier.text = \u0417\u0430\u0433\u043E\u0441\u0442\u0440\u0435\u043D\u0430 \u043A\u0440\u0438\u0432\u0430
+EdgeStyleAction.sharp_linear.text = \u0417\u0430\u0433\u043E\u0441\u0442\u0440\u0435\u043D\u0430 \u043F\u0440\u044F\u043C\u0430
+EdgeStyleAsParentAction.text = \u042F\u043A \u0443 \u0431\u0430\u0442\u044C\u043A\u0430
+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_link_manually = \u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0443\u0440\u0443\u0447\u043D\u0443...
+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...
+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
+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.
+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
+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
+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...
+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...
+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]
+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>
+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
+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>
+ForwardAction.text = \u0412\u043F\u0435\u0440\u0435\u0434
+freeplane_reverted = Freeplane_Reverted_[translate me]
+FreeplaneHelpStarter.text = \u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430 ...
+FreeplaneHelpStarter.tooltip = \u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430...
+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
+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
+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
+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]
+icon_attach = \u0417\u0432\u0435\u0440\u043D\u0438 \u0443\u0432\u0430\u0433\u0443
+icon_back = \u041D\u0430\u0437\u0430\u0434
+icon_bee = Freeplane[translate me]
+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_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_clanbomber = \u041D\u0435\u0431\u0435\u0437\u043F\u0435\u0447\u043D\u043E
+icon_closed = No Entry[translate me]
+icon_decrypted = Unlocked[translate me]
+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_forward = \u0412\u043F\u0435\u0440\u0435\u0434
+icon_freemind_butterfly = FreeMind[translate me]
+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
+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_gohome = \u0414\u043E\u0434\u043E\u043C\u0443
+icon_help = \u041F\u0438\u0442\u0430\u043D\u043D\u044F
+icon_hourglass = Waiting[translate me]
+icon_idea = \u0406\u0434\u0435\u044F
+icon_kaddressbook = \u0422\u0435\u043B\u0435\u0444\u043E\u043D
+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_licq = \u0424\u0430\u0439\u043D\u0435\u043D\u044C\u043A\u043E
+icon_Mail = \u041F\u043E\u0448\u0442\u0430
+icon_male1 = Male1[translate me]
+icon_male2 = Male2[translate me]
+icon_menu = \u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+icon_messagebox_warning = \u0412\u0430\u0436\u043B\u0438\u0432\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_stop = \u0421\u0442\u043E\u043F
+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]
+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...
+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
+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
+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?
+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?
+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_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_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
+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
+mindmap = \u0410\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
+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]
+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_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]
+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
+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_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
+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
+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
+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_previous_find = \u0420\u0430\u043D\u0456\u0448\u0438\u0445 \u0437\u0431\u0456\u0433\u0456\u0432 \u043D\u0435\u043C\u0430\u0454.
+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
+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
+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"
+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
+normal = \u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439
+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
+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]
+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.
+OptionPanel.absolute = \u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u043E
+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_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.as_parent = \u042F\u043A \u0431\u0430\u0442\u044C\u043A\u043E
+OptionPanel.automatic = \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E
+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.combined = \u041A\u043E\u043C\u0431\u0456\u043D\u043E\u0432\u0430\u043D\u043E
+OptionPanel.cs = Cs
+OptionPanel.da = Dk
+OptionPanel.de = De
+OptionPanel.default = \u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442
+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
+OptionPanel.default_browser_command_other_os.tooltip = <html> \u042F\u043A \u043F\u0440\u0430\u0432\u0438\u043B\u043E Linux: </html>
+OptionPanel.default_browser_command_windows_9x = \u041D\u0430\u0432\u0456\u0433\u0430\u0442\u043E\u0440 \u0434\u043B\u044F Windows 9x
+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.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.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\u0435\u043D\u043D\u0456 \u0440\u043E\u0431\u043E\u0442\u0438 \u0437 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E </html>
+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.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.Environment = \u041E\u0442\u043E\u0447\u0435\u043D\u043D\u044F
+OptionPanel.es = Es
+OptionPanel.et = Et[translate me]
+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.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\u0437\u0430\u043D\u0456 </html>
+OptionPanel.Files = \u0424\u0430\u0439\u043B\u0438
+OptionPanel.first = \u041F\u0435\u0440\u0448\u0438\u0439
+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.gtk = Gtk
+OptionPanel.hr = Hr[translate me]
+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_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.Keystrokes = \u041A\u043B\u0430\u0432\u0456\u0448\u0456
+OptionPanel.ko = Kr
+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.linear = \u041F\u0440\u044F\u043C\u0430
+OptionPanel.links = \u0417\u0432'\u044F\u0437\u043A\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.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.metal = \u041C\u0435\u0442\u0430\u043B
+OptionPanel.motif = Motif
+OptionPanel.nb = Nb
+OptionPanel.nl = Nl
+OptionPanel.nn = Nn[translate me]
+OptionPanel.nothing = \u041D\u0456\u0447\u043E\u0433\u043E
+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\u044C\u0441\u044F. </html>
+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.relative = \u0412\u0456\u0434\u043D\u043E\u0441\u043D\u043E
+OptionPanel.ru = Ru
+OptionPanel.scrollbar_increment = Speed[translate me]
+OptionPanel.selection_method = \u041C\u0435\u0442\u043E\u0434 \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u0443\u0437\u043B\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.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.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.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.files = \u0424\u0430\u0439\u043B\u0438
+OptionPanel.separator.html_export = \u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E 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.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.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.look_and_feel = \u041F\u0440\u0438\u043A\u0438\u0434
+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.other_defaults = \u0406\u043D\u0448\u0456 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0438
+OptionPanel.separator.patterns = \u0417\u0440\u0430\u0437\u043E\u043A
+OptionPanel.separator.save = \u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438
+OptionPanel.separator.scrollbar = Scrollbar[translate me]
+OptionPanel.separator.selection_method = \u041C\u0435\u0442\u043E\u0434 \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.sl = Sl
+OptionPanel.standardbackgroundcolor = \u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443
+OptionPanel.standardcloudcolor = \u041A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440
+OptionPanel.standardcloudestyle = \u0422\u0438\u043F \u0445\u043C\u0430\u0440
+OptionPanel.standardlinkcolor = \u041A\u043E\u043B\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C
+OptionPanel.standardlinkestyle = \u0422\u0438\u043F \u0437\u0432'\u044F\u0437\u043E\u043A
+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.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\u0435 \u0432\u0435\u043B\u0438\u043A\u0435 \u0447\u0438\u0441\u043B\u043E \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0430\u0454 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0456 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F. </html>
+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.windows = Windows
+OptionPanel.zh_CN = Zh CN
+OptionPanel.zh_TW = Zh
+PageAction.text = \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438...
+PasteAction.text = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438
+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]
+plugins/TimeList.xml_Created = \u0421\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u0439
+plugins/TimeList.xml_Date = \u0414\u0430\u0442\u0430
+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_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_hour = \u0413\u043E\u0434\u0438\u043D\u0430:
+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\u0430 \u0431\u0443\u0434\u0435 \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u0430.<br> \u041F\u0440\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u043C\u0443 \u0441\u0442\u0430\u0440\u0442\u0456 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438, \u0442\u0430\u0439\u043C\u0435\u0440 \u0431\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439 \u0437\u043D\u043E\u0432\u0443. </html>
+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\u0456\u043D\u0438\u0442\u0438 \u0434\u0430\u0442\u0443 (\u0422\u0410\u041A), <br> \u0430\u0431\u043E \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043A\u043E\u043B\u0438\u0448\u043D\u044E \u0434\u0430\u0442\u0443 (\u041D\u0406)? </html>
+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_todayButton = \u0421\u044C\u043E\u0433\u043E\u0434\u043D\u0456
+plugins/TimeManagement.xml_WindowTitle = \u0427\u0430\u0441
+preferences = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
+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
+PropertyAction.text = \u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ...
+QuitAction.text = \u0412\u0438\u0439\u0442\u0438
+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
+RemoveAllIconsAction.text = \u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0443\u0441\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+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?
+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...
+saved = \u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E
+scheme_evaluate = \u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438!
+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_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
+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)
+simplyhtml.borderWidthLabel = \u0422\u043E\u0432\u0449\u0438\u043D\u0430
+simplyhtml.cancelBtnName = \u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
+simplyhtml.copyLabel = \u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+simplyhtml.cutLabel = \u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438
+simplyhtml.fontBoldLabel = \u0416\u0438\u0440\u043D\u043E
+simplyhtml.fontItalicLabel = \u041A\u0443\u0440\u0441\u0438\u0432
+simplyhtml.fontTabLabel = \u0428\u0440\u0438\u0444\u0442
+simplyhtml.fontUnderlineLabel = \u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+simplyhtml.helpLabel = \u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430
+simplyhtml.okBtnName = \u0413\u0430\u0440\u0430\u0437\u0434
+simplyhtml.pasteLabel = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438
+simplyhtml.previewLabel = Preview[translate me]
+simplyhtml.redoLabel = \u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438
+simplyhtml.replaceNo = \u041D\u0456
+simplyhtml.replaceYes = \u0422\u0430\u043A
+simplyhtml.styleLabel = \u0421\u0442\u0438\u043B\u044C
+simplyhtml.uLineLabel = \u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+split = \u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438
+style = \u0421\u0442\u0438\u043B\u044C
+svg = SVG[translate me]
+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
+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
+underline = \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..
+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_zoom = \u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u0434\u0440\u0443\u043A\u0443 (0.0 - 2.0):
+width = \u0422\u043E\u0432\u0449\u0438\u043D\u0430
+yes = \u0422\u0430\u043A
+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
new file mode 100644
index 0000000..d56f72d
--- /dev/null
+++ b/freeplane/resources/translations/Resources_zh_CN.properties
@@ -0,0 +1,1763 @@
+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
+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
+accessories/plugins/EncryptNode.properties_1 = \u5BC6\u7801\u9519\u8BEF\u6216\u5BC6\u7801\u592A\u77ED.
+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_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_Applet.text = \u5BFC\u51FA\u4E3A Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = \u5BFC\u51FA\u56FE\u4E3Ajava\u6D4F\u89C8\u5668applet
+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_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.groovy.script.name = \u811a\u672c\u540d{0}\u6ca1\u6709\u4ee5 ".groovy"\u7ed3\u5c3e
+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><em>\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</em></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)
+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)...
+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
+as_parent = \u540C\u7236\u8282\u70B9
+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_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
+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_attribute = \u5C5E\u6027
+attributes_close = \u5173\u95ED
+attributes_deselect_all = \u5168\u90E8\u4E0D\u9009
+attributes_dialog_title = \u5C5E\u6027\u7BA1\u7406\u5668
+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_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
+attributes_popup_down = \u4E0B
+attributes_popup_edit = \u7F16\u8F91
+attributes_popup_hide = \u9690\u85CF
+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_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
+attributes_select_all = \u5168\u9009
+attributes_select_all_tooltip = \u9009\u62E9 / \u53D6\u6D88\u9009\u62E9\u6240\u6709
+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_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}
+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
+AutomaticLayoutControllerAction.null.text = \u7981\u7528
+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
+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
+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_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
+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_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)
+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
+ColorProperty.ResetColor = \u91CD\u8BBE\u989C\u8272
+combined = \u7EC4\u5408
+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-2012 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
+CreateDisjunctConditionAction.text = \u6216
+CreateNotSatisfiedConditionAction.text = \u975e
+CreationModificationPluginAction.text = \u663e\u793a\u4fee\u6539\u65f6\u95f4(&M)
+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)
+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
+delete = \u5220\u9664(&D)
+delete_child = \u5220\u9664\u8282\u70b9
+DeleteAction.text = \u5220\u9664\u8282\u70b9\u52a8\u4f5c
+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
+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}
+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_style = \u8FDE\u7EBF\u98CE\u683C
+edge_width = \u8FDE\u7EBF\u5BBD\u5EA6
+EdgeColorAction.text = \u8FDE\u7EBF\u989C\u8272...
+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.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.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>
+EdgeStyleAction.sharp_bezier.text = \u6E10\u7A84\u8D1D\u585E\u5C14\u66F2\u7EBF
+EdgeStyleAction.sharp_bezier.tooltip = <html>Display the edge as a smooth curve with sharpened ends.</html>
+EdgeStyleAction.sharp_linear.text = \u6E10\u7A84\u76F4\u7EBF
+EdgeStyleAction.sharp_linear.tooltip = <html>Display the edge as a straight line with sharpened ends.</html>
+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.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_end_label = <html>Connector<br>label
+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_middle_label = <html>Middle<br>label
+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
+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
+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 ...
+EncryptedMap.tooltip = \u521B\u5EFA\u52A0\u5BC6\u56FE
+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)
+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
+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...
+ExportToHTMLAction.text = \u5BFC\u51FA\u4E3AHTML
+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_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>
+FaqOpenURLAction.text = FAQ
+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
+filter_conditions = \u8FC7\u6EE4\u5668
+filter_contains = \u5305\u542B
+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_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_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_no_filtering = \u4E0D\u8FC7\u6EE4
+filter_node = \u8282\u70B9\u6587\u672C
+filter_node_level = \u8282\u70b9\u5c42\u6b21
+filter_not = \u975E
+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_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
+find_what = \u67E5\u627E
+FindAction.text = \u67E5\u627E ...
+FirstGroupNodeAction.text = \u8bbe\u5b9a/\u53d6\u6d88 \u7fa4\u7ec4\u5f00\u59cb\u8282\u70b9
+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
+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:
+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_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
+ForwardAction.tooltip = \u5728\u9009\u4E2D\u7684\u94FE\u4E2D\u524D\u8DF3
+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...
+Freeplane.progress.endStartup = \u542F\u52A8\u5B8C\u6210.
+Freeplane.progress.gettingPreferenceDirectories = \u83B7\u53D6\u9996\u9009\u76EE\u5F55...
+Freeplane.progress.gettingPreferences = \u83B7\u53D6\u9996\u9009\u9879...
+Freeplane.progress.loadMaps = \u52A0\u8F7D\u5BFC\u56FE...
+Freeplane.progress.propagateLookAndFeel = \u4F20\u64AD\u5916\u89C2...
+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...
+GrabKeyDialog.common.cancel = \u53D6\u6D88
+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>
+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
+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
+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}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = \u52a0
+icon_attach = \u6709\u9644\u4EF6
+icon_audio = \u97f3\u9891
+icon_back = \u540e\u9000
+icon_bee = Freeplane
+icon_bell = \u8bb0\u4f4f
+icon_bookmark = \u6781\u597D
+icon_broken-line = \u65AD\u5F00
+icon_button_cancel = \u53d6\u6d88
+icon_button_ok = OK
+icon_calendar = \u65E5\u671F
+icon_checked = \u9009\u62e9
+icon_clanbomber = \u5371\u9669
+icon_clock = \u65F6\u95F4
+icon_clock2 = \u63d0\u9192
+icon_closed = \u7981\u5165
+icon_decrypted = \u89E3\u5BC6
+icon_desktop_new = \u5907\u5FD8
+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_female1 = \u5973\u60271
+icon_female2 = \u5973\u60272
+icon_females = \u5973\u6027
+icon_flag = \u7EA2\u65D7
+icon_flag-black = \u9ED1\u65D7
+icon_flag-blue = \u84DD\u65D7
+icon_flag-green = \u7EFF\u65D7
+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_freemind_butterfly = FreeMind
+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
+icon_full-4 = \u4F18\u5148\u7EA7 4
+icon_full-5 = \u4F18\u5148\u7EA7 5
+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_gohome = \u5BB6
+icon_group = \u7ec4
+icon_help = \u95EE\u9898
+icon_hourglass = \u7B49\u5F85
+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_kaddressbook = \u7535\u8BDD
+icon_kmail = \u7535\u90AE
+icon_knotify = \u97F3\u4E50
+icon_korn = \u90AE\u7BB1
+icon_ksmiletris = \u9AD8\u5174
+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_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_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_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_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_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.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)...
+ImportMindmanagerFiles.text = MindManager X5 \u5BFC\u56FE...
+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
+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
+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 License for more details.<br><br>You should have received a copy of the GNU General Public License<br>along with this program; if not, write to the Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+link_error = \u9519\u8bef\u8fde\u63a5\u201c{0}\u201d\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
+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
+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
+map_already_exists = \u601D\u7EF4\u5BFC\u56FE\u5DF2\u5B58\u5728\uFF0C\u8981\u8986\u76D6\u5417?
+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_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
+mindmap = \u601D\u7EF4\u5BFC\u56FE
+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
+mode_na = \u6A21\u5F0F\u4E0D\u53EF\u7528
+mode_status = \u6a21\u5f0f\u6539\u53d8\u4e3a{0}
+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)
+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...)
+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}''
+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
+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_previous_find = \u524D\u8FB9\u6CA1\u6709\u4E86.
+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_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
+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
+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
+NodeUpAction.text = \u4E0A\u79FB
+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...
+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
+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).
+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.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.ar = \u963F\u6839\u5EF7\u8BED
+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.Behaviour = \u884C\u4E3A
+OptionPanel.bezier = \u8D1D\u585E\u5C14\u66F2\u7EBF
+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.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.combined = \u7EC4\u5408
+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.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.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_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
+OptionPanel.default_browser_command_other_os.tooltip = <html> \u5178\u578B\u7684\u662FLinux:</html>
+OptionPanel.default_browser_command_windows_9x = Windows 9x\u9ED8\u8BA4\u6D4F\u89C8\u5668\u547D\u4EE4
+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.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>
+OptionPanel.delete_nodes_without_question = \u65E0\u9700\u786E\u8BA4\u5373\u5220\u9664\u8282\u70B9?
+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.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.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
+OptionPanel.el__min_default_window_height = \u9ED8\u8BA4\u7A97\u53E3\u6700\u5C0F\u9AD8\u5EA6
+OptionPanel.el__min_default_window_width = \u9ED8\u8BA4\u7A97\u53E3\u6700\u5C0F\u5BBD\u5EA6
+OptionPanel.el__position_window_below_node = \u8282\u70B9\u4E0B\u4F4D\u7F6E\u7A97\u53E3
+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.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>
+OptionPanel.execute_scripts_without_file_restriction = \u5141\u8BB8\u6587\u4EF6\u64CD\u4F5C(\u4E0D\u63A8\u8350)
+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.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.Files = \u6587\u4EF6
+OptionPanel.first = \u5F00\u59CB
+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.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.gtk = Gtk
+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
+OptionPanel.html_export_fold_all = \u6298\u53E0\u5168\u90E8
+OptionPanel.html_export_fold_currently_folded = \u4FDD\u6301\u6298\u53E0
+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_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.image_cache = for images
+OptionPanel.it = \u610F\u5927\u5229\u8BED
+OptionPanel.ja = \u65E5\u8BED
+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_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 = \u201C\u6700\u8FD1\u7684\u6587\u4EF6\u201D\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.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_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.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\u6837\u9002\u7528</html>
+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_node_width = \u8282\u70B9\u6700\u5927\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.motif = Motif
+OptionPanel.nb = \u632A\u5A01\u8BED(\u4F2F\u514B\u6885\u5C14)
+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.nodecolor = \u8282\u70B9\u989C\u8272
+OptionPanel.nodecolor.tooltip = \u672A\u9009\u4E2D\u8282\u70B9\u7684\u524D\u666F\u989C\u8272
+OptionPanel.nodefontbold = \u7C97\u4F53
+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></tr><tr><td>\u7EC4\u5408: </td><td>\u5F53\u8282\u70B9\u6298\u53E0\u65F6\u4F7F\u7528\u6C14\u6CE1\u6846\uFF0C\u5C55\u5F00\u65F6\u4F7F\u7528\u53C9\u5F62.</td></tr></table></html>
+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.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_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.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.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.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.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.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\u7c7b\u522b\u8def\u5f84\uff0c!</html>\u5982\u679c\u4f60\u8bbe\u5b9a\u7c7b\u522b\u8def\u5f84, \u4f60\u4e5f\u5fc5\u987b\u5141\u8bb8\u8bfb\u53d6!
+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.scrolling_speed = Automatic map scrolling speed
+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
+OptionPanel.selection_method_delayed = \u5EF6\u8FDF
+OptionPanel.selection_method_direct = \u76F4\u63A5
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u6A21\u5F0F
+OptionPanel.separator.anti_alias = \u5E73\u6ED1
+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.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.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.files = \u6587\u4EF6
+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.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.key_typing = \u6309\u952E
+OptionPanel.separator.language = \u8BED\u8A00
+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
+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.notifications = \u786E\u8BA4
+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.patterns = \u6A21\u5F0F
+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.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.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.sharp_bezier = \u6E10\u7A84\u8D1D\u585E\u5C14\u66F2\u7EBF
+OptionPanel.sharp_linear = \u6E10\u7A84\u76F4\u7EBF
+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.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.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
+OptionPanel.standardcloudcolor.tooltip = <html> html \u7B26\u53F7\u8868\u793A\u6807\u51C6\u4E91\u6846\u989C\u8272 </html>
+OptionPanel.standardcloudestyle = \u6807\u51C6\u4E91\u6846\u98CE\u683C
+OptionPanel.standardcloudestyle.tooltip = <html>\u6807\u51C6\u4E91\u6846\u98CE\u683C. \u5F53\u524D\u53EA\u652F\u6301 'bezier'</html>
+OptionPanel.standarddrawrectangleforselection = \u4E3A\u6240\u9009\u8282\u70B9\u8BBE\u7F6E\u6CE1\u6846
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>\u7ED9\u6240\u9009\u8282\u70B9\u52A0\u4E0A\u6CE1\u6846.</html>
+OptionPanel.standardlinkcolor = \u6807\u51C6\u94FE\u63A5\u989C\u8272
+OptionPanel.standardlinkcolor.tooltip = <html>html \u7B26\u53F7\u8868\u793A\u6807\u51C6\u94FE\u63A5\u989C\u8272</html>
+OptionPanel.standardlinkestyle = \u6807\u51C6\u94FE\u63A5\u98CE\u683C
+OptionPanel.standardlinkestyle.tooltip = <html>\u6807\u51C6\u94FE\u63A5\u98CE\u683C. \u5F53\u524D\u53EA\u652F\u6301 'bezier'</html>
+OptionPanel.standardselectednodecolor = \u6807\u51C6\u8282\u70B9\u9009\u4E2D\u989C\u8272
+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.summary = \u6458\u8981
+OptionPanel.sv = \u745E\u5178\u8BED
+OptionPanel.text.use_ctrl_key = \u4ece\u5de5\u5177\u83dc\u5355\u4e2d\u4f7f\u7528\u2018\u6307\u5b9a\u5feb\u6377\u65b9\u5f0f\u2019
+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.tr = \u571F\u8033\u5176\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\u201C\u64A4\u9500\u201D\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.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.wheel_velocity = \u901F\u5EA6
+OptionPanel.wheel_velocity.tooltip = \u503C\u8D8A\u5927\u8F6C\u52A8\u6EDA\u8F6E\u65F6\u56FE\u6EDA\u52A8\u7684\u8D8A\u5FEB.
+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\u518d\u73b0\u9519\u8bef\u3002\n\n\u6309\u786e\u5b9a\u6309\u94ae\u5728web\u6d4f\u89c8\u5668\u4e2d\u6253\u5f00\u9519\u8bef\u8ddf\u8e2a\u9875\u3002\n\n\u8c22\u8c22\u4f60\u5bf9\u7f3a\u9677\u4fee\u590d\u7684\u5e2e\u52a9\u3002\nFreeplane\u5c0f\u7ec4
+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
+PasteAction.text = \u7C98\u8D34
+PasteAttributes.text = \u7c98\u8d34\u5c5e\u6027
+PatternNewNameProperty = \u65B0\u6A21\u5F0F
+PatternToString.backgroundColor = \u80CC\u666F\u989C\u8272
+PatternToString.Child = \u5B50\u8282\u70B9\u6837\u5F0F
+PatternToString.color = \u989C\u8272
+PatternToString.EdgeColor = \u8FDE\u7EBF\u989C\u8272
+PatternToString.EdgeStyle = \u8FDE\u7EBF\u98CE\u683C
+PatternToString.EdgeWidth = \u8FDE\u7EBF\u5BBD\u5EA6
+PatternToString.FontBold = \u7C97\u4F53
+PatternToString.FontItalic = \u659C\u4F53
+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.MONTH = \u6708
+PeriodUnit.WEEK = \u5468
+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/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.
+plugins/ScriptEditor.menu_actions = \u52A8\u4F5C(&A)
+plugins/ScriptEditor.new_script = \u65B0\u811A\u672C
+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/TimeList.xml_Created = \u521B\u5EFA
+plugins/TimeList.xml_Date = \u65E5\u671F
+plugins/TimeList.xml_Icons = \u56FE\u6807
+plugins/TimeList.xml_Modified = \u4FEE\u6539
+plugins/TimeList.xml_Notes = \u6CE8\u89E3
+plugins/TimeList.xml_Text = \u6587\u672C
+plugins/TimeManagement.xml_appendButton = \u5728\u6240\u9009\u8282\u70B9\u8FFD\u52A0\u65E5\u671F
+plugins/TimeManagement.xml_Cancel = \u53D6\u6D88
+plugins/TimeManagement.xml_cancelButton = \u53D6\u6D88
+plugins/TimeManagement.xml_closeButton = \u5173\u95ED
+plugins/TimeManagement.xml_Export = \u5BFC\u51FA\u9009\u4E2D\u7684\u8282\u70B9
+plugins/TimeManagement.xml_Find = \u67E5\u627E
+plugins/TimeManagement.xml_Goto = \u8F6C\u5230
+plugins/TimeManagement.xml_hour = \u65F6:
+plugins/TimeManagement.xml_menu_actions = \u52A8\u4F5C
+plugins/TimeManagement.xml_minute = \u5206:
+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_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
+plugins/TimeManagement.xml_Replace_All = \u5168\u90E8\u66FF\u6362
+plugins/TimeManagement.xml_Replace_Selected = \u66FF\u6362\u9009\u5B9A
+plugins/TimeManagement.xml_Select = \u9009\u62E9
+plugins/TimeManagement.xml_todayButton = \u4ECA\u5929
+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...
+PrintDirectAction.text = \u6253\u5370
+printing_settings = \u6253\u5370\u6BD4\u4F8B
+PrintPreviewAction.text = \u6253\u5370\u9884\u89C8
+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
+read_only = \u53EA\u8BFB
+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
+RedoAction.text = \u91CD\u505A
+RedoFilterAction.text = \u91CD\u505A
+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
+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
+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>
+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
+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)
+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.
+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
+scheme_evaluate = \u8BC4\u4F30!
+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_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
+select_favorites_folder = \u9009\u62E9\u201C\u6536\u85CF\u5939\u201D\u6240\u5728\u7684\u76EE\u5F55
+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
+SelectAllAction.text = \u9009\u62E9\u6240\u6709\u53EF\u89C1\u9879
+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)
+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
+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.
+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
+ShowSelectedAttributesAction.text = \u663E\u793A\u9009\u62E9\u7684\u5C5E\u6027
+ShowSelectionAsRectangleAction.text = \u77E9\u5F62\u9009\u62E9
+simplyhtml.aboutFrameTitle = \u5173\u4E8E\u672C\u7A0B\u5E8F
+simplyhtml.aboutLabel = \u5173\u4E8E SimplyHTML...
+simplyhtml.alignCenter = \u4E2D
+simplyhtml.alignLabel = \u5BF9\u9F50:
+simplyhtml.alignLeft = \u5DE6
+simplyhtml.alignRight = \u53F3
+simplyhtml.allCellsRangeLabel = \u6240\u6709\u5355\u5143\u683C
+simplyhtml.allOccurrencesReplaced = \u5DF2\u5168\u90E8\u66FF\u6362
+simplyhtml.appendTableColLabel = \u9644\u52A0\u5217
+simplyhtml.appendTableRowLabel = \u9644\u52A0\u884C
+simplyhtml.applyCellAttrLabel = \u5E94\u7528\u4E8E
+simplyhtml.backgroundLabel = \u80CC\u666F:
+simplyhtml.boldItalicName = \u7C97\u659C\u4F53
+simplyhtml.boldName = \u7C97\u4F53
+simplyhtml.borderColorLabel = \u989C\u8272:
+simplyhtml.borderWidthLabel = \u5BBD\u5EA6
+simplyhtml.bottomLabel = \u5E95\u90E8:
+simplyhtml.cancelBtnName = \u53D6\u6D88
+simplyhtml.cellBorderTabLabel = \u8FB9\u6846
+simplyhtml.cellGenTabLabel = \u5E38\u89C4
+simplyhtml.cellMarginTabLabel = \u8FB9\u8DDD
+simplyhtml.cellPanelTitle = \u5355\u5143\u683C\u683C\u5F0F
+simplyhtml.clearFormatLabel = \u53BB\u9664\u683C\u5F0F
+simplyhtml.clearFormatTip = \u53BB\u9664\u683C\u5F0F
+simplyhtml.close = \u5173\u95ED
+simplyhtml.closeBtnName = \u5173\u95ED
+simplyhtml.colorLabel = \u989C\u8272
+simplyhtml.copyLabel = \u590D\u5236
+simplyhtml.copyTip = \u590D\u5236
+simplyhtml.cTagNameHead1 = \u6807\u9898 1
+simplyhtml.cTagNameHead2 = \u6807\u9898 2
+simplyhtml.cTagNameHead3 = \u6807\u9898 3
+simplyhtml.cTagNameHead4 = \u6807\u9898 4
+simplyhtml.cTagNameHead5 = \u6807\u9898 5
+simplyhtml.cTagNameHead6 = \u6807\u9898 6
+simplyhtml.cTagNameLink = \u94FE\u63A5
+simplyhtml.cTagNameOL = \u6709\u5E8F\u5217\u8868
+simplyhtml.cTagNamePara = \u6BB5\u843D
+simplyhtml.cTagNameUL = \u65E0\u5E8F\u5217\u8868
+simplyhtml.cutLabel = \u526A\u5207
+simplyhtml.cutTip = \u526A\u5207
+simplyhtml.defaultDocName = \u65E0\u6807\u9898
+simplyhtml.deleteTableColLabel = \u5220\u9664\u5217
+simplyhtml.deleteTableRowLabel = \u5220\u9664\u884C
+simplyhtml.docTitleQuery = \u8BBE\u7F6E\u6807\u9898\u7ED9:
+simplyhtml.docTitleTitle = \u7F16\u8F91\u6587\u6863\u6807\u9898
+simplyhtml.editLabel = \u7F16\u8F91
+simplyhtml.effectLabel = \u6548\u679C
+simplyhtml.familyLabel = \u5B57\u4F53
+simplyhtml.findNext = \u67E5\u627E\u4E0B\u4E00\u4E2A...
+simplyhtml.findReplaceDialogTitle = \u67E5\u627E\u66FF\u6362
+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.fontDialogTitle = \u5B57\u4F53\u683C\u5F0F
+simplyhtml.fontItalicLabel = \u659C\u4F53
+simplyhtml.fontItalicTip = \u5207\u6362\u659C\u4F53 \u5F00/\u5173
+simplyhtml.fontLabel = \u5B57\u4F53...
+simplyhtml.fontTabLabel = \u5B57\u4F53
+simplyhtml.fontTip = \u5B57\u4F53\u683C\u5F0F...
+simplyhtml.fontUnderlineLabel = \u4E0B\u5212\u7EBF
+simplyhtml.fontUnderlineTip = \u5207\u6362\u4E0B\u5212\u7EBF \u5F00/\u5173
+simplyhtml.foregroundLabel = \u524D\u666F:
+simplyhtml.formatLabel = \u683C\u5F0F
+simplyhtml.formatListLabel = \u5217\u8868...
+simplyhtml.formatListTip = \u6539\u53D8\u5217\u8868\u683C\u5F0F
+simplyhtml.formatParaLabel = \u6BB5\u843D...
+simplyhtml.formatParaTip = \u6539\u53D8\u6BB5\u843D\u683C\u5F0F
+simplyhtml.formatTableLabel = \u8868\u683C...
+simplyhtml.formatTableTip = \u8868\u683C\u683C\u5F0F
+simplyhtml.helpLabel = \u5E2E\u52A9
+simplyhtml.htmlTabTitle = HTML\u4EE3\u7801\u89C6\u56FE
+simplyhtml.imageFileDesc = \u56FE\u50CF\u6587\u4EF6
+simplyhtml.insertTableColLabel = \u63D2\u5165\u5217
+simplyhtml.insertTableLabel = \u8868\u683C...
+simplyhtml.insertTableMsg = \u591A\u5C11\u5217?
+simplyhtml.insertTableRowLabel = \u63D2\u5165\u884C
+simplyhtml.insertTableTitle = \u63D2\u5165\u8868\u683C
+simplyhtml.italicName = \u659C\u4F53
+simplyhtml.layoutTabTitle = \u5E03\u5C40\u89C6\u56FE
+simplyhtml.leftLabel = \u5DE6:
+simplyhtml.listDialogTitle = \u5217\u8868\u683C\u5F0F
+simplyhtml.listIndentTitle = \u7F29\u8FDB:
+simplyhtml.listPosInside = \u5185\u90E8
+simplyhtml.listPositionLabel = \u4F4D\u7F6E:
+simplyhtml.listPosOutside = \u5916\u90E8
+simplyhtml.listTypeCircle = \u5706\u70B9\u9879\u76EE\u7B26\u53F7
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = \u6587\u4EF6\u7B26\u9879\u76EE\u7B26\u53F7
+simplyhtml.listTypeLabel = \u7C7B\u578B:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = \u65E0
+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.matchCase = \u533A\u5206\u5927\u5C0F\u5199
+simplyhtml.matchCase.tooltip = \u67e5\u627e\u65f6\u662f\u5426\u533a\u5206\u5927\u5c0f\u5199
+simplyhtml.newStyleDefaultName = \u65B0\u6837\u5F0F
+simplyhtml.nextTableCellLabel = \u4E0B\u4E00\u4E2A\u5355\u5143\u683C
+simplyhtml.noLineLabel = \u65E0
+simplyhtml.noMoreOccurrencesFound = \u672A\u627E\u5230\u641C\u7D22\u9879
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = \u9875\u8FB9\u8DDD(\u5185)
+simplyhtml.paraAlignCenterLabel = \u5C45\u4E2D
+simplyhtml.paraAlignCenterTip = \u8BBE\u7F6E\u6BB5\u843D\u5C45\u4E2D\u5BF9\u9F50
+simplyhtml.paraAlignLeftLabel = \u5DE6\u5BF9\u9F50
+simplyhtml.paraAlignLeftTip = \u8BBE\u7F6E\u6BB5\u843D\u5DE6\u5BF9\u9F50
+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.pasteLabel = \u7C98\u8D34
+simplyhtml.pastePlainTextLabel = \u7c98\u8d34\u4e3a\u7eaf\u6587\u672c
+simplyhtml.pasteTip = \u7C98\u8D34
+simplyhtml.plainName = \u65E0\u683C\u5F0F
+simplyhtml.previewLabel = \u9884\u89C8
+simplyhtml.previewText = \u9884\u89C8\u6587\u672C
+simplyhtml.prevTableCellLabel = \u4E0A\u4E00\u4E2A\u5355\u5143\u683C
+simplyhtml.printLabel = \u6253\u5370...
+simplyhtml.redoLabel = \u91CD\u505A
+simplyhtml.redoTip = \u91CD\u505A
+simplyhtml.replace = \u66FF\u6362...
+simplyhtml.replaceAll = \u5168\u9009
+simplyhtml.replaceDone = \u5B8C\u6210
+simplyhtml.replaceNo = \u5426
+simplyhtml.replaceThisQuery = \u66FF\u6362\u6B64
+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.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.searchUp = \u5411\u4E0A\u67E5\u627E
+simplyhtml.searchUp.tooltip = \u4ece\u6700\u672b\u4e00\u884c\u5f80\u4e0a\u67e5\u627e
+simplyhtml.selectAllLabel = \u5168\u9009
+simplyhtml.sizeLabel = \u5B57\u53F7
+simplyhtml.standardStyleName = \u6807\u51C6
+simplyhtml.strikeLabel = \u52A0\u5220\u9664\u7EBF
+simplyhtml.styleLabel = \u6837\u5F0F
+simplyhtml.styleNameInputText = \u65B0\u6837\u5F0F\u7684\u540D\u79F0?
+simplyhtml.styleNameInputTitle = \u4FDD\u5B58\u6837\u5F0F
+simplyhtml.tableBgColLabel = \u80CC\u666F\u989C\u8272:
+simplyhtml.tableDialogTitle = \u683C\u5F0F\u8868
+simplyhtml.tableLabel = \u8868\u683C
+simplyhtml.tablePanelTitle = \u8868\u683C\u5F0F
+simplyhtml.tableWidthLabel = \u5BBD\u5EA6:
+simplyhtml.textIndentLabel = \u7F29\u8FDB:
+simplyhtml.textToFind = \u67E5\u627E\u7684\u6587\u672C:
+simplyhtml.thisCellRangeLabel = \u6B64\u5355\u5143\u683C
+simplyhtml.thisColRangeLabel = \u6B64\u5217
+simplyhtml.thisRowRangeLabel = \u6B64\u884C
+simplyhtml.toggleBulletsLabel = \u6807\u53F7\u7684\u5217\u8868 \u5F00/\u5173
+simplyhtml.toggleBulletsTip = \u6807\u53F7\u7684\u5217\u8868 \u5F00/\u5173
+simplyhtml.toggleNumbersLabel = \u7F16\u53F7\u7684\u5217\u8868 \u5F00/\u5173
+simplyhtml.toggleNumbersTip = \u7F16\u53F7\u7684\u5217\u8868 \u5F00/\u5173
+simplyhtml.topLabel = \u9876\u90E8:
+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.undoTip = \u64A4\u9500
+simplyhtml.valignBaseline = \u57FA\u7EBF
+simplyhtml.valignBottom = \u5E95\u90E8
+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
+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
+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
+styles.list = \u5217\u8868
+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.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
+svg = SVG
+template_dir = \u6807\u51c6\u6a21\u7248
+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>
+ToggleChildrenFoldedAction.text = \u5C55\u5F00/\u6298\u53E0\u5B50\u8282\u70B9
+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
+ToggleMenubarAction.text = \u83DC\u5355\u680F
+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
+underline = \u4E0B\u5212\u7EBF
+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
+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
+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_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_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
+WebDocuAction.text = Web \u6587\u6863
+width = \u5BBD\u5EA6
+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.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
+yes = \u662F
+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
new file mode 100644
index 0000000..37e33eb
--- /dev/null
+++ b/freeplane/resources/translations/Resources_zh_TW.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane - \u514d\u8cbb\u7684\u5fc3\u667a\u5716\u548c\u77e5\u8b58\u5efa\u69cb\u8edf\u9ad4
+AboutAction.text = \u95DC\u65BC
+acceleratorPresets = \u5feb\u901f\u9375\u9810\u8a2d\u503c
+accelerators_loading_error = \u7121\u6cd5\u5f9e {0} \u8f09\u5165\u52a0\u901f\u5668
+accessories/plugins/ApplyFormatPlugin.dialog.title = \u66f4\u6539\u7bc0\u9ede\u683c\u5f0f
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = \u8b8a\u66f4\u6a23\u677f
+accessories/plugins/EncryptNode.properties_0 = \u9078\u64C7\u5BC6\u78BC
+accessories/plugins/EncryptNode.properties_1 = \u5BC6\u78BC\u932F\u8AA4.
+accessories/plugins/EncryptNode.properties_2 = \u8f38\u5165\u5bc6\u78bc:
+accessories/plugins/EncryptNode.properties_3 = \u518d\u8f38\u5165\u4e00\u6b21:
+accessories/plugins/EncryptNode.properties_4 = \u8F38\u5165\u5BC6\u78BC.
+accessories/plugins/EncryptNode.properties_5 = <html>\u8a18\u4f4f, \u52a0\u5bc6\u7684\u5f37\u5ea6\u9ad8\u5ea6\u4f9d\u8cf4\u5bc6\u78bc\u7684\u54c1\u8cea.
+accessories/plugins/EncryptNode.properties_6 = \u78BA\u5B9A
+accessories/plugins/EncryptNode.properties_7 = \u53D6\u6D88
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = \u60a8\u53ea\u80fd\u9078\u64c7\u6709\u52a0\u5bc6\u5c6c\u6027\u7684\u7bc0\u9ede. \u8acb\u5f9e\u5de5\u5177\u9078\u55ae\u63d2\u5165\u9019\u7a2e\u7d50\u9ede.
+accessories/plugins/EncryptNode.properties_select_me = \u9078\u6211\u7e7c\u7e8c!
+accessories/plugins/EncryptNode.properties_wrong_password = \u5BC6\u78BC\u932F\u8AA4.
+accessories/plugins/ExportWithTWiki.text = \u5b58\u6210 TWiki \u683c\u5f0f...
+accessories/plugins/ExportWithTWiki.tooltip = \u5c07\u5fc3\u667a\u5716\u532f\u51fa\u6210 TWiki \u6587\u4ef6 (\u4e00\u7a2e\u958b\u653e\u7a0b\u5f0f\u78bc\u7684\u7dad\u57fa\u5f0f\u5354\u4f5c\u5e73\u53f0)
+accessories/plugins/ExportWithXSLT.tooltip = \u9019\u662f\u4f7f\u7528 XSLT \u7684\u5236\u5f0f\u8f38\u51fa\u65b9\u5f0f.
+accessories/plugins/ExportWithXSLT_Applet.text = \u5b58\u6210 Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = \u532f\u51fa java applet \u7248
+accessories/plugins/ExportWithXSLT_Flash.text = \u532f\u51fa\u6210 Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = \u532f\u51fa\u6210 Flash
+accessories/plugins/ExportWithXSLT_HTML.text = \u532f\u51fa\u6210 XHTML (JavaScript \u7248)...
+accessories/plugins/ExportWithXSLT_HTML3.text = \u532f\u51fa\u6210 XHTML (\u53ef\u9ede\u9078\u5716\u50cf\u7248)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = \u5c07\u8cc7\u6e90\u7bc0\u9ede\u8f49\u6210 TaskJuggler \u6a94\u6848...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>\u5c07\u8cc7\u6e90\u7bc0\u9ede\u8f49\u6210 Task Juggler \u6a21\u7d44 (\u4e00\u7a2e\u958b\u653e\u7a0b\u5f0f\u78bc\u7684\u5c08\u6848\u7ba1\u7406\u8edf\u9ad4)</html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = \u5c07\u4efb\u52d9\u7bc0\u9ede\u8f49\u6210 TaskJuggler \u6a94\u6848...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>\u5c07\u4efb\u52d9\u7bc0\u9ede\u8f49\u6210 Task Juggler \u6a21\u7d44 (\u4e00\u7a2e\u958b\u653e\u7a0b\u5f0f\u78bc\u7684\u5c08\u6848\u7ba1\u7406\u8edf\u9ad4)</html>
+action_keystroke_in_use_error = \u52d5\u4f5c {1} \u9700\u8981\u7684\u6309\u9375 {0} \u5df2\u7d93\u88ab\u52d5\u4f5c {2} \u4f7f\u7528
+active = \u5957\u7528
+actual_map_styles = \u5fc3\u667a\u5716\u689d\u4ef6\u5f0f\u6a23\u5f0f
+actual_node_styles = \u7bc0\u9ede\u689d\u4ef6\u5f0f\u6a23\u5f0f
+add = \u65B0\u589E
+AddConnectorAction.text = \u589e\u52a0\u9023\u7d50\u7dda
+AddElementaryConditionAction.text = \u65b0\u589e
+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: {0}
+AddOnDetailsPanel.header.function = \u529f\u80fd
+AddOnDetailsPanel.header.menu = \u9078\u55ae\u4f4d\u7f6e
+AddOnDetailsPanel.header.shortcut = \u6377\u5f91
+AddOnDetailsPanel.homepage = \u9996\u9801:
+addons.installer.canceled = \u5b89\u88dd\u5df2\u522a\u9664
+addons.installer.confirm.licence = <html><body><h1>\u6388\u6b0a</h1>{0}<p><p><em>\u60a8\u63a5\u53d7\u9019\u500b\u6388\u6b0a\u689d\u6b3e\u55ce?</em></p></body></html>
+addons.installer.failed = \u5b89\u88dd\u5931\u6557: {0}
+addons.installer.freeplaneversion.format.error = {0} \u683c\u5f0f\u932f\u8aa4 (\u503c:{1})
+addons.installer.groovy.script.name = Script {0} \u4e0d\u662f\u4ee5 ".groovy" \u7d50\u675f
+addons.installer.html.script = Script \u672c\u9ad4\u53ef\u80fd\u4e0d\u662f HTML \u683c\u5f0f
+addons.installer.install = \u5b89\u88dd
+addons.installer.invalid.keyboard.shortcut = \u7121\u6548\u7684\u6377\u5f91 {0}
+addons.installer.licence.unchanged = \u6388\u6b0a\u6c92\u6709\u6539\u8b8a
+addons.installer.map.structure = \u5fc3\u667a\u5716\u7d50\u69cb\u932f\u8aa4: {0}
+addons.installer.missing.child.nodes = \u5b50\u7d50\u9ede\u907a\u5931: {0}
+addons.installer.missing.permission.attribute = Script {0}: \u907a\u5931\u6b0a\u9650\u5c6c\u6027 {1}
+addons.installer.missing.properties = \u907a\u5931\u6027\u8cea: {0}
+addons.installer.missing.translation = \u907a\u5931\u4f4d\u7f6e {1} \u5c0d {0} \u7684\u7ffb\u8b6f
+addons.installer.no.scripts = \u6c92\u6709\u767c\u73fe scripts
+addons.installer.no.zipdata = \u6c92\u6709\u767c\u73fe zip data
+addons.installer.nonstandard.permissions = Script \u8981\u6c42\u7684\u4e0b\u5217\u6b0a\u9650\u5c1a\u672a\u63d0\u4f9b: {0}. \n \u61c9\u8a72\u5c07\u5b83\u5011\u52a0\u5165\u6a19\u6e96\u6b0a\u9650\u55ce?
+addons.installer.one.child.expected = \u671f\u5f85 {0} \u7684\u5b50\u7bc0\u9ede\u537b\u5f97\u5230 {1}
+addons.installer.script.no.execution_mode = {0} \u7684\u57f7\u884c\u6a21\u5f0f\u5c6c\u6027\u6c92\u6709\u5b9a\u7fa9
+addons.installer.script.no.menulocation = {0} \u7684\u9078\u55ae\u4f4d\u7f6e\u5c6c\u6027\u6c92\u6709\u5b9a\u7fa9
+addons.installer.script.no.menutitle = {0} \u7684\u9078\u55ae\u6a19\u984c\u9375\u5c6c\u6027\u6c92\u6709\u5b9a\u7fa9
+addons.installer.script.no.permissions = {0} \u7684\u6b0a\u9650\u6c92\u6709\u5b9a\u7fa9
+addons.installer.success = \u5b89\u88dd\u6210\u529f.\n \u65b0\u7684\u9644\u52a0\u5143\u4ef6\u5728\u91cd\u65b0\u555f\u52d5\u5f8c\u5373\u53ef\u4f7f\u7528.
+addons.installer.success.update = \u5f9e {0} \u5230 {1} \u66f4\u65b0\u6210\u529f.\n\u67d0\u4e9b\u529f\u80fd\u5fc5\u9808\u91cd\u65b0\u555f\u52d5\u5f8c\u624d\u80fd\u4f7f\u7528.
+addons.installer.title = \u9644\u52a0\u5143\u4ef6\u5b89\u88dd\u7a0b\u5f0f
+addons.installer.too.new = \u9019\u500b freeplane \u7248\u672c {0} \u592a\u65b0, \u9019\u500b\u9644\u52a0\u5143\u4ef6\u6700\u591a\u652f\u63f4 {1} \u7248.
+addons.installer.too.old = \u9019\u500b freeplane \u7248\u672c {0} \u592a\u820a, \u9019\u500b\u9644\u52a0\u5143\u4ef6\u81f3\u5c11\u9700\u8981 {1} \u7248.
+addons.installer.unknown.deinstallation.rules = \u672a\u77e5\u7684\u89e3\u9664\u5b89\u88dd\u898f\u5247 {0}
+addons.installer.update = \u5f9e\u7248\u672c {0} \u66f4\u65b0
+addons.installer.warning = <html><body><em>\u60a8\u61c9\u8a72\u53ea\u5f9e\u60a8\u4fe1\u4efb\u7684\u4f86\u6e90\u5b89\u88dd\u9644\u52a0\u5143\u4ef6. \u60e1\u610f\u8edf\u9ad4\u53ef\u80fd\u5c0e\u81f4\u60a8\u7684\u8cc7\u6599\u640d\u6bc0\u6216\u4fb5\u5bb3\u60a8\u7684\u96b1\u79c1.</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = \u532f\u5165\u5c6c\u6027\u7684\u6a23\u5f0f
+AddStyleAttributes.tooltip = \u5f9e\u6a23\u5f0f\u7bc0\u9ede\u52a0\u5165\u5c6c\u6027
+AllMapsNodeListAction.text = \u5728\u6240\u6709\u5fc3\u667a\u5716\u7684\u7bc0\u9ede\u5217\u8868\u4e2d\u5c0b\u627e\u6216\u53d6\u4ee3...
+always = \u6c38\u9060\u9069\u7528
+AlwaysUnfoldedNodeAction.text = \u8a2d\u5b9a/\u53d6\u6d88 \u6c38\u9060\u5c55\u958b\u7bc0\u9ede
+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 = \u5957\u7528
+ApplyAction.text = \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
+ApplySelectedViewConditionAction.text = \u7be9\u9078\u9078\u53d6\u7684\u7bc0\u9ede
+ApplyToVisibleAction.text = \u5957\u7528\u5230\u7be9\u9078\u7684\u7bc0\u9ede
+as_parent = \u7576\u4f5c\u7236\u7bc0\u9ede
+AskForHelp.text = \u5c0b\u6c42\u5e6b\u52a9
+AssignAttributesAction.text = \u5c0b\u627e\u8207\u53d6\u4ee3\u5c6c\u6027...
+attribute_delete = \u522A\u9664\u6240\u6709\u5C6C\u6027\u503C
+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_replace = \u53D6\u4EE3
+attribute_top = \u8f09\u5165\u5fc3\u667a\u5716\u7684\u6240\u6709\u5c6c\u6027
+attribute_value = \u5c6c\u6027\u503c
+attributes_AddAttributeAction.text = \u7de8\u8f2f\u5c6c\u6027\u65bc\u5c0d\u8a71\u8996\u7a97
+attributes_adding_empty_attribute_error = \u5C6C\u6027\u540D\u7A31\u4E0D\u80FD\u662F\u7A7A\u5B57\u4E32
+attributes_all = \u6240\u6709\u5C6C\u6027
+attributes_assign_dialog = \u5c6c\u6027\u7de8\u8f2f\u5668
+attributes_attribute = \u5C6C\u6027
+attributes_close = \u95DC\u9589
+attributes_deselect_all = \u53D6\u6D88\u5168\u9078
+attributes_dialog_title = \u5C6C\u6027\u7BA1\u7406\u5E2B
+attributes_edit = \u7DE8\u8F2F
+attributes_edit_tooltip = \u7de8\u8f2f\u96c6\u5408
+attributes_for_selected = \u9078\u53d6\u7684\u7bc0\u9ede
+attributes_for_visible = \u5168\u90E8\u7BC0\u9EDE
+attributes_import = \u532F\u5165
+attributes_import_tooltip = \u5f9e\u5176\u4ed6\u5fc3\u667a\u5716\u532f\u5165\u5c6c\u6027
+attributes_no_import_candidates_found = \u6c92\u6709\u767c\u73fe\u65b0\u5c6c\u6027
+attributes_popup_delete = \u522A\u9664
+attributes_popup_down = \u4e0b\u4e00\u5217
+attributes_popup_edit = \u7DE8\u8F2F
+attributes_popup_hide = \u96B1\u85CF
+attributes_popup_new = \u65B0\u589E\u5C6C\u6027
+attributes_popup_optimal_width = \u6700\u4f73\u5bec\u5ea6
+attributes_popup_up = \u4e0a\u4e00\u5217
+attributes_refresh = \u91CD\u65B0\u6574\u7406
+attributes_RemoveAllAttributesAction.text = \u79fb\u9664\u6240\u6709\u5c6c\u6027
+attributes_RemoveFirstAttributeAction.text = \u79fb\u9664\u7b2c\u4e00\u500b\u5c6c\u6027
+attributes_RemoveLastAttributeAction.text = \u79fb\u9664\u6700\u5f8c\u4e00\u500b\u5c6c\u6027
+attributes_restricted_attributes_tooltip = \u5c6c\u6027\u7684\u9650\u5236\u96c6\u5408
+attributes_restricted_values_tooltip = \u76ee\u524d\u5c6c\u6027\u503c\u7684\u9650\u5236\u96c6\u5408
+attributes_restriction = \u9650\u5236\u7684\u96c6\u5408
+attributes_select_all = \u5168\u9078/\u53d6\u6d88\u5168\u9078
+attributes_select_all_tooltip = \u5168\u9078/\u53d6\u6d88\u5168\u9078
+attributes_show = \u986F\u793A
+attributes_skip_root = \u8DF3\u904E\u4E3B\u7BC0\u9EDE
+attributes_visible = \u986f\u793a/\u96b1\u85cf
+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}) ...
+AutomaticEdgeColorHookAction.text = \u81ea\u52d5\u5206\u652f\u984f\u8272
+AutomaticLayout.ALL = \u6240\u6709
+AutomaticLayout.HEADINGS = \u6a19\u984c
+AutomaticLayout.level = \u7b2c {0} \u5c64\u7bc0\u9ede\u683c\u5f0f
+AutomaticLayout.level.root = \u4e3b\u7bc0\u9ede\u683c\u5f0f
+AutomaticLayoutAction.text = \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.HEADINGS.text = \u5c0d\u975e\u7d42\u7aef\u7bc0\u9ede
+AutomaticLayoutControllerAction.null.text = \u4e0d\u4f7f\u7528
+BackAction.text = \u8FD4\u56DE
+BackAction.tooltip = \u8FD4\u56DE
+background = \u80CC\u666F
+bitmaps = \u9ede\u9663\u5716
+black = \u9ed1\u8272
+BlinkingNodeHookAction.text = \u9583\u720d\u7684\u7bc0\u9ede
+BlinkingNodeHookAction.tooltip = <html>\u4f7f\u7bc0\u9ede\u9583\u720d, \u4f46\u4e0d\u8981\u904e\u5ea6\u4f7f\u7528, \u4e26\u4e14\u4e0d\u8981\u548c\u5176\u4ed6\u81ea\u52d5\u683c\u5f0f\u5957\u7528\u5230\u540c\u4e00\u7bc0\u9ede../html>
+blue = \u85cd\u8272
+BoldAction.text = \u7C97\u9AD4
+boldify_branch = \u7C97\u9AD4
+branch = \u5206\u652f
+browse = \u700f\u89bd...
+calendar_attributes_panel = \u65e5\u66c6\u548c\u5c6c\u6027
+calendar_panel = \u65e5\u66c6
+can_not_connect_to_info_server = \u7121\u6cd5\u9023\u63a5\u5230\u8cc7\u8a0a\u4f3a\u670d\u5668
+can_not_delete_predefined_style = \u7121\u6cd5\u522a\u9664\u9810\u5148\u5b9a\u7fa9\u7684\u6a23\u5f0f
+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 = \u53D6\u6D88
+CancelAction.text = \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.
+cannot_add_parent_to_root = \u4e3b\u7bc0\u9ede\u4e0d\u80fd\u88ab\u52a0\u5230\u65b0\u7684\u7236\u7bc0\u9ede.
+cannot_delete_root = \u4E3B\u7BC0\u9EDE\u4E0D\u53EF\u522A\u9664\u6216\u526A\u8CBC
+cannot_join_nodes_with_children = \u6709\u5B50\u7BC0\u9EDE\u7684\u4E0D\u80FD\u5408\u4F75
+cannot_move_to_child = \u4e0d\u80fd\u628a\u7bc0\u9ede\u79fb\u5230\u5b83\u7684\u5b50\u7bc0\u9ede.
+CenterAction.text = \u79fb\u81f3\u4e2d\u9593
+CenterSelectedNodeAction.text = \u5c07\u9078\u53d6\u7684\u7bc0\u9ede\u79fb\u5230\u4e2d\u5fc3
+ChangeConnectorArrowsAction.backward.text = \u5f80\u5f8c
+ChangeConnectorArrowsAction.both.text = \u96d9\u5411
+ChangeConnectorArrowsAction.forward.text = \u5F80\u524D
+ChangeConnectorArrowsAction.none.text = \u7121\u7bad\u982d
+ChangeConnectorArrowsAction.text = \u6539\u8b8a\u9023\u63a5\u7dda\u7684\u7bad\u982d
+ChangeConnectorShapeAction.CUBIC_CURVE.text = \u5f27\u7dda
+ChangeConnectorShapeAction.EDGE_LIKE.text = \u6a21\u64ec\u5206\u652f\u7dda
+ChangeConnectorShapeAction.LINE.text = \u76f4\u7dda
+ChangeConnectorShapeAction.LINEAR_PATH.text = \u7dda\u6027\u8def\u5f91
+ChangeNodeLevelLeftsAction.text = \u5c07\u7bc0\u9ede\u79fb\u5230\u5de6\u908a
+ChangeNodeLevelLeftsAction.tooltip = \u4e3b\u7bc0\u9ede\u5de6\u908a\u7684\u7bc0\u9ede\u6703\u964d\u4e00\u968e\u8b8a\u6210\u5b83\u4e0a\u65b9\u5144\u5f1f\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede. \u4e3b\u7bc0\u9ede\u53f3\u908a\u7684\u7bc0\u9ede\u6703\u5347\u4e00\u968e\u8b8a\u6210\u5b83\u4e0a\u65b9\u5144\u5f1f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede.
+ChangeNodeLevelRightsAction.text = \u5c07\u7bc0\u9ede\u79fb\u5230\u53f3\u908a
+ChangeNodeLevelRightsAction.tooltip = \u4e3b\u7bc0\u9ede\u53f3\u908a\u7684\u7bc0\u9ede\u6703\u964d\u4e00\u968e\u8b8a\u6210\u5b83\u4e0a\u65b9\u5144\u5f1f\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede. \u4e3b\u7bc0\u9ede\u5de6\u908a\u7684\u7bc0\u9ede\u6703\u5347\u4e00\u968e\u8b8a\u6210\u5b83\u4e0a\u65b9\u5144\u5f1f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede.
+choose_background_color = \u9078\u64c7\u80cc\u666f\u984f\u8272:
+choose_cloud_color = \u9078\u64c7\u96f2\u7684\u984f\u8272
+choose_edge_color = \u9078\u64c7\u5206\u652f\u7dda\u984f\u8272
+choose_map_background_color = \u9078\u64c7\u5fc3\u667a\u5716\u7684\u80cc\u666f\u984f\u8272
+choose_node_background_color = \u9078\u64c7\u7bc0\u9ede\u7684\u80cc\u666f\u984f\u8272
+choose_node_color = \u9078\u64c7\u7bc0\u9ede\u984f\u8272
+ClearLinkAnchorAction.text = \u6e05\u9664\u9023\u7d50\u9328\u9ede
+ClearLinkAnchorAction.tooltip = <html>\u6e05\u9664\u5148\u524d\u8a2d\u5b9a\u7684\u7bc0\u9ede\u9328\u9ede</html>
+close_btn = \u95dc\u9589
+CloseAction.text = \u95dc\u9589\u76ee\u524d\u5fc3\u667a\u5716
+CloudAction.text = \u96f2\u72c0\u5305\u8986
+CloudColorAction.text = \u96F2\u7684\u984F\u8272...
+CloudShapeAction.ARC.text = \u5f27\u5f62
+CloudShapeAction.RECT.text = \u77e9\u5f62
+CloudShapeAction.ROUND_RECT.text = \u5713\u89d2\u77e9\u5f62
+CloudShapeAction.STAR.text = \u661f\u8292\u5f62
+ColorProperty.ResetColor = \u91cd\u8a2d\u70ba\u539f\u59cb\u984f\u8272
+combined = \u6574\u5408
+condition = \u689d\u4ef6
+confirmation = \u78BA\u8A8D\u6846
+connector = \u9023\u7d50\u7dda
+connector_arrows = \u9023\u7d50\u7dda\u7bad\u982d
+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 = \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-2012 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
+corrupt_map = \u5fc3\u667a\u5716\u5167\u5bb9\u6bc0\u640d
+CreateConjunctConditionAction.text = And
+CreateDisjunctConditionAction.text = Or
+CreateNotSatisfiedConditionAction.text = Not
+CreationModificationPluginAction.text = -- \u986f\u793a\u4fee\u6539\u6642\u9593
+CreationModificationPluginAction.tooltip = <html>\u6b64\u529f\u80fd\u986f\u793a\u7bc0\u9ede\u5efa\u7acb\u548c\u4fee\u6539\u7684\u6642\u9593.</html>
+current_dir = \u76ee\u524d\u5fc3\u667a\u5716\u76ee\u9304
+CutAction.text = \u526A\u4E0B
+decrease_branch_font_size = \u7e2e\u5c0f\u5b57\u578b
+DecreaseNodeFontAction.text = \u7e2e\u5c0f\u5b57\u578b
+default = \u9810\u8a2d
+DefaultColorAction.text = \u9810\u8a2d\u984f\u8272
+defaultstyle.details = \u7d30\u7bc0
+defaultstyle.floating = \u6d6e\u52d5\u7bc0\u9ede
+defaultstyle.note = \u8a3b\u89e3
+delete = \u522A\u9664
+delete_child = \u522a\u9664\u7bc0\u9ede
+DeleteAction.text = \u522A\u9664\u7BC0\u9EDE
+DeleteConditionAction.text = \u522A\u9664
+DeleteDetailsAction.text = \u79fb\u9664\u7bc0\u9ede\u7d30\u7bc0
+DeleteLevelStyleAction.text = \u79fb\u9664\u968e\u5c64\u6a23\u5f0f
+DeleteStyleAction.text = \u79fb\u9664\u6a23\u5f0f
+DeleteUserStyleAction.text = \u79fb\u9664\u4f7f\u7528\u8005\u5b9a\u7fa9\u6a23\u5f0f
+dialect_info.app = \u5fc3\u667a\u5716\u6a94 {0} \u662f\u7531\u7a0b\u5f0f {1} \u6240\u5efa\u7acb.
+dialect_info.unknownApp = \u5fc3\u667a\u5716\u6a94 {0} \u662f\u7531\u672a\u77e5\u7a0b\u5f0f\u6240\u5efa\u7acb.
+dialect_info.unknownURL = \u5b83\u7684\u7db2\u7ad9\u672a\u77e5.
+dialect_info.url = \u66f4\u591a\u8a0a\u606f\u8acb\u53c3\u8a2a\u7db2\u7ad9 {0}.
+dialect_info.warning = Freplane \u53ef\u80fd\u4e0d\u6b63\u78ba\u7684\u958b\u555f\u3001\u986f\u793a\u3001\u6216\u5132\u5b58.
+DirectHtmlFlavorHandler = HTML \u4f5c\u70ba\u55ae\u500b\u7bc0\u9ede
+DocumentationAction.text = \u4f7f\u7528\u624b\u518a
+down = \u5f80\u4e0b
+download = \u4e0b\u8f09
+dropped_file_error = \u4e0d\u80fd\u958b\u555f\u6a94\u6848. \u539f\u56e0: {0}
+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
+EdgeColorAction.text = \u5206\u652f\u7dda\u984f\u8272...
+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
+EdgeStyleAction.hide_edge.tooltip = <html>\u5c07\u9078\u53d6\u7bc0\u9ede\u5230\u7236\u7bc0\u9ede\u7684\u5206\u652f\u7dda\u4ee5\u865b\u7dda\u8868\u793a, \u6216\u8005\u96b1\u85cf\u5206\u652f\u7dda.</html>
+EdgeStyleAction.horizontal.text = \u6c34\u5e73
+EdgeStyleAction.horizontal.tooltip = <html>\u4ee5\u4e92\u76f8\u5782\u76f4\u7684\u76f4\u7dda\u986f\u793a\u5206\u652f\u7dda</html>
+EdgeStyleAction.linear.text = \u76F4\u7DDA
+EdgeStyleAction.linear.tooltip = <html>\u4ee5\u76f4\u7dda\u986f\u793a\u5206\u652f\u7dda</html>
+EdgeStyleAction.sharp_bezier.text = \u7531\u7c97\u800c\u7d30\u7684\u8c9d\u6c0f\u66f2\u7dda
+EdgeStyleAction.sharp_bezier.tooltip = <html>\u4ee5\u7531\u7c97\u800c\u7d30\u7684\u5e73\u6ed1\u66f2\u7dda\u986f\u793a\u5206\u652f\u7dda</html>
+EdgeStyleAction.sharp_linear.text = \u7531\u7c97\u800c\u7d30\u7684\u76f4\u7dda
+EdgeStyleAction.sharp_linear.tooltip = <html>\u4ee5\u7531\u7c97\u800c\u7d30\u7684\u7dda\u6bb5\u986f\u793a\u5206\u652f\u7dda</html>
+EdgeStyleAsParentAction.text = \u540c\u7236\u7bc0\u9ede
+EdgeStyleAsParentAction.tooltip = <html>\u4f7f\u7528\u7236\u7bc0\u9ede\u7684\u6a23\u5f0f</html>
+EdgeWidthAction_width_parent.text = \u7236\u7bc0\u9ede
+EdgeWidthAction_width_thin.text = \u8584\u5206\u652f\u7dda
+edit = \u7DE8\u8F2F
+edit.decision = HTML\u7DE8\u8F2F\u5668
+edit.edit_rich_text = \u4f60\u9700\u8981\u4f7f\u7528\u8f03\u597d\u7684\u7de8\u8f2f\u529f\u80fd\u55ce? (\u5982\u7c97\u9ad4, \u659c\u9ad4)
+edit_details = \u7de8\u8f2f\u7bc0\u9ede\u7d30\u7bc0\u65bc\u5c0d\u8a71\u8996\u7a97
+edit_end_label = \u9023\u7d50\u7dda\u6a19\u7c64
+edit_label_font_family = \u5b57\u578b
+edit_label_font_size = \u5b57\u9ad4\u5927\u5c0f
+edit_link_manually = \u624b\u52d5\u7de8\u8f2f\u8d85\u9023\u7d50 ...
+edit_long_node = \u7de8\u8f2f\u7bc0\u9ede\u6838\u5fc3\u65bc\u5c0d\u8a71\u8996\u7a97
+edit_middle_label = \u7de8\u8f2f\u4e2d\u592e\u6a19\u7c64
+edit_note = \u7de8\u8f2f\u8a3b\u89e3
+edit_source_label = \u7de8\u8f2f\u8d77\u9ede\u6a19\u7c64
+edit_target_label = \u7de8\u8f2f\u7d42\u9ede\u6a19\u7c64
+edit_transparency_label = \u900f\u660e\u5ea6
+edit_width_label = \u9023\u7d50\u7dda\u5bec\u5ea6
+EditAction.text = \u7de8\u8f2f\u7bc0\u9ede\u6838\u5fc3\u65bc\u5167\u5d4c\u7de8\u8f2f\u5217
+EditAttributesAction.text = \u7de8\u8f2f\u5c6c\u6027\u65bc\u5167\u5d4c\u7de8\u8f2f\u5217
+EditDetailsAction.text = \u7de8\u8f2f\u7bc0\u9ede\u7d30\u7bc0\u65bc\u5167\u5d4c\u7de8\u8f2f\u5217
+EditDetailsInDialogAction.text = \u7de8\u8f2f\u7bc0\u9ede\u7d30\u7bc0\u65bc\u5c0d\u8a71\u8996\u7a97
+EditFilterAction.text = \u7de8\u8f2f\u7be9\u9078\u5668...
+EditLongAction.text = \u7de8\u8f2f\u7bc0\u9ede\u6838\u5fc3\u65bc\u5c0d\u8a71\u8996\u7a97
+EditNoteInDialogAction.text = \u7de8\u8f2f\u8a3b\u89e3\u65bc\u5c0d\u8a71\u8996\u7a97
+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
+enter_base_url = \u5c07\u8cbc\u4e0a\u76f8\u5c0d\u9023\u7d50, \u8acb\u8f38\u5165\u57fa\u6e96URL.
+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
+enter_map_url = \u8f38\u5165\u5fc3\u667a\u5716\u7db2\u5740
+enter_new_style_name = \u8f38\u5165\u65b0\u7684\u6a23\u5f0f\u540d\u7a31
+enter_node_id = \u8f38\u5165 ID (\u7bc0\u9ede\u8eab\u5206\u78bc)
+enter_zoom = \u8f38\u5165\u7e2e\u653e\u6bd4\u4f8b
+EnterPassword.text = \u8f38\u5165\u5bc6\u78bc
+error = \u932F\u8AA4
+error_applying_template = \u5957\u7528 XSL \u6a21\u677f\u7684\u6642\u5019\u932f\u8aa4
+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
+ExecuteScriptError.text = Script \u6307\u4ee4\u57f7\u884c\u932f\u8aa4:
+ExecuteScriptForAllNodes.text = \u57f7\u884c\u6240\u6709 script \u6307\u4ee4
+ExecuteScriptForSelectionAction.text = \u57f7\u884c\u9078\u53d6\u7684\u7bc0\u9ede\u7684 script \u6307\u4ee4
+ExecuteScriptOnSelectedNode.text = \u5c0d\u6240\u6709\u9078\u53d6\u7684\u7bc0\u9ede\u57f7\u884c {0}
+ExecuteScriptOnSelectedNodeRecursively.text = \u905e\u8ff4\u5730\u5c0d\u9078\u53d6\u7684\u7bc0\u9ede\u57f7\u884c {0}
+ExecuteScriptOnSingleNode.text = \u5c0d\u4e00\u500b\u9078\u64c7\u7684\u7bc0\u9ede\u57f7\u884c {0}
+ExecuteScripts.noScriptsAvailable = \u6c92\u6709\u53ef\u7528\u7684 scripts
+ExecuteScripts.text = \u57f7\u884c script \u6307\u4ee4
+ExecuteScriptSecurityError.text = Scripts \u57f7\u884c\u6642\u51fa\u73fe\u932f\u8aa4: {0}
+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 = \u532f\u51fa\u5fc3\u667a\u5716...
+ExportBranchAction.text = \u5206\u652f\u53e6\u5b58\u65b0\u6a94...
+ExportBranchToHTMLAction.text = \u5c07\u5206\u652f\u7684\u7bc0\u9ede\u532f\u51faHTML...
+exported_file = \u532f\u51fa\u7684\u6a94\u6848 {0}
+ExportPdf.text = \u532f\u51fa\u6210 PDF \u6a94...
+ExportSvg.text = \u532f\u51fa\u6210 SVG \u6a94...
+ExportToHTMLAction.text = \u532f\u51fa\u6210 HTML \u6a94...
+ExportToImage.jpg.text = \u532f\u51fa\u6210 JPEG \u6a94...
+ExportToImage.png.text = \u532f\u51fa\u6210 PNG \u6a94...
+ExportToOoWriter.text = \u532f\u51fa\u6210 Open Office \u6587\u4ef6...
+extension_menu = \u7bc0\u9ede\u6a23\u7248
+ExternalImage_popupMenu_Change = \u66f4\u63db\u5716\u7247...
+ExternalImage_popupMenu_Open = \u5728\u6aa2\u8996\u5668\u958b\u555f
+ExternalImage_popupMenu_Remove = \u79fb\u9664
+ExternalImage_popupMenu_ResetZoom = \u6062\u5fa9\u539f\u5927\u5c0f
+ExternalImageAddAction.text = \u52a0\u5165\u5716\u7247...
+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
+f_button_unassigned = <\u672a\u8a2d\u5b9a\u52d5\u4f5c>
+FaqOpenURLAction.text = \u5E38\u898B\u554F\u984C\u89E3\u7B54
+file = \u6A94\u6848
+file_already_exists = \u6A94\u6848 {0} \u5DF2\u7D93\u5B58\u5728. \u78BA\u5B9A\u8981\u8986\u84CB\u55CE?
+file_not_found = \u627e\u4e0d\u5230\u6a94\u6848 {0}
+FileListFlavorHandler = \u9023\u7d50\u5230\u6a94\u6848
+FileProperties_BranchLeafCount = \u9078\u53d6\u7684\u5206\u652f\u7684\u672b\u7aef\u7bc0\u9ede\u6578:
+FileProperties_BranchNodeCount = \u9078\u53d6\u7684\u5206\u652f\u7684\u7bc0\u9ede\u6578:
+FileProperties_ChangesSinceLastSave = \u4e0a\u6b21\u5132\u5b58\u4e4b\u5f8c\u7684\u6539\u8b8a:
+FileProperties_FileName = \u6a94\u6848\u540d\u7a31:
+FileProperties_FileSaved = \u6a94\u6848\u5132\u5b58\u65bc:
+FileProperties_FileSize = \u6a94\u6848\u5927\u5c0f:
+FileProperties_MainBranchCount = \u4e3b\u8981\u5206\u652f\u6578:
+FileProperties_NeverSaved = \u5f9e\u672a\u5132\u5b58
+FileProperties_NodeChildCount = \u9078\u53d6\u7684\u5206\u652f\u7684\u5b50\u7bc0\u9ede\u6578:
+FileProperties_NodeSelectionCount = \u9078\u53d6\u7684\u7bc0\u9ede\u6578:
+FileProperties_TotalFilteredCount = \u6eff\u8db3\u7be9\u9078\u689d\u4ef6\u7684\u7bc0\u9ede\u6578:
+FileProperties_TotalLeafCount = \u6240\u6709\u672b\u7aef\u7bc0\u9ede\u6578:
+FileProperties_TotalNodeCount = \u6240\u6709\u7bc0\u9ede\u6578:
+FilePropertiesAction.text = \u5fc3\u667a\u5716\u7d71\u8a08\u8cc7\u8a0a...
+FileRevisionsDialog.cancel = \u53d6\u6d88
+FileRevisionsDialog.file_last_modified = \u6642\u9593\u5370\u8a18
+FileRevisionsDialog.file_name = \u6a94\u6848
+FileRevisionsDialog.file_size = \u4f4d\u5143\u7d44
+FileRevisionsDialog.open = \u958b\u555f
+FileRevisionsDialog.open.tooltip = \u958b\u555f\u6a94\u6848, \u5373\u4f7f\u5b83\u53ef\u80fd\u904e\u6642.
+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_add = \u65B0\u589E
+filter_and = AND
+filter_any_text = \u7bc0\u9ede\u6838\u5fc3, \u7d30\u7bc0\u548c\u8a3b\u89e3
+filter_conditions = \u7be9\u9078\u689d\u4ef6
+filter_contains = \u5305\u542b
+filter_created_after = \u5728...\u4e4b\u5f8c\u5efa\u7acb
+filter_created_before = \u5728...\u4e4b\u524d\u5efa\u7acb
+filter_delete = \u522A\u9664
+filter_details = \u7bc0\u9ede\u7d30\u7bc0
+filter_dialog = \u7be9\u9078\u529f\u80fd\u7de8\u8f2f\u5668
+filter_does_not_exist = \u4e0d\u5b58\u5728
+filter_edit_description = \u7be9\u9078\u5217\u8868
+filter_enter_value = \u8f38\u5165\u503c
+filter_even_level = \u5947\u6578\u968e\u7bc0\u9ede
+filter_exist = \u5b58\u5728
+filter_icon = \u5c0f\u5716\u793a
+filter_is_equal_to = =
+filter_is_not_equal_to = \u2260
+filter_leaf = \u672b\u7aef\u7bc0\u9ede
+filter_link = \u8d85\u9023\u7d50
+filter_match_approximately = \u8fd1\u4f3c\u5339\u914d
+filter_match_approximately_tooltip = <html>\u662f\u5426\u5141\u8a31\u8fd1\u4f3c\u5339\u914d,<br/>\u4f8b\u5982\uff0c\u641c\u5c0b 'files' \u6642\u4e5f\u6703\u627e\u5230 'flies'.</html>
+filter_match_case = \u5340\u5206\u5927\u5c0f\u5beb
+filter_match_case_tooltip = \u5339\u914d\u6642\u662f\u5426\u5340\u5206\u5927\u5c0f\u5beb.
+filter_modified_after = \u5728...\u4e4b\u5f8c\u4fee\u6539
+filter_modified_before = \u5728...\u4e4b\u524d\u4fee\u6539
+filter_no_filtering = \u7121\u7be9\u9078
+filter_node = \u7bc0\u9ede\u6838\u5fc3
+filter_node_level = \u7bc0\u9ede\u968e\u5c64
+filter_not = NOT
+filter_note = \u8a3b\u89e3
+filter_odd_level = \u5076\u6578\u968e\u7bc0\u9ede
+filter_or = OR
+filter_parent = \u7236\u7bc0\u9ede\u6587\u5b57
+filter_periodic_level = \u9031\u671f\u6027
+filter_priority = \u512a\u5148\u5e8f
+filter_regexp_matches = regexp (\u5b57\u4e32\u5e38\u898f\u8868\u793a\u5f0f) \u5339\u914d
+filter_reminder = \u63d0\u9192
+filter_reminder_after = \u9810\u5b9a\u5728...\u4e4b\u5f8c
+filter_reminder_before = \u9810\u5b9a\u5728...\u4e4b\u524d
+filter_reminder_executed = \u5df2\u7d93\u904e\u6642
+filter_reminder_later = \u7a0d\u5f8c\u5230\u671f
+filter_root = \u4e3b\u7bc0\u9ede
+filter_script = Script \u7be9\u9078
+filter_select = \u9078\u64c7
+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 = \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
+fit_map_to_page = \u8ABF\u6210\u4E00\u9801
+fit_map_to_page_height = \u8abf\u6210\u4e00\u9801\u9ad8
+fit_map_to_page_width = \u8abf\u6210\u4e00\u9801\u5bec
+FitToPage.text = \u8abf\u6210\u4e00\u9801
+FitToPage.tooltip = \u653e\u5927\u6216\u7e2e\u5c0f\u6210\u8996\u7a97\u5927\u5c0f
+fold = \u647A\u758A
+FoldAllAction.text = \u5168\u90e8\u647a\u758a
+FoldAllAction.tooltip = <html>\u647a\u758a\u9078\u53d6\u7684\u7bc0\u9ede\u548c\u5b83\u6240\u6709\u7684\u5b50\u7bc0\u9ede.</html>
+FoldOneLevelAction.text = \u647a\u758a\u4e00\u5c64
+FoldOneLevelAction.tooltip = <html>\u5c07\u9078\u53d6\u7684\u7bc0\u9ede\u672b\u7aef\u647a\u758a\u4e00\u5c64.</html>
+follow_graphical_link = \u8df3\u5230:
+FollowLinkAction.text = \u958b\u555f\u8d85\u9023\u7d50
+font = \u5B57\u578B
+FontFamilyAction.text = \u5B57\u9AD4
+FontSizeAction.text = \u5B57\u578B\u5927\u5C0F
+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_panel = \u683c\u5f0f
+FormatCopy.text = \u8907\u88fd\u683c\u5f0f
+FormatCopy.tooltip = <html>\u8907\u88fd\u7bc0\u9ede\u683c\u5f0f.</html>
+FormatPaste.text = \u8cbc\u4e0a\u683c\u5f0f
+FormatPaste.tooltip = <html>\u8cbc\u4e0a\u7bc0\u9ede\u683c\u5f0f.</html>
+formats_not_loaded = \u683c\u5f0f\u7121\u6cd5\u8f09\u5165\uff0c\u6a94\u6848\u6bc0\u640d
+formula.error.attributeValueIsNull = \u5c6c\u6027\u503c "{0}" \u662f\u7a7a\u7684
+formula.error.circularReference = \u5faa\u74b0\u53c3\u7167: \u7bc0\u9ede "{0}" \u7684\u516c\u5f0f\u53c3\u7167\u5230\u5b83\u81ea\u5df1.
+formula.EvaluateAllAction.text = \u8a08\u7b97\u6240\u6709\u516c\u5f0f
+formula.EvaluateAllAction.tooltip = \u8a08\u7b97\u5716\u4e0a\u6240\u6709\u516c\u5f0f
+formula.menuname = \u516c\u5f0f
+formula_editor = \u7de8\u8f2f\u65b9\u7a0b\u5f0f
+ForwardAction.text = \u5F80\u524D
+ForwardAction.tooltip = \u5F80\u524D
+FreeNodeAction.text = \u8a2d\u5b9a/\u53d6\u6d88 \u81ea\u7531\u5b9a\u4f4d\u7bc0\u9ede
+Freeplane.progress.buildScreen = \u5EFA\u7ACB\u8996\u7A97...
+Freeplane.progress.createController = \u5EFA\u7ACB\u63A7\u5236\u5668...
+Freeplane.progress.createInitialMode = \u521D\u59CB\u5316...
+Freeplane.progress.endStartup = \u555F\u52D5\u5B8C\u6210
+Freeplane.progress.gettingPreferenceDirectories = \u53D6\u5F97\u5B58\u653E\u8A2D\u5B9A\u6A94\u7684\u76EE\u9304...
+Freeplane.progress.gettingPreferences = \u53D6\u5F97\u8A2D\u5B9A\u6A94...
+Freeplane.progress.loadMaps = \u8F09\u5165\u5FC3\u667A\u5716...
+Freeplane.progress.propagateLookAndFeel = \u6E96\u5099\u5916\u89C0...
+Freeplane.progress.settingPreferences = \u555F\u7528\u8A2D\u5B9A\u6A94...
+Freeplane.progress.startCreateController = \u555F\u7528\u63A7\u5236\u5668...
+Freeplane.progress.updateLookAndFeel = \u66F4\u65B0\u5916\u89C0...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = \u652f\u63f4...
+FreeplaneHelpStarter.tooltip = \u5ef6\u4f38\u652f\u63f4
+GettingStartedAction.text = \u5feb\u901f\u5165\u9580
+GotoLinkNodeAction.text = \u5230\u9023\u7d50\u7bc0\u9ede
+GotoNodeAction.text = \u5230\u6307\u5b9a ID \u7684\u7bc0\u9ede...
+GrabKeyDialog.common.cancel = \u53D6\u6D88
+GrabKeyDialog.common.ok = \u78BA\u5B9A
+GrabKeyDialog.grab-key.assigned-to = \u8a2d\u5b9a\u5230
+GrabKeyDialog.grab-key.assigned-to.none = \u76ee\u524d\u672a\u8a2d\u5b9a
+GrabKeyDialog.grab-key.clear = \u6e05\u9664\u8a2d\u5b9a
+GrabKeyDialog.grab-key.remove = \u79fb\u9664
+GrabKeyDialog.grab-key.remove-ask = \u4f60\u8981\u79fb\u9664\u9019\u500b\u9375\u55ce?
+GrabKeyDialog.grab-key.title = \u8f38\u5165\u65b0\u9451
+green = \u7da0\u8272
+help = \u652F\u63F4
+HideableAction.tooltip = <html>\u628a\u6539\u8b8a\u7684\u7bc0\u9ede\u6a19\u793a\u51fa\u4f86.</html>
+HideAllAttributesAction.text = \u96B1\u85CF\u5C6C\u6027
+HierarchicalIcons2Action.text = \u986f\u793a\u5b50\u7bc0\u9ede\u5c0f\u5716\u793a\u7684\u4ea4\u96c6
+HierarchicalIconsAction.text = \u986f\u793a\u5b50\u7bc0\u9ede\u5c0f\u5716\u793a
+HierarchicalIconsAction.tooltip = \u6240\u6709\u7bc0\u9ede\u7684\u5b50\u5b6b\u7bc0\u9ede\u5982\u679c\u6709\u5c0f\u5716\u793a, \u5c07\u6703\u4ee5\u8f03\u5c0f\u7684\u5716\u793a\u986f\u793a\u5728\u8a72\u7bc0\u9ede.
+hot_keys = \u5feb\u901f\u9375
+hot_keys_table = \u5feb\u901f\u9375\u5217\u8868
+HotKeyInfoAction.text = \u5feb\u901f\u9375\u5c0d\u7167\u8868
+html_export_based_on_headings = HTML \u532f\u51fa- \u6a19\u984c\u5f0f
+html_export_fold_all = HTML \u532f\u51fa- \u5168\u90e8\u647a\u758a
+html_export_fold_currently_folded = HTML \u532f\u51fa- \u647a\u758a\u76ee\u524d\u88ab\u647a\u758a\u7684
+html_export_no_folding = HTML \u532f\u51fa- \u4e0d\u647a\u758a
+html_problem = <html>\u7121\u6cd5\u8f49\u6210 html<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = \u52a0
+icon_attach = \u6709\u9644\u4ef6
+icon_audio = \u8072\u97f3
+icon_back = \u8FD4\u56DE
+icon_bee = Freeplane \u871c\u8702
+icon_bell = \u63D0\u9192\u6211
+icon_bookmark = \u975e\u5e38\u597d
+icon_broken-line = \u65b7\u7dda
+icon_button_cancel = \u4e0d\u597d
+icon_button_ok = \u597d
+icon_calendar = \u65E5\u671F
+icon_checked = \u6838\u9078
+icon_clanbomber = \u5371\u96AA
+icon_clock = \u6642\u9593
+icon_clock2 = \u63d0\u9192
+icon_closed = \u7981\u6b62\u9032\u5165
+icon_decrypted = \u89E3\u9396
+icon_desktop_new = \u4E0D\u8981\u5FD8\u4E86
+icon_division = \u9664
+icon_down = \u4E0B
+icon_edit = \u4fee\u6539
+icon_encrypted = \u52A0\u9396
+icon_executable = \u53ef\u57f7\u884c
+icon_family = \u5bb6\u5ead
+icon_fema = \u7537\u5973
+icon_female1 = \u5973\u6027 1
+icon_female2 = \u5973\u6027 2
+icon_females = \u5973\u6027\u5011
+icon_flag = \u7d05\u65d7
+icon_flag-black = \u9ed1\u65d7
+icon_flag-blue = \u85cd\u65d7
+icon_flag-green = \u7da0\u65d7
+icon_flag-orange = \u6a58\u65d7
+icon_flag-pink = \u7c89\u7d05\u65d7
+icon_flag-yellow = \u9ec3\u65d7
+icon_folder = \u8cc7\u6599\u593e
+icon_forward = \u5F80\u524D
+icon_freemind_butterfly = FreeMind \u8774\u8776
+icon_full-0 = \u512a\u5148\u5e8f 0
+icon_full-1 = \u512a\u5148\u5e8f 1
+icon_full-2 = \u512a\u5148\u5e8f 2
+icon_full-3 = \u512a\u5148\u5e8f 3
+icon_full-4 = \u512a\u5148\u5e8f 4
+icon_full-5 = \u512a\u5148\u5e8f 5
+icon_full-6 = \u512a\u5148\u5e8f 6
+icon_full-7 = \u512a\u5148\u5e8f 7
+icon_full-8 = \u512a\u5148\u5e8f 8
+icon_full-9 = \u512a\u5148\u5e8f 9
+icon_go = \u7da0\u71c8
+icon_gohome = \u5BB6
+icon_group = \u5718\u9ad4
+icon_help = \u554f\u984c
+icon_hourglass = \u7b49\u5f85
+icon_icon_not_found = \u672a\u767c\u73fe\u5c0f\u5716\u793a
+icon_idea = \u5275\u610F
+icon_image = \u5716\u7247
+icon_info = \u8cc7\u8a0a
+icon_internet = \u7db2\u969b\u7db2\u8def
+icon_internet_warning = \u7db2\u969b\u7db2\u8def\u8b66\u544a
+icon_kaddressbook = \u96FB\u8A71
+icon_kmail = \u96fb\u90f5
+icon_knotify = \u97F3\u6A02
+icon_korn = \u90F5\u7BB1
+icon_ksmiletris = \u5feb\u6a02
+icon_launch = \u958b\u59cb
+icon_licq = \u5F88\u597D
+icon_list = \u5217\u8868
+icon_Mail = \u90F5\u4EF6
+icon_male1 = \u7537\u6027 1
+icon_male2 = \u7537\u6027 2
+icon_males = \u7537\u6027\u5011
+icon_menu = \u5C0F\u5716\u793A
+icon_messagebox_warning = \u91CD\u8981
+icon_mindmap = \u5fc3\u667a\u5716
+icon_multiplication = \u4e58
+icon_narrative = \u6558\u4e8b
+icon_negative = \u5dee
+icon_neutral = \u666e\u901a
+icon_password = \u5BC6\u78BC
+icon_pencil = \u9084\u9808\u4FEE\u6539
+icon_penguin = Linux \u4f01\u9d5d
+icon_positive = \u597d
+icon_prepare = \u9ec3\u71c8
+icon_revision = \u4fee\u8a02
+icon_smiley-angry = \u751F\u6C23
+icon_smiley-neutral = \u666e\u901a
+icon_smiley-oh = \u9A5A\u8A1D
+icon_smily_bad = \u96e3\u904e
+icon_stop = \u7d05\u71c8
+icon_stop-sign = \u505c\u6b62
+icon_subtraction = \u6e1b
+icon_unchecked = \u672a\u6838\u9078
+icon_up = \u4E0A
+icon_user_icon = \u4f7f\u7528\u8005
+icon_very_negative = \u5f88\u5dee
+icon_very_positive = \u5f88\u597d
+icon_video = \u5f71\u7247
+icon_wizard = \u9B54\u6CD5
+icon_xmag = \u9084\u9700\u8A0E\u8AD6
+icon_yes = \u91CD\u8981
+IconGroupPopupAction.arrows.text = \u7bad\u982d
+IconGroupPopupAction.docs_folders.text = \u6587\u4ef6\u548c\u8cc7\u6599\u593e
+IconGroupPopupAction.flags.text = \u65d7\u6a19
+IconGroupPopupAction.math.text = \u6578\u5b78
+IconGroupPopupAction.media.text = \u5a92\u9ad4
+IconGroupPopupAction.miscellaneous.text = \u4e94\u82b1\u516b\u9580
+IconGroupPopupAction.nature.text = \u81ea\u7136
+IconGroupPopupAction.numbers.text = \u6578\u5b57
+IconGroupPopupAction.office.text = \u8fa6\u516c\u5ba4
+IconGroupPopupAction.people.text = \u4eba
+IconGroupPopupAction.rating.text = \u8a55\u7b49
+IconGroupPopupAction.signs.text = \u7b26\u865f
+IconGroupPopupAction.smiley.text = \u8868\u60c5
+IconGroupPopupAction.time.text = \u6642\u9593
+IconGroupPopupAction.user.text = \u4f7f\u7528\u8005\u81ea\u8a02
+IconProgressExtended10Action.text = \u5ef6\u4f38\u9032\u5c55 10%
+IconProgressExtended10Action.tooltip = <html>\u52a0\u5165\u9032\u5c55\u6307\u6a19: \u4e4b\u5f8c\u7528\u6ed1\u9f20\u5de6\u9375\u96d9\u9ede\u64ca\u53ef\u589e\u52a0 10% ; <br>\u6bcf\u6b21 Control + \u6ed1\u9f20\u5de6\u9375\u96d9\u9ede\u64ca\u53ef\u6e1b\u5c11 10% \u76f4\u81f3\u79fb\u9664\u6307\u6a19.</html>
+IconProgressExtended25Action.text = \u5ef6\u4f38\u9032\u5c55 25%
+IconProgressExtended25Action.tooltip = <html>\u52a0\u5165\u9032\u5c55\u6307\u6a19: \u4e4b\u5f8c\u7528\u6ed1\u9f20\u5de6\u9375\u96d9\u9ede\u64ca\u53ef\u589e\u52a0 25% ; <br>\u6bcf\u6b21 Control + \u6ed1\u9f20\u5de6\u9375\u96d9\u9ede\u64ca\u53ef\u6e1b\u5c11 25% \u76f4\u81f3\u79fb\u9664\u6307\u6a19.</html>
+IconProgressIconDownAction.text = \u9032\u5c55\u6e1b\u5c11
+IconProgressIconDownAction.tooltip = \u6e1b\u5c11/\u63d2\u5165/\u79fb\u9664 \u9032\u5c55\u5c0f\u5716\u793a (100% -> 75% -> 50% -> 25% -> 0% -> \u79fb\u9664).
+IconProgressIconUpAction.text = \u9032\u5c55\u589e\u52a0
+IconProgressIconUpAction.tooltip = \u589e\u52a0/\u63d2\u5165 \u9032\u5c55\u5c0f\u5716\u793a (0% -> 25% -> 50% -> 75% -> 100% + OK).
+IconProgressRemoveAction.text = \u79fb\u9664\u9032\u5c55
+IconProgressRemoveAction.tooltip = \u79fb\u9664\u9032\u5c55\u5c0f\u5716\u793a\u548c\u5ef6\u4f38\u9032\u5c55\u6307\u6a19.
+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_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 = \u532f\u5165\u9023\u7d50\u6a94\u6848\u6210\u5206\u652f (\u4e3b\u7bc0\u9ede\u4e0d\u532f\u5165)
+ImportMindmanagerFiles.text = \u532f\u5165 MindManager X5...
+increase_branch_font_size = \u52A0\u5927\u5B57\u578B
+IncreaseNodeFontAction.text = \u52A0\u5927\u5B57\u578B
+internal_error_tooltip = \u5167\u90e8\u932f\u8aa4\u767c\u751f, \u8acb\u67e5\u8a62\u5728{0}\u7684\u6700\u5f8c\u65e5\u8a8c\u6a94.
+invalid_export_file = \u7121\u6548\u7684\u8f38\u51fa\u6a94\u540d
+invalid_file_msg = \u7121\u6cd5\u627e\u5230 {0} \u7684\u6a94\u6848
+invalid_uri = URI {0} \u7121\u6548
+invalid_url = \u7121\u6cd5\u5efa\u7acb\u6709\u6548\u7684 URL
+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
+LatexDeleteLatexAction.text = \u79fb\u9664 LaTeX \u6578\u5b78\u5f0f
+LatexEditLatexAction.text = \u7de8\u8f2f LaTeX \u6578\u5b78\u5f0f
+LatexInsertLatexAction.text = \u65b0\u589e LaTeX \u6578\u5b78\u5f0f
+less_than_two_selected_nodes = \u4f60\u5fc5\u9808\u81f3\u5c11\u9078\u53d6\u5169\u500b\u7bc0\u9ede\u4f86\u5efa\u7acb\u9023\u7d50.
+license = \u6388\u6b0a: GPL 2 or later
+license_text = <html>Freeplane - \u5fc3\u667a\u5716\u5efa\u7acb\u548c\u89c0\u770b\u7a0b\u5f0f<br>\u4e2d\u6587\u5316 1.2.4 \u7248<br>\u4e2d\u6587\u5316\u4f5c\u8005\uff1aCharles Chang<br>http://www.charles-chang.com
+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}
+load = \u8F09\u5165
+load_accelerator_presets = \u8f09\u5165
+LoadAcceleratorPresetsAction.textPatterns.text = \u6587\u5b57\u6a23\u5f0f
+locking_failed_by_open = \u9396\u5b9a\u5fc3\u667a\u5716 {0} \u5931\u6557. \u4ee5\u552f\u8b80\u65b9\u5f0f\u958b\u555f.
+locking_failed_by_save_as = \u9396\u5b9a\u5fc3\u667a\u5716 {0} \u5931\u6557. \u7d42\u6b62\u5132\u5b58.
+locking_old_lock_removed = \u5fc3\u667a\u5716 {0} \u88ab\u4f7f\u7528\u8005 {1} \u9396\u5b9a, \u79fb\u9664\u9396\u5b9a\u56e0\u70ba\u662f\u820a\u7684.
+long_node_changed_cancel = \u7BC0\u9EDE\u5DF2\u88AB\u8B8A\u66F4, \u8ACB\u554F\u4F60\u60F3\u653E\u68C4\u8B8A\u66F4\u55CE?
+long_node_changed_submit = \u7BC0\u9EDE\u5DF2\u88AB\u8B8A\u66F4, \u8ACB\u554F\u4F60\u60F3\u5132\u5B58\u8B8A\u66F4\u55CE?
+lots_of_links_warning = \u60a8\u6b63\u8981\u5728\u540c\u4e00\u500b\u7bc0\u9ede\u4e0a\u65b0\u589e\u5927\u91cf\u7684\u9023\u7d50. \u60a8\u771f\u7684\u60f3\u8981\u65b0\u589e\u9019\u4e9b\u9023\u7d50\u55ce?
+main_resource_directory = \u5b89\u88dd\u8cc7\u6e90: {0}
+MainView.errorUpdateText = \u8f38\u5165\u7684 {0} \u932f\u8aa4\u5730\u8a2d\u5b9a\u6587\u5b57
+MakeLinkFromAnchorAction.text = \u5f9e\u9328\u9ede\u5efa\u7acb\u9023\u7d50
+MakeLinkFromAnchorAction.tooltip = <html>\u5f9e\u4e0b\u9328\u7684\u7bc0\u9ede\u5efa\u7acb\u5c40\u90e8\u6216<br/>\u5168\u57df\u9023\u7d50\u5230\u9078\u53d6\u7684\u7bc0\u9ede</html>
+MakeLinkToAnchorAction.text = \u5efa\u7acb\u9023\u7d50\u5230\u9328\u9ede
+MakeLinkToAnchorAction.tooltip = <html>\u5f9e\u9078\u53d6\u7bc0\u9ede\u5efa\u7acb\u5c40\u90e8\u6216<br/>\u5168\u57df\u9023\u7d50\u5230\u4e0b\u9328\u7684\u7bc0\u9ede</html>
+ManageAddOnsAction.text = \u9644\u52a0\u5143\u4ef6
+ManageAddOnsDialog.activate = \u555f\u7528
+ManageAddOnsDialog.activation.success = {0} \u6703\u5728\u91cd\u65b0\u555f\u52d5\u5f8c\u555f\u7528
+ManageAddOnsDialog.authored.by = \u4f5c\u8005:
+ManageAddOnsDialog.cannot.activate = \u7121\u6cd5\u555f\u7528: {0} \u5df2\u7d93\u5728\u4f5c\u7528\u4e2d
+ManageAddOnsDialog.cannot.configure = \u7121\u6cd5\u8a2d\u5b9a\u7d44\u614b {0}
+ManageAddOnsDialog.cannot.deactivate = \u7121\u6cd5\u505c\u7528
+ManageAddOnsDialog.cannot.deinstall = \u7121\u6cd5\u89e3\u9664\u5b89\u88dd {0}
+ManageAddOnsDialog.configure = \u8a2d\u5b9a\u7d44\u614b
+ManageAddOnsDialog.deactivate = \u505c\u7528
+ManageAddOnsDialog.deactivation.success = {0} \u5728\u91cd\u65b0\u555f\u52d5\u5f8c\u5c07\u505c\u7528
+ManageAddOnsDialog.deinstall = \u89e3\u9664\u5b89\u88dd
+ManageAddOnsDialog.deinstallation.success = {0} \u5728\u91cd\u65b0\u555f\u52d5\u5f8c\u5c07\u89e3\u9664\u5b89\u88dd
+ManageAddOnsDialog.error = {0} \u5b89\u88dd\u932f\u8aa4
+ManageAddOnsDialog.install = \u5b89\u88dd
+ManageAddOnsDialog.install.from.known.location = \u5f9e\u5df2\u77e5\u4f4d\u7f6e\u5b89\u88dd\u9644\u52a0\u5143\u4ef6
+ManageAddOnsDialog.install.tooltip = \u5728\u9019\u88e1\u63d2\u5165\u9644\u52a0\u5143\u4ef6\u5b89\u88dd\u6a94
+ManageAddOnsDialog.map.not.opened = \u5fc3\u667a\u5716 {0} \u672a\u958b\u555f
+ManageAddOnsDialog.really.deinstall = \u771f\u7684\u8981\u89e3\u9664 {0} \u7684\u5b89\u88dd\u55ce?
+ManageAddOnsDialog.search = \u5c0b\u627e\u9644\u52a0\u5143\u4ef6
+ManageAddOnsDialog.search.file = \u5c0b\u627e
+ManageAddOnsDialog.select.tooltip = \u9078\u64c7\u6a94\u6848
+ManageAddOnsDialog.status.downloading = \u4e0b\u8f09\u6a94\u6848...
+ManageAddOnsDialog.status.installing = \u5b89\u88dd\u9644\u52a0\u5143\u4ef6...
+ManageAddOnsDialog.status.success = {0} \u6210\u529f\u5b89\u88dd
+ManageAddOnsDialog.tab.install = \u5c0b\u627e\u4e26\u5b89\u88dd
+ManageAddOnsDialog.tab.install.tooltip = \u5c0b\u627e\u4e26\u5b89\u88dd\u65b0\u7684\u9644\u52a0\u5143\u4ef6
+ManageAddOnsDialog.tab.manage = \u9644\u52a0\u5143\u4ef6
+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 = \u7ba1\u7406\u5fc3\u667a\u5716\u689d\u4ef6\u6a23\u5f0f...
+ManageNodeConditionalStylesAction.text = \u7ba1\u7406\u7bc0\u9ede\u689d\u4ef6\u6a23\u5f0f...
+map_already_exists = \u6b64\u5fc3\u667a\u5716\u5df2\u5b58\u5728, \u8981\u8986\u5beb\u55ce?
+map_corrupted = \u5fc3\u667a\u5716\u640d\u6bc0, \u67e5\u770b?
+map_load_error = \u7121\u6cd5\u7121\u6cd5\u8f09\u5165\u5fc3\u667a\u5716 {0}
+map_locked_by_open = \u5fc3\u667a\u5716 {0} \u5df2\u7d93\u88ab\u4f7f\u7528\u8005 {1} \u7de8\u8f2f, \u5c07\u4ee5\u552f\u8b80\u7684\u72c0\u614b\u958b\u555f.
+map_locked_by_save_as = \u5fc3\u667a\u5716 {0} \u6b63\u88ab\u4f7f\u7528\u8005 {1} \u7de8\u8f2f, \u4e2d\u6b62\u53e6\u5b58\u65b0\u6a94.
+map_not_saved = \u8a72\u5716\u5c1a\u672a\u5b58\u6a94.
+MapBackgroundColorAction.text = \u5fc3\u667a\u5716\u80cc\u666f\u984f\u8272...
+MaxNodeWidth.text = \u8a2d\u5b9a\u6700\u5927\u7bc0\u9ede\u5bec\u5ea6
+menu_applyStyle = \u5957\u7528\u6a23\u5f0f
+menu_attributes = \u5C6C\u6027
+menu_clouds = \u96f2\u72c0\u5305\u8986
+menu_copy = \u8907\u88fd
+menu_coreFormat = \u7bc0\u9ede\u6838\u5fc3\u5167\u5bb9
+menu_details = \u7d30\u7bc0
+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:\n{1}\n\u96e2\u958b
+menu_extensions = \u7bc0\u9ede\u5ef6\u4f38\u5167\u5bb9
+menu_extras = \u5de5\u5177
+menu_file_import = \u532F\u5165
+menu_filter = \u7be9\u9078
+menu_format = \u683c\u5f0f
+menu_group = \u7fa4\u7d44\u7bc0\u9ede
+menu_hoverView = \u7bc0\u9ede\u63d0\u793a
+menu_iconByCategory = \u5c0f\u5716\u793a\u5206\u985e
+menu_iconView = \u5c0f\u5716\u793a
+menu_image = \u5716\u7247
+menu_insert = \u65b0\u589e
+menu_latex_formula = LaTeX \u6578\u5b78\u5f0f
+menu_links = \u8d85\u9023\u7d50
+menu_manageStyles = \u7ba1\u7406\u6a23\u5f0f
+menu_moveNode = \u79fb\u52d5\u548c\u6392\u5e8f
+menu_navigate = \u5c0e\u89bd
+menu_newNode = \u65b0\u589e\u7bc0\u9ede
+menu_node = \u7bc0\u9ede
+menu_node_features = \u7bc0\u9ede\u7279\u9ede
+menu_nodes = \u7bc0\u9ede
+menu_nodeView = \u7bc0\u9ede\u6838\u5fc3
+menu_notes = \u8a3b\u89e3
+menu_noteView = \u8a3b\u89e3
+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 = \u6aa2\u8996
+menu_viewmode = \u700f\u89bd\u8a2d\u5b9a
+MenuUtils.invalid_menuitem = {0} \u4e0d\u662f\u6709\u6548\u7684\u9078\u55ae\u9805\u76ee\u9375.
+mindmap = \u5FC3\u667A\u5716
+MindMapNodesFlavorHandler = \u7bc0\u9ede\u968e\u5c64\u7d50\u69cb
+mindmaps = \u5FC3\u667A\u5716
+mindmaps_desc = \u5FC3\u667A\u5716 (*.mm)
+mindmaps_filter_desc = \u7be9\u9078\u689d\u4ef6 (*.mmfilter)
+MinNodeWidth.text = \u8a2d\u5b9a\u6700\u5c0f\u7bc0\u9ede\u5bec\u5ea6
+mode_Browse = \u700f\u89bd\u6a21\u5f0f
+mode_File = \u6a94\u6848\u6a21\u5f0f
+mode_MindMap = \u5fc3\u667a\u5716\u6a21\u5f0f
+mode_na = \u6a21\u5f0f\u4e0d\u5b58\u5728
+mode_status = \u6a21\u5f0f\u6539\u6210 {0}
+mode_title = Freeplane - {0} \u6A21\u5F0F
+modes = \u5207\u63DB\u6A21\u5F0F
+ModesMenuAction.Browse.text = \u5fc3\u667a\u5716\u700f\u89bd\u5668
+ModesMenuAction.File.text = \u6a94\u6848\u7e3d\u7ba1
+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
+NavigationNextMapAction.text = \u4e0b\u4e00\u5f35\u5fc3\u667a\u5716
+NavigationPreviousMapAction.text = \u4e0a\u4e00\u5f35\u5fc3\u667a\u5716
+new = \u65b0\u589e
+new_map_from_user_templates.text = \u65b0\u589e\u7279\u5b9a\u6a23\u7248\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
+new_version_available = \u5df2\u6709\u65b0\u7248\u672c ''{0}''
+NewChildAction.text = \u65B0\u589E\u5B50\u7BC0\u9EDE
+NewerFileRevisionsFoundDialog.cancel = \u7565\u904e
+NewerFileRevisionsFoundDialog.cancel.tooltip = \u4e0d\u958b\u555f\u9019\u500b\u6a94\u6848
+NewerFileRevisionsFoundDialog.file_last_modified = \u6642\u9593\u5370\u8a18
+NewerFileRevisionsFoundDialog.file_name = \u6a94\u6848
+NewerFileRevisionsFoundDialog.file_size = \u4f4d\u5143\u7d44
+NewerFileRevisionsFoundDialog.open = \u958b\u555f\u6a94\u6848
+NewerFileRevisionsFoundDialog.open.tooltip = \u958b\u555f\u6a94\u6848\u5373\u4f7f\u5b83\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7248\u672c
+NewerFileRevisionsFoundDialog.question = \u767c\u73fe {0} \u7684\u8f03\u65b0\u7248\u672c
+NewerFileRevisionsFoundDialog.restore = \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?\n(\u9078\u64c7 No \u70ba\u6b63\u5e38\u958b\u555f)
+newmap.install.addon.title = \u5b89\u88dd\u9644\u52a0\u5143\u4ef6?
+NewMapAction.text = \u65b0\u589e\u5fc3\u667a\u5716
+NewMapViewAction.text = \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>
+NewPreviousSiblingAction.text = \u65b0\u589e\u4e0a\u65b9\u5144\u5f1f\u7bc0\u9ede
+NewSiblingAction.text = \u65b0\u589e\u4e0b\u65b9\u5144\u5f1f\u7bc0\u9ede
+NewSummaryAction.text = \u65b0\u589e\u7e3d\u7d50\u7bc0\u9ede
+NewUserStyleAction.text = \u65b0\u81ea\u5b9a\u6a23\u5f0f...
+NextNodeAction.BACK.text = \u5230\u524d\u4e00\u500b\u7bc0\u9ede
+NextNodeAction.BACK_N_FOLD.text = \u5230\u524d\u4e00\u500b\u7bc0\u9ede\u4e26\u647a\u758a\u8a72\u7bc0\u9ede
+NextNodeAction.FORWARD.text = \u5230\u5f8c\u4e00\u500b\u7bc0\u9ede
+NextNodeAction.FORWARD_N_FOLD.text = \u5230\u5f8c\u4e00\u500b\u7bc0\u9ede\u4e26\u647a\u758a\u8a72\u7bc0\u9ede
+NextPresentationItemAction.text = \u6253\u958b\u4e0b\u4e00\u500b\u7c21\u5831\u9805\u76ee
+no = \u5426
+no_copy_attributes_before_paste_attributes = \u4f60\u7121\u6cd5\u5728\u8907\u88fd\u5c6c\u6027\u524d\u5c31\u53bb\u8cbc\u4e0a\u5c6c\u6027.
+NO_FORMAT = \u7d14\u6587\u5b57
+no_format_copy_before_format_paste = \u4f60\u5fc5\u9808\u5148\u8907\u88fd\u683c\u5f0f\u624d\u80fd\u8cbc\u4e0a\u683c\u5f0f.
+no_found_from = <html>\u7121\u6cd5\u5728 {1} \u627e\u5230 <u>{0}</u>.
+no_more_found_from = <html>\u7121\u6cd5\u5728 {1} \u627e\u5230\u66f4\u591a\u7684 <u>{0}</u>.
+no_previous_find = \u627e\u4e0d\u5230
+no_styles_found_in_map = \u5fc3\u667a\u5716\u4e2d\u6c92\u767c\u73fe\u6a23\u5f0f
+node = \u7BC0\u9EDE
+node_changed_discard_changes = \u7BC0\u9EDE\u5DF2\u88AB\u8B8A\u66F4, \u8ACB\u554F\u4F60\u60F3\u653E\u68C4\u8B8A\u66F4\u55CE?
+node_is_write_protected = \u76EE\u6A19\u7BC0\u9EDE\u5BEB\u5165\u4FDD\u8B77\u4E2D.
+node_location_help = \u62d6\u66f3\u53ef\u4ee5\u8b8a\u66f4\u7bc0\u9ede\u4f4d\u7f6e, ctrl+\u62d6\u66f3 \u53ef\u4ee5\u6539\u8b8a\u5e73\u884c\u7bc0\u9ede\u7684\u9593\u8ddd, \u96d9\u64ca\u53ef\u56de\u5fa9\u539f\u8a2d\u5b9a.
+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 = \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
+NodeExtensions.EditNodeExtensions = \u7de8\u8f2f\u7bc0\u9ede\u5ef6\u4f38\u6027\u8cea
+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 = \u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u6C23\u6CE1\u6846
+NodeShapeAction.fork.text = \u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u5E95\u7DDA
+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
+ok = \u78BA\u5B9A
+OKAction.text = \u78BA\u5B9A
+OnlineReference.text = \u53c3\u8003\u624b\u518a
+open_asMindMap = \u5fc3\u667a\u5716
+OpenAction.text = \u958b\u555f\u820a\u6a94...
+OpenFreeplaneSiteAction.text = Freeplane \u9996\u9801
+OpenPathAction.text = \u958b\u555f\u820a\u6a94
+OpenURLMapAction.text = \u958b\u555f\u7db2\u8def\u4e0a\u5fc3\u667a\u5716...
+OpenUserDirAction.text = \u958b\u555f\u4f7f\u7528\u8005\u76ee\u9304
+option_changes_may_require_restart = \u4fee\u6539\u7684\u8a2d\u5b9a\u53ef\u80fd\u8981\u91cd\u65b0\u555f\u52d5\u5f8c\u624d\u80fd\u4f5c\u7528.
+OptionalDontShowMeAgainDialog.cancel = \u5426
+OptionalDontShowMeAgainDialog.dontShowAgain = \u4EE5\u5F8C\u4E0D\u8981\u518D\u8A62\u554F\u6211
+OptionalDontShowMeAgainDialog.ok = \u662f
+OptionalDontShowMeAgainDialog.rememberMyDescision = \u8A18\u4F4F\u6211\u76EE\u524D\u7684\u6C7A\u5B9A(\u4E0B\u6B21\u4E0D\u7528\u518D\u554F)
+OptionPanel.absolute = \u7D55\u5C0D
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = \u81ea\u52d5\u6392\u7248\u6a23\u677f\u8a2d\u5b9a
+OptionPanel.ADD_CHILD = \u65b0\u589e\u5b50\u7bc0\u9ede
+OptionPanel.ADD_SIBLING = \u65b0\u589e\u5144\u5f1f\u7bc0\u9ede
+OptionPanel.addons = \u9644\u52a0\u5143\u4ef6
+OptionPanel.always_fold_all_after_load = \u7bc0\u9ede\u5168\u90e8\u647a\u758a
+OptionPanel.always_load_last_maps = \u81ea\u52d5\u958b\u555f\u4e0a\u6b21\u7684\u6216\u8005\u65b0\u7684\u5fc3\u667a\u5716
+OptionPanel.always_load_last_maps.tooltip = \u958b\u555f\u4e0a\u8ff0\u9078\u9805\u8a2d\u5b9a\u7684\u4e0a\u6b21\u6a94\u6848, \u5982\u672a\u8a2d\u5b9a\u5247\u958b\u555f\u65b0\u7684\u5fc3\u667a\u5716.
+OptionPanel.always_save_folding = \u6c38\u9060
+OptionPanel.always_save_folding_state = \u6c38\u9060\u5132\u5b58\u647a\u758a\u72c0\u614b
+OptionPanel.always_save_folding_state.tooltip = \u5982\u679c\u52fe\u9078, \u6bcf\u6b21\u5c55\u958b\u6216\u647a\u758a\u7bc0\u9ede\u90fd\u6703\u63d0\u9192\u4f60\u5132\u5b58\u6a94\u6848.
+OptionPanel.always_unfold_all_after_load = \u7bc0\u9ede\u5168\u90e8\u5c55\u958b
+OptionPanel.antialias = \u53BB\u92F8\u9F52
+OptionPanel.antialias.tooltip = <html>\u6c7a\u5b9a\u5716\u5f62\u54c1\u8cea, \u4f46\u53bb\u92f8\u9f52\u9700\u8981\u82b1\u8cbb\u6642\u9593.</html>
+OptionPanel.antialias_all = \u9664\u53BB\u6240\u6709\u92F8\u9F52\u908A
+OptionPanel.antialias_edges = \u9664\u53BB\u92F8\u9F52\u908A
+OptionPanel.antialias_none = \u4E0D\u53BB\u92F8\u9F52
+OptionPanel.Appearance = \u5916\u89C0\u8A2D\u5B9A
+OptionPanel.apply_system_screen_resolution = \u5957\u7528\u7cfb\u7d71\u87a2\u5e55\u89e3\u6790\u5ea6
+OptionPanel.approximate_search_threshold = \u9032\u4f3c\u5339\u914d\u7684\u9580\u6abb
+OptionPanel.approximate_search_threshold.tooltip = <html>\u9032\u4f3c\u5339\u914d\u7684\u9580\u6abb<br/><font size="2">\u53c3\u95b1 http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(\u503c\u8d8a\u5927\uff0c\u8d8a\u5c11\u8b8a\u4f8b\u6703\u88ab\u641c\u5c0b\u5230)</html>
+OptionPanel.ar = \u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u963f\u62c9\u4f2f\u6587)
+OptionPanel.ARC = \u5f27\u7dda
+OptionPanel.as_parent = \u8DDF\u4E3B\u7BC0\u9EDE\u76F8\u540C
+OptionPanel.ask = \u8A62\u554F
+OptionPanel.automatic = \u81EA\u52D5\u5075\u6E2C\u8A9E\u7CFB
+OptionPanel.automaticFormat_level = \u81ea\u52d5\u6392\u7248\u5404\u5c64\u7bc0\u9ede\u683c\u5f0f\u8a2d\u5b9a\u503c (\u6ed1\u9f20\u5de6\u9375\u9ede\u5165\u53ef\u4fee\u6539)
+OptionPanel.automaticFormat_level1 = \u4e3b\u7bc0\u9ede\u683c\u5f0f
+OptionPanel.automaticFormat_level2 = 1. \u5404\u5c64\u7bc0\u9ede\u683c\u5f0f
+OptionPanel.backup_file_number = \u4fdd\u5b58\u7684\u5099\u4efd\u6a94\u6848\u6578\u91cf
+OptionPanel.Behaviour = \u7DE8\u8F2F\u884C\u70BA\u8A2D\u5B9A
+OptionPanel.bezier = \u8C9D\u6C0F\u66F2\u7DDA
+OptionPanel.bubble = \u6c23\u6ce1\u6846
+OptionPanel.ca = Catal\u00e0 (\u52a0\u6cf0\u7f85\u5c3c\u4e9e\u6587 / \u74e6\u502b\u897f\u4e9e\u6587)
+OptionPanel.Cancel = \u53D6\u6D88
+OptionPanel.center_selected_node = \u5c07\u9078\u53d6\u7684\u7bc0\u9ede\u7f6e\u65bc\u4e2d\u592e
+OptionPanel.check_updates_automatically = \u7a0b\u5f0f\u555f\u52d5\u6642\u6aa2\u67e5\u662f\u5426\u6709\u65b0\u7248\u672c
+OptionPanel.childpattern = \u5b50\u6a23\u677f
+OptionPanel.childpattern.tooltip = \u9078\u5B9A\u7684\u6A21\u677F\u5957\u7528\u5230\u6240\u6709\u5B50\u7BC0\u9EDE
+OptionPanel.clear_all_setters = \u91CD\u8A2D\u6240\u6709\u8A2D\u5B9A
+OptionPanel.clear_all_setters.tooltip = \u91CD\u8A2D\u6240\u6709\u8A2D\u5B9A
+OptionPanel.cloud = \u96f2\u72c0\u5305\u8986
+OptionPanel.cloudcolor = \u96f2\u7684\u984f\u8272
+OptionPanel.cloudshape = \u96f2\u7684\u5f62\u72c0
+OptionPanel.combined = \u6574\u5408
+OptionPanel.compare_as_number = \u6578\u5b57\u6bd4\u5c0d
+OptionPanel.convert_to_current_version = <html>\u81ea\u52d5\u5c07\u820a\u7248 freeplane \u8f49\u63db\u6210\u65b0\u7248\u683c\u5f0f?</html>
+OptionPanel.convert_to_current_version.tooltip = <html>\u53EA\u6709\u975E\u5E38\u5927\u7684\u5716\u4E0D\u9700\u8981\u8F49\u63DB<br>(\u5C08\u5BB6\u77E5\u8B58)\u4F60\u4E5F\u53EF\u4EE5\u958B\u555F\u6C92\u6709\u8F49\u63DB\u904E\u7684\u820A\u7248\u5FC3\u667A\u5716.</html>
+OptionPanel.cs = \u010desky (\u6377\u514b\u6587)
+OptionPanel.cut_nodes_without_question = \u526a\u4e0b\u7bc0\u9ede\u4e0d\u7528\u78ba\u8a8d?
+OptionPanel.cut_nodes_without_question.tooltip = \u5982\u679c\u52fe\u9078\u6b64\u8a2d\u5b9a, \u6709\u53ef\u80fd\u56e0\u758f\u5ffd\u8aa4\u6309\u800c\u522a\u6389\u7bc0\u9ede.
+OptionPanel.da = Dansk (\u4e39\u9ea5\u6587)
+OptionPanel.date_format = \u6a19\u6e96\u65e5\u671f\u683c\u5f0f
+OptionPanel.date_format.tooltip = SHORT, MEDIUM, LONG, FULL \u6216\u662f "MM/dd/yyyy" \u4e4b\u4efb\u4e00\u500b
+OptionPanel.datetime_format = \u6a19\u6e96\u65e5\u671f\u6642\u9593\u683c\u5f0f
+OptionPanel.datetime_format.tooltip = <datestyle>,<timestyle> ( SHORT, MEDIUM, LONG, \u6216 FULL) \u6216\u662f "M/d/yyyy hh:mm" \u4e4b\u4efb\u4e00\u500b
+OptionPanel.de = Deutsch (\u5fb7\u6587)
+OptionPanel.default = \u9810\u8a2d\u503c
+OptionPanel.default_attribute_key_column_width = \u6a19\u6e96\u5c6c\u6027\u9375\u5bec\u5ea6
+OptionPanel.default_attribute_value_column_width = \u6a19\u6e96\u5c6c\u6027\u503c\u5bec\u5ea6
+OptionPanel.default_browser_command_mac = \u547C\u53EB\u700F\u89BD\u5668\u6240\u4F7F\u7528\u4E4B\u547D\u4EE4\u63D0\u793A\u5B57\u5143\u57F7\u884C\u53C3\u6578(Mac)
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_other_os = \u547C\u53EB\u700F\u89BD\u5668\u6240\u4F7F\u7528\u4E4B\u547D\u4EE4\u63D0\u793A\u5B57\u5143\u57F7\u884C\u53C3\u6578(\u5176\u4ED6\u4F5C\u696D\u7CFB\u7D71)
+OptionPanel.default_browser_command_other_os.tooltip = <html> \u4e00\u822c\u662f Linux</html>
+OptionPanel.default_browser_command_windows_9x = \u547C\u53EB\u700F\u89BD\u5668\u6240\u4F7F\u7528\u4E4B\u547D\u4EE4\u63D0\u793A\u5B57\u5143\u57F7\u884C\u53C3\u6578(Windows 9x)
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>\u9019 "" \u662f\u5fc5\u9808\u7684, \u56e0\u70ba\u4ed6\u5011\u7684 URL \u6709 "=".</html>
+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.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, \u8acb\u52fe\u9078.</html>
+OptionPanel.delete_nodes_without_question = \u522a\u9664\u7bc0\u9ede\u4e0d\u7528\u78ba\u8a8d?
+OptionPanel.delete_nodes_without_question.tooltip = \u5982\u679c\u52fe\u9078\u6b64\u8a2d\u5b9a, \u6709\u53ef\u80fd\u56e0\u758f\u5ffd\u8aa4\u6309\u800c\u522a\u6389\u7bc0\u9ede.
+OptionPanel.disable_cursor_move_paper = \u79fb\u52d5\u5fc3\u667a\u5716\u6642\u4e0d\u986f\u793a "\u79fb\u52d5\u6e38\u6a19"
+OptionPanel.disable_cursor_move_paper.tooltip = <html>\u65bc\u87a2\u5e55\u62d6\u66f3\u79fb\u52d5\u5fc3\u667a\u5716\u4f4d\u7f6e\u6642\u4e0d\u8981\u986f\u793a\u5c08\u7528\u7684 "\u79fb\u52d5\u6e38\u6a19" (\u6307\u5411\u56db\u908a\u7684\u7bad\u982d\u7b26\u865f)</html>
+OptionPanel.display_inline_editor_for_all_new_nodes = \u5c0d\u6240\u6709\u65b0\u7bc0\u9ede\u986f\u793a\u5167\u5d4c\u7de8\u8f2f\u5217
+OptionPanel.display_node_id = \u986f\u793a\u7bc0\u9ede ID
+OptionPanel.edgecolor = \u5206\u652f\u7dda\u984f\u8272
+OptionPanel.edgecolor.tooltip = \u5230\u7236\u7bc0\u9ede\u7684\u5206\u652f\u7dda\u984f\u8272
+OptionPanel.edgestyle = \u5206\u652f\u7dda\u6a23\u5f0f
+OptionPanel.edgestyle.tooltip = \u5230\u7236\u7bc0\u9ede\u7684\u5206\u652f\u7dda\u6a23\u5f0f
+OptionPanel.edgewidth = \u5206\u652f\u7dda\u5bec\u5ea6
+OptionPanel.edgewidth.tooltip = \u5230\u7236\u7bc0\u9ede\u7684\u5206\u652f\u7dda\u5bec\u5ea6
+OptionPanel.EDIT_CURRENT = \u8986\u5beb\u5167\u5bb9
+OptionPanel.edit_on_double_click = \u96d9\u9ede\u64ca\u9032\u5165\u7de8\u8f2f
+OptionPanel.editor_extra_width = \u984d\u5916\u5bec\u5ea6
+OptionPanel.editor_extra_width.tooltip = <html>\u6c7a\u5b9a\u8981\u589e\u52a0\u7684\u5bec\u5ea6\u7684\u50cf\u7d20\u503c, \u7576\u6587\u5b57\u8d85\u904e\u76ee\u524d\u5bec\u5ea6\u6642.</html>
+OptionPanel.el = \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac (\u5e0c\u81d8\u6587)
+OptionPanel.el__buttons_above = \u6309\u9215\u5728\u8996\u7a97\u4e0a\u65b9
+OptionPanel.el__enter_confirms_by_default = \u6309 Enter \u9375\u5c31\u78ba\u8a8d\u7dda\u5167\u7bc0\u9ede\u7de8\u8f2f
+OptionPanel.el__max_default_window_height = \u6700\u5927\u8996\u7A97\u9AD8\u5EA6
+OptionPanel.el__max_default_window_width = \u6700\u5927\u8996\u7A97\u5BEC\u5EA6
+OptionPanel.el__min_default_window_height = \u6700\u5C0F\u8996\u7A97\u9AD8\u5EA6
+OptionPanel.el__min_default_window_width = \u6700\u5C0F\u8996\u7A97\u5BEC\u5EA6
+OptionPanel.el__position_window_below_node = \u8996\u7A97\u5728\u7BC0\u9EDE\u4E0B\u65B9
+OptionPanel.en = English (\u82f1\u6587)
+OptionPanel.Environment = \u74B0\u5883\u8A2D\u5B9A
+OptionPanel.es = Espa\u00f1ol / Castellano (\u897f\u73ed\u7259\u6587 / \u5361\u65af\u63d0\u723e\u6587)
+OptionPanel.et = Eesti, Eesti Keel (\u611b\u6c99\u5c3c\u4e9e\u6587)
+OptionPanel.execute_scripts_without_asking = \u6307\u4ee4\u53ef\u4ee5\u76f4\u63a5\u57f7\u884c (\u4e0d\u9700\u78ba\u8a8d)
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Freeplane \u6307\u4ee4\u53ef\u57f7\u884c\u5404\u7a2e\u52d5\u4f5c. <br>\u56e0\u6b64\u4f60\u4e0d\u8a72\u57f7\u884c\u4f60\u4e0d\u77e5\u9053\u7684\u6307\u4ee4\u4ee5\u7b56\u5b89\u5168.</html>
+OptionPanel.execute_scripts_without_exec_restriction = \u5141\u8a31\u57f7\u884c\u61c9\u7528\u7a0b\u5f0f (\u4e0d\u5efa\u8b70)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html>\u5047\u5982\u4f60\u8981\u57f7\u884c\u7279\u6b8a\u7684\u5176\u4ed6\u7684\u61c9\u7528\u7a0b\u5f0f (\u5982\u700f\u89bd\u5668), \u4f60\u5fc5\u9808\u555f\u7528\u9019\u500b\u529f\u80fd.</html>
+OptionPanel.execute_scripts_without_file_restriction = \u5141\u8a31\u6a94\u6848\u76f8\u95dc\u64cd\u4f5c (\u4e0d\u5efa\u8b70)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html>\u5047\u5982\u4f60\u8981\u57f7\u884c\u6a94\u6848\u7684\u65b0\u589e\u522a\u9664\u4fee\u6539\u7b49\u6b0a\u9650,\u4f60\u5fc5\u9808\u555f\u7528\u9019\u500b\u529f\u80fd.</html>
+OptionPanel.execute_scripts_without_network_restriction = \u5141\u8a31\u7db2\u8def\u76f8\u95dc\u64cd\u4f5c (\u4e0d\u5efa\u8b70)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html>\u5047\u5982\u4f60\u8981\u57f7\u884c\u7279\u6b8a\u7684\u7db2\u8def\u52d5\u4f5c, \u4f60\u5fc5\u9808\u555f\u7528\u9019\u500b\u529f\u80fd.</html>
+OptionPanel.execute_scripts_without_write_restriction = \u5141\u8a31\u6a94\u6848\u8986\u5beb (\u4e0d\u5efa\u8b70)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>\u5982\u679c\u4f60\u7684 Groovy Scripts \u5beb\u5165\u6a94\u6848 (\u5beb\u5165, \u522a\u9664(!)),<br>\u4f60\u5fc5\u9808\u505a\u9019\u500b\u8a2d\u5b9a, <br>\u6b63\u5e38\u53ea\u5141\u8a31\u8b80.<br>\u4f7f\u7528\u9019\u529f\u80fd\u8981\u5c0f\u5fc3, \u56e0\u70ba\u60e1\u610f\u7684 scripts \u6703\u50b7\u5bb3\u4f60\u7684\u96fb\u8166!</body></html>
+OptionPanel.experimental_file_locking_on = \u5BE6\u9A57\u6027\u5C07\u6A94\u6848\u9396\u4F4F
+OptionPanel.experimental_file_locking_on.tooltip = <html> \u5be6\u9a57\u7684\u529f\u80fd</html>
+OptionPanel.export_icons_in_html = \u532f\u51fa HTML \u6642\u4e5f\u540c\u6642\u532f\u51fa\u5c0f\u5716\u793a
+OptionPanel.export_icons_in_html.tooltip = <html> \u5426\u5247\u532f\u51fa\u7684 html \u6703\u627e\u4e0d\u5230\u5c0f\u5716\u793a\u7684\u9023\u7d50.</html>
+OptionPanel.Files = \u6A94\u6848
+OptionPanel.first = \u7B2C\u4E00\u500B
+OptionPanel.fold_on_click_inside = \u9ede\u64ca\u5167\u90e8\u6642\u6298\u758a
+OptionPanel.foldingsymbolwidth = \u647a\u758a\u7bc0\u9ede\u7b26\u865f\u7684\u5bec\u5ea6
+OptionPanel.foldingsymbolwidth.tooltip = <html>\u4ee3\u8868\u4e0b\u5c64\u7bc0\u9ede\u647a\u758a\u7684\u5c0f\u5708\u7684\u5bec\u5ea6</html>
+OptionPanel.fork = \u5e95\u7dda
+OptionPanel.format_locale = \u683c\u5f0f\u9069\u7528\u5834\u5408
+OptionPanel.format_locale.tooltip = \u5c0d\u683c\u5f0f\u548c\u8cc7\u6599\u89e3\u6790\u7684\u9069\u7528\u5834\u5408\u8a2d\u5b9a
+OptionPanel.formula_disable_caching = \u4e0d\u4f7f\u7528\u516c\u5f0f\u8a08\u7b97\u7de9\u885d\u5340
+OptionPanel.formula_disable_plugin = \u4e0d\u4f7f\u7528\u516c\u5f0f\u8a08\u7b97
+OptionPanel.fr = Fran\u00e7ais (\u6cd5\u6587)
+OptionPanel.gl = Galego (\u683c\u9675\u862d\u6587)
+OptionPanel.goto_note_end_on_edit = \u79fb\u52d5\u8a3b\u89e3\u6307\u6a19\u5230\u5c3e\u7aef
+OptionPanel.grid_size = \u683c\u9ede\u9593\u683c\u5927\u5c0f
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = \u96b1\u85cf\u5206\u652f\u7dda
+OptionPanel.highlight_formulas = \u5f37\u8abf\u516c\u5f0f
+OptionPanel.horizontal = \u6c34\u5e73\u7dda
+OptionPanel.hr = Hrvatski (\u514b\u7f85\u57c3\u897f\u4e9e\u6587)
+OptionPanel.HTML = HTML \u8a2d\u5b9a
+OptionPanel.html_export_based_on_headings = \u6a19\u984c\u5f0f
+OptionPanel.html_export_fold_all = \u5168\u90e8\u647a\u758a
+OptionPanel.html_export_fold_currently_folded = \u647a\u758a\u76ee\u524d\u88ab\u647a\u758a\u7684
+OptionPanel.html_export_folding = \u532F\u51FAHTML
+OptionPanel.html_export_no_folding = \u4e0d\u647a\u758a
+OptionPanel.hu = Magyar (\u5308\u7259\u5229\u6587)
+OptionPanel.ic_disable = \u4e0d\u4f7f\u7528
+OptionPanel.ic_file = \u4f7f\u7528\u78c1\u789f
+OptionPanel.ic_ram = \u4f7f\u7528\u8a18\u61b6\u9ad4
+OptionPanel.icon = \u5c0f\u5716\u793a
+OptionPanel.icon.tooltip = \u5957\u7528\u7684\u8a71, \u7bc0\u9ede\u5c31\u6703\u6709\u9019\u500b\u5c0f\u5716\u793a.
+OptionPanel.icons.list = \u986f\u793a\u7684\u6a19\u6e96\u5c0f\u5716\u793a\u5217\u8868
+OptionPanel.icons.list.tooltip = \u4f60\u53ef\u4ee5\u6392\u5e8f\u6216\u8b93\u67d0\u4e9b\u5c0f\u5716\u793a\u7121\u6548. \u5c0f\u5716\u793a\u5fc5\u9808\u7528 ';' \u5206\u9694.
+OptionPanel.id = Bahasa Indonesia (\u5370\u5c3c\u6587)
+OptionPanel.IGNORE = \u5ffd\u7565
+OptionPanel.il__enter_confirms_by_default = \u5167\u5b9a\u78ba\u8a8d
+OptionPanel.image_cache = \u5716\u7247\u7528
+OptionPanel.it = Italiano (\u7fa9\u5927\u5229\u6587)
+OptionPanel.ja = \u65e5\u672c\u8a9e (\u65e5\u6587)
+OptionPanel.key_type_action = \u9375\u76e4\u6572\u64ca\u6642
+OptionPanel.Keystrokes = \u5FEB\u901F\u9375\u8A2D\u5B9A
+OptionPanel.ko = \ud55c\uad6d\uc5b4 / \uc870\uc120\ub9d0 (\u97d3\u6587/ \u671d\u9bae\u6587)
+OptionPanel.label_font_family = \u5b57\u578b
+OptionPanel.label_font_size = \u5B57\u578B\u5927\u5C0F
+OptionPanel.language = \u8A9E\u7CFB
+OptionPanel.language.tooltip = <html>\u7a0b\u5f0f\u8981\u7528\u7684\u8a9e\u6587. '\u81ea\u52d5\u5075\u6e2c\u8a9e\u7cfb' \u6703\u8a66\u8457\u8f09\u5165\u4f7f\u7528\u8005\u76ee\u524d\u7684\u8a9e\u6587. </html>
+OptionPanel.last = \u6700\u5f8c\u4e00\u500b
+OptionPanel.last_opened_list_length = \u5217\u51FA\u6700\u8FD1\u958B\u555F\u7684\u6A94\u6848\u6578\u91CF
+OptionPanel.layout_map_on_text_change = \u7de8\u8f2f\u6642\u66f4\u65b0\u5fc3\u667a\u5716
+OptionPanel.layout_map_on_text_change.tooltip = \u4e0d\u4f7f\u7528\u4ee5\u7372\u5f97\u66f4\u597d\u7684\u6548\u80fd
+OptionPanel.linear = \u76F4\u7DDA
+OptionPanel.links = \u8D85\u9023\u7D50
+OptionPanel.links.tooltip = <html>\u8a2d\u5b9a\u8d85\u9023\u7d50\u8def\u5f91\u662f\u7d55\u5c0d\u6216\u76f8\u5c0d </html>
+OptionPanel.load_folding = \u8f09\u5165\u6642
+OptionPanel.load_folding_from_map_default_fold_all = \u7bc0\u9ede\u647a\u758a\u72c0\u6cc1\u6839\u64da\u5fc3\u667a\u5716\u6a94\u7684\u8a18\u9304, \u5982\u5716\u6a94\u672a\u8a18\u9304, \u7bc0\u9ede\u5168\u90e8\u647a\u758a
+OptionPanel.load_folding_from_map_default_unfold_all = \u7bc0\u9ede\u647a\u758a\u72c0\u6cc1\u6839\u64da\u5fc3\u667a\u5716\u6a94\u7684\u8a18\u9304, \u5982\u5716\u6a94\u672a\u8a18\u9304, \u7bc0\u9ede\u5168\u90e8\u5c55\u958b
+OptionPanel.load_last_map = \u81ea\u52d5\u958b\u555f\u6700\u5f8c\u5132\u5b58\u7684\u5fc3\u667a\u5716
+OptionPanel.load_last_map.tooltip = <html>\u7576 freeplane \u958b\u555f\u6642, \u81ea\u52d5\u958b\u555f\u4e0a\u6b21\u5b58\u6a94\u7684\u5fc3\u667a\u5716.</html>
+OptionPanel.load_last_maps = \u81ea\u52d5\u958b\u555f\u4e0a\u6b21\u6240\u6709\u7684\u5fc3\u667a\u5716
+OptionPanel.lookandfeel = \u8996\u7A97\u98A8\u683C
+OptionPanel.lookandfeel.tooltip = <html>\u9078\u64c7\u60f3\u8981\u7684\u8996\u7a97\u5916\u89c0</html>
+OptionPanel.lt = Kalba (\u7acb\u9676\u5b9b\u6587)
+OptionPanel.max_displayed_node_count = \u6700\u5927\u986f\u793a\u7bc0\u9ede\u6578
+OptionPanel.max_image_width = \u6700\u5927\u521d\u59cb\u5716\u7247\u5bec\u5ea6
+OptionPanel.max_image_width.tooltip = \u65b0\u5716\u7247\u6703\u7e2e\u81f3\u9019\u500b\u5bec\u5ea6
+OptionPanel.max_menu_item_count = \u9078\u55ae\u9805\u76ee\u6700\u5927\u6578\u91cf
+OptionPanel.max_menu_item_count.tooltip = \u6bcf\u500b\u5b50\u9078\u55ae\u4e2d\u9805\u76ee\u7684\u9650\u5236\u6578\u91cf\uff0c\u6700\u5c0f\u8981\u8a2d\u70ba10
+OptionPanel.max_node_width = \u6700\u5927\u7BC0\u9EDE\u5BEC\u5EA6
+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.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)
+OptionPanel.nn = Norsk nynorsk (\u632a\u5a01\u8010\u8afe\u65af\u514b\u6587)
+OptionPanel.nodebackgroundcolor = \u7bc0\u9ede\u80cc\u666f\u984f\u8272
+OptionPanel.nodebackgroundcolor.tooltip = \u672a\u88ab\u9078\u53d6\u6642\u7684\u7bc0\u9ede\u80cc\u666f\u984f\u8272
+OptionPanel.nodecolor = \u7BC0\u9EDE\u984F\u8272
+OptionPanel.nodecolor.tooltip = \u672a\u88ab\u9078\u53d6\u6642\u7bc0\u9ede\u524d\u666f\u984f\u8272
+OptionPanel.nodefontbold = \u7c97\u9ad4\u5b57
+OptionPanel.nodefonthyperlink = \u8d85\u9023\u7d50
+OptionPanel.nodefontitalic = \u659c\u9ad4\u5b57
+OptionPanel.nodefontname = \u7BC0\u9EDE\u5B57\u578B\u540D\u7A31
+OptionPanel.nodefontsize = \u7BC0\u9EDE\u5B57\u578B\u5927\u5C0F
+OptionPanel.nodeformat = \u6578\u5b57\u683c\u5f0f
+OptionPanel.nodeformat.tooltip = <html>\u6587\u5b57\u66ff\u63db / \u683c\u5f0f:<ul><li><em>\u6a23\u5f0f\u64f4\u5145</em> (<tt>%s</tt> \u662f\u539f\u59cb\u6587\u5b57), \u4f8b\u5982 <tt>\u6ce8\u610f: %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)
+OptionPanel.nodeshape = \u7BC0\u9EDE\u6A23\u5F0F
+OptionPanel.nodeshape.tooltip = <html>\u7bc0\u9ede\u6a23\u5f0f\u63cf\u8ff0\u7bc0\u9ede\u7684\u5916\u89c0. <br>\u9078\u9805:<br><table border="1"><tr><td>\u53c9\u72c0: </td><td> \u6c92\u6709\u5916\u6846,</td></tr><tr><td>\u6ce1\u6ce1\u72c0: </td><td> \u7bc0\u9ede\u6709\u5713\u89d2\u5916\u6846,</td></tr><tr><td>\u8ddf\u7236\u7bc0\u9ede\u76f8\u540c: </td><td> \u63a1\u7528\u7236\u7bc0\u9ede\u7684\u6a23\u5f0f <br>\u6216\u5167\u5b9a\u7684\u4e3b\u7bc0\u9ede\u6a23\u5f0f,</td></tr><tr><td>\u6574\u5408: </td><td> \u7bc0\u9ede\u647a\u758a\u6642\u70ba\u6ce1\u6ce1\u72c0, \u5426\u5247\u70ba\u53c9\u72c0.</td></tr></table></html>
+OptionPanel.nodetext = \u7BC0\u9EDE\u6587\u5B57
+OptionPanel.nodetext.tooltip = \u5b9a\u7fa9\u7bc0\u9ede\u6587\u5b57, \u4e4b\u524d\u7684\u6587\u5b57\u6703\u88ab\u6368\u68c4.
+OptionPanel.nothing = \u53D6\u6D88\u5168\u9078
+OptionPanel.number_format = \u6a19\u6e96\u6578\u5b57\u683c\u5f0f
+OptionPanel.number_format.tooltip = \u6a23\u5f0f\u53ef\u5305\u542b '#' \u6216 '0' \u4f86\u8a2d\u5b9a\u5f37\u5236\u6578\u5b57\u683c\u5f0f, \u4f8b\u5982 "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = \u81EA\u52D5\u5132\u5B58\u6A94\u7684\u6578\u76EE
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> n \u500b\u4e0d\u540c\u7684\u6a94\u6848\u7528\u4f86\u5b58\u5fc3\u667a\u5716. \u7b2c1\u500b\u5fc3\u667a\u5716\u5b58\u5230\u7b2c1\u500b\u6a94\u6848, \u4f9d\u6b64\u985e\u63a8, \u7b2cn+1\u500b\u5fc3\u667a\u5716\u518d\u5b58\u56de\u7b2c1\u500b\u6a94\u6848 (\u5faa\u74b0)</html>
+OptionPanel.OK = \u5132\u5B58
+OptionPanel.org.freeplane.plugin.bugreport = \u653f\u7b56
+OptionPanel.org.freeplane.plugin.bugreport.allowed = \u6c38\u9060\u50b3\u9001
+OptionPanel.org.freeplane.plugin.bugreport.ask = \u986f\u793a\u5831\u544a\u5c0d\u8a71\u7a97
+OptionPanel.org.freeplane.plugin.bugreport.denied = \u6c38\u4e0d\u50b3\u9001
+OptionPanel.org.freeplane.plugin.bugreport.userid = \u4f7f\u7528\u8005
+OptionPanel.outline_hgap = \u6c34\u5e73\u9593\u8ddd
+OptionPanel.outline_vgap = \u5782\u76f4\u9593\u8ddd
+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, \u65e5\u671f-\u6642\u9593\u548c\u6578\u5b57\u8f38\u5165\u4e26\u5957\u7528\u6a19\u6e96\u683c\u5f0f. \u4f8b\u5982 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+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! \u8b8a\u66f4\u5df2\u6062\u5fa9.
+OptionPanel.patternname = \u540D\u7A31
+OptionPanel.patternname.tooltip = \u7368\u7279\u7684\u6a23\u7248\u540d\u7a31
+OptionPanel.pl = Polski (\u6ce2\u862d\u6587)
+OptionPanel.placenewbranches = \u65b0\u589e\u5b50\u7bc0\u9ede\u4f4d\u7f6e
+OptionPanel.placenewbranches.tooltip = <html>\u7b2c\u4e00\u500b\u6216\u6700\u5f8c\u4e00\u500b</html>
+OptionPanel.plugin.tooltip = \u975e\u6838\u5fc3\u63d2\u4ef6
+OptionPanel.plugins = \u63d2\u4ef6
+OptionPanel.presentation_dimmer_transparency = \u7c21\u5831\u6697\u8655\u7684\u900f\u660e\u5ea6
+OptionPanel.presentation_mode = \u7c21\u5831\u6a21\u5f0f
+OptionPanel.printonwhitebackground = <html>\u5217\u5370\u6642\u4f7f\u7528\u767d\u8272\u5e95\u8272</html>
+OptionPanel.printonwhitebackground.tooltip = <html>\u5217\u5370\u6642\u7E3D\u662F\u4F7F\u7528\u767D\u5E95\u7576\u80CC\u666F</html>
+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.relative = \u76F8\u5C0D
+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\u591a\u6587\u672c\u683c\u5f0f (RTF) \u8cbc\u4e0a
+OptionPanel.remove_notes_without_question = \u4e0d\u8a62\u554f\u5c31\u79fb\u9664\u8a3b\u89e3?
+OptionPanel.remove_notes_without_question.tooltip = \u5982\u52fe\u9078, \u53ef\u80fd\u6703\u4e0d\u5c0f\u5fc3\u8aa4\u522a\u8a3b\u89e3
+OptionPanel.resources_use_default_font_for_notes_too = \u8a3b\u89e3\u4e5f\u4f7f\u7528\u9810\u8a2d\u5b57\u578b
+OptionPanel.resources_use_margin_top_zero_for_notes = \u79fb\u9664\u8a3b\u89e3\u4e0a\u908a\u754c
+OptionPanel.revision_color = \u88ab\u4fee\u8a02\u7bc0\u9ede\u7684\u80cc\u666f\u984f\u8272
+OptionPanel.revision_color.tooltip = \u88ab\u4fee\u8a02\u7bc0\u9ede\u7684\u80cc\u666f\u984f\u8272
+OptionPanel.ROUND_RECT = \u5713\u89d2\u77e9\u5f62
+OptionPanel.ru = \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a (\u4fc4\u6587)
+OptionPanel.save_folding = \u5132\u5b58\u647a\u758a
+OptionPanel.save_folding_if_map_is_changed = \u5982\u679c\u5fc3\u667a\u5716\u6709\u6539\u8b8a
+OptionPanel.save_modification_times = \u5132\u5b58\u4fee\u6539\u6642\u9593
+OptionPanel.script_classpath = Script \u985e\u5225\u8def\u5f91
+OptionPanel.script_classpath.tooltip = <html>\u7528\u4f86\u52a0\u5165 script \u548c\u516c\u5f0f\u7684\u985e\u5225\u8def\u5f91\u7684 JAR \u548c\u76ee\u9304\u5217\u8868.<br>\u4f7f\u7528 ; (Windows) \u6216 : (Linux, Mac) \u4f86\u5206\u9694.<br>\u76ee\u9304\u6703\u88ab\u6383\u63cf\u627e JAR \u548c .class \u6a94.<br>\u8def\u5f91\u5982\u679c\u4e0d\u662f\u7d55\u5c0d\u8def\u5f91, \u5c07\u88ab\u8996\u70ba\u76f8\u5c0d\u65bc Freeplane \u7684\u4f7f\u7528\u8005\u76ee\u9304.<br>\u5982\u679c\u4f60\u8a2d\u5b9a\u985e\u5225\u8def\u5f91\uff0c!</html>\u5982\u679c\u4f60\u8a2d\u5b9a\u985e\u5225\u8def\u5f91, \u4f60\u4e5f\u5fc5\u9808\u5141\u8a31\u8b80\u53d6!
+OptionPanel.script_directories = Script \u641c\u5c0b\u8def\u5f91 (\u4ee5 ; \u5206\u9694)
+OptionPanel.script_directories.tooltip = <html>\u76ee\u9304\u5217\u8868.<br>\u4f7f\u7528 ; (Windows) \u6216 : (Linux, Mac) \u4f86\u5206\u9694.<br>\u8def\u5f91\u5982\u679c\u4e0d\u662f\u7d55\u5c0d\u8def\u5f91, \u5c07\u88ab\u8996\u70ba\u76f8\u5c0d\u65bc Freeplane \u7684\u4f7f\u7528\u8005\u76ee\u9304.</html>
+OptionPanel.script_user_key_name_for_signing = \u9078\u64c7\u6027\u7684\u4f7f\u7528\u8005\u6309\u9375\u5225\u540d\u7c3d\u7f72
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>\u5982\u679c\u60f3\u7c3d\u7f72\u81ea\u5df1\u7684\u6307\u4ee4, \u5728\u6b64\u8f38\u5165\u5bc6\u9470\u7684\u5225\u540d. <br>\u5bc6\u9470\u5728\u5167\u5b9a\u7684\u5bc6\u78bc\u5eab\u5167. <br>\u5bc6\u9470\u7684\u5bc6\u78bc\u5fc5\u9808\u548c\u5bc6\u9470\u5eab\u5167\u5b9a\u7684\u5bc6\u78bc\u4e00\u81f4.</html>
+OptionPanel.scrollbar_increment = \u6372\u8ef8\u901f\u5ea6
+OptionPanel.scrolling_speed = \u5fc3\u667a\u5716\u81ea\u52d5\u6372\u52d5\u901f\u5ea6
+OptionPanel.selection_method = \u7BC0\u9EDE\u9078\u53D6\u6A21\u5F0F
+OptionPanel.selection_method.tooltip = <html> \u8a2d\u5b9a\u7bc0\u9ede\u5982\u4f55\u88ab\u9078\u53d6.</html>
+OptionPanel.selection_method_by_click = \u6309\u4E0B\u6ED1\u9F20\u9375\u9078\u53D6
+OptionPanel.selection_method_delayed = \u6ed1\u9f20\u63a5\u89f8\u4e00\u6bb5\u6642\u9593\u5f8c\u9078\u53d6
+OptionPanel.selection_method_direct = \u6ed1\u9f20\u63a5\u89f8\u5f8c\u76f4\u63a5\u9078\u53d6
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = \u81ea\u52d5\u6392\u7248\u7684\u6a23\u677f
+OptionPanel.separator.anti_alias = \u53BB\u92F8\u9F52
+OptionPanel.separator.attributes = \u5C6C\u6027
+OptionPanel.separator.automatic_save = \u81EA\u52D5\u5132\u5B58
+OptionPanel.separator.behaviour = \u7DE8\u8F2F\u884C\u70BA\u8A2D\u5B9A
+OptionPanel.separator.browser = \u700F\u89BD\u5668\u8A2D\u5B9A
+OptionPanel.separator.cache = \u7de9\u885d\u5340
+OptionPanel.separator.CloudControls = \u96f2
+OptionPanel.separator.commands_for_the_program = \u7a0b\u5f0f\u7684\u63a7\u5236\u547d\u4ee4
+OptionPanel.separator.connectors = \u9023\u7d50\u7dda
+OptionPanel.separator.data_formats = \u8cc7\u6599\u683c\u5f0f\u548c\u89e3\u6790
+OptionPanel.separator.default_colors = \u9810\u8A2D\u984F\u8272
+OptionPanel.separator.default_fonts = \u9810\u8A2D\u5B57\u578B
+OptionPanel.separator.default_styles = \u9810\u8a2d\u7bc0\u9ede\u6a23\u5f0f
+OptionPanel.separator.EdgeControls = \u5206\u652f\u7dda
+OptionPanel.separator.edit_long_node_window = \u7bc0\u9ede\u7de8\u8f2f\u8996\u7a97
+OptionPanel.separator.editing = \u7de8\u8f2f\u5668\u8a2d\u5b9a
+OptionPanel.separator.files = \u6A94\u6848
+OptionPanel.separator.formula = \u516c\u5f0f
+OptionPanel.separator.General = \u4E00\u822C
+OptionPanel.separator.html_export = \u532f\u51fa HTML
+OptionPanel.separator.html_import = \u532f\u5165 HTML
+OptionPanel.separator.hyperlink_types = \u8D85\u9023\u7D50\u8A2D\u5B9A
+OptionPanel.separator.icon_properties = \u5c0f\u5716\u793a
+OptionPanel.separator.icons = \u5c0f\u5716\u793a\u5feb\u901f\u9375 (\u9ede\u9078\u5c0f\u65b9\u6846\u7de8\u8f2f)
+OptionPanel.separator.initial_map_size = \u9810\u8A2D\u5FC3\u667A\u5716\u5927\u5C0F
+OptionPanel.separator.inline_editor = \u7dda\u5167\u7bc0\u9ede\u7de8\u8f2f\u5668
+OptionPanel.separator.key_typing = \u9375\u76e4\u6572\u64ca
+OptionPanel.separator.language = \u8A9E\u7CFB
+OptionPanel.separator.load = \u8f09\u5165
+OptionPanel.separator.look_and_feel = \u8996\u7A97\u98A8\u683C
+OptionPanel.separator.mouse_wheel = \u6ed1\u9f20\u6efe\u8f2a
+OptionPanel.separator.new_node_commands = \u65B0\u7BC0\u9EDE
+OptionPanel.separator.node_editing_commands = \u7BC0\u9EDE\u7DE8\u8F2F\u547D\u4EE4
+OptionPanel.separator.node_navigation_commands = \u7BC0\u9EDE\u5C0E\u89BD
+OptionPanel.separator.NodeColors = \u7BC0\u9EDE\u984F\u8272
+OptionPanel.separator.NodeFont = \u7BC0\u9EDE\u5B57\u578B
+OptionPanel.separator.NodeShape = \u7bc0\u9ede\u5f62\u72c0
+OptionPanel.separator.NodeStyle = \u7bc0\u9ede\u6a23\u5f0f
+OptionPanel.separator.NodeText = \u6838\u5fc3\u6587\u5b57
+OptionPanel.separator.notifications = \u78BA\u8A8D\u6846
+OptionPanel.separator.org.freeplane.plugin.bugreport = \u81ea\u52d5\u932f\u8aa4\u5831\u544a
+OptionPanel.separator.other_defaults = \u5176\u4ED6\u9810\u8A2D\u503C
+OptionPanel.separator.others = \u5176\u4ED6\u529F\u80FD
+OptionPanel.separator.outline_view = \u5916\u89c0 (\u7bc0\u9ede\u9593\u8ddd)
+OptionPanel.separator.patterns = \u6A23\u677F
+OptionPanel.separator.RichTextEditor = \u591a\u6587\u672c (Rich-Text) \u7de8\u8f2f\u5668
+OptionPanel.separator.root_node_appearance = \u4E3B\u7BC0\u9EDE\u5916\u89C0
+OptionPanel.separator.save = \u5132\u5B58
+OptionPanel.separator.scripting = Scripting
+OptionPanel.separator.scrollbar = \u6372\u8ef8
+OptionPanel.separator.search = \u641c\u5c0b
+OptionPanel.separator.selection_colors = \u88ab\u9078\u53d6\u7bc0\u9ede\u7684\u984f\u8272\u8a2d\u5b9a
+OptionPanel.separator.selection_method = \u7BC0\u9EDE\u9078\u53D6\u6A21\u5F0F
+OptionPanel.separator.single_instance_mode = \u55ae\u4e00\u7a0b\u5f0f\u57f7\u884c\u6a21\u5f0f
+OptionPanel.separator.size_limits = \u5927\u5c0f\u9650\u5236
+OptionPanel.separator.spelling = \u62fc\u5b57\u6aa2\u67e5\u9078\u9805
+OptionPanel.separator.status = \u72c0\u614b\u5217
+OptionPanel.separator.tooltip = \u5de5\u5177\u63d0\u793a\u6642\u9593
+OptionPanel.separator.undo = \u5fa9\u539f
+OptionPanel.separator.updates = \u7a0b\u5f0f\u66f4\u65b0
+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?
+OptionPanel.setscript.tooltip = \u6307\u4ee4\u5c07\u548c\u76ee\u524d\u8a2d\u5b9a\u7684\u6a23\u5f0f\u76f8\u95dc\u806f.
+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
+OptionPanel.show_node_tooltips = \u986f\u793a\u7bc0\u9ede\u63d0\u793a
+OptionPanel.show_note_icons = \u986f\u793a\u8a3b\u89e3\u5c0f\u5716\u793a
+OptionPanel.show_styles_in_tooltip = -- \u986f\u793a\u7bc0\u9ede\u6a23\u5f0f
+OptionPanel.signed_script_are_trusted = \u81ea\u52d5\u4fe1\u4efb\u7c3d\u7f72\u904e\u7684\u6307\u4ee4
+OptionPanel.signed_script_are_trusted.tooltip = \u5047\u5982\u6b64\u6307\u4ee4\u662f\u7c3d\u7f72\u904e\u7684\u6307\u4ee4, \u5982 Freeplane \u7684\u4f5c\u8005, \u6b64\u6307\u4ee4\u662f\u53ef\u4ee5\u4e0d\u53d7\u9650\u5236\u5c31\u57f7\u884c.
+OptionPanel.simplyhtml.default_paste_mode = \u5167\u5b9a\u8cbc\u4e0a\u6a21\u5f0f
+OptionPanel.single_backup_directory = \u4f7f\u7528\u55ae\u4e00\u76ee\u9304\u7d66\u5099\u4efd\u6a94\u6848
+OptionPanel.single_backup_directory.tooltip = <html>\u5982\u679c\u5099\u4efd\u6a94\u6848\u548c\u81ea\u52d5\u5132\u5b58\u6a94\u6848\u8981\u653e\u5728\u55ae\u4e00\u76ee\u9304\u800c\u4e0d\u662f\u5728\u5fc3\u667a\u5716\u6240\u5728\u76ee\u9304\u7684\u5b50\u76ee\u9304</html>
+OptionPanel.single_backup_directory_path = \u5099\u4efd\u6a94\u6848\u76ee\u9304 (\u5982\u679c\u9078\u53d6\u4e0a\u8ff0\u9078\u9805)
+OptionPanel.single_backup_directory_path.tooltip = <html>\u53d6\u4ee3 freeplane \u5167\u5b9a\u5099\u4efd\u76ee\u9304</html>
+OptionPanel.single_instance = \u5728\u57f7\u884c\u7684\u7a0b\u5f0f\u4e2d\u958b\u555f\u6a94\u6848
+OptionPanel.single_instance_force = \u7a0b\u5f0f\u4e0d\u91cd\u8907\u958b\u555f
+OptionPanel.single_instance_force.tooltip = \u907f\u514d Freeplane \u7a0b\u5f0f\u91cd\u8907\u57f7\u884c\uff0c\u5373\u4f7f\u6c92\u6709\u6a94\u6848\u8f09\u5165
+OptionPanel.sk = Sloven\u010dina (\u65af\u6d1b\u4f10\u514b\u6587)
+OptionPanel.sl = Sloven\u0161\u010dina (\u65af\u6d1b\u7dad\u5c3c\u4e9e\u6587)
+OptionPanel.spelling_opt_case_sensitive = \u5340\u5206\u5927\u5c0f\u5beb
+OptionPanel.spelling_opt_ignore_all_caps_words = \u5ffd\u7565\u5168\u5927\u5beb\u7684\u5b57
+OptionPanel.spelling_opt_ignore_capitalization = \u5ffd\u7565\u5b57\u958b\u982d\u7684\u5927\u5beb\u5b57\u6bcd
+OptionPanel.spelling_opt_ignore_words_with_numbers = \u5ffd\u7565\u6709\u6578\u5b57\u7684\u5b57
+OptionPanel.spelling_opt_suggestions_limit_dialog = \u5c0d\u8a71\u7a97\u4e2d\u5efa\u8b70\u7684\u6700\u5927\u6578\u91cf
+OptionPanel.spelling_opt_suggestions_limit_menu = \u9078\u55ae\u4e2d\u5efa\u8b70\u7684\u6700\u5927\u6578\u91cf
+OptionPanel.sr = \u0441\u0440\u043f\u0441\u043a\u0438 (\u585e\u723e\u7dad\u4e9e\u6587)
+OptionPanel.standard_template = \u6a19\u6e96\u6a23\u7248\u6a94\u6848
+OptionPanel.standardbackgroundcolor = \u7bc0\u9ede\u80cc\u666f\u984f\u8272
+OptionPanel.standardbackgroundcolor.tooltip = <html>\u7bc0\u9ede\u80cc\u666f\u984f\u8272 (\u7528 html #RRGGBB \u8868\u793a\u6cd5)</html>
+OptionPanel.standardcloudcolor = \u96f2\u7684\u984f\u8272
+OptionPanel.standardcloudcolor.tooltip = <html>\u96f2\u7684\u984f\u8272 (\u7528 html #RRGGBB \u8868\u793a\u6cd5)</html>
+OptionPanel.standardcloudestyle = \u96f2\u7684\u6a23\u5f0f
+OptionPanel.standardcloudestyle.tooltip = <html>\u96f2\u7684\u6a23\u5f0f. </html>
+OptionPanel.standarddrawrectangleforselection = \u88ab\u9078\u53d6\u7684\u7bc0\u9ede\u4ee5\u6ce1\u6ce1\u6a19\u793a\u51fa\u4f86
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>\u5c07\u88ab\u9078\u53d6\u7684\u7bc0\u9ede\u4ee5\u6ce1\u6ce1\u5305\u4f4f</html>
+OptionPanel.standardlinkcolor = \u9023\u7d50\u7dda\u984f\u8272
+OptionPanel.standardlinkcolor.tooltip = <html>\u9023\u7d50\u7dda\u984f\u8272 (\u7528 html #RRGGBB \u8868\u793a\u6cd5)</html>
+OptionPanel.standardlinkestyle = \u9023\u7d50\u7dda\u6a23\u5f0f
+OptionPanel.standardlinkestyle.tooltip = <html>\u9023\u7d50\u7dda\u6a23\u5f0f. \u76ee\u524d\u53ea\u652f\u63f4\u8c9d\u6c0f\u66f2\u7dda.</html>
+OptionPanel.standardselectednodecolor = \u88ab\u9078\u53d6\u6642\u7684\u7bc0\u9ede\u984f\u8272
+OptionPanel.standardselectednodecolor.tooltip = <html>\u88ab\u9078\u53d6\u6642\u7684\u7bc0\u9ede\u984f\u8272 (\u7528 html #RRGGBB \u8868\u793a\u6cd5)</html>
+OptionPanel.standardselectednoderectanglecolor = \u88ab\u9078\u53d6\u6642\u7684\u7bc0\u9ede\u7684\u6ce1\u6ce1\u984f\u8272
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>\u88ab\u9078\u53d6\u6642\u7684\u6ce1\u6ce1\u7684\u984f\u8272 (\u7528 html #RRGGBB \u8868\u793a\u6cd5) </html>
+OptionPanel.STAR = \u661f\u72c0
+OptionPanel.structured_html_import = \u532f\u5165 HTML \u7bc0\u9ede\u7d50\u69cb
+OptionPanel.structured_icon_toolbar = \u7d50\u69cb\u5316\u5c0f\u5716\u793a\u5de5\u5177\u5217
+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.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, \u55ae\u4f4d: \u6beb\u79d2 (msec). \u5982\u4e0d\u81ea\u52d5\u5132\u5b58\u8acb\u8a2d\u5b9a 2000000000.</html>
+OptionPanel.time_for_delayed_selection = \u5ef6\u9072\u6642\u9593\u8a2d\u5b9a (\u6beb\u79d2, ms)
+OptionPanel.time_for_delayed_selection.tooltip = <html> \u6ed1\u9f20\u79fb\u5230\u7bc0\u9ede\u5f8c\u8d85\u904e\u6b64\u5ef6\u9072\u6642\u9593\u6703\u9078\u53d6\u8a72\u7bc0\u9ede, \u55ae\u4f4d: \u6beb\u79d2 (msec). \u5982\u679c\u6ed1\u9f20\u4e00\u79fb\u5230\u7bc0\u9ede\u4e0a\u5c31\u8981\u9078\u53d6, \u8a2d\u5b9a 1.</html>
+OptionPanel.toolTipManager.dismissDelay = \u986f\u793a\u6642\u9593 (\u6beb\u79d2, ms)
+OptionPanel.toolTipManager.initialDelay = \u521d\u59cb\u5ef6\u9072\u6642\u9593 (\u6beb\u79d2, ms)
+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.</html>
+OptionPanel.toolTipManager.reshowDelay = \u91cd\u65b0\u986f\u793a\u5ef6\u9072\u6642\u9593 (\u6beb\u79d2, ms)
+OptionPanel.tr = T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d (\u571f\u5eab\u66fc\u6587)
+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.</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.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
+OptionPanel.use_tabbed_pane.tooltip = \u985e\u4f3cFireFox \u6216 IE \u7684\u9801\u7c3d\u529f\u80fd
+OptionPanel.user_defined_screen_resolution = \u4f7f\u7528\u8005\u5b9a\u7fa9\u7684\u87a2\u5e55\u89e3\u6790\u5ea6 (dpi)
+OptionPanel.validate_classpath_needs_readaccess = Scripting: \u8a2d\u5b9a\u985e\u5225\u8def\u5f91\u6642\u5fc5\u9808\u5141\u8a31\u6a94\u6848\u8b80\u53d6
+OptionPanel.validate_invalid_date_format = \u7121\u6548\u7684\u65e5\u671f\u683c\u5f0f
+OptionPanel.validate_invalid_datetime_format = \u7121\u6548\u7684\u65e5\u671f-\u6642\u9593\u683c\u5f0f
+OptionPanel.validate_invalid_number_format = \u7121\u6548\u7684\u6578\u5b57\u683c\u5f0f
+OptionPanel.validate_write_without_read = Scripting: \u8003\u616e\u5c07 Read/File \u52a0\u5230 Write/File.
+OptionPanel.validation_error = <html><body>\u9a57\u8b49\u932f\u8aa4:<p><em>{0}</em><p>\u8acb\u4fee\u6539\u8a2d\u5b9a.</body></html>
+OptionPanel.validation_warning = <html><body>\u9a57\u6b63\u8b66\u544a:<p><em>{0}</em></body></html>
+OptionPanel.vi = Ti\u1ebfng Vi\u1ec7t (\u8d8a\u5357\u6587)
+OptionPanel.wheel_velocity = \u901F\u5EA6
+OptionPanel.wheel_velocity.tooltip = \u503c\u8d8a\u5927, \u6ed1\u9f20\u6efe\u8f2a\u5728\u5716\u4e0a\u79fb\u52d5\u7684\u6548\u61c9\u8d8a\u5feb.
+OptionPanel.windows = \u8996\u7a97
+OptionPanel.zh_CN = \u7C21\u9AD4\u4E2D\u6587
+OptionPanel.zh_TW = \u6B63\u9AD4\u4E2D\u6587
+org.freeplane.plugin.bugreport.agree = \u9001\u51fa
+org.freeplane.plugin.bugreport.always_agree = \u6c38\u9060\u9001\u51fa
+org.freeplane.plugin.bugreport.always_deny = \u6c38\u4e0d\u9001\u51fa
+org.freeplane.plugin.bugreport.deny = \u4e0d\u8981\u9001\u51fa
+org.freeplane.plugin.bugreport.dialog.title = \u81ea\u52d5\u932f\u8aa4\u5831\u544a
+org.freeplane.plugin.bugreport.freeplane_team = Freeplane \u5718\u968a\u8a0a\u606f
+org.freeplane.plugin.bugreport.lastreport = \u6536\u5230\u7684\u5831\u544a
+org.freeplane.plugin.bugreport.never = \u6c38\u4e0d\u6c42\u52a9
+org.freeplane.plugin.bugreport.question = Freeplane \u6709\u81ea\u52d5\u932f\u8aa4\u8ffd\u8e64\u5f15\u64ce.
+org.freeplane.plugin.bugreport.report = \u76ee\u524d\u7684\u5831\u544a
+org.freeplane.plugin.bugreport.wanted_bug = \u5167\u90e8\u932f\u8aa4\u767c\u751f\u4e26\u4e14\u5df2\u81ea\u52d5\u56de\u5831.
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = \u7bc0\u9ede {0} \u6c92\u6709\u5b9a\u7fa9
+out_of_memory = \u8a18\u61b6\u9ad4\u4e0d\u8db3
+overwrite_keyset_question = \u8986\u5beb\u5b58\u5728\u7684\u6309\u9375\u96c6
+PageAction.text = \u8A2D\u5B9A\u5217\u5370\u683C\u5F0F...
+password_is_not_ascii = \u5bc6\u78bc\u4e0d\u662f ASCII \u78bc
+PasteAction.text = \u8CBC\u4E0A
+PasteAttributes.text = \u8cbc\u4e0a\u5c6c\u6027
+PatternNewNameProperty = \u65B0\u6A23\u677F
+PatternToString.backgroundColor = \u80cc\u666f\u984f\u8272
+PatternToString.Child = \u5B50\u7BC0\u9EDE\u6A23\u5F0F
+PatternToString.color = \u984F\u8272
+PatternToString.EdgeColor = \u5206\u652f\u7dda\u984f\u8272
+PatternToString.EdgeStyle = \u5206\u652f\u7dda\u6a23\u5f0f
+PatternToString.EdgeWidth = \u5206\u652f\u7dda\u5bec\u5ea6
+PatternToString.FontBold = \u7C97\u9AD4
+PatternToString.FontItalic = \u659C\u9AD4
+PatternToString.FontName = \u5b57\u578b
+PatternToString.Icon = \u5c0f\u5716\u793a
+PatternToString.NodeFontSize = \u5B57\u578B\u5927\u5C0F
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = \u5929
+PeriodUnit.HOUR = \u5c0f\u6642
+PeriodUnit.MINUTE = \u5206\u9418
+PeriodUnit.MONTH = \u6708
+PeriodUnit.WEEK = \u9031
+PeriodUnit.YEAR = \u5e74
+plugins/latex/LatexNodeHook.editorTitle = \u7de8\u8f2f LateX
+plugins/script_filter = Script \u7be9\u9078\u5668 {0}
+plugins/script_filter_error = {0} had to return a boolean result on {1} but returned {2}
+plugins/ScriptEditor.cancel = \u96e2\u958b (\u4e0d\u5132\u5b58)
+plugins/ScriptEditor.exit = \u5132\u5B58\u5F8C\u96E2\u958B
+plugins/ScriptEditor.FORBIDDEN_ACTION = \u7981\u6b62\u7684\u6307\u4ee4. \u7981\u6b62\u57f7\u884c {0,choice,0#File|1#Network|2#Exec}: {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\u5f0f\u8a2d\u5b9a\u4e2d\u4fee\u6539.
+plugins/ScriptEditor.menu_actions = \u57F7\u884C
+plugins/ScriptEditor.new_script = \u65B0\u6307\u4EE4
+plugins/ScriptEditor.run = \u57F7\u884C
+plugins/ScriptEditor.sign = \u7c3d\u7f72\u6307\u4ee4...
+plugins/ScriptEditor/window.Result = \u7d50\u679c:
+plugins/ScriptEditor/window.title = \u6307\u4EE4\u7DE8\u8F2F\u5668
+plugins/ScriptingEngine.illegalAccessToInternalAPI = \u975e\u6cd5\u63a5\u89f8\u5167\u90e8 API (package {0}). \u5982\u679c API \u4e0d\u5920\u529b\u8acb\u806f\u7d61 freeplane \u5718\u968a.
+plugins/TimeList.xml_Created = \u65B0\u589E
+plugins/TimeList.xml_Date = \u65E5\u671F
+plugins/TimeList.xml_Icons = \u5c0f\u5716\u793a
+plugins/TimeList.xml_Modified = \u4FEE\u6539
+plugins/TimeList.xml_Notes = \u8A3B\u89E3
+plugins/TimeList.xml_Text = \u5167\u5BB9
+plugins/TimeManagement.xml_appendButton = \u52A0\u4E0A\u65E5\u671F
+plugins/TimeManagement.xml_Cancel = \u53D6\u6D88
+plugins/TimeManagement.xml_cancelButton = \u53D6\u6D88
+plugins/TimeManagement.xml_closeButton = \u95DC\u9589
+plugins/TimeManagement.xml_Export = \u532f\u51fa\u6240\u9078\u53d6\u7684\u7bc0\u9ede
+plugins/TimeManagement.xml_Find = \u5C0B\u627E
+plugins/TimeManagement.xml_Goto = \u5230
+plugins/TimeManagement.xml_hour = \u6642:
+plugins/TimeManagement.xml_menu_actions = \u53EF\u57F7\u884C\u7684\u547D\u4EE4
+plugins/TimeManagement.xml_minute = \u5206:
+plugins/TimeManagement.xml_reminderButton = \u6B64\u65E5\u671F\u5230\u7684\u6642\u5019\u63D0\u9192\u6211
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>\u6309\u4e0b\u5f8c\u8a08\u6642\u5668\u88ab\u8a2d\u5b9a\u5230\u6307\u5b9a\u7684\u6642\u9593. \u6703\u6709\u9583\u720d\u7684\u5c0f\u5716\u793a\u4f86\u5438\u5f15\u4f60\u7684\u6ce8\u610f.<br>\u5982\u95dc\u6389\u5fc3\u667a\u5716, \u4e0b\u6b21\u958b\u555f\u5fc3\u667a\u5716\u6642\u8a08\u6642\u5668\u6703\u6062\u5fa9\u4f5c\u7528.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>\u76ee\u524d\u6bcf\u500b\u7bc0\u9ede\u53ea\u80fd\u6709\u4e00\u500b\u8a08\u6642\u5668. <br>\u76ee\u524d\u7684\u63d0\u9192\u8a08\u756b\u5728 {0,date} {0,time}, \u4f60\u7684\u9078\u64c7\u662f {1,date} {1,time}. <br><br>\u4f60\u60f3\u6539\u8b8a\u63d0\u9192\u6642\u9593 (YES) <br>\u6216\u4f60\u60f3\u7dad\u6301\u820a\u7684 (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = \u8a08\u756b\u5728{0,date} {0,time} \u63d0\u9192.
+plugins/TimeManagement.xml_remindLaterButton = \u7a0d\u5f8c\u63d0\u9192
+plugins/TimeManagement.xml_remindLaterButton_tooltip = \u7a0d\u5f8c\u63d0\u9192
+plugins/TimeManagement.xml_removeReminderButton = \u79FB\u9664\u63D0\u9192\u529F\u80FD
+plugins/TimeManagement.xml_removeReminderButton_tooltip = \u79fb\u9664\u9078\u53d6\u7bc0\u9ede\u7684\u6240\u6709\u63d0\u9192\u529f\u80fd.
+plugins/TimeManagement.xml_Replace = \u53D6\u4EE3
+plugins/TimeManagement.xml_Replace_All = \u5168\u90E8\u53D6\u4EE3
+plugins/TimeManagement.xml_Replace_Selected = \u53D6\u4EE3
+plugins/TimeManagement.xml_Select = \u9078\u64C7
+plugins/TimeManagement.xml_todayButton = \u4ECA\u5929
+plugins/TimeManagement.xml_WindowTitle = \u6642\u9593\u7BA1\u7406
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = \u641C\u5C0B(\u53D6\u4EE3)
+preferences = \u5C6C\u6027\u8A2D\u5B9A
+print_preview_title = \u9810\u89BD\u5217\u5370
+PrintAction.text = \u5217\u5370...
+PrintDirectAction.text = \u5217\u5370
+printing_settings = \u5217\u5370\u8a2d\u5b9a
+PrintPreviewAction.text = \u9810\u89bd\u5217\u5370...
+PropertyAction.dialog = \u500b\u4eba\u5316\u8a2d\u5b9a
+PropertyAction.text = \u500b\u4eba\u5316\u8a2d\u5b9a ...
+QuickFilterAction.text = \u5feb\u901f\u7be9\u9078
+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 = \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. <br>\u8981\u8f49\u63db\u55ce (\u5efa\u8b70)? <br>(\u5426\u5247\u7d50\u679c\u7121\u6cd5\u4fdd\u8b49.) </html>
+really_cut_node = \u78BA\u5B9A\u8981\u526A\u4E0B\u7BC0\u9EDE?
+really_execute_script = \u4F60\u78BA\u5B9A\u8981\u57F7\u884C\u5728\u6B64\u5716\u88E1\u8A2D\u5B9A\u7684\u6307\u4EE4\u55CE?(\u9019\u53EF\u80FD\u6703\u5371\u5BB3\u60A8\u7684\u96FB\u8166)
+really_remove_node = \u771F\u7684\u8981\u522A\u9664\u7BC0\u9EDE?
+really_remove_notes = \u771F\u7684\u8981\u79FB\u9664\u8A3B\u89E3\u55CE?
+ReapplyFilterAction.text = \u91cd\u65b0\u5957\u7528
+red = \u7d05\u8272
+RedefineStyleAction.text = \u91cd\u65b0\u5b9a\u7fa9\u6a23\u5f0f
+RedoAction.text = \u53d6\u6d88\u5fa9\u539f
+RedoFilterAction.text = \u53d6\u6d88\u5fa9\u539f
+regular_expressions = \u4e00\u822c\u8868\u793a
+ReminderHookAction.text = \u79FB\u9664\u63D0\u9192\u529F\u80FD
+ReminderHookAction.tooltip = \u79FB\u9664\u7BC0\u9EDE\u6240\u8A2D\u5B9A\u7684\u63D0\u9192\u8A2D\u5B9A
+remove_file_from_list_on_error = \u6a94\u6848 {0} \u7121\u6cd5\u958b\u555f. \u5c07\u5b83\u5f9e\u4e0a\u6b21\u958b\u555f\u7684\u6a94\u6848\u540d\u55ae\u4e2d\u79fb\u9664?
+remove_shortcut_question = \u53d6\u4ee3\u5feb\u901f\u9375?
+RemoveAllIconsAction.text = \u79fb\u9664\u6240\u6709\u5c0f\u5716\u793a
+RemoveConnectorAction.text = \u79fb\u9664\u9023\u7d50\u7dda
+RemoveEncryption.text = \u79fb\u9664\u5bc6\u78bc
+RemoveFormatAction.text = \u79fb\u9664\u683c\u5f0f
+RemoveIcon_0_Action.text = \u79fb\u9664\u7b2c\u4e00\u500b\u5c0f\u5716\u793a
+RemoveIconAction.text = \u79fb\u9664\u6700\u5f8c\u4e00\u500b\u5c0f\u5716\u793a
+RemoveNoteAction.text = \u79FB\u9664\u8A3B\u89E3
+RemoveNoteAction.tooltip = <html>\u79fb\u9664\u53ef\u80fd\u7684\u591a\u500b\u8a3b\u89e3.</html>
+rename = \u66F4\u6539\u540D\u7A31
+repair_link = \u4FEE\u5FA9\u9023\u7D50
+repair_link_question = \u4e0d\u80fd\u8f09\u5165\u5fc3\u667a\u5716. \u624b\u52d5\u4fee\u5fa9\u9023\u7d50?
+replace = \u53D6\u4EE3
+replace_shortcut_question = \u9019\u500b\u5feb\u901f\u9375\u5df2\u7d93\u6307\u5b9a\u7d66\n {0}.\n\u53d6\u4ee3\u9019\u500b\u8a2d\u5b9a?
+replace_shortcut_title = \u53d6\u4ee3\u5feb\u901f\u9375?
+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 = \u91cd\u8a2d\u7bc0\u9ede\u4f4d\u7f6e
+ResetStyleAction.text = \u91cd\u8a2d\u7bc0\u9ede\u6a23\u5f0f
+RevertAction.text = \u9084\u539f\u81f3\u4e0a\u6b21\u5132\u5b58\u72c0\u614b
+RevisionPluginAction.text = \u6539\u8b8a\u88ab\u4fee\u8a02\u7bc0\u9ede\u7684\u80cc\u666f\u984f\u8272
+save_failed = \u5fc3\u667a\u5716 {0} \u5132\u5b58\u5931\u6557.
+save_unsaved = \u5132\u5b58\u4ee5\u4e0b\u5fc3\u667a\u5716? :
+save_unsaved_styles = \u5132\u5b58\u6a23\u5f0f?
+SaveAcceleratorPresetsAction.text = \u5132\u5b58\u5feb\u901f\u9375\u96c6
+SaveAction.text = \u5B58\u6A94
+SaveAll.text = \u5132\u5B58\u6240\u6709\u6A94\u6848
+SaveAll.tooltip = \u5132\u5B58\u6240\u6709\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, \u6a94\u6848\u6bc0\u640d.
+scheme_evaluate = \u8a55\u4f30!
+script_execution_disabled = Script \u57f7\u884c\u88ab\u6291\u6b62, \u8acb\u770b \u5de5\u5177>\u500b\u4eba\u5316\u8a2d\u5b9a>\u63d2\u4ef6
+ScriptEditor.text = \u6307\u4ee4\u7de8\u8f2f\u5668...
+ScriptEditor.tooltip = \u5141\u8a31\u5728 Freeplane \u7cfb\u7d71\u5beb\u5165\u5927\u91cf\u6307\u4ee4.
+ScriptEditorPanel.changed_cancel = \u8A9E\u6CD5\u5DF2\u88AB\u66F4\u52D5, \u8ACB\u554F\u4F60\u8981\u653E\u68C4\u9019\u4E9B\u8B8A\u52D5\u55CE?
+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
+select_favorites_folder = \u9078\u64c7\u6211\u7684\u6700\u611b\u7684\u6a94\u6848\u593e
+select_file_export_to = \u9078\u64c7\u532f\u51fa\u7684\u76ee\u7684\u6a94\u6848
+select_folder_for_importing = \u9078\u64C7\u532F\u5165\u7684\u76EE\u9304
+select_icon = \u9078\u64c7\u4e00\u500b\u5c0f\u5716\u793a
+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 = \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
+SelectNoteAction.text = \u5207\u63db\u8a3b\u89e3\u8996\u7a97
+SelectNoteAction.tooltip = \u5207\u63db\u8a3b\u89e3\u8996\u7a97
+set_accelerator_on_next_click_action = \u9ede\u64ca\u4efb\u4e00\u9078\u55ae\u9805\u76ee\u4f86\u8a2d\u5b9a\u65b0\u7684\u5feb\u901f\u9375
+SetAcceleratorOnNextClickAction.text = \u6307\u5b9a\u5feb\u901f\u9375
+SetImageByFileChooserAction.text = \u52A0\u5165\u5716\u6A94...
+SetLinkAnchorAction.text = \u8a2d\u5b9a\u9023\u7d50\u9328\u9ede
+SetLinkAnchorAction.tooltip = <html>\u8a2d\u5b9a\u9078\u53d6\u7684\u7bc0\u9ede\u70ba\u4e0b\u9328\u9ede\u4ee5\u505a\u70ba\u5c07\u4f86<br/>\u5efa\u7acb\u5c40\u90e8\u6216\u5168\u57df\u9023\u7d50.
+SetLinkAnchorAction.tooltip_anchored = <html>\u8a2d\u5b9a\u9078\u53d6\u7684\u7bc0\u9ede\u70ba\u4e0b\u9328\u9ede\u4ee5\u505a\u70ba\u5c07\u4f86<br/>\u5efa\u7acb\u5c40\u90e8\u6216\u5168\u57df\u9023\u7d50. \u76ee\u524d\u7684\u4e0b\u9328\u9ede:<br/>{0}
+SetLinkByFileChooserAction.text = \u65b0\u589e\u6a94\u6848\u8d85\u9023\u7d50...
+SetLinkByTextFieldAction.text = \u7de8\u8f2f\u65b0\u820a\u8d85\u9023\u7d50...
+SetNodeLink.text = \u8a2d\u5b9a\u7bc0\u9ede\u9023\u7d50
+SetNoteWindowPosition.bottom.text = \u4e0b
+SetNoteWindowPosition.left.text = \u5de6
+SetNoteWindowPosition.right.text = \u53f3
+SetNoteWindowPosition.top.text = \u4e0a
+SetShortenerStateAction.text = \u6700\u5c0f\u5316\u7bc0\u9ede
+sf_login_required = \u9700\u8981\u767b\u5165 Source Forge, \u8981\u7e7c\u7e8c\u55ce\uff1f
+ShowAllAttributesAction.text = \u986F\u793A\u6240\u6709\u7684\u5C6C\u6027
+ShowAncestorsAction.text = \u986f\u793a\u7956\u5148\u7bc0\u9ede
+ShowAttributeDialogAction.text = \u5c6c\u6027\u7ba1\u7406\u5e2b...
+ShowDescendantsAction.text = \u986f\u793a\u5b50\u5b6b\u7bc0\u9ede
+ShowFilterToolbarAction.text = \u7be9\u9078\u5668\u5de5\u5177\u5217
+ShowFormatPanel.text = \u6027\u8cea\u9762\u677f
+ShowFormatPanel.tooltip = \u5448\u73fe\u4e00\u500b\u5c0d\u8a71\u8996\u7a97, \u5176\u4e2d\u7bc0\u9ede\u548c\u5206\u652f\u7dda\u7684\u5c6c\u6027\u53ef\u4ee5\u540c\u6642\u4fee\u6539.
+ShowHideNoteAction.text = \u8a3b\u89e3\u8996\u7a97
+ShowHideNoteAction.tooltip = \u958b\u555f\u6216\u95dc\u9589\u8a3b\u89e3\u8996\u7a97
+ShowNextChildAction.text = \u986f\u793a\u4e0b\u500b\u5b50\u7bc0\u9ede
+ShowNotesInMapAction.text = \u5728\u5fc3\u667a\u5716\u4e0a\u986f\u793a\u8a3b\u89e3
+ShowSelectedAttributesAction.text = \u986f\u793a\u9078\u53d6\u7684\u5c6c\u6027
+ShowSelectionAsRectangleAction.text = \u77e9\u5f62\u6307\u6a19
+simplyhtml.aboutFrameTitle = \u95DC\u65BC\u672C\u7A0B\u5F0F
+simplyhtml.aboutLabel = \u95dc\u65bc SimplyHTML...
+simplyhtml.alignCenter = \u7F6E\u4E2D
+simplyhtml.alignLabel = \u4f4d\u7f6e\u8abf\u6574:
+simplyhtml.alignLeft = \u9760\u5DE6
+simplyhtml.alignRight = \u9760\u53F3
+simplyhtml.allCellsRangeLabel = \u6240\u6709\u5143\u7d20
+simplyhtml.allOccurrencesReplaced = \u6240\u6709\u6240\u6709\u88ab\u53d6\u4ee3\u7684
+simplyhtml.appendTableColLabel = \u64F4\u5927\u4E00\u884C
+simplyhtml.appendTableRowLabel = \u64F4\u5927\u4E00\u5217
+simplyhtml.applyCellAttrLabel = \u5957\u7528
+simplyhtml.backgroundLabel = \u80cc\u666f:
+simplyhtml.boldItalicName = \u7C97\u659C\u9AD4
+simplyhtml.boldName = \u7C97\u9AD4
+simplyhtml.borderColorLabel = \u984f\u8272:
+simplyhtml.borderWidthLabel = \u5BEC
+simplyhtml.bottomLabel = \u4e0b:
+simplyhtml.cancelBtnName = \u53D6\u6D88
+simplyhtml.cellBorderTabLabel = \u908a\u754c
+simplyhtml.cellGenTabLabel = \u4E00\u822C
+simplyhtml.cellMarginTabLabel = \u9801\u908a\u7a7a\u767d
+simplyhtml.cellPanelTitle = \u683C\u5B50\u683C\u5F0F
+simplyhtml.clearFormatLabel = \u79FB\u9664\u683C\u5F0F
+simplyhtml.clearFormatTip = \u79FB\u9664\u683C\u5F0F
+simplyhtml.close = \u95DC\u9589
+simplyhtml.closeBtnName = \u95DC\u9589
+simplyhtml.colorLabel = \u984F\u8272
+simplyhtml.copyLabel = \u8907\u88FD
+simplyhtml.copyTip = \u8907\u88FD
+simplyhtml.cTagNameHead1 = \u6A19\u984C1
+simplyhtml.cTagNameHead2 = \u6A19\u984C2
+simplyhtml.cTagNameHead3 = \u6A19\u984C3
+simplyhtml.cTagNameHead4 = \u6A19\u984C4
+simplyhtml.cTagNameHead5 = \u6A19\u984C5
+simplyhtml.cTagNameHead6 = \u6A19\u984C6
+simplyhtml.cTagNameLink = \u9023\u7d50
+simplyhtml.cTagNameOL = \u6709\u5e8f\u5217\u8868
+simplyhtml.cTagNamePara = \u6BB5\u843D
+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.deleteTableRowLabel = \u522A\u9664\u5217
+simplyhtml.docTitleQuery = \u8a2d\u5b9a\u6a19\u984c:
+simplyhtml.docTitleTitle = \u7de8\u8f2f\u6587\u4ef6\u6a19\u984c
+simplyhtml.editLabel = \u7DE8\u8F2F
+simplyhtml.effectLabel = \u6548\u679C
+simplyhtml.familyLabel = \u5b57\u9ad4
+simplyhtml.findNext = \u627e\u4e0b\u4e00\u500b...
+simplyhtml.findReplaceDialogTitle = \u641c\u5c0b/\u53d6\u4ee3
+simplyhtml.findReplaceLabel = \u641c\u5c0b/\u53d6\u4ee3
+simplyhtml.findReplaceTip = \u641c\u5c0b (\u53d6\u4ee3)
+simplyhtml.fontBoldLabel = \u7C97\u9AD4
+simplyhtml.fontBoldTip = \u7c97\u9ad4\u958b\u95dc\u5207\u63db
+simplyhtml.fontColorLabel = \u6587\u5b57\u984f\u8272
+simplyhtml.fontColorTip = \u6587\u5b57\u984f\u8272
+simplyhtml.fontDialogTitle = \u683C\u5F0F\u5B57\u578B
+simplyhtml.fontItalicLabel = \u659c\u9ad4
+simplyhtml.fontItalicTip = \u659c\u9ad4\u958b\u95dc\u5207\u63db
+simplyhtml.fontLabel = \u5b57\u578b...
+simplyhtml.fontTabLabel = \u5B57\u578B
+simplyhtml.fontTip = \u5b57\u578b\u683c\u5f0f...
+simplyhtml.fontUnderlineLabel = \u5E95\u7DDA
+simplyhtml.fontUnderlineTip = \u5e95\u7dda\u958b\u95dc\u5207\u63db
+simplyhtml.foregroundLabel = \u524d\u666f:
+simplyhtml.formatLabel = \u683C\u5F0F
+simplyhtml.formatListLabel = \u9805\u76ee...
+simplyhtml.formatListTip = \u66f4\u6539\u9805\u76ee\u683c\u5f0f
+simplyhtml.formatParaLabel = \u6BB5\u843D...
+simplyhtml.formatParaTip = \u66f4\u6539\u6bb5\u843d\u683c\u5f0f
+simplyhtml.formatTableLabel = \u8868\u683C...
+simplyhtml.formatTableTip = \u683c\u5f0f\u8868
+simplyhtml.helpLabel = \u652F\u63F4
+simplyhtml.htmlTabTitle = HTML\u539F\u59CB\u78BC
+simplyhtml.imageFileDesc = \u5f71\u50cf\u6a94
+simplyhtml.insertTableColLabel = \u63D2\u5165\u4E00\u884C
+simplyhtml.insertTableLabel = \u8868\u683C...
+simplyhtml.insertTableMsg = \u591A\u5C11\u6B04\u4F4D?
+simplyhtml.insertTableRowLabel = \u63D2\u5165\u4E00\u5217
+simplyhtml.insertTableTitle = \u63D2\u5165\u8868\u683C
+simplyhtml.italicName = \u659C\u9AD4
+simplyhtml.layoutTabTitle = \u9810\u89BD
+simplyhtml.leftLabel = \u5de6:
+simplyhtml.listDialogTitle = \u9805\u76ee\u683c\u5f0f
+simplyhtml.listIndentTitle = \u7e2e\u6392:
+simplyhtml.listPosInside = \u5167
+simplyhtml.listPositionLabel = \u4f4d\u7f6e:
+simplyhtml.listPosOutside = \u5916
+simplyhtml.listTypeCircle = \u5713\u5b54
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = \u9ED1\u9EDE
+simplyhtml.listTypeLabel = \u985e\u578b:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = \u7121
+simplyhtml.listTypeSquare = \u65b9\u5b54
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = \u5916\u570d\u908a\u7de3
+simplyhtml.matchApproximately = \u8fd1\u4f3c\u5339\u914d
+simplyhtml.matchApproximately.tooltip = <html>\u662f\u5426\u5141\u8a31\u8fd1\u4f3c\u5339\u914d,<br/>\u4f8b\u5982\uff0c\u641c\u5c0b 'files' \u6703\u627e\u5230 'flies'.</html>
+simplyhtml.matchCase = \u5340\u5206\u5927\u5c0f\u5beb
+simplyhtml.matchCase.tooltip = \u662f\u5426\u5340\u5206\u5927\u5c0f\u5beb.
+simplyhtml.newStyleDefaultName = \u65b0\u6a23\u5f0f
+simplyhtml.nextTableCellLabel = \u4e0b\u4e00\u683c
+simplyhtml.noLineLabel = \u7121
+simplyhtml.noMoreOccurrencesFound = \u627e\u4e0d\u5230\u4e0b\u4e00\u500b
+simplyhtml.okBtnName = \u78BA\u5B9A
+simplyhtml.paddingLabel = \u5167\u90e8\u908a\u7de3
+simplyhtml.paraAlignCenterLabel = \u7f6e\u4e2d\u5c0d\u9f4a
+simplyhtml.paraAlignCenterTip = \u8A2D\u5B9A\u6BB5\u843D\u7F6E\u4E2D
+simplyhtml.paraAlignLeftLabel = \u7F6E\u5DE6
+simplyhtml.paraAlignLeftTip = \u8a2d\u5b9a\u6bb5\u843d\u9760\u5de6\u5c0d\u9f4a
+simplyhtml.paraAlignRightLabel = \u7F6E\u53F3
+simplyhtml.paraAlignRightTip = \u8a2d\u5b9a\u6bb5\u843d\u9760\u53f3\u5c0d\u9f4a
+simplyhtml.paraStyleDialogTitle = \u6bb5\u843d\u6a23\u5f0f
+simplyhtml.paraTabLabel = \u6BB5\u843D
+simplyhtml.pasteHTMLLabel = \u8cbc\u4e0a HTML
+simplyhtml.pasteLabel = \u8CBC\u4E0A
+simplyhtml.pastePlainTextLabel = \u8cbc\u4e0a\u7d14\u6587\u5b57
+simplyhtml.pasteTip = \u8CBC\u4E0A
+simplyhtml.plainName = \u6B63\u9AD4
+simplyhtml.previewLabel = \u9810\u89BD
+simplyhtml.previewText = \u6587\u5B57\u9810\u89BD
+simplyhtml.prevTableCellLabel = \u524d\u4e00\u683c
+simplyhtml.printLabel = \u5217\u5370...
+simplyhtml.redoLabel = \u53d6\u6d88\u5fa9\u539f
+simplyhtml.redoTip = \u53d6\u6d88\u5fa9\u539f
+simplyhtml.replace = \u53D6\u4EE3...
+simplyhtml.replaceAll = \u5168\u9078/\u53D6\u6D88\u5168\u9078
+simplyhtml.replaceDone = \u5b8c\u6210
+simplyhtml.replaceNo = \u5426
+simplyhtml.replaceThisQuery = \u53d6\u4ee3\u9019\u500b\u8a5e\uff1f
+simplyhtml.replaceWith = \u53d6\u4ee3:
+simplyhtml.replaceYes = \u662F
+simplyhtml.rightLabel = \u53f3:
+simplyhtml.searchDown = \u7531\u4e0a\u5f80\u4e0b\u5c0b\u627e
+simplyhtml.searchDown.tooltip = \u5f9e\u4e0a\u5f80\u4e0b\u627e
+simplyhtml.searchFromStart = \u5F9E\u982D\u958B\u59CB\u5C0B\u627E
+simplyhtml.searchFromStart.tooltip = \u5f9e\u6700\u958b\u982d\u958b\u59cb\u627e
+simplyhtml.searchUp = \u7531\u4e0b\u5f80\u4e0a\u5c0b\u627e
+simplyhtml.searchUp.tooltip = \u7531\u4e0b\u5f80\u4e0a\u627e
+simplyhtml.selectAllLabel = \u5168\u9078
+simplyhtml.sizeLabel = \u5927\u5C0F
+simplyhtml.standardStyleName = \u6a19\u6e96
+simplyhtml.strikeLabel = \u522A\u9664\u7DDA
+simplyhtml.styleLabel = \u5B57\u9AD4
+simplyhtml.styleNameInputText = \u65b0\u5b57\u9ad4\u7684\u540d\u7a31?
+simplyhtml.styleNameInputTitle = \u5132\u5B58\u6A23\u5F0F
+simplyhtml.tableBgColLabel = \u80cc\u666f\u8272:
+simplyhtml.tableDialogTitle = \u8868\u683c\u683c\u5f0f
+simplyhtml.tableLabel = \u8868\u683C
+simplyhtml.tablePanelTitle = \u8868\u683C\u683C\u5F0F
+simplyhtml.tableWidthLabel = \u5bec:
+simplyhtml.textIndentLabel = \u7e2e\u6392:
+simplyhtml.textToFind = \u5c0b\u627e\u6587\u5b57:
+simplyhtml.thisCellRangeLabel = \u9019\u683c
+simplyhtml.thisColRangeLabel = \u9019\u6b04
+simplyhtml.thisRowRangeLabel = \u9019\u5217
+simplyhtml.toggleBulletsLabel = \u7b26\u865f\u9805\u76ee
+simplyhtml.toggleBulletsTip = \u7b26\u865f\u9805\u76ee
+simplyhtml.toggleNumbersLabel = \u7de8\u865f\u9805\u76ee
+simplyhtml.toggleNumbersTip = \u7de8\u865f\u9805\u76ee
+simplyhtml.topLabel = \u4e0a:
+simplyhtml.uLineLabel = \u5E95\u7DDA
+simplyhtml.unableToOpenFileError = \u627e\u4e0d\u5230\u6a94\u6848
+simplyhtml.unableToRedoError = \u7121\u6cd5\u53d6\u6d88\u5fa9\u539f:
+simplyhtml.unableToUndoError = \u7121\u6cd5\u5fa9\u539f:
+simplyhtml.undoLabel = \u5fa9\u539f
+simplyhtml.undoTip = \u5fa9\u539f
+simplyhtml.valignBaseline = \u57fa\u7dda
+simplyhtml.valignBottom = \u4e0b\u65b9
+simplyhtml.valignLabel = \u5782\u76f4\u65b9\u5411\u5c0d\u9f4a:
+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
+SortNodes.text = \u6392\u5E8F\u5B50\u7BC0\u9EDE
+SortNodes.tooltip = \u6309\u5b57\u6bcd\u9806\u5e8f\u6392\u5e8f\u5b50\u7bc0\u9ede
+split = \u5206\u5272
+SplitConditionAction.text = \u5206\u5272
+SplitNode.text = \u5206\u5272\u7bc0\u9ede (\u7bc0\u9ede\u5167\u5bb9\u5fc5\u9808\u6709\u5169\u884c\u4ee5\u4e0a)
+SplitNode.tooltip = \u7bc0\u9ede\u6703\u88ab\u5206\u5272
+STANDARD_FORMAT = \u6a19\u6e96
+stop_processing = \u505c\u6b62
+StringFlavorHandler = \u7d14\u6587\u5b57\u7bc0\u9ede\u968e\u5c64\u7d50\u69cb
+StructuredHtmlFlavorHandler = HTML \u7bc0\u9ede\u968e\u5c64\u7d50\u8cfc
+style = \u6a23\u5f0f
+style_already_exists = \u6a23\u5f0f\u5df2\u7d93\u5b58\u5728
+styledialog.cancel.text = \u53d6\u6d88
+styledialog.ok.text = \u78ba\u5b9a
+styles = \u6a23\u5f0f
+styles.AutomaticLayout = \u5957\u7528\u968e\u5c64\u6a23\u5f0f
+styles.connection = \u9023\u7d50\u7dda
+styles.date = \u65e5\u671f
+styles.definition = \u5b9a\u7fa9
+styles.description = \u63cf\u8ff0
+styles.floating_node = \u6d6e\u52d5\u7bc0\u9ede
+styles.idea = \u9ede\u5b50
+styles.important = \u91cd\u8981
+styles.key = \u9470\u5319
+styles.list = \u5217\u8868
+styles.needs_action = \u9700\u8981\u884c\u52d5
+styles.note = \u6ce8\u610f
+styles.ok = OK
+styles.pending = \u7b49\u5f85
+styles.predefined = \u9810\u5148\u5b9a\u7fa9\u7684\u6a23\u5f0f
+styles.question = \u554f\u984c
+styles.quotation = \u5f15\u8ff0
+styles.root_node = \u6a23\u5f0f
+styles.subsubtopic = \u6b21\u5b50\u6a19\u984c
+styles.subtopic = \u5b50\u6a19\u984c
+styles.topic = \u6a19\u984c
+styles.user-defined = \u4f7f\u7528\u8005\u5b9a\u7fa9\u6a23\u5f0f
+styles.website = \u7db2\u7ad9
+styles_menu = \u53ef\u7528\u7684\u6a23\u5f0f
+submenu_keystroke_in_use_error = \u5b50\u9078\u55ae {1} \u7121\u6cd5\u4f7f\u7528\u6309\u9375 {0}, \u79fb\u9664\u6309\u9375.
+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
+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...
+TimeManagementAction.tooltip = <html>\u986f\u793a\u65e5\u66c6\u6a21\u7d44 (by Kai Toedter).</html>
+ToggleChildrenFoldedAction.text = \u5c55\u958b/\u647a\u758a \u5b50\u7bc0\u9ede
+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 = \u5de6\u908a\u5c0f\u5716\u793a\u9078\u55ae
+ToggleMenubarAction.text = \u9078\u55ae\u5217
+ToggleStatusAction.text = \u986f\u793a\u72c0\u614b\u5217
+ToggleToolbarAction.text = \u5de5\u5177\u5217
+undefined_error = \u975e\u9810\u671f\u7684\u932f\u8aa4, \u8acb\u63d0\u51fa\u932f\u8aa4\u5831\u544a.
+underline = \u5E95\u7DDA
+UnderlineAction.text = \u5e95\u7dda
+underlined = \u52A0\u4E0A\u5E95\u7DDA
+UndoAction.text = \u5fa9\u539f
+UndoFilterAction.text = \u5fa9\u539f
+unfold = \u5C55\u958B
+UnfoldAllAction.text = \u5168\u90e8\u5c55\u958b
+UnfoldAllAction.tooltip = <html>\u5c55\u958b\u9078\u53d6\u7684\u7bc0\u9ede\u548c\u5b83\u6240\u6709\u7684\u5b50\u7bc0\u9ede.</html>
+UnfoldOneLevelAction.text = \u5c55\u958b\u4e00\u5c64
+UnfoldOneLevelAction.tooltip = <html>\u5c07\u9078\u53d6\u7684\u7bc0\u9ede\u5f80\u4e0b\u5c55\u958b\u4e00\u5c64.</html>
+up = \u5f80\u4e0a
+update_failed = \u66f4\u65b0\u5931\u6557, \u932f\u8aa4\u8a0a\u606f: {0}.
+UpdateCheckAction.text = \u6aa2\u67e5\u662f\u5426\u6709\u66f4\u65b0
+updatecheckdialog = \u6aa2\u67e5\u66f4\u65b0\u5c0d\u8a71\u7a97
+url_error = URL\u683C\u5F0F\u932F\u8AA4!
+url_open_error = \u7121\u6cd5\u958b\u555f URL {0}.
+used_in_menu = \u5feb\u901f\u9375\u7121\u6cd5\u8a2d\u5b9a, \u5df2\u7d93\u88ab\u4f7f\u7528.
+UsePlainTextAction.text = \u4F7F\u7528\u7D14\u6587\u5B57\u683C\u5F0F
+user_config_folder = \u4f7f\u7528\u8005\u7d44\u614b\u8cc7\u6599\u593e: {0}
+user_defined_scale = \u4f7f\u7528\u8005\u5b9a\u7fa9\u5927\u5c0f
+user_defined_zoom = \u4f7f\u7528\u8005\u5b9a\u7fa9
+user_defined_zoom_status_bar = \u6539\u8b8a\u7e2e\u653e\u5927\u5c0f\u5230\u4f7f\u7528\u8005\u5b9a\u7fa9\u503c {0}%.
+user_icon = \u4f7f\u7528\u8005\u5c0f\u5716\u793a "{0}"
+user_template_dir = \u4f7f\u7528\u8005\u6a23\u7248
+user_zoom = \u5217\u5370\u7e2e\u653e\u6bd4 (0.0 - 2.0):
+value_format = \u6578\u503c\u683c\u5f0f
+version_up_to_date = \u4f60\u5df2\u7d93\u4f7f\u7528\u6700\u65b0\u7248\u7a0b\u5f0f
+ViewerControllerAction.text = \u5916\u90e8\u7269\u4ef6...
+ViewLayoutTypeAction.OUTLINE.text = \u5927\u7db1\u8996\u5716
+WebDocuAction.text = \u7DB2\u9801\u6587\u4EF6
+width = \u5BEC
+wrong_regexp = \u932f\u8aa4\u7684\u5b57\u4e32\u5e38\u898f\u8868\u793a\u5f0f (regexp) "{0}", \u932f\u8aa4 {1}
+xslt_export.html = HTML \u6587\u4ef6
+xslt_export.latex = LateX \u6587\u4ef6
+xslt_export.latexbook = LateX \u66f8\u672c
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 \u548c\u4e4b\u5f8c\u7248\u672c) XML \u683c\u5f0f
+xslt_export.ms_project = MS Project (2003 \u548c\u4e4b\u5f8c\u7248\u672c) XML \u683c\u5f0f
+xslt_export.ms_word = Word (2003 \u548c\u4e4b\u5f8c\u7248\u672c) XML \u683c\u5f0f
+xslt_export.text = \u7d14\u6587\u5b57
+xslt_export_not_possible = Freeplane \u7121\u6cd5\u532f\u51fa XLST
+yes = \u662F
+ZoomInAction.text = \u653E\u5927
+ZoomOutAction.text = \u7E2E\u5C0F
diff --git a/freeplane/resources/xml/ExportWithXSLT.xml b/freeplane/resources/xml/ExportWithXSLT.xml
new file mode 100644
index 0000000..0f117b7
--- /dev/null
+++ b/freeplane/resources/xml/ExportWithXSLT.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<export_with_xslt>
+ <action
+ name="accessories/plugins/ExportWithXSLT_HTML"
+ >
+ <properties
+ file_type="html"
+ xslt_file="/xslt/toxhtml.xsl"
+ create_dir="true"
+ files_to_copy="marktree.js,minus.png,plus.png,ilink.png,treestyles.css"
+ file_prefix="/html/"
+ copy_icons="true"
+ load_file="true"
+ create_html_linked_image="false" />
+ </action>
+ <action
+ name="accessories/plugins/ExportWithXSLT_HTML3"
+ >
+ <properties
+ file_type="html"
+ xslt_file="/xslt/freeplane2html.xsl"
+ create_dir="true"
+ files_to_copy="freeplane2html.css,hide.png,leaf.png,show.png,ilink.png"
+ file_prefix="/html/"
+ copy_icons="true"
+ load_file="true"
+ create_html_linked_image="true"/>
+ </action>
+ <action
+ name="accessories/plugins/ExportWithXSLT_Applet"
+ >
+ <properties
+ file_type="html"
+ xslt_file="/xslt/freeplane2applet.xsl"
+ create_dir="true"
+ files_to_copy="freeplaneviewer.jar"
+ file_prefix="$org.freeplane.core.dir.lib"
+ copy_map="true"
+ copymode="FILE"
+ load_file="true"
+ set_properties="show_note_icons,
+ show_icon_for_attributes,
+ use_common_out_point_for_root_node"/>
+ </action>
+ <action
+ name="accessories/plugins/ExportWithXSLT_Flash"
+ >
+ <properties
+ file_type="html"
+ xslt_file="/xslt/freeplane2flash.xsl"
+ create_dir="true"
+ files_to_copy="visorFreeplane.swf,flashobject.js"
+ file_prefix="/flash/"
+ copy_map="true"
+ load_file="true" />
+ </action>
+ <action
+ name="accessories/plugins/ExportWithXSLT_TASKSTJI"
+ >
+ <properties
+ file_type="tji"
+ name_extension=".tasks"
+ xslt_file="/xslt/mm2tjitasks.xsl"
+ copy_map="false"
+ load_file="false"
+ create_dir="false"
+ create_html_linked_image="false" />
+ </action>
+ <action
+ name="accessories/plugins/ExportWithXSLT_RESOURCESTJI"
+ >
+ <properties
+ file_type="tji"
+ name_extension=".resources"
+ xslt_file="/xslt/mm2tjiresources.xsl"
+ copy_map="false"
+ load_file="false"
+ create_dir="false"
+ create_html_linked_image="false" />
+ </action>
+ <action
+ name="accessories/plugins/ExportWithTWiki"
+ >
+ <properties
+ file_type="twi"
+ name_extension=""
+ xslt_file="/xslt/mm2twiki.xsl"
+ copy_map="false"
+ load_file="false"
+ create_dir="false"
+ create_html_linked_image="false" />
+ </action>
+</export_with_xslt>
diff --git a/freeplane/resources/xml/browsemodemenu.xml b/freeplane/resources/xml/browsemodemenu.xml
new file mode 100644
index 0000000..e089bfc
--- /dev/null
+++ b/freeplane/resources/xml/browsemodemenu.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><menu_structure>
+ <menu_category name="menu_bar">
+ <menu_submenu name="file" name_ref="file">
+ <menu_submenu menu_key="main_menu_most_recent_files" name="last" name_ref="most_recent_files"/>
+ <menu_action action="PageAction"/>
+ <menu_action action="PrintPreviewAction"/>
+ <menu_action accelerator="control P" action="PrintAction"/>
+ <menu_action action="FilePropertiesAction"/>
+ <menu_action accelerator="control W" action="CloseAction"/>
+ <menu_action accelerator="control Q" action="QuitAction" menu_key="MB_QuitAction"/>
+ </menu_submenu>
+ <menu_submenu name="edit" name_ref="edit">
+ <menu_submenu name="menu_extensions" name_ref="menu_extensions">
+ <menu_action action="SetShortenerStateAction"/>
+ </menu_submenu>
+ <menu_submenu name="menu_copy" name_ref="menu_copy">
+ <menu_action accelerator="control C" action="CopyAction"/>
+ <menu_action accelerator="control shift C" action="CopySingleAction"/>
+ </menu_submenu>
+ <menu_category name="find">
+ <menu_action accelerator="control G" action="FindAction"/>
+ <menu_action accelerator="control shift G" action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="view" name_ref="menu_view">
+ <menu_category name="Menu_Toolbar_Panel">
+ <menu_category name="toolbars">
+ <menu_submenu name="toolbars" name_ref="menu_toolbars">
+ <menu_action action="ToggleMenubarAction" menu_key="MB_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction" accelerator="control F"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_category>
+ <menu_category name="zoom">
+ <menu_action accelerator="alt UP" action="ZoomInAction"/>
+ <menu_action accelerator="alt DOWN" action="ZoomOutAction"/>
+ <menu_action accelerator="control alt C" action="CenterSelectedNodeAction"/>
+ </menu_category>
+ <menu_submenu name="menu_viewmode" name_ref="menu_viewmode">
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="ShowSelectionAsRectangleAction"/>
+ </menu_submenu>
+ <menu_submenu name="menu_hoverView" name_ref="menu_hoverView">
+ <menu_action accelerator="alt F2" action="ToggleDetailsAction"/>
+ <menu_action action="SetBooleanPropertyAction.show_node_tooltips"/>
+ </menu_submenu>
+ <menu_category name="AttributeView">
+ <menu_submenu name="menu_displayAttributes" name_ref="menu_displayAttributes">
+ <menu_radio_action action="ShowSelectedAttributesAction"/>
+ <menu_radio_action action="ShowAllAttributesAction"/>
+ <menu_radio_action action="HideAllAttributesAction"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="navigate" name_ref="menu_navigate">
+ <menu_category name="navigate">
+ <menu_action accelerator="control shift TAB" action="NavigationPreviousMapAction"/>
+ <menu_action accelerator="control TAB" action="NavigationNextMapAction"/>
+ <menu_category name="folding">
+ <menu_action accelerator="SPACE" action="ToggleFoldedAction"/>
+ <menu_action action="ShowNextChildAction" accelerator="shift SPACE" />
+ <menu_action accelerator="control SPACE" action="ToggleChildrenFoldedAction"/>
+ <menu_action accelerator="alt PAGE_DOWN" action="UnfoldOneLevelAction"/>
+ <menu_action accelerator="alt PAGE_UP" action="FoldOneLevelAction"/>
+ <menu_action accelerator="alt END" action="UnfoldAllAction"/>
+ <menu_action accelerator="alt HOME" action="FoldAllAction"/>
+ </menu_category>
+ </menu_category>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ <menu_action action="GotoNodeAction"/>
+ <menu_action accelerator="control alt LEFT" action="NextNodeAction.BACK"/>
+ <menu_action accelerator="control alt RIGHT" action="NextNodeAction.FORWARD"/>
+ <menu_action accelerator="control alt shift LEFT" action="NextNodeAction.BACK_N_FOLD"/>
+ <menu_action accelerator="control alt shift RIGHT" action="NextNodeAction.FORWARD_N_FOLD"/>
+ <menu_action action="NextPresentationItemAction"/>
+ <menu_category name="links">
+ <menu_action accelerator="control ENTER" action="FollowLinkAction"/>
+ <!-- goto -->
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="filter" name_ref="menu_filter">
+ <menu_category name="Filter">
+ <menu_category name="DoFilter">
+ <menu_action action="UndoFilterAction"/>
+ <menu_action action="RedoFilterAction"/>
+ <menu_action action="ReapplyFilterAction"/>
+ <menu_action action="QuickFilterAction"/>
+ <menu_action action="ApplySelectedViewConditionAction"/>
+ <menu_action action="QuickFindAllAction"/>
+ <menu_action action="ApplyNoFilteringAction"/>
+ <menu_action action="EditFilterAction"/>
+ </menu_category>
+ <menu_category name="FilterCondition">
+ <menu_action action="ApplyToVisibleAction"/>
+ <menu_action action="ShowAncestorsAction"/>
+ <menu_action action="ShowDescendantsAction"/>
+ </menu_category>
+ <menu_category name="Find">
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="QuickFindAction.FORWARD"/>
+ </menu_category>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="extras" name_ref="menu_extras">
+ <menu_submenu name="encryption" name_ref="menu_encryption">
+ <menu_action action="EnterPassword"/>
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="mindmaps" name_ref="mindmaps">
+ <menu_category menu_key="main_menu_modes" name="modes"/>
+ <menu_category menu_key="main_menu_navigate_maps" name="navigate"/>
+ <menu_category menu_key="main_menu_mindmaps" name="mindmaps"/>
+ </menu_submenu>
+ <menu_submenu name="help" name_ref="help">
+ <menu_category name="update">
+ <menu_action action="UpdateCheckAction"/>
+ </menu_category>
+ <menu_category name="Web resources">
+ <menu_action action="OpenFreeplaneSiteAction"/>
+ <menu_action action="AskForHelp"/>
+ <menu_action action="ReportBugAction"/>
+ <menu_action action="RequestFeatureAction"/>
+ </menu_category>
+ <menu_category name="legacy">
+ <menu_action action="AboutAction" menu_key="MB_AboutAction"/>
+ </menu_category>
+ <menu_action action="GettingStartedAction"/>
+ <menu_action accelerator="F1" action="DocumentationAction"/>
+ </menu_submenu>
+ </menu_category>
+ <menu_category name="map_popup">
+ <menu_action action="ToggleMenubarAction" menu_key="MP_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction"/>
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="SetBooleanPropertyAction.presentation_mode" />
+ <menu_action action="CenterSelectedNodeAction"/>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ <menu_action action="GotoNodeAction"/>
+ </menu_category>
+ <menu_category name="node_popup">
+ <menu_action action="SetShortenerStateAction"/>
+ <menu_action action="EnterPassword"/>
+ <menu_action accelerator="control C" action="CopyAction"/>
+ <menu_action accelerator="control shift C" action="CopySingleAction"/>
+ </menu_category>
+ <menu_category name="main_toolbar">
+ <menu_category name="main">
+ <menu_action action="NavigationPreviousMapAction"/>
+ <menu_action action="NavigationNextMapAction"/>
+ </menu_category>
+ <menu_category menu_key="main_toolbar_zoom" name="zoom">
+ </menu_category>
+ <menu_category name="open">
+ <menu_action action="PrintAction"/>
+ <menu_action action="CloseAction"/>
+ </menu_category>
+ <menu_category name="paste">
+ <menu_action action="CopyAction"/>
+ </menu_category>
+ <menu_category name="folding">
+ <menu_action action="UnfoldOneLevelAction"/>
+ <menu_action action="FoldOneLevelAction"/>
+ <menu_action action="UnfoldAllAction"/>
+ <menu_action action="FoldAllAction"/>
+ </menu_category>
+ <menu_category name="url" menu_key="main_toolbar_url"/>
+ </menu_category>
+</menu_structure>
\ No newline at end of file
diff --git a/freeplane/resources/xml/filemodemenu.xml b/freeplane/resources/xml/filemodemenu.xml
new file mode 100644
index 0000000..1fd0c6a
--- /dev/null
+++ b/freeplane/resources/xml/filemodemenu.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><menu_structure>
+ <menu_category name="menu_bar">
+ <menu_submenu name="file" name_ref="file">
+ <menu_submenu menu_key="main_menu_most_recent_files" name="last" name_ref="most_recent_files"/>
+ <menu_action action="PageAction"/>
+ <menu_action action="PrintPreviewAction"/>
+ <menu_action accelerator="control P" action="PrintAction"/>
+ <menu_action accelerator="control W" action="CloseAction"/>
+ <menu_action accelerator="control Q" action="QuitAction" menu_key="MB_QuitAction"/>
+ </menu_submenu>
+ <menu_submenu name="edit" name_ref="edit">
+ <menu_category name="find">
+ <menu_action accelerator="control G" action="FindAction"/>
+ <menu_action accelerator="control shift G" action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="OpenPathAction"/>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="view" name_ref="menu_view">
+ <menu_category name="Menu_Toolbar_Panel">
+ <menu_category name="toolbars">
+ <menu_submenu name="toolbars" name_ref="menu_toolbars">
+ <menu_action action="ToggleMenubarAction" menu_key="MB_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction" accelerator="control F"/>
+ <menu_action action="SetBooleanPropertyAction.presentation_mode" />
+ </menu_submenu>
+ </menu_category>
+ </menu_category>
+ <menu_category name="zoom">
+ <menu_action accelerator="alt UP" action="ZoomInAction"/>
+ <menu_action accelerator="alt DOWN" action="ZoomOutAction"/>
+ <menu_action accelerator="control alt C" action="CenterSelectedNodeAction"/>
+ </menu_category>
+ <menu_submenu name="menu_viewmode" name_ref="menu_viewmode">
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="ShowSelectionAsRectangleAction"/>
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="navigate" name_ref="menu_navigate">
+ <menu_category name="navigate">
+ <menu_action accelerator="control shift TAB" action="NavigationPreviousMapAction"/>
+ <menu_action accelerator="control TAB" action="NavigationNextMapAction"/>
+ <menu_category name="folding">
+ <menu_action accelerator="SPACE" action="ToggleFoldedAction"/>
+ <menu_action action="ShowNextChildAction" accelerator="shift SPACE" />
+ <menu_action accelerator="control SPACE" action="ToggleChildrenFoldedAction"/>
+ </menu_category>
+ </menu_category>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ <menu_action accelerator="control alt LEFT" action="NextNodeAction.BACK"/>
+ <menu_action accelerator="control alt RIGHT" action="NextNodeAction.FORWARD"/>
+ </menu_submenu>
+ <menu_submenu name="filter" name_ref="menu_filter">
+ <menu_category name="Filter">
+ <menu_category name="DoFilter">
+ <menu_action action="UndoFilterAction"/>
+ <menu_action action="RedoFilterAction"/>
+ <menu_action action="ReapplyFilterAction"/>
+ <menu_action action="QuickFilterAction"/>
+ <menu_action action="ApplySelectedViewConditionAction"/>
+ <menu_action action="QuickFindAllAction"/>
+ <menu_action action="ApplyNoFilteringAction"/>
+ <menu_action action="EditFilterAction"/>
+ </menu_category>
+ <menu_category name="FilterCondition">
+ <menu_action action="ApplyToVisibleAction"/>
+ <menu_action action="ShowAncestorsAction"/>
+ <menu_action action="ShowDescendantsAction"/>
+ </menu_category>
+ <menu_category name="Find">
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="QuickFindAction.FORWARD"/>
+ </menu_category>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="mindmaps" name_ref="mindmaps">
+ <menu_category menu_key="main_menu_modes" name="modes"/>
+ <menu_category menu_key="main_menu_navigate_maps" name="navigate"/>
+ <menu_category menu_key="main_menu_mindmaps" name="mindmaps"/>
+ </menu_submenu>
+ <menu_submenu name="help" name_ref="help">
+ <menu_category name="update">
+ <menu_action action="UpdateCheckAction"/>
+ </menu_category>
+ <menu_category name="Web resources">
+ <menu_action action="OpenFreeplaneSiteAction"/>
+ <menu_action action="AskForHelp"/>
+ <menu_action action="ReportBugAction"/>
+ <menu_action action="RequestFeatureAction"/>
+ </menu_category>
+ <menu_category name="legacy">
+ <menu_action action="AboutAction" menu_key="MB_AboutAction"/>
+ </menu_category>
+ <menu_action action="GettingStartedAction"/>
+ <menu_action accelerator="F1" action="DocumentationAction"/>
+ </menu_submenu>
+ </menu_category>
+ <menu_category name="map_popup">
+ <menu_action action="ToggleMenubarAction" menu_key="MP_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction"/>
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="CenterSelectedNodeAction"/>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ </menu_category>
+ <menu_category name="node_popup">
+ <menu_action action="CenterAction"/>
+ </menu_category>
+ <menu_category name="main_toolbar">
+ <menu_category menu_key="main_toolbar_update" name="update"/>
+ <menu_category name="main">
+ <menu_action action="NavigationPreviousMapAction"/>
+ <menu_action action="NavigationNextMapAction"/>
+ </menu_category>
+ <menu_category menu_key="main_toolbar_zoom" name="zoom">
+ <menu_action action="CenterAction"/>
+ </menu_category>
+ <menu_category name="open">
+ <menu_action action="PrintAction"/>
+ <menu_action action="CloseAction"/>
+ </menu_category>
+ </menu_category>
+</menu_structure>
\ No newline at end of file
diff --git a/freeplane/resources/xml/mapVersions.xml b/freeplane/resources/xml/mapVersions.xml
new file mode 100644
index 0000000..32096b2
--- /dev/null
+++ b/freeplane/resources/xml/mapVersions.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MapVersions>
+ <dialect name="FREEPLANE1_2_0" versionBegin="freeplane 1.2.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_1" versionBegin="0.9.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEMIND" versionBegin="0.8" needsConversion="false" anotherDialect="false" appName="FreeMind" url="http://freemind.sourceforge.net" />
+ <dialect name="FREEMIND_1" versionBegin="1." needsConversion="false" anotherDialect="true" appName="FreeMind" url="http://freemind.sourceforge.net" />
+ <dialect name="DOCEAR" versionBegin="docear " needsConversion="false" anotherDialect="true" appName="Docear" url="http://www.doc-ear.com" />
+</MapVersions>
diff --git a/freeplane/resources/xml/mindmapmodemenu.xml b/freeplane/resources/xml/mindmapmodemenu.xml
new file mode 100644
index 0000000..acd8f0d
--- /dev/null
+++ b/freeplane/resources/xml/mindmapmodemenu.xml
@@ -0,0 +1,545 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<menu_structure>
+ <menu_category name="menu_bar">
+ <menu_submenu name="file" name_ref="file">
+ <menu_action action="NewMapAction" accelerator="control N" />
+ <menu_action action="new_map_from_user_templates" />
+ <menu_action action="EncryptedMap" />
+ <menu_separator />
+ <menu_action action="SaveAction" accelerator="control S" />
+ <menu_action action="SaveAsAction" accelerator="control shift S" />
+ <menu_action action="SaveAll" />
+ <menu_action action="RevertAction" />
+ <menu_separator />
+ <menu_action action="OpenAction" accelerator="control O" />
+ <menu_action action="OpenURLMapAction" />
+ <menu_submenu name="last" name_ref="most_recent_files" menu_key="main_menu_most_recent_files"/>
+ <menu_separator />
+ <menu_action action="ExportAction"/>
+ <menu_action action="ExportBranchAction" accelerator="alt shift A" />
+ <menu_submenu name="import" name_ref="menu_file_import">
+ <menu_action action="ImportBranchAction" />
+ <menu_action action="ImportLinkedBranchAction"/>
+ <menu_action action="ImportLinkedBranchWithoutRootAction"/>
+ <menu_separator />
+ <menu_action action="ImportExplorerFavoritesAction"/>
+ <menu_action action="ImportFolderStructureAction"/>
+ <menu_action action="ImportMindmanagerFiles"/>
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="PageAction" />
+ <menu_action action="PrintPreviewAction" />
+ <menu_action action="PrintAction" accelerator="control P" />
+ <menu_separator />
+ <menu_action action="FilePropertiesAction" />
+ <menu_separator />
+ <menu_action action="CloseAction" accelerator="control W" />
+ <menu_separator />
+ <menu_action action="QuitAction" accelerator="control Q" menu_key="MB_QuitAction"/>
+ </menu_submenu>
+ <menu_submenu name="edit" name_ref="edit">
+ <menu_submenu name="menu_newNode" name_ref="menu_newNode">
+ <menu_action action="NewChildAction" accelerator="INSERT" />
+ <menu_action action="NewSiblingAction" accelerator="ENTER" />
+ <menu_action action="NewPreviousSiblingAction" accelerator="shift ENTER" />
+ <menu_action action="NewParentNode" accelerator="shift INSERT" />
+ <menu_action action="NewFreeNodeAction" />
+ <menu_action action="NewSummaryAction" accelerator="alt shift INSERT" />
+ </menu_submenu>
+ <menu_submenu name="menu_group" name_ref="menu_group">
+ <menu_action action="FirstGroupNodeAction" accelerator = "alt shift B"/>
+ <menu_action action="SummaryNodeAction" accelerator = "alt shift S"/>
+ <menu_action action="AlwaysUnfoldedNodeAction"/>
+ <menu_action action="CloudAction" accelerator="control shift B" />
+ </menu_submenu>
+ <menu_action action="AddConnectorAction" accelerator="control L" />
+ <menu_submenu name="links" name_ref="menu_links">
+ <menu_action action="SetLinkByFileChooserAction" accelerator="control shift K" />
+ <menu_action action="SetLinkByTextFieldAction" accelerator="control K" />
+ <menu_action action="ExtractLinkFromTextAction" />
+ <menu_separator/>
+ <menu_action action="AddLocalLinkAction" accelerator="alt shift L" />
+ <menu_action action="AddMenuItemLinkAction" accelerator="" />
+ <menu_separator/>
+ <menu_action action="SetLinkAnchorAction" accelerator="" />
+ <menu_action action="MakeLinkFromAnchorAction" accelerator="" />
+ <menu_action action="MakeLinkToAnchorAction" accelerator="" />
+ <menu_action action="ClearLinkAnchorAction" accelerator="" />
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="DeleteAction" accelerator="DELETE" />
+ <menu_separator />
+ <menu_submenu name="menu_title" name_ref="menu_title">
+ <menu_action action="EditAction" accelerator="F2" />
+ <menu_action action="SetBooleanPropertyAction.edit_on_double_click" />
+ <menu_action action="EditLongAction" accelerator="alt ENTER" />
+ <menu_action action="JoinNodesAction" accelerator="control J" ></menu_action>
+ <menu_action action="SplitNode" />
+ <menu_action action="RevisionPluginAction" />
+ <menu_separator />
+ <menu_action action="SetImageByFileChooserAction" accelerator="alt shift K" />
+ </menu_submenu>
+ <menu_submenu name="icons" name_ref="menu_iconView">
+ <menu_action action="IconSelectionPlugin" accelerator="control F2"/>
+ <menu_submenu name="icons" name_ref="menu_iconByCategory">
+ <menu_separator />
+ <menu_category name="icons_list" menu_key="main_menu_icons">
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="progress" name_ref="menu_progress">
+ <menu_action action="IconProgressIconUpAction" accelerator="alt LESS" />
+ <menu_action action="IconProgressIconDownAction" accelerator="alt shift LESS" />
+ <menu_separator/>
+ <menu_action action="IconProgressExtended10Action" />
+ <menu_action action="IconProgressExtended25Action" />
+ <menu_separator/>
+ <menu_action action="IconProgressRemoveAction" />
+ </menu_submenu>
+ <menu_action action="HierarchicalIconsAction" />
+ <menu_action action="HierarchicalIcons2Action" />
+ <menu_submenu name="menu_remove_icons" >
+ <menu_action action="RemoveIcon_0_Action" />
+ <menu_action action="RemoveIconAction" />
+ <menu_action action="RemoveAllIconsAction" />
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="menu_extensions" name_ref="menu_extensions">
+ <menu_action action="EditDetailsAction"/>
+ <menu_action action="EditDetailsInDialogAction"/>
+ <menu_action action="CopyStyleExtensionsAction" />
+ <menu_action action="DeleteDetailsAction"/>
+ <menu_separator/>
+ <menu_action action="ExternalImageAddAction" />
+ <menu_action action="ExternalImageChangeAction" />
+ <menu_action action="ExternalImageRemoveAction" />
+ <menu_separator/>
+ <menu_action action="EditAttributesAction" accelerator="alt F9"/>
+ <menu_action action="attributes_AddAttributeAction"/>
+ <menu_action action="AssignAttributesAction" />
+ <menu_action action="CopyAttributes" />
+ <menu_action action="PasteAttributes" />
+ <menu_action action="AddStyleAttributes" />
+ <menu_submenu name="menu_removeAttribute" name_ref="menu_removeAttribute">
+ <menu_action action="attributes_RemoveFirstAttributeAction"/>
+ <menu_action action="attributes_RemoveLastAttributeAction"/>
+ <menu_action action="attributes_RemoveAllAttributesAction"/>
+ </menu_submenu>
+ <menu_action action="ShowAttributeDialogAction" />
+ <menu_separator/>
+ <menu_action action="LatexInsertLatexAction" plugin="org.freeplane.plugin.latex"/>
+ <menu_action action="LatexEditLatexAction" plugin="org.freeplane.plugin.latex"/>
+ <menu_action action="LatexDeleteLatexAction" plugin="org.freeplane.plugin.latex"/>
+ </menu_submenu>
+ <menu_submenu name="notes" name_ref="menu_notes">
+ <menu_action action="EditNoteInDialogAction" />
+ <menu_action action="RemoveNoteAction" />
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="UndoAction" accelerator="control Z" />
+ <menu_action action="RedoAction" accelerator="control Y" />
+ <menu_action action="CutAction" accelerator="control X" />
+ <menu_submenu name="menu_copy" name_ref="menu_copy">
+ <menu_action action="CopyAction" accelerator="control C" />
+ <menu_action action="CopySingleAction" accelerator="control shift C" />
+ <menu_action action="CopyIDAction" />
+ <menu_action action="CopyNodeURIAction" />
+ </menu_submenu>
+ <menu_action action="PasteAction" accelerator="control V" />
+ <menu_action action="SelectedPasteAction" />
+ <menu_separator />
+ <menu_submenu name="menu_moveNode" name_ref="menu_moveNode">
+ <menu_action action="NodeUpAction" accelerator="control UP" />
+ <menu_action action="NodeDownAction" accelerator="control DOWN" />
+ <menu_action action="SortNodes" />
+ <menu_action action="ChangeNodeLevelLeftsAction" accelerator="control LEFT" />
+ <menu_action action="ChangeNodeLevelRightsAction" accelerator="control RIGHT" />
+ </menu_submenu>
+ <menu_action action="FreeNodeAction"/>
+ <menu_action action="ResetNodeLocationAction" />
+ <menu_separator />
+ <menu_category name="find">
+ <menu_action action="FindAction" accelerator="control G" />
+ <menu_action action="QuickFindAction.FORWARD" accelerator="control shift G" />
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="NodeListAction" accelerator="control shift F" />
+ <menu_action action="AllMapsNodeListAction" />
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="view" name_ref="menu_view">
+ <menu_action action="NewMapViewAction"/>
+ <menu_category name="Menu_Toolbar_Panel">
+ <menu_category name="toolbars">
+ <menu_submenu name="toolbars" name_ref="menu_toolbars">
+ <menu_action action="ToggleMenubarAction" menu_key="MB_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction" />
+ <menu_action action="ShowFilterToolbarAction" accelerator="control F"/>
+ <menu_action action="ToggleFBarAction" />
+ <menu_action action="ToggleLeftToolbarAction" />
+ <menu_action action="ToggleStatusAction" />
+ </menu_submenu>
+ <menu_action action="ShowFormatPanel" />
+ </menu_category>
+ <menu_separator />
+ </menu_category>
+ <menu_category name="zoom">
+ <menu_action action="ZoomInAction" accelerator="alt UP" />
+ <menu_action action="ZoomOutAction" accelerator="alt DOWN" />
+ <menu_action action="FitToPage" />
+ <menu_action action="CenterSelectedNodeAction" accelerator="control alt C" />
+ <menu_action action="SetBooleanPropertyAction.center_selected_node"/>
+ </menu_category>
+ <menu_separator />
+ <menu_submenu name="menu_viewmode" name_ref="menu_viewmode">
+ <menu_action action="ViewLayoutTypeAction.OUTLINE" />
+ <menu_action action="ToggleFullScreenAction" />
+ <menu_action action="SetBooleanPropertyAction.presentation_mode" />
+ <menu_action action="ShowSelectionAsRectangleAction" />
+ <menu_action action="SetBooleanPropertyAction.highlight_formulas" />
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="SetShortenerStateAction" />
+ <menu_action action="ToggleDetailsAction" accelerator="alt F2" />
+ <menu_submenu name="menu_hoverView" name_ref="menu_hoverView">
+ <menu_action action="SetBooleanPropertyAction.show_node_tooltips" />
+ <menu_action action="SetBooleanPropertyAction.show_styles_in_tooltip" />
+ <menu_action action="CreationModificationPluginAction" />
+ </menu_submenu>
+ <menu_category name="AttributeView">
+ <menu_submenu name="menu_displayAttributes" name_ref="menu_displayAttributes">
+ <menu_radio_action action="ShowSelectedAttributesAction" />
+ <menu_radio_action action="ShowAllAttributesAction" />
+ <menu_radio_action action="HideAllAttributesAction" />
+ <menu_action action="SetBooleanMapPropertyAction.show_icon_for_attributes" />
+ </menu_submenu>
+ </menu_category>
+ <menu_submenu name="menu_noteView" name_ref="menu_noteView">
+ <menu_action action="ShowHideNoteAction" accelerator="control GREATER" />
+ <menu_submenu name="note_window_location" name_ref="note_window_location">
+ <menu_radio_action action="SetNoteWindowPosition.top" />
+ <menu_radio_action action="SetNoteWindowPosition.left" />
+ <menu_radio_action action="SetNoteWindowPosition.right" />
+ <menu_radio_action action="SetNoteWindowPosition.bottom" />
+ </menu_submenu>
+ <menu_action action="SetBooleanMapPropertyAction.show_note_icons" />
+ <menu_action action="ShowNotesInMapAction"/>
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="format" name_ref="menu_format">
+ <menu_submenu name="menu_applyStyle" name_ref="menu_applyStyle" menu_key="main_menu_styles"/>
+ <menu_submenu name="AutomaticLayoutAction" name_ref="automatic_layout">
+ <menu_action action="AutomaticLayoutControllerAction.HEADINGS" />
+ <menu_action action="AutomaticLayoutControllerAction.ALL" />
+ <menu_action action="AutomaticLayoutControllerAction.null" />
+ </menu_submenu>
+ <menu_submenu name="menu_manageStyles" name_ref="menu_manageStyles">
+ <menu_action action="NewUserStyleAction" />
+ <menu_action action="RedefineStyleAction" />
+ <menu_action action="ManageConditionalStylesAction" />
+ <menu_action action="ManageNodeConditionalStylesAction" />
+ <menu_separator />
+ <menu_action action="CopyMapStylesAction" />
+ <menu_action action="EditStylesAction" />
+ </menu_submenu>
+ <menu_action action="FormatCopy" accelerator="alt shift C" />
+ <menu_action action="FormatPaste" accelerator="alt shift V" />
+
+ <menu_separator />
+ <menu_action action="MapBackgroundColorAction" />
+ <menu_submenu name="menu_coreFormat" name_ref="menu_coreFormat">
+ <menu_action action="BoldAction" accelerator="control B" />
+ <menu_action action="ItalicAction" accelerator="control I" />
+ <menu_action action="IncreaseNodeFontAction" accelerator="control PLUS" />
+ <menu_action action="DecreaseNodeFontAction" accelerator="control MINUS" />
+ <menu_separator />
+ <menu_action action="NodeColorAction" accelerator="alt shift F" />
+ <menu_action action="BlinkingNodeHookAction" />
+ <menu_action action="NodeColorBlendAction"/>
+ <menu_separator />
+ <menu_action action="NodeBackgroundColorAction" />
+ <menu_separator />
+ <menu_action action="NodeShapeAction.fork" />
+ <menu_action action="NodeShapeAction.bubble" />
+ <menu_separator />
+ <menu_action action="RemoveFormatAction"/>
+ <menu_action action="UsePlainTextAction" accelerator="alt shift P" />
+ </menu_submenu>
+ <menu_category name="CloudProperties">
+ <menu_submenu name="shapes" name_ref="format_menu_cloud_shapes">
+ <menu_radio_action action="CloudShapeAction.ARC" />
+ <menu_radio_action action="CloudShapeAction.STAR" />
+ <menu_radio_action action="CloudShapeAction.RECT" />
+ <menu_radio_action action="CloudShapeAction.ROUND_RECT" />
+ </menu_submenu>
+ <menu_action action="CloudColorAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="EdgeProperties">
+ <menu_submenu name="styles" name_ref="format_menu_edge_styles">
+ <menu_radio_action action="EdgeStyleAsParentAction" />
+ <menu_radio_action action="EdgeStyleAction.linear" />
+ <menu_radio_action action="EdgeStyleAction.bezier" />
+ <menu_radio_action action="EdgeStyleAction.sharp_linear" />
+ <menu_radio_action action="EdgeStyleAction.sharp_bezier" />
+ <menu_radio_action action="EdgeStyleAction.horizontal" />
+ <menu_radio_action action="EdgeStyleAction.hide_edge" />
+ </menu_submenu>
+ <menu_submenu name="widths" name_ref="format_menu_edge_widths">
+ <menu_radio_action action="EdgeWidthAction_width_parent" />
+ <menu_radio_action action="EdgeWidthAction_width_thin" />
+ <menu_radio_action action="EdgeWidthAction_1" />
+ <menu_radio_action action="EdgeWidthAction_2" />
+ <menu_radio_action action="EdgeWidthAction_4" />
+ <menu_radio_action action="EdgeWidthAction_8" />
+ </menu_submenu>
+ <menu_action action="EdgeColorAction" accelerator="alt shift E" />
+ <menu_action action="AutomaticEdgeColorHookAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_action action="NodeWidthAction" />
+ </menu_submenu>
+ <menu_submenu name="navigate" name_ref="menu_navigate" menu_key="menu_navigate">
+ <menu_category name="navigate">
+ <menu_action action="NavigationPreviousMapAction" accelerator="control shift TAB" />
+ <menu_action action="NavigationNextMapAction" accelerator="control TAB" />
+ <menu_separator />
+ <menu_category name="folding">
+ <menu_action action="ToggleFoldedAction" accelerator="SPACE" />
+ <menu_action action="ShowNextChildAction" accelerator="shift SPACE" />
+ <menu_action action="ToggleChildrenFoldedAction" accelerator="control SPACE" />
+ <menu_action action="UnfoldOneLevelAction" accelerator="alt PAGE_DOWN" />
+ <menu_action action="FoldOneLevelAction" accelerator="alt PAGE_UP" />
+ <menu_action action="UnfoldAllAction" accelerator="alt END" />
+ <menu_action action="FoldAllAction" accelerator="alt HOME" />
+ </menu_category>
+ </menu_category>
+ <menu_separator />
+ <menu_action action="SelectAllAction" accelerator="control A" />
+ <menu_action action="SelectBranchAction" accelerator="control shift A" />
+ <menu_separator />
+ <menu_action action="MoveToRootAction" accelerator="ESCAPE" />
+ <menu_action action="GotoNodeAction"/>
+ <menu_action action="NextNodeAction.BACK" accelerator="control alt LEFT" />
+ <menu_action action="NextNodeAction.FORWARD" accelerator="control alt RIGHT" />
+ <menu_action action="NextNodeAction.BACK_N_FOLD" accelerator="control shift LEFT" />
+ <menu_action action="NextNodeAction.FORWARD_N_FOLD" accelerator="control shift RIGHT" />
+ <menu_action action="NextPresentationItemAction" accelerator="control shift SPACE"/>
+ <menu_action action="BackAction" accelerator="alt LEFT" />
+ <menu_action action="ForwardAction" accelerator="alt RIGHT" />
+ <menu_category name="links">
+ <menu_separator />
+ <menu_action action="FollowLinkAction" accelerator="control ENTER" />
+ <menu_category menu_key="menu_goto_links"/>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="filter" name_ref="menu_filter">
+ <menu_category name="Filter">
+ <menu_category name="DoFilter">
+ <menu_action action="UndoFilterAction" />
+ <menu_action action="RedoFilterAction" />
+ <menu_action action="ReapplyFilterAction" />
+ <menu_separator />
+ <menu_action action="QuickFilterAction" />
+ <menu_action action="ApplySelectedViewConditionAction"/>
+ <menu_action action="QuickFindAllAction" />
+ <menu_action action="ApplyNoFilteringAction"/>
+ <menu_action action="EditFilterAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="FilterCondition">
+ <menu_action action="ApplyToVisibleAction" />
+ <menu_action action="ShowAncestorsAction" />
+ <menu_action action="ShowDescendantsAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="Find">
+ <menu_action action="QuickFindAction.BACK" />
+ <menu_action action="QuickFindAction.FORWARD" />
+ </menu_category>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="extras" name_ref="menu_extras">
+ <menu_submenu name="time" name_ref="menu_time">
+ <menu_action action="TimeManagementAction" accelerator="control T" />
+ <menu_action action="TimeListAction" />
+ <menu_action action="ReminderHookAction" />
+ </menu_submenu>
+ <menu_separator />
+ <menu_submenu name="encryption" name_ref="menu_encryption">
+ <menu_action action="EnterPassword" />
+ <menu_action action="RemoveEncryption" />
+ </menu_submenu>
+ <menu_separator />
+ <menu_category name="first">
+ <menu_category name="options">
+ <menu_action action="ManageAddOnsAction" plugin="org.freeplane.plugin.script"/>
+ <menu_action action="SetAcceleratorOnNextClickAction" />
+ <menu_submenu name="acceleratorPresets" name_ref="acceleratorPresets">
+ <menu_submenu name="load_accelerator_presets" menu_key="main_menu_new_load_accelerator_presets"/>
+ <menu_action action="SaveAcceleratorPresetsAction"/>
+ </menu_submenu>
+ </menu_category>
+ <menu_separator />
+ <menu_category name="scripting" plugin="org.freeplane.plugin.script" menu_key="main_menu_scripting">
+ </menu_category>
+ <menu_action action="ExecuteScriptForSelectionAction" plugin="org.freeplane.plugin.script"/>
+ <menu_action action="ExecuteScriptForAllNodes" plugin="org.freeplane.plugin.script"/>
+ <menu_action action="ScriptEditor" plugin="org.freeplane.plugin.script"/>
+ <menu_separator />
+ <menu_submenu name="formula" name_ref="formula.menuname" plugin="org.freeplane.plugin.formula">
+ <menu_action action="formula.EvaluateAllAction" plugin="org.freeplane.plugin.formula"/>
+ <menu_separator />
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="OpenUserDirAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_action action="PropertyAction" accelerator="control COMMA" menu_key="MB_PropertyAction"/>
+ </menu_submenu>
+ <menu_submenu name="mindmaps" name_ref="mindmaps">
+ <menu_category name="modes" menu_key="main_menu_modes"/>
+ <menu_category name="navigate" menu_key="main_menu_navigate_maps"/>
+ <menu_separator />
+ <menu_category name="mindmaps" menu_key="main_menu_mindmaps"/>
+ <menu_separator />
+ </menu_submenu>
+ <menu_submenu name="help" name_ref="help">
+ <menu_category name="update">
+ <menu_action action="UpdateCheckAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="Web resources">
+ <menu_action action="OpenFreeplaneSiteAction" />
+ <menu_action action="AskForHelp" />
+ <menu_action action="ReportBugAction" />
+ <menu_action action="RequestFeatureAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="legacy">
+ <menu_action action="AboutAction" menu_key="MB_AboutAction"/>
+ </menu_category>
+ <menu_separator />
+ <menu_action action="GettingStartedAction" accelerator="F1" />
+ <menu_action action="DocumentationAction" />
+ <menu_action action="OnlineReference" />
+ <menu_action action="HotKeyInfoAction"/>
+ <menu_separator />
+ </menu_submenu>
+ </menu_category>
+ <menu_category name="map_popup">
+ <menu_action action="ToggleFullScreenAction" />
+ <menu_action action="ToggleMenubarAction" menu_key="MP_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction" />
+ <menu_action action="ShowFilterToolbarAction" />
+ <menu_action action="ToggleFBarAction" />
+ <menu_action action="ToggleLeftToolbarAction" />
+ <menu_action action="ToggleStatusAction" />
+ <menu_separator />
+ <menu_action action="ShowFormatPanel" />
+ <menu_action action="ShowHideNoteAction" accelerator="control GREATER" />
+ <menu_separator />
+ <menu_action action="MapBackgroundColorAction" />
+ <menu_separator />
+ <menu_action action="ViewLayoutTypeAction.OUTLINE" />
+ <menu_action action="FitToPage" />
+ <menu_action action="CenterSelectedNodeAction" />
+ <menu_action action="MoveToRootAction" accelerator="ESCAPE" />
+ <menu_action action="GotoNodeAction"/>
+ </menu_category>
+ <menu_category name="node_popup">
+ <menu_action action="EditLongAction" accelerator="alt ENTER" />
+ <menu_action action="EditDetailsInDialogAction" />
+ <menu_action action="EditDetailsAction"/>
+ <menu_action action="DeleteDetailsAction"/>
+ <menu_action action="SetShortenerStateAction" />
+ <menu_action action="EditNoteInDialogAction" />
+ <menu_action action="ExternalImageAddAction" />
+ <menu_action action="EditAttributesAction" accelerator="alt F9"/>
+ <menu_separator />
+ <menu_action action="NewSummaryAction" accelerator="alt shift INSERT" />
+ <menu_action action="SummaryNodeAction" accelerator = "alt shift S"/>
+ <menu_action action="AlwaysUnfoldedNodeAction"/>
+ <menu_action action="FreeNodeAction"/>
+ <menu_action action="CloudAction" accelerator="control shift B" />
+ <menu_submenu name="menu_applyStyle" name_ref="menu_applyStyle" menu_key="node_popup_styles"/>
+ <menu_action action="AddConnectorAction" accelerator="control L" />
+ <menu_submenu name="links" name_ref="menu_links" menu_key="popup_navigate">
+ <menu_action action="SetLinkByFileChooserAction" accelerator="control shift K" />
+ <menu_action action="SetLinkByTextFieldAction" accelerator="control K" />
+ <menu_action action="ExtractLinkFromTextAction" />
+ <menu_separator/>
+ <menu_action action="AddLocalLinkAction" accelerator="alt shift L" />
+ <menu_action action="AddMenuItemLinkAction" accelerator="" />
+ <menu_separator/>
+ <menu_action action="SetLinkAnchorAction" accelerator="" />
+ <menu_action action="MakeLinkFromAnchorAction" accelerator="" />
+ <menu_action action="MakeLinkToAnchorAction" accelerator="" />
+ <menu_action action="ClearLinkAnchorAction" accelerator="" />
+ <menu_category menu_key="popup_goto_links"/>
+ </menu_submenu>
+ <menu_separator />
+ <menu_action action="EnterPassword" />
+ <menu_category name="scripting" plugin="org.freeplane.plugin.script" menu_key="node_popup_scripting"/>
+ <menu_separator />
+ <menu_action action="CutAction" accelerator="control X" />
+ <menu_action action="CopyAction" accelerator="control C" />
+ <menu_action action="CopySingleAction" accelerator="control shift C" />
+ <menu_action action="CopyIDAction" />
+ <menu_action action="CopyNodeURIAction" />
+ <menu_action action="PasteAction" accelerator="control V" />
+ <menu_action action="SortNodes" />
+ <menu_action action="UndoAction" />
+ <menu_action action="RedoAction" />
+ </menu_category>
+ <menu_category name="main_toolbar">
+ <menu_separator />
+ <menu_category name="history">
+ <menu_action action="BackAction" />
+ <menu_action action="ForwardAction" />
+ </menu_category>
+ <menu_category name="update" menu_key="main_toolbar_update" />
+ <menu_category name="main">
+ <menu_action action="NavigationPreviousMapAction" />
+ <menu_action action="NavigationNextMapAction" />
+ </menu_category>
+ <menu_category name="zoom" menu_key="main_toolbar_zoom">
+ </menu_category>
+ <menu_category name="open">
+ <menu_action action="OpenAction" />
+ <menu_action action="NewMapAction" />
+ <menu_action action="SaveAction" />
+ <menu_action action="SaveAsAction" />
+ <menu_action action="PrintAction" />
+ <menu_action action="CloseAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="undo">
+ <menu_action action="UndoAction" />
+ <menu_action action="RedoAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_category name="font" menu_key="main_toolbar_font">
+ <menu_category name="toolbar_styles" menu_key="main_toolbar_style"/>
+ <menu_category name="toolbar_fonts" menu_key="main_toolbar_font_name"/>
+ <menu_category name="toolbar_fonts" menu_key="main_toolbar_font_size"/>
+ <menu_action action="BoldAction" />
+ <menu_action action="ItalicAction" />
+ </menu_category>
+ <menu_separator />
+ <menu_action action="CloudAction" />
+ <menu_action action="CloudColorAction" />
+ <menu_separator />
+ <menu_category name="folding">
+ <menu_action action="UnfoldOneLevelAction"/>
+ <menu_action action="FoldOneLevelAction"/>
+ <menu_action action="UnfoldAllAction"/>
+ <menu_action action="FoldAllAction"/>
+ </menu_category>
+ <menu_category name="find">
+ <menu_action action="FindAction"/>
+ <menu_action action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="NodeListAction"/>
+ </menu_category>
+ <menu_action action="EnterPassword" />
+ </menu_category>
+</menu_structure>
\ No newline at end of file
diff --git a/freeplane/resources/xml/mm2oowriterStyles.xml b/freeplane/resources/xml/mm2oowriterStyles.xml
new file mode 100644
index 0000000..47af777
--- /dev/null
+++ b/freeplane/resources/xml/mm2oowriterStyles.xml
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*Freeplane - A Program for creating and viewing Mindmaps
+ *Copyright (C) 2000-2008 Christian Foltin and others.
+ *
+ *See COPYING for Details
+ *
+ *This program is free software; you can redistribute it and/or
+ *modify it under the terms of the GNU General Public License
+ *as published by the Free Software Foundation; either version 2
+ *of the License, or (at your option) any later version.
+ *
+ *This program is distributed in the hope that it will be useful,
+ *but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *GNU 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.
+ *
+ */
+-->
+<office:document-styles
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+ xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+ xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+ xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+ xmlns:ooo="http://openoffice.org/2004/office"
+ xmlns:ooow="http://openoffice.org/2004/writer"
+ xmlns:oooc="http://openoffice.org/2004/calc"
+ xmlns:dom="http://www.w3.org/2001/xml-events" office:version="1.0">
+ <office:font-face-decls>
+ <style:font-face style:name="StarSymbol"
+ svg:font-family="StarSymbol" />
+ <style:font-face style:name="DejaVu Sans"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="roman" style:font-pitch="variable" />
+ <style:font-face style:name="DejaVu Sans1"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="swiss" style:font-pitch="variable" />
+ <style:font-face style:name="DejaVu Sans2"
+ svg:font-family="'DejaVu Sans'"
+ style:font-family-generic="system" style:font-pitch="variable" />
+ </office:font-face-decls>
+ <office:styles>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties draw:shadow-offset-x="0.3cm"
+ draw:shadow-offset-y="0.3cm"
+ draw:start-line-spacing-horizontal="0.283cm"
+ draw:start-line-spacing-vertical="0.283cm"
+ draw:end-line-spacing-horizontal="0.283cm"
+ draw:end-line-spacing-vertical="0.283cm"
+ style:flow-with-text="false" />
+ <style:paragraph-properties
+ style:text-autospace="ideograph-alpha" style:line-break="strict"
+ style:writing-mode="lr-tb"
+ style:font-independent-line-spacing="false">
+ <style:tab-stops />
+ </style:paragraph-properties>
+ <style:text-properties style:use-window-font-color="true"
+ fo:font-size="12pt" fo:language="de" fo:country="DE"
+ style:font-size-asian="12pt" style:language-asian="de"
+ style:country-asian="DE" style:font-size-complex="12pt"
+ style:language-complex="de" style:country-complex="DE" />
+ </style:default-style>
+ <style:default-style style:family="paragraph">
+ <style:paragraph-properties
+ fo:hyphenation-ladder-count="no-limit"
+ style:text-autospace="ideograph-alpha"
+ style:punctuation-wrap="hanging" style:line-break="strict"
+ style:tab-stop-distance="1.251cm" style:writing-mode="page" />
+ <style:text-properties style:use-window-font-color="true"
+ style:font-name="DejaVu Sans" fo:font-size="12pt" fo:language="de"
+ fo:country="DE" style:font-name-asian="DejaVu Sans2"
+ style:font-size-asian="12pt" style:language-asian="de"
+ style:country-asian="DE" style:font-name-complex="DejaVu Sans2"
+ style:font-size-complex="12pt" style:language-complex="de"
+ style:country-complex="DE" fo:hyphenate="false"
+ fo:hyphenation-remain-char-count="2"
+ fo:hyphenation-push-char-count="2" />
+ </style:default-style>
+ <style:default-style style:family="table">
+ <style:table-properties table:border-model="collapsing" />
+ </style:default-style>
+ <style:default-style style:family="table-row">
+ <style:table-row-properties fo:keep-together="auto" />
+ </style:default-style>
+ <style:style style:name="Standard" style:family="paragraph"
+ style:class="text" />
+ <style:style style:name="Text_20_body"
+ style:display-name="Text body" style:family="paragraph"
+ style:parent-style-name="Standard" style:class="text">
+ <style:paragraph-properties fo:margin-top="0cm"
+ fo:margin-bottom="0.212cm" />
+ </style:style>
+ <style:style style:name="Heading" style:family="paragraph"
+ style:parent-style-name="Standard"
+ style:next-style-name="Text_20_body" style:class="text">
+ <style:paragraph-properties fo:margin-top="0.423cm"
+ fo:margin-bottom="0.212cm" fo:keep-with-next="always" />
+ <style:text-properties style:font-name="DejaVu Sans1"
+ fo:font-size="14pt" style:font-name-asian="DejaVu Sans2"
+ style:font-size-asian="14pt" style:font-name-complex="DejaVu Sans2"
+ style:font-size-complex="14pt" />
+ </style:style>
+ <style:style style:name="Heading_20_1"
+ style:display-name="Heading 1" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="1">
+ <style:text-properties fo:font-size="115%"
+ fo:font-weight="bold" style:font-size-asian="115%"
+ style:font-weight-asian="bold" style:font-size-complex="115%"
+ style:font-weight-complex="bold" />
+ </style:style>
+ <style:style style:name="Heading_20_2"
+ style:display-name="Heading 2" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="2">
+ <style:text-properties fo:font-size="14pt"
+ fo:font-style="italic" fo:font-weight="bold"
+ style:font-size-asian="14pt" style:font-style-asian="italic"
+ style:font-weight-asian="bold" style:font-size-complex="14pt"
+ style:font-style-complex="italic" style:font-weight-complex="bold" />
+ </style:style>
+ <style:style style:name="Heading_20_3"
+ style:display-name="Heading 3" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="3">
+ <style:text-properties fo:font-size="14pt"
+ fo:font-weight="bold" style:font-size-asian="14pt"
+ style:font-weight-asian="bold" style:font-size-complex="14pt"
+ style:font-weight-complex="bold" />
+ </style:style>
+ <style:style style:name="Heading_20_4"
+ style:display-name="Heading 4" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="4">
+ <style:text-properties fo:font-size="85%"
+ fo:font-style="italic" fo:font-weight="bold"
+ style:font-size-asian="85%" style:font-style-asian="italic"
+ style:font-weight-asian="bold" style:font-size-complex="85%"
+ style:font-style-complex="italic" style:font-weight-complex="bold"/>
+ </style:style>
+ <style:style style:name="Heading_20_5"
+ style:display-name="Heading 5" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="5">
+ <style:text-properties fo:font-size="85%"
+ fo:font-weight="bold" style:font-size-asian="85%"
+ style:font-weight-asian="bold" style:font-size-complex="85%"
+ style:font-weight-complex="bold"/>
+ </style:style>
+ <style:style style:name="Heading_20_6"
+ style:display-name="Heading 6" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="text"
+ style:default-outline-level="6">
+ <style:text-properties fo:font-size="75%"
+ fo:font-weight="bold" style:font-size-asian="75%"
+ style:font-weight-asian="bold" style:font-size-complex="75%"
+ style:font-weight-complex="bold"/>
+ </style:style>
+ <style:style style:name="Heading_20_7"
+ style:display-name="Heading 7" style:family="paragraph"
+ style:parent-style-name="Heading" style:class="text"
+ style:next-style-name="Text_20_body"
+ style:default-outline-level="7">
+ <style:text-properties fo:font-size="75%"
+ fo:font-weight="bold" style:font-size-asian="75%"
+ style:font-weight-asian="bold" style:font-size-complex="75%"
+ style:font-weight-complex="bold"/>
+ </style:style>
+ <style:style style:name="List" style:family="paragraph"
+ style:parent-style-name="Text_20_body" style:class="list" />
+ <style:style style:name="Caption" style:family="paragraph"
+ style:parent-style-name="Standard" style:class="extra">
+ <style:paragraph-properties fo:margin-top="0.212cm"
+ fo:margin-bottom="0.212cm" text:number-lines="false"
+ text:line-number="0" />
+ <style:text-properties fo:font-size="12pt"
+ fo:font-style="italic" style:font-size-asian="12pt"
+ style:font-style-asian="italic" style:font-size-complex="12pt"
+ style:font-style-complex="italic" />
+ </style:style>
+ <style:style style:name="Index" style:family="paragraph"
+ style:parent-style-name="Standard" style:class="index">
+ <style:paragraph-properties text:number-lines="false"
+ text:line-number="0" />
+ </style:style>
+ <style:style style:name="Title" style:family="paragraph"
+ style:parent-style-name="Heading" style:next-style-name="Subtitle"
+ style:class="chapter">
+ <style:paragraph-properties fo:text-align="center"
+ style:justify-single-word="false" />
+ <style:text-properties fo:font-size="18pt"
+ fo:font-weight="bold" style:font-size-asian="18pt"
+ style:font-weight-asian="bold" style:font-size-complex="18pt"
+ style:font-weight-complex="bold" />
+ </style:style>
+ <style:style style:name="Subtitle" style:family="paragraph"
+ style:parent-style-name="Heading"
+ style:next-style-name="Text_20_body" style:class="chapter">
+ <style:paragraph-properties fo:text-align="center"
+ style:justify-single-word="false" />
+ <style:text-properties fo:font-size="14pt"
+ fo:font-style="italic" style:font-size-asian="14pt"
+ style:font-style-asian="italic" style:font-size-complex="14pt"
+ style:font-style-complex="italic" />
+ </style:style>
+ <style:style style:name="Bullet_20_Symbols"
+ style:display-name="Bullet Symbols" style:family="text">
+ <style:text-properties style:font-name="StarSymbol"
+ fo:font-size="9pt" style:font-name-asian="StarSymbol"
+ style:font-size-asian="9pt" style:font-name-complex="StarSymbol"
+ style:font-size-complex="9pt" />
+ </style:style>
+ <text:outline-style>
+ <text:outline-level-style text:level="1"
+ style:num-format="1">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="2"
+ style:num-format="1" text:display-levels="2">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="3"
+ style:num-format="1" text:display-levels="3">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="4"
+ style:num-format="1" text:display-levels="4">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="5"
+ style:num-format="1" text:display-levels="5">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="6"
+ style:num-format="1" text:display-levels="6">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="7"
+ style:num-format="1" text:display-levels="7">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="8"
+ style:num-format="1" text:display-levels="8">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="9"
+ style:num-format="1" text:display-levels="9">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ <text:outline-level-style text:level="10"
+ style:num-format="1" text:display-levels="10">
+ <style:list-level-properties
+ text:min-label-distance="0.381cm" />
+ </text:outline-level-style>
+ </text:outline-style>
+ <text:notes-configuration text:note-class="footnote"
+ style:num-format="1" text:start-value="0"
+ text:footnotes-position="page" text:start-numbering-at="document" />
+ <text:notes-configuration text:note-class="endnote"
+ style:num-format="i" text:start-value="0" />
+ <text:linenumbering-configuration text:number-lines="false"
+ text:offset="0.499cm" style:num-format="1"
+ text:number-position="left" text:increment="5" />
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="pm1">
+ <style:page-layout-properties fo:page-width="20.999cm"
+ fo:page-height="29.699cm" style:num-format="1"
+ style:print-orientation="portrait" fo:margin-top="2cm"
+ fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm"
+ style:writing-mode="lr-tb" style:footnote-max-height="0cm">
+ <style:footnote-sep style:width="0.018cm"
+ style:distance-before-sep="0.101cm"
+ style:distance-after-sep="0.101cm" style:adjustment="left"
+ style:rel-width="25%" style:color="#000000" />
+ </style:page-layout-properties>
+ <style:header-style />
+ <style:footer-style />
+ </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+ <style:master-page style:name="Standard"
+ style:page-layout-name="pm1" />
+ </office:master-styles>
+</office:document-styles>
\ No newline at end of file
diff --git a/freeplane/resources/xml/patterns.xml b/freeplane/resources/xml/patterns.xml
new file mode 100644
index 0000000..a31ab15
--- /dev/null
+++ b/freeplane/resources/xml/patterns.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Default patterns supplied with Freeplane
+ Don't change this file per hand as a pattern manager
+ is now included in Freeplane.
+-->
+<patterns>
+<pattern name="Default">
+ <pattern_node_background_color/>
+ <pattern_node_color/>
+ <pattern_node_style/>
+ <pattern_node_font_name/>
+ <pattern_node_font_bold/>
+ <pattern_node_font_italic/>
+ <pattern_node_font_size/>
+ <pattern_icon/>
+ <pattern_cloud/>
+ <pattern_edge_color/>
+ <pattern_edge_style/>
+ <pattern_edge_width/>
+</pattern>
+<pattern name="OK">
+ <pattern_icon value="button_ok"/>
+</pattern>
+<pattern name="Needs action">
+ <pattern_icon value="messagebox_warning"/>
+</pattern>
+<pattern name="Floating Node">
+ <pattern_cloud value="true"/>
+ <pattern_edge_style value="hide_edge"/>
+</pattern>
+<pattern name="Topic">
+ <pattern_node_color value="#18898b"/>
+ <pattern_node_style value="fork"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="true"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_edge_color value="#808080"/>
+ <pattern_edge_style value="bezier"/>
+ <pattern_edge_width value="thin"/>
+</pattern>
+<pattern name="Subtopic">
+ <pattern_node_color value="#cc3300"/>
+ <pattern_node_style value="fork"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="true"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_edge_color value="#808080"/>
+ <pattern_edge_style value="bezier"/>
+ <pattern_edge_width value="thin"/>
+</pattern>
+<pattern name="Subsubtopic">
+ <pattern_node_color value="#669900"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="true"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+<pattern name="Important">
+ <pattern_node_color value="#ff0000"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_icon value="yes"/>
+</pattern>
+<pattern name="Question">
+ <pattern_node_font_name value="Aharoni"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_icon value="help"/>
+</pattern>
+<pattern name="Key">
+ <pattern_node_color value="#996600"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="false"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_icon value="password"/>
+</pattern>
+<pattern name="Idea">
+ <pattern_icon value="idea"/>
+</pattern>
+<pattern name="Note">
+ <pattern_node_color value="#990000"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+<pattern name="Date">
+ <pattern_node_color value="#0033ff"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_icon value="calendar"/>
+</pattern>
+<pattern name="Website">
+ <pattern_node_color value="#006633"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+<pattern name="List">
+ <pattern_node_color value="#cc6600"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="true"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_icon value="list"/>
+</pattern>
+<pattern name="Quotation">
+ <pattern_node_color value="#338800"/>
+ <pattern_node_style value="fork"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="false"/>
+ <pattern_node_font_italic value="false"/>
+ <pattern_node_font_size value="12"/>
+ <pattern_edge_color value="#808080"/>
+ <pattern_edge_style value="bezier"/>
+ <pattern_edge_width value="thin"/>
+</pattern>
+<pattern name="Definition">
+ <pattern_node_color value="#666600"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="false"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+<pattern name="Description">
+ <pattern_node_color value="#996600"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_bold value="false"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+<pattern name="Pending">
+ <pattern_node_color value="#b3b95c"/>
+ <pattern_node_font_name value="Liberation Sans"/>
+ <pattern_node_font_size value="12"/>
+</pattern>
+</patterns>
\ No newline at end of file
diff --git a/freeplane/resources/xml/preferences.xml b/freeplane/resources/xml/preferences.xml
new file mode 100644
index 0000000..6e852ec
--- /dev/null
+++ b/freeplane/resources/xml/preferences.xml
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<preferences_structure>
+<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"/>
+ <path name = "standard_template"/>
+ </separator>
+ <separator name = "automatic_save">
+ <number name = "time_for_automatic_save" min = "0"/>
+ <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 = "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"/>
+ </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="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="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="use_tabbed_pane"/>
+ <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="toolTipManager.max_tooltip_width" />
+ <number name="default_attribute_key_column_width" min = "10"/>
+ <number name="default_attribute_value_column_width" min = "10"/>
+ </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">
+ <number name="outline_vgap" min = "1"/>
+ <number name="outline_hgap" min = "1"/>
+ </separator>
+ <separator name="icon_properties">
+ <boolean name="structured_icon_toolbar"/>
+ <boolean name="show_note_icons" />
+ <boolean name="show_icon_for_attributes" />
+ </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"/>
+ <number name="foldingsymbolwidth"/>
+ <boolean name="edit_on_double_click"/>
+ <number name="grid_size" min = "1"/>
+ <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>
+ </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" />
+ </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"/>
+ </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"/>
+ <number name="toolTipManager.dismissDelay" min = "0"/>
+ <number name="toolTipManager.reshowDelay" 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/resources/xml/stylemodemenu.xml b/freeplane/resources/xml/stylemodemenu.xml
new file mode 100644
index 0000000..e6d6b0c
--- /dev/null
+++ b/freeplane/resources/xml/stylemodemenu.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><menu_structure>
+ <menu_category name="menu_bar">
+ <menu_submenu name="file" name_ref="file">
+ <menu_action action="styledialog.ok"/>
+ <menu_action action="styledialog.cancel"/>
+ </menu_submenu>
+ <menu_submenu name="edit" name_ref="edit">
+ <menu_submenu name="menu_group" name_ref="menu_group">
+ <menu_action accelerator="control shift B" action="CloudAction"/>
+ </menu_submenu>
+ <menu_submenu name="icons" name_ref="menu_iconView">
+ <menu_submenu name="icons" name_ref="menu_iconByCategory">
+ <menu_category menu_key="main_menu_icons" name="icons_list">
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="menu_remove_icons" >
+ <menu_action action="RemoveIcon_0_Action" />
+ <menu_action action="RemoveIconAction" />
+ <menu_action action="RemoveAllIconsAction" />
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="menu_extensions" name_ref="menu_extensions">
+ <menu_action action="EditDetailsAction"/>
+ <menu_action action="EditDetailsInDialogAction"/>
+ <menu_action action="DeleteDetailsAction"/>
+ <menu_action accelerator="alt F9" action="EditAttributesAction"/>
+ <menu_action action="CopyAttributes"/>
+ <menu_action action="PasteAttributes"/>
+ </menu_submenu>
+ <menu_submenu name="notes" name_ref="menu_notes">
+ <menu_action action="EditNoteInDialogAction"/>
+ <menu_action action="RemoveNoteAction"/>
+ </menu_submenu>
+ <menu_action accelerator="control Z" action="UndoAction"/>
+ <menu_action accelerator="control Y" action="RedoAction"/>
+ <menu_submenu name="menu_moveNode" name_ref="menu_moveNode">
+ <menu_action accelerator="control UP" action="NodeUpAction"/>
+ <menu_action accelerator="control DOWN" action="NodeDownAction"/>
+ </menu_submenu>
+ <menu_category name="find">
+ <menu_action accelerator="control G" action="FindAction"/>
+ <menu_action accelerator="control shift G" action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="view" name_ref="menu_view">
+ <menu_category name="Menu_Toolbar_Panel">
+ <menu_category name="toolbars">
+ <menu_submenu name="toolbars" name_ref="menu_toolbars">
+ <menu_action action="ToggleMenubarAction" menu_key="MB_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ToggleLeftToolbarAction"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_category>
+ <menu_category name="zoom">
+ <menu_action accelerator="alt UP" action="ZoomInAction"/>
+ <menu_action accelerator="alt DOWN" action="ZoomOutAction"/>
+ <menu_action accelerator="control alt C" action="CenterSelectedNodeAction"/>
+ </menu_category>
+ <menu_submenu name="menu_viewmode" name_ref="menu_viewmode">
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="ShowSelectionAsRectangleAction"/>
+ </menu_submenu>
+ <menu_submenu name="menu_hoverView" name_ref="menu_hoverView">
+ <menu_action accelerator="alt F2" action="ToggleDetailsAction"/>
+ </menu_submenu>
+ <menu_category name="AttributeView">
+ <menu_submenu name="menu_displayAttributes" name_ref="menu_displayAttributes">
+ <menu_radio_action action="ShowSelectedAttributesAction"/>
+ <menu_radio_action action="ShowAllAttributesAction"/>
+ <menu_radio_action action="HideAllAttributesAction"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="format" name_ref="menu_format">
+ <menu_submenu name="menu_manageStyles" name_ref="menu_manageStyles">
+ <menu_action accelerator="" action="DeleteUserStyleAction"/>
+ <menu_action action="NewLevelStyleAction"/>
+ <menu_action action="DeleteLevelStyleAction"/>
+ <menu_action action="NewUserStyleAction"/>
+ <menu_action action="ManageNodeConditionalStylesAction"/>
+ </menu_submenu>
+ <menu_action accelerator="alt shift C" action="FormatCopy"/>
+ <menu_action accelerator="alt shift V" action="FormatPaste"/>
+ <menu_submenu name="menu_coreFormat" name_ref="menu_coreFormat">
+ <menu_action accelerator="control B" action="BoldAction"/>
+ <menu_action accelerator="control I" action="ItalicAction"/>
+ <menu_action accelerator="control PLUS" action="IncreaseNodeFontAction"/>
+ <menu_action accelerator="control MINUS" action="DecreaseNodeFontAction"/>
+ <menu_separator />
+ <menu_action accelerator="alt shift F" action="NodeColorAction"/>
+ <menu_action action="NodeColorBlendAction"/>
+ <menu_action action="NodeBackgroundColorAction"/>
+ <menu_separator />
+ <menu_action action="NodeShapeAction.fork"/>
+ <menu_action action="NodeShapeAction.bubble"/>
+ <menu_separator />
+ <menu_action action="RemoveFormatAction"/>
+ </menu_submenu>
+ <menu_category name="CloudProperties">
+ <menu_action action="CloudColorAction"/>
+ </menu_category>
+ <menu_category name="EdgeProperties">
+ <menu_submenu name="styles" name_ref="format_menu_edge_styles">
+ <menu_radio_action action="EdgeStyleAsParentAction"/>
+ <menu_radio_action action="EdgeStyleAction.linear"/>
+ <menu_radio_action action="EdgeStyleAction.bezier"/>
+ <menu_radio_action action="EdgeStyleAction.sharp_linear"/>
+ <menu_radio_action action="EdgeStyleAction.sharp_bezier"/>
+ <menu_radio_action action="EdgeStyleAction.horizontal"/>
+ <menu_radio_action action="EdgeStyleAction.hide_edge"/>
+ </menu_submenu>
+ <menu_submenu name="widths" name_ref="format_menu_edge_widths">
+ <menu_radio_action action="EdgeWidthAction_width_parent"/>
+ <menu_radio_action action="EdgeWidthAction_width_thin"/>
+ <menu_radio_action action="EdgeWidthAction_1"/>
+ <menu_radio_action action="EdgeWidthAction_2"/>
+ <menu_radio_action action="EdgeWidthAction_4"/>
+ <menu_radio_action action="EdgeWidthAction_8"/>
+ </menu_submenu>
+ <menu_action accelerator="alt shift E" action="EdgeColorAction"/>
+ </menu_category>
+ <menu_action action="NodeWidthAction" />
+ </menu_submenu>
+ <menu_submenu name="navigate" name_ref="menu_navigate">
+ <menu_category name="navigate">
+ <menu_category name="folding">
+ <menu_action accelerator="SPACE" action="ToggleFoldedAction"/>
+ <menu_action action="ShowNextChildAction" accelerator="shift SPACE" />
+ <menu_action accelerator="control SPACE" action="ToggleChildrenFoldedAction"/>
+ </menu_category>
+ </menu_category>
+ <menu_action accelerator="control A" action="SelectAllAction"/>
+ <menu_action accelerator="control shift A" action="SelectBranchAction"/>
+ </menu_submenu>
+ <menu_submenu name="mindmaps" name_ref="mindmaps">
+ <menu_category menu_key="main_menu_modes" name="modes"/>
+ <menu_category menu_key="main_menu_navigate_maps" name="navigate"/>
+ <menu_category menu_key="main_menu_mindmaps" name="mindmaps"/>
+ </menu_submenu>
+ </menu_category>
+ <menu_category name="map_popup">
+ <menu_action action="ToggleMenubarAction" menu_key="MP_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ToggleLeftToolbarAction"/>
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="CenterSelectedNodeAction"/>
+ </menu_category>
+ <menu_category name="node_popup">
+ <menu_action action="EditDetailsInDialogAction"/>
+ <menu_action action="EditDetailsAction"/>
+ <menu_action action="DeleteDetailsAction"/>
+ <menu_action action="EditNoteInDialogAction"/>
+ <menu_action accelerator="alt F9" action="EditAttributesAction"/>
+ <menu_action accelerator="control shift B" action="CloudAction"/>
+ <menu_action action="NewUserStyleAction"/>
+ <menu_action action="DeleteUserStyleAction"/>
+ </menu_category>
+ <menu_category name="main_toolbar">
+ <menu_category name="undo">
+ <menu_action action="styledialog.ok"/>
+ <menu_action action="styledialog.cancel"/>
+ <menu_action action="UndoAction"/>
+ <menu_action action="RedoAction"/>
+ </menu_category>
+ <menu_category name="toolbar_styles" menu_key="main_toolbar_style"/>
+ <menu_category menu_key="main_toolbar_font" name="font">
+ <menu_category name="toolbar_fonts" menu_key="main_toolbar_font_name"/>
+ <menu_category name="toolbar_fonts" menu_key="main_toolbar_font_size"/>
+ <menu_action action="BoldAction"/>
+ <menu_action action="ItalicAction"/>
+ </menu_category>
+ <menu_category name="clouds">
+ <menu_action action="CloudAction"/>
+ <menu_action action="CloudColorAction"/>
+ </menu_category>
+ </menu_category>
+</menu_structure>
\ No newline at end of file
diff --git a/freeplane/resources/xslt/freeplane2applet.xsl b/freeplane/resources/xslt/freeplane2applet.xsl
new file mode 100644
index 0000000..afc3c05
--- /dev/null
+++ b/freeplane/resources/xslt/freeplane2applet.xsl
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+ <!--
+/*Freeplane - A Program for creating and viewing Mindmaps
+ *Copyright (C) 2006 Christian Foltin <christianfoltin at users.sourceforge.net>
+ *See COPYING for Details
+ *
+ *This program is free software; you can redistribute it and/or
+ *modify it under the terms of the GNU General Public License
+ *as published by the Free Software Foundation; either version 2
+ *of the License, or (at your option) any later version.
+ *
+ *This program is distributed in the hope that it will be useful,
+ *but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *GNU 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.
+ */
+
+ -->
+
+ <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<!-- fc, 20.10.2004: The following parameters are set by freeplane. -->
+<xsl:param name="destination_dir">./</xsl:param>
+<xsl:param name="area_code"></xsl:param>
+<xsl:param name="folding_type">html_export_no_folding</xsl:param>
+ <!-- possible values:
+ html_export_fold_all,
+ html_export_no_folding,
+ html_export_fold_currently_folded,
+ html_export_based_on_headings: this means, that approx. five levels are given, more deeper nodes are folded.
+ As of the time being, this parameter is not used.
+ -->
+<xsl:param name="propertyList"/>
+<!--
+
+ -->
+ <xsl:template match="/">
+ <html>
+ <head>
+ <!-- look if there is any node inside the map (there should never be none, but who knows?)
+ and take its text as the title -->
+ <title><xsl:call-template name="output-title" /></title>
+ <style type="text/css">
+/*<![CDATA[*/
+body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px; height:100% }
+html { height:100% }
+/*]]>*/
+ </style>
+ </head>
+ <body>
+ <xsl:element name="applet">
+ <xsl:attribute name="code">org.freeplane.main.applet.FreeplaneApplet.class</xsl:attribute>
+ <xsl:attribute name="archive">
+ ./<xsl:value-of select="$destination_dir"/>freeplaneviewer.jar,
+ </xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+ <xsl:attribute name="height">100%</xsl:attribute>
+ <param name="type" value="application/x-java-applet;version=1.5"/>
+ <param name="scriptable" value="false"/>
+ <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>
+ <xsl:call-template name="appletParameters">
+ <xsl:with-param name="propertyList" select="$propertyList"/>
+ </xsl:call-template>
+
+ <param name="selection_method" value="selection_method_direct"/>
+ </xsl:element>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="output-title">
+ <!-- look if there is any node inside the map (there should never be
+ none, but who knows?) and take its text as the title -->
+ <xsl:choose>
+ <xsl:when test="/map/node/@TEXT">
+ <xsl:value-of select="normalize-space(/map/node/@TEXT)" />
+ </xsl:when>
+ <xsl:when test="/map/node/richcontent[@TYPE='NODE']">
+ <xsl:variable name="t">
+ <xsl:apply-templates select="/map/node/richcontent[@TYPE='NODE']/html/body" mode="strip-tags" />
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($t)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Mind Map</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="appletParameters">
+ <xsl:param name="propertyList"/>
+ <xsl:if test="$propertyList">
+ <xsl:variable name="property" select="substring-before($propertyList, '$$$')"/>
+ <xsl:variable name="name" select="substring-before($property, '=')"/>
+ <xsl:variable name="value" select="substring-after($property, '=')"/>
+ <xsl:call-template name="appletParam">
+ <xsl:with-param name="name" select="$name"/>
+ <xsl:with-param name="value" select="$value"/>
+ </xsl:call-template>
+ <xsl:variable name="otherProperties" select="substring-after($propertyList, '$$$')"/>
+ <xsl:call-template name="appletParameters">
+ <xsl:with-param name="propertyList" select="$otherProperties"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template name="appletParam">
+ <xsl:param name="name"/>
+ <xsl:param name="value"/>
+ <xsl:if test="$value">
+ <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>
+ <xsl:template match="text()|@*" mode="strip-tags">
+ <xsl:value-of select="string(.)"/>
+ </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/freeplane2flash.xsl b/freeplane/resources/xslt/freeplane2flash.xsl
new file mode 100644
index 0000000..3c3967e
--- /dev/null
+++ b/freeplane/resources/xslt/freeplane2flash.xsl
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+ <!--
+/*Freeplane - A Program for creating and viewing Mindmaps
+ *Copyright (C) 2006 Christian Foltin <christianfoltin at users.sourceforge.net>
+ *See COPYING for Details
+ *
+ *This program is free software; you can redistribute it and/or
+ *modify it under the terms of the GNU General Public License
+ *as published by the Free Software Foundation; either version 2
+ *of the License, or (at your option) any later version.
+ *
+ *This program is distributed in the hope that it will be useful,
+ *but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *GNU 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.
+ */
+
+ -->
+
+ <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ indent="yes"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
+
+<!-- fc, 20.10.2004: The following parameter is set by freeplane. -->
+<xsl:param name="destination_dir">./</xsl:param>
+<xsl:param name="area_code"></xsl:param>
+<xsl:param name="folding_type">html_export_no_folding</xsl:param>
+ <!-- possible values:
+ html_export_fold_all,
+ html_export_no_folding,
+ html_export_fold_currently_folded,
+ html_export_based_on_headings: this means, that approx. five levels are given, more deeper nodes are folded.
+ As of the time being, this parameter is not used.
+ -->
+<!--
+
+ -->
+ <xsl:template match="/">
+ <xsl:variable name="bgcolor">
+ <xsl:choose>
+ <xsl:when test="map/node/hook[@NAME='MapStyle']/@background">
+ <xsl:value-of select="map/node/hook[@NAME='MapStyle']/@background"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>#ffffff</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title><xsl:call-template name="output-title" /></title>
+ <xsl:element name="script">
+ <xsl:attribute name="type">text/javascript</xsl:attribute>
+ <xsl:attribute name="src">./<xsl:value-of select="$destination_dir"/>flashobject.js</xsl:attribute>
+ <xsl:text> </xsl:text><!-- this space is a trick, such that firefox displays the flash... :( -->
+ </xsl:element>
+<style type="text/css">
+
+ /* hide from ie on mac \*/
+ html {
+ height: 100%;
+ overflow: hidden;
+ }
+
+ #flashcontent {
+ height: 100%;
+ }
+ /* end hide */
+
+ body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: <xsl:value-of select="$bgcolor"/>;
+ }
+
+</style>
+ </head>
+ <body>
+ <div id="flashcontent">
+ Flash plugin or Javascript are turned off.
+ Activate both and reload to view the mindmap
+ </div>
+
+ <script type="text/javascript">
+ var fo = new FlashObject("./<xsl:value-of select="$destination_dir"/>visorFreeplane.swf", "visorFreeplane", "100%", "100%", 8);
+ fo.addParam("quality", "high");
+ fo.addVariable("bgcolor", 0x<xsl:value-of select="substring-after($bgcolor, '#')"/>);
+ fo.addVariable("openUrl", "_blank");
+ fo.addVariable("initLoadFile", "./<xsl:value-of select="$destination_dir"/>map.mm");
+ fo.addVariable("startCollapsedToLevel","2");
+ fo.write("flashcontent");
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+
+<!-- from toxhtml.xsl -->
+
+ <xsl:template name="output-title">
+ <!-- look if there is any node inside the map (there should never be
+ none, but who knows?) and take its text as the title -->
+ <xsl:choose>
+ <xsl:when test="/map/node/@TEXT">
+ <xsl:value-of select="normalize-space(/map/node/@TEXT)" />
+ </xsl:when>
+ <xsl:when test="/map/node/richcontent[@TYPE='NODE']">
+ <xsl:variable name="t">
+ <xsl:apply-templates select="/map/node/richcontent[@TYPE='NODE']/html/body" mode="strip-tags" />
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($t)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Mind Map</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template match="text()|@*" mode="strip-tags">
+ <xsl:value-of select="string(.)"/>
+ </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/freeplane2html.xsl b/freeplane/resources/xslt/freeplane2html.xsl
new file mode 100644
index 0000000..5d33629
--- /dev/null
+++ b/freeplane/resources/xslt/freeplane2html.xsl
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ File: freeplane2html.xsl
+ Version: 0.8.1
+ Description: A XSLT stylesheet to transform mindmap files created with
+ Freeplane (http://freeplane.sf.net) into HTML files. The
+ transformation will keep the structure of the files, clouds
+ (with it's colors), icons, internal and external links and the ability
+ to collapse whole subtrees of the document (with JavaScript enabled).
+ The results of the transformation were tested and found to be working
+ in the following browsers:
+ - Internet Explorer 6
+ - Mozilla Firefox 0.9 (should be working with nearly any
+ browser using the Geko engine)
+ - Konqueror
+ - Opera 7
+ Other browsers were not tested, but you should have a good chance of
+ gettting things to work with them.
+ Usage: Use any XSLT-Processor (development was done using xsltproc
+ under Linux) to apply this stylesheet to the Freeplane-file. Copy the
+ result and all the PNG-Files inside the script directory
+ (including the icons-subdir) into a directory of it's own
+ (e.g. on a webserver).
+ Open the HTML-file with a webbrowser.
+ Author: Markus Brueckner <freeplane-xsl at slash-me.net>
+ License: BSD license without advertising clause. (see
+ http://www.opensource.org/licenses/bsd-license.php for further details)
+ Bug fix (FC/ 25.04.2006):
+ - Export of local hyperlinks corrected.
+ Update (EWL / 2006-06-02):
+ - add export of notes & attributes
+ - re-format/re-arrange/modularize the file to align with tohtml.xsl
+-->
+<xsl:stylesheet version="1.0"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ >
+<!-- mozilla doesn't parse method xhtml (in xslt 2.0) -->
+<xsl:output method="xml"
+ version="1.0"
+ encoding="UTF-8"
+ doctype-public="-//W3C//DTD XHTML 1.1//EN"
+ doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
+ omit-xml-declaration="no"
+ />
+
+<!-- fc, 20.10.2004: The following parameter is set by freeplane. -->
+<xsl:param name="destination_dir">./</xsl:param>
+<xsl:param name="title">Mind Map</xsl:param>
<xsl:param name="area_code"></xsl:param>
+<xsl:param name="folding_type">html_export_no_folding</xsl:param>
+ <!-- possible values:
+ html_export_fold_all,
+ html_export_no_folding,
+ html_export_fold_currently_folded,
+ html_export_based_on_headings: this means, that approx. five levels are given, more deeper nodes are folded.
+ As of the time being, this parameter is not used.
+ -->
+<!-- if false, does not show standard freeplane icons
+(assumed to be in ./icons directory), default is true -->
+<xsl:param name="show_icons">true</xsl:param>
+<!-- if true, external links urls are shown, default is false. -->
+<xsl:param name="show_link_url">false</xsl:param>
+
+<!-- ### THE ROOT TEMPLATE ### -->
+
+<xsl:template match="/">
+<html>
+<!-- Thanks to gulpman: -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+
+<xsl:comment>This file has been created with freeplane2html.xsl</xsl:comment>
+<head>
+ <title><xsl:call-template name="output-title" /></title>
+ <!-- Stylesheet, generator and some JavaScript for the collapsing of
+ the trees -->
+ <xsl:element name="link">
+ <xsl:attribute name="rel">stylesheet</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$destination_dir"/>freeplane2html.css</xsl:attribute>
+ <xsl:attribute name="type">text/css</xsl:attribute>
+ </xsl:element>
+ <meta name="generator" content="Freeplane-XSL Stylesheet (see: http://freeplane-xsl.dev.slash-me.net/ for details)" />
+ <xsl:element name="script">
+ <xsl:attribute name="type">text/javascript</xsl:attribute>
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>freeplane2html.js</xsl:attribute>
+ </xsl:element>
+ <script type="text/javascript">
+ <xsl:comment>
+ <![CDATA[
+ function toggle(id)
+ {
+ div_el = document.getElementById(id);
+ img_el = document.getElementById('img'+id);
+ if (div_el.style.display != 'none')
+ {
+ ]]>
+
+ div_el.style.display='none';
+ img_el.src = '<xsl:value-of select="$destination_dir"/>show.png';
+ <![CDATA[
+ }
+ else
+ {
+ ]]>
+ div_el.style.display='block';
+ img_el.src = '<xsl:value-of select="$destination_dir"/>hide.png';
+ <![CDATA[
+ };
+ };
+ ]]>
+ </xsl:comment>
+ </script>
+</head>
+
+<body>
+ <h1><xsl:call-template name="output-title" /></h1>
+ <!-- place image -->
+ <div style="width:96%; padding:2%; margin-bottom:10px; border: 0px; text-align:center; vertical-align:center;">
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>image.png</xsl:attribute>
+ <xsl:attribute name="style">margin-bottom:10px; border: 0px; text-align:center; vertical-align:center;</xsl:attribute>
+ <xsl:attribute name="alt">Imagemap</xsl:attribute>
+ <xsl:attribute name="usemap">#fm_imagemap</xsl:attribute>
+ </xsl:element>
+ </div>
+ <map name="fm_imagemap" id="fm_imagemap">
+ <xsl:value-of select="$area_code" disable-output-escaping="yes"/>
+ </map>
+ <xsl:apply-templates />
+</body>
+
+</html>
+</xsl:template> <!-- xsl:template match="/" -->
+
+<!-- the template to output for each node -->
+<xsl:template match="node">
+<div>
+ <!-- generate a unique ID that can be used to reference this node
+ e.g. from the JavaScript -->
+ <xsl:variable name="contentID">
+ <xsl:value-of select="generate-id()"/>
+ </xsl:variable>
+ <!-- check whether this node is a cloud... -->
+ <xsl:choose>
+ <xsl:when test="cloud">
+ <!-- ...if yes, check whether it has a special color... -->
+ <xsl:choose>
+ <xsl:when test="cloud/@COLOR">
+ <xsl:attribute name="class">cloud</xsl:attribute>
+ <xsl:attribute name="style">background-color:<xsl:value-of select="cloud/@COLOR" /></xsl:attribute>
+ </xsl:when>
+ <!-- no? Then choose some default color -->
+ <xsl:otherwise>
+ <xsl:attribute name="class">cloud</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="class">node</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- check whether this node has any child nodes... -->
+ <xsl:choose>
+ <xsl:when test="node">
+ <!-- ...yes? Then put the "hide" button in front of the text...
+ -->
+ <!--<img src="hide.png" class="hideshow" alt="hide">-->
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>hide.png</xsl:attribute>
+ <xsl:attribute name="class">hideshow</xsl:attribute>
+ <xsl:attribute name="alt">hide</xsl:attribute>
+ <xsl:attribute name="onClick"><![CDATA[toggle("]]><xsl:value-of select="$contentID" /><![CDATA[")]]></xsl:attribute>
+ <xsl:attribute name="id">img<xsl:value-of select="$contentID" /></xsl:attribute>
+ </xsl:element>
+ <!--</img>-->
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- ...no? Then output the empty leaf icon -->
+ <!--<img src="leaf.png" class="hideshow" alt="leaf" />-->
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>leaf.png</xsl:attribute>
+ <xsl:attribute name="class">hideshow</xsl:attribute>
+ <xsl:attribute name="alt">leaf</xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="output-icons" />
+ <!-- check if this node has an ID (for the document internal links) -->
+ <xsl:if test="@ID">
+ <!-- note: as Freeplane sometimes prepends the IDs with an
+ underscore which is not valid as the first character
+ in an HTML id, we surround the ID with FM<ID>FM -->
+ <a>
+ <xsl:attribute name="id">FM<xsl:value-of select="@ID"/>FM</xsl:attribute>
+ </a>
+ </xsl:if>
+ <xsl:call-template name="output-node" />
+ <!-- if there are arrowlinks inside this node (i.e. this node is
+ connected to another node in Freeplane using an arrow), then
+ create a document internal link -->
+ <xsl:if test="child::arrowlink">
+ <xsl:call-template name="output-arrowlinks" />
+ </xsl:if>
+ <!-- Output the note and attributes -->
+ <xsl:if test="richcontent[@TYPE='NOTE'] or attribute">
+ <div class="note-and-attributes">
+ <xsl:call-template name="output-note" />
+ <xsl:call-template name="output-attributes" />
+ </div>
+ </xsl:if>
+ <!-- the content div. This div contains all subnodes of this node.
+ It carries the unique ID created in the beginning (which is
+ used to hide this div when necessary). The content node
+ is only created if there are any subnodes -->
+ <xsl:if test="node">
+ <div class="content">
+ <xsl:attribute name="id"><xsl:value-of select="$contentID" /></xsl:attribute>
+ <xsl:apply-templates select="node"/>
+ </div>
+ </xsl:if>
+</div>
+</xsl:template> <!-- xsl:template match="node" -->
+
+<!-- ### XHTML LIBRARY ### -->
+<!-- (this part could be extracted and 'import'ed from toxhtml.xsl and
+ freeplanetohtml.xsl if there wouldn't be issues with the path -->
+
+<xsl:template match="font">
+ <xsl:if test="string-length(@SIZE) > 0">font-size:<xsl:value-of select="round((number(@SIZE) div 12)*100)" />%;</xsl:if><xsl:if test="@BOLD='true'">font-weight:bold;</xsl:if><xsl:if test="@ITALIC='true'">font-style:italic;</xsl:if>
+</xsl:template>
+
+<xsl:template name="output-node">
+ <xsl:element name="div">
+ <xsl:attribute name="class">nodecontent</xsl:attribute>
+ <xsl:if test="@COLOR or @BACKGROUND_COLOR or font">
+ <xsl:attribute name="style">
+ <xsl:if test="@COLOR">color:<xsl:value-of select="@COLOR" />;</xsl:if>
+ <xsl:if test="@BACKGROUND_COLOR">background-color:<xsl:value-of select="@BACKGROUND_COLOR" />;</xsl:if>
+ <xsl:apply-templates select="font" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@LINK">
+ <xsl:call-template name="output-node-with-link" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+</xsl:template> <!-- xsl:template name="output-node" -->
+
+<xsl:template name="output-node-with-link">
+ <xsl:choose>
+ <xsl:when test="not($show_link_url='true')">
+ <xsl:variable name="link">
+ <xsl:choose>
+ <!-- test for local hyperlinks. -->
+ <xsl:when test="starts-with(@LINK, '#')">#FM<xsl:value-of select="substring(@LINK,2)" />FM</xsl:when>
+ <xsl:otherwise><xsl:value-of select="@LINK" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$link" />
+ </xsl:attribute>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:element>
+ <xsl:if test="not($show_icons='false')">
+ <xsl:text> </xsl:text>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$link"/>
+ </xsl:attribute>
+ <xsl:element name="img">
+ <xsl:attribute name="src"><xsl:value-of select="$destination_dir"/>ilink.png</xsl:attribute>
+ <xsl:attribute name="alt">User Link</xsl:attribute>
+ <xsl:attribute name="style">border-width:0</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$show_link_url='true'">
+ - [ <a><xsl:attribute name="href"><xsl:value-of select="@LINK" />
+ </xsl:attribute><xsl:value-of select="@LINK"/></a> ]
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-node-with-link" -->
+
+<xsl:template name="output-nodecontent">
+ <xsl:choose>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:apply-templates select="richcontent[@TYPE='NODE']/html/body" mode="richcontent" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="textnode" />
+ </xsl:otherwise>
+ </xsl:choose>
<xsl:if test="richcontent[@TYPE='DETAILS']">
<xsl:apply-templates select="richcontent[@TYPE='DETAILS']/html/body" mode="richcontent" />
</xsl:if>
+</xsl:template> <!-- xsl:template name="output-nodecontent" -->
+
+<xsl:template match="body" mode="richcontent">
+ <xsl:copy-of select="*|text()"/>
+</xsl:template> <!-- xsl:template name="htmlnode" -->
+
+<xsl:template name="textnode">
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:value-of select="@TEXT" />
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template> <!-- xsl:template name="textnode" -->
+
+ <xsl:template name="output-title">
<!-- look if there is any node inside the map (there should never be
none, but who knows?) and take its text as the title -->
<xsl:choose>
<xsl:when test="/map/node/@TEXT">
<xsl:value-of select="normalize-space(/map/node/@TEXT)" />
</xsl:when>
<xsl:when test="/map/node/richcontent[@TYPE='NODE']">
<xsl:variable name="t">
<xsl:apply-templates select="/map/node/richcontent[@TYPE='NODE']/html/body" mode="strip-tags" />
</xsl:variable>
<xsl:value-of select="normalize-space($t)" />
</xsl:when>
<xsl:otherwise>
<xsl:text>Mind Map</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()|@*" mode="strip-tags">
<xsl:value-of select="string(.)"/>
</xsl:template>
+<!-- replace ASCII line breaks through HTML line breaks (br) -->
+<xsl:template name="format_text">
+ <xsl:param name="nodetext" />
+ <xsl:if test="string-length(substring-after($nodetext,'
')) = 0">
+ <xsl:value-of select="$nodetext" />
+ </xsl:if>
+ <xsl:if test="string-length(substring-after($nodetext,'
')) > 0">
+ <xsl:value-of select="substring-before($nodetext,'
')" />
+ <br />
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:value-of select="substring-after($nodetext,'
')" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="format_text" -->
+
+<xsl:template name="output-note">
+ <xsl:if test="richcontent[@TYPE='NOTE']">
+ <span class="note">
+ <xsl:apply-templates select="richcontent[@TYPE='NOTE']/html/body" mode="richcontent" />
+ </span>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-note" -->
+
+<xsl:template name="output-attributes">
+ <xsl:if test="attribute">
+ <table class="attributes" summary="Attributes Names and Values">
+ <caption>Attributes</caption>
+ <tr><th>Name</th><th>Value</th></tr>
+ <xsl:for-each select="attribute">
+ <tr>
+ <td><xsl:value-of select="@NAME" /></td>
+ <td><xsl:value-of select="@VALUE" /></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-attributes" -->
+
+<!-- function is defined in such a way that an undefined show_icons variable
+ leads to output of the icons (important for reuse) -->
+<xsl:template name="output-arrowlinks">
+ <xsl:if test="$show_icons='false'"> - [ </xsl:if>
+ <xsl:for-each select="arrowlink">
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="onclick">getVisibleParents('FM<xsl:value-of select="@DESTINATION" />FM')</xsl:attribute>
+ <xsl:attribute name="href">#FM<xsl:value-of select="@DESTINATION" />FM</xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="$show_icons='false'">
+ <xsl:value-of
+ select="concat('&','rArr',';')"
+ disable-output-escaping="yes" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="img">
+ <xsl:attribute name="src"><xsl:value-of select="$destination_dir"/>ilink.png</xsl:attribute>
+ <xsl:attribute name="class">ilink</xsl:attribute>
+ <xsl:attribute name="alt">Connector</xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:for-each>
+ <xsl:if test="$show_icons='false'"> ] </xsl:if>
+</xsl:template> <!-- xsl:template name="output-arrowlinks" -->
+
+<xsl:template name="output-icons">
+ <xsl:if test="not($show_icons='false')">
+ <xsl:for-each select="icon">
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>icons/<xsl:value-of select="@BUILTIN" />.png</xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="@BUILTIN" />
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-icons" -->
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/freeplane_version_updater.xslt b/freeplane/resources/xslt/freeplane_version_updater.xslt
new file mode 100644
index 0000000..2a760c7
--- /dev/null
+++ b/freeplane/resources/xslt/freeplane_version_updater.xslt
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:template
+ match="/ | node() | @* | comment() | processing-instruction()">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="map">
+ <!-- versions (the version tag is to be found in FreeMind.java as XML_VERSION.-->
+ <xsl:variable name="version"><!--
+ --><xsl:choose><!--
+ --><xsl:when test="@version='0.7.0'"><!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.7.1'"><!--
+ -->0710000<!--Numbering scheme: version.subversion.releasecandidateversion.betaversion.alphaversion
+ --></xsl:when><!--
+ --><xsl:when test="(starts-with(@version, '0.8.0_alpha'))"><!--
+ -->0800001<!--
+ --></xsl:when><!--
+ --><xsl:when test="(starts-with(@version, '0.8.0_beta'))"><!--
+ -->0800010<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0 RC1'"><!--
+ -->0800100<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0 RC2'"><!--
+ -->0800200<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0 RC3'"><!--
+ -->0800300<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0 RC4'"><!--
+ -->0800400<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0 RC5'"><!--
+ -->0800500<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.0'"><!--
+ -->0801000<!-- Means the 0.8 release. This number is bigger than that of 0.8RC5.
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.FA Alpha 3' or @version='0.8.FA Alpha 4' or @version='0.8.FA Alpha 5a'"><!--
+ -->0801004<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.1_beta1'"><!--
+ -->0810010<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.1_beta2'"><!--
+ -->0810020<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.8.1_beta3'"><!--
+ -->0810030<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.9.0 Beta 5'"><!--
+ -->0900050<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.9.0_Beta_6'"><!--
+ -->0900060<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.9.0_Beta_8'"><!--
+ -->0900080<!--
+ --></xsl:when><!--
+ --><xsl:when test="@version='0.9.0'"><!--
+ -->0901000<!--
+ --></xsl:when><!--
+ --><xsl:otherwise><!--
+ -->-1<!--
+ --></xsl:otherwise><!--
+ --></xsl:choose><!--
+ --></xsl:variable><!--
+ <xsl:message>!<xsl:value-of select="$version"></xsl:value-of>!</xsl:message>
+ --><xsl:copy>
+ <xsl:apply-templates select="@* | node()">
+ <xsl:with-param name="version" select="$version"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+ </xsl:template>
+ <!-- from
+ <hook NAME="accessories/plugins/CreationModificationPlugin.properties">
+<Parameters CREATED="1107380732932" MODIFIED="1107901568379"/>
+</hook>
+
+ to
+
+ <node COLOR="#00b439" CREATED="1113680014182" FOLDED="true"
+ ID="Freemind_Link_241899915" MODIFIED="1113680014182"
+ TEXT="Transactions">
+ -->
+ <!-- remove the following attributes/tags: -->
+ <xsl:template match="node/hook[@NAME='accessories/plugins/CreationModificationPlugin.properties']"/>
+ <xsl:template match="node/hook[@NAME='accessories/plugins/NodeNote.properties']"/>
+ <xsl:template match="node/@SHIFT_Y"/>
+ <xsl:template match="node/@AA_NODE_CLASS"/>
+ <xsl:template match="node/@ADDITIONAL_INFO"/>
+ <xsl:template match="node/attrlayout"/>
+
+ <xsl:template match="node">
+ <xsl:param name="version">-1</xsl:param>
+ <xsl:copy>
+ <xsl:choose>
+ <!-- move the attributes CREATED and MODIFIED into the node tag as of version 0.8.0RC3-->
+ <xsl:when test="$version < 0800300 and hook[@NAME='accessories/plugins/CreationModificationPlugin.properties']">
+ <xsl:attribute name="CREATED">
+ <xsl:value-of
+ select="hook[@NAME='accessories/plugins/CreationModificationPlugin.properties']/Parameters/@CREATED"/>
+ </xsl:attribute>
+ <xsl:attribute name="MODIFIED">
+ <xsl:value-of
+ select="hook[@NAME='accessories/plugins/CreationModificationPlugin.properties']/Parameters/@MODIFIED"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$version < 0800400 and @SHIFT_Y">
+ <xsl:attribute name="VSHIFT">
+ <xsl:value-of
+ select="@SHIFT_Y"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$version < 0800400 and @ADDITIONAL_INFO">
+ <xsl:attribute name="ENCRYPTED_CONTENT">
+ <xsl:value-of
+ select="@ADDITIONAL_INFO"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test="attrlayout">
+ <xsl:element name="attribute_layout">
+ <xsl:apply-templates select = "attrlayout/@*" />
+ </xsl:element>
+ </xsl:if>
+ <xsl:apply-templates select="@*|node()">
+ <xsl:with-param name="version" select="$version"/>
+ </xsl:apply-templates>
+ <xsl:choose>
+ <!-- move the notes into the node tag as of version 0.9.0 Beta6-->
+ <xsl:when test="$version <= 0900050 and hook[@NAME='accessories/plugins/NodeNote.properties']">
+ <xsl:element name="richcontent">
+ <xsl:attribute name="TYPE">NOTE</xsl:attribute>
+ <html>
+ <head>
+
+ </head>
+ <body>
+ <p align="left">
+ <xsl:value-of
+ select="hook[@NAME='accessories/plugins/NodeNote.properties']/text"/>
+ </p>
+ </body>
+ </html>
+ </xsl:element>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="@LINK">
+ <xsl:param name="version">-1</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$version < 0901000">
+ <!--replace space by %20 -->
+ <xsl:attribute name="LINK">
+ <xsl:call-template name="str-replace">
+ <xsl:with-param name="input" select="."/>
+ <xsl:with-param name="search-string" select="' '"/>
+ <xsl:with-param name="replace-string" select="'%20'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy></xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="str-replace">
+ <xsl:param name="input"/>
+ <xsl:param name="search-string"/>
+ <xsl:param name="replace-string"/>
+ <xsl:choose>
+ <!-- See if the input contains the search string -->
+ <xsl:when test="contains($input,$search-string)">
+ <!-- If so, then concatenate the substring before the search
+ string to the replacement string and to the result of
+ recursively applying this template to the remaining sub-string.
+ -->
+ <xsl:value-of select="substring-before($input,$search-string)"/>
+ <xsl:value-of select="$replace-string"/>
+ <xsl:call-template name="str-replace">
+ <xsl:with-param name="input" select="substring-after($input,$search-string)"/>
+ <xsl:with-param name="search-string" select="$search-string"/>
+ <xsl:with-param name="replace-string" select="$replace-string"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- There are no more occurences of the search string so
+ just return the current input string -->
+ <xsl:value-of select="$input"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/mindmanager2mm.xsl b/freeplane/resources/xslt/mindmanager2mm.xsl
new file mode 100644
index 0000000..2624626
--- /dev/null
+++ b/freeplane/resources/xslt/mindmanager2mm.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.0" standalone="no" ?>
+ <!--
+ : Convert from MindManager (c) to Freeplane ( ;) ). : : This code
+ released under the GPL. : (http://www.gnu.org/copyleft/gpl.html) : :
+ Christian Foltin, June, 2005 : : $Id: mindmanager2mm.xsl,v 1.1.2.3.4.3
+ 2007/10/17 19:54:36 christianfoltin Exp $ :
+ -->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ap="http://schemas.mindjet.com/MindManager/Application/2003"
+ xmlns:cor="http://schemas.mindjet.com/MindManager/Core/2003" xmlns:pri="http://schemas.mindjet.com/MindManager/Primitive/2003"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+
+ <xsl:strip-space elements="*" />
+ <xsl:output method="xml" indent="yes" encoding="UTF-8" />
+
+ <xsl:template match="/ap:Map">
+ <map version="0.9.0">
+ <xsl:apply-templates select="ap:OneTopic/ap:Topic" />
+ </map>
+ </xsl:template>
+
+ <xsl:template match="ap:Topic">
+ <node>
+ <xsl:attribute name="TEXT">
+ <xsl:value-of select="./ap:Text/@PlainText" />
+ </xsl:attribute>
+ <xsl:attribute name="POSITION">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::ap:Topic/ap:Offset/@CX > 0"><xsl:text>right</xsl:text></xsl:when>
+ <xsl:otherwise><xsl:text>left</xsl:text></xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="./ap:Hyperlink">
+ <xsl:attribute name="LINK">
+ <xsl:value-of select="./ap:Hyperlink/@Url" />
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="./ap:Text/ap:Font/@Color">
+ <xsl:attribute name="COLOR">
+ <xsl:text>#</xsl:text><xsl:value-of
+ select="substring(./ap:Text/ap:Font/@Color,3)" />
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="./ap:SubTopicShape/@SubTopicShape='urn:mindjet:Oval'">
+ <xsl:attribute name="STYLE">
+ <xsl:text>bubble</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:apply-templates select="./ap:NotesGroup" />
+ <xsl:apply-templates select="./ap:SubTopics/ap:Topic" />
+ <!--
+ <xsl:for-each select="./ap:SubTopics/ap:Topic"> <xsl:sort
+ select="(./ap:Offset/@CX) * -1"/> <xsl:apply-templates select="."/>
+ </xsl:for-each>
+ -->
+ <xsl:apply-templates select="./ap:IconsGroup" />
+ </node>
+ </xsl:template>
+
+ <xsl:template match="ap:NotesGroup">
+ <xsl:element name="richcontent">
+ <xsl:attribute name="TYPE">
+ <xsl:text>NOTE</xsl:text>
+ </xsl:attribute>
+ <xsl:copy-of select="ap:NotesXhtmlData/xhtml:html" />
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="ap:IconsGroup">
+ <xsl:apply-templates select="./ap:Icons" />
+ </xsl:template>
+
+ <xsl:template match="ap:Icons">
+ <xsl:apply-templates select="./ap:Icon" />
+ </xsl:template>
+
+ <xsl:template match="ap:Icon[@xsi:type='ap:StockIcon']">
+ <xsl:element name="icon">
+ <xsl:attribute name="BUILTIN">
+ <xsl:choose>
+ <xsl:when
+ test="@IconType='urn:mindjet:SmileyAngry'">clanbomber</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:SmileyNeutral'">button_ok</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:SmileySad'">clanbomber</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:SmileyHappy'">ksmiletris</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:SmileyScreaming'">ksmiletris</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:ArrowRight'">forward</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:ArrowLeft'">back</xsl:when>
+<!-- <xsl:when test="@IconType='urn:mindjet:TwoEndArrow'">bell</xsl:when>
+ <xsl:when test="@IconType='urn:mindjet:ArrowDown'">bell</xsl:when>
+ <xsl:when test="@IconType='urn:mindjet:ArrowUp'">bell</xsl:when> -->
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagGreen'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagYellow'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagPurple'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagBlack'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagBlue'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagOrange'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:FlagRed'">flag</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:ThumbsUp'">button_ok</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Calendar'">bell</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Emergency'">messagebox_warning</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:OnHold'">knotify</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Stop'">button_cancel</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Prio1'">full-1</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Prio2'">full-2</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Prio3'">full-3</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Prio4'">full-4</xsl:when>
+ <xsl:when
+ test="@IconType='urn:mindjet:Prio5'">full-5</xsl:when>
+<!--
+ <xsl:when test="@IconType='urn:mindjet:JudgeHammer'">bell</xsl:when>
+ <xsl:when test="@IconType='urn:mindjet:Dollar'">bell</xsl:when>
+ <xsl:when test="@IconType='urn:mindjet:Resource1'">bell</xsl:when>
+ -->
+ <!-- <xsl:when test="@IconType='urn:mindjet:Resource1'">button_ok</xsl:when> -->
+ <xsl:otherwise>
+ <xsl:text>messagebox_warning</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+
+
+
+ <xsl:template match="node()|@*" />
+
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/mm2tjiresources.xsl b/freeplane/resources/xslt/mm2tjiresources.xsl
new file mode 100644
index 0000000..2c2b6db
--- /dev/null
+++ b/freeplane/resources/xslt/mm2tjiresources.xsl
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <xsl:output method="text" indent="no"/>
+ <xsl:strip-space elements="*"/>
+
+ <xsl:template match="map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <!-- NODE -->
+ <xsl:template match="node">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$depth=0">
+ <xsl:text># Freeplane map "</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>"
</xsl:text>
+ <xsl:apply-templates select="node"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$depth=1">
+ <xsl:if test="@TEXT='RESOURCES'">
+ <!--xsl:text> RESOURCES </xsl:text-->
+ <xsl:apply-templates select="node" mode="shift"/>
+ <xsl:apply-templates select="node" mode="resource"/>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ATTRIBUTE -->
+ <xsl:template match="attribute">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@NAME='resource'">
+ </xsl:when>
+ <xsl:when test="@NAME='shift' and position()=1">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:value-of select="@NAME"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@VALUE"/>
+ <xsl:text>
</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ATTRIBUTE RESOURCE_ID-->
+ <xsl:template match="attribute" mode="resource_id">
+ <xsl:if test="@NAME='resource'">
+ <xsl:if test="position()=1">
+ <xsl:value-of select="@VALUE"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- NODE RESOURCE -->
+ <xsl:template match="node" mode="resource">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:variable name="resource_id">
+ <xsl:apply-templates select="attribute" mode="resource_id"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@TEXT='#'">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$resource_id!=''">
+ <xsl:text>
</xsl:text>
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>resource </xsl:text><xsl:value-of select="$resource_id"/><xsl:text> "</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>" {
</xsl:text>
+ <xsl:apply-templates select="attribute"/>
+ <xsl:apply-templates select="node" mode="resource"/>
+ <!-- koniec task -->
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="node" mode="resource"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+ <!-- ATTRIBUTE RESOURCE_ID-->
+ <xsl:template match="attribute" mode="shift_id">
+ <xsl:if test="@NAME='shift'">
+ <xsl:if test="position()=1">
+ <xsl:value-of select="@VALUE"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="node" mode="shift">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:variable name="shift_id">
+ <xsl:apply-templates select="attribute" mode="shift_id"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@TEXT='#'">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$shift_id!=''">
+ <xsl:text>
</xsl:text>
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>shift </xsl:text><xsl:value-of select="$shift_id"/><xsl:text> "</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>" {
</xsl:text>
+ <xsl:apply-templates select="attribute"/>
+ <xsl:apply-templates select="node" mode="shift"/>
+ <!-- koniec task -->
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="node" mode="shift"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Node Depth Mesurement -->
+ <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>
+
+ <!-- Map Depth Mesurement -->
+ <xsl:template match="map" mode="depthMesurement">
+ <xsl:param name="depth" select=" '0' "/>
+ <xsl:value-of select="$depth"/>
+ </xsl:template>
+
+ <xsl:template name="spaces">
+ <xsl:param name="count" select="1"/>
+ <xsl:if test="$count > 0">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="spaces">
+ <xsl:with-param name="count" select="$count - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/mm2tjitasks.xsl b/freeplane/resources/xslt/mm2tjitasks.xsl
new file mode 100644
index 0000000..b81fcc8
--- /dev/null
+++ b/freeplane/resources/xslt/mm2tjitasks.xsl
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <xsl:output method="text" indent="no"/>
+ <xsl:strip-space elements="*"/>
+
+ <xsl:template match="map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <!-- NODE -->
+ <xsl:template match="node">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$depth=0">
+ <xsl:text># Freeplane map "</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>"
</xsl:text>
+ <xsl:apply-templates select="node"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$depth=1">
+ <xsl:if test="@TEXT='TASKS'">
+ <!--xsl:text> TASK </xsl:text-->
+ <xsl:apply-templates select="node" mode="task"/>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ATTRIBUTE -->
+ <xsl:template match="attribute">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@NAME='task'">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:value-of select="@NAME"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@VALUE"/>
+ <xsl:text>
</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ATTRIBUTE TASK_ID-->
+ <xsl:template match="attribute" mode="task_id">
+ <xsl:if test="@NAME='task'">
+ <xsl:value-of select="@VALUE"/>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- NODE TASK -->
+ <xsl:template match="node" mode="task">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:variable name="task_id">
+ <xsl:apply-templates select="attribute" mode="task_id"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@TEXT='#'">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$task_id!=''">
+ <xsl:text>
</xsl:text>
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>task </xsl:text><xsl:value-of select="$task_id"/><xsl:text> "</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>" {
</xsl:text>
+ <xsl:apply-templates select="attribute"/>
+ <xsl:apply-templates select="node" mode="task"/>
+ <!-- koniec task -->
+ <xsl:call-template name="spaces"><xsl:with-param name="count" select="($depth - 2) * 4"/></xsl:call-template>
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="node" mode="task"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Node Depth Mesurement -->
+ <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>
+
+ <!-- Map Depth Mesurement -->
+ <xsl:template match="map" mode="depthMesurement">
+ <xsl:param name="depth" select=" '0' "/>
+ <xsl:value-of select="$depth"/>
+ </xsl:template>
+
+ <xsl:template name="spaces">
+ <xsl:param name="count" select="1"/>
+ <xsl:if test="$count > 0">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="spaces">
+ <xsl:with-param name="count" select="$count - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/mm2twiki.xsl b/freeplane/resources/xslt/mm2twiki.xsl
new file mode 100644
index 0000000..c492b2e
--- /dev/null
+++ b/freeplane/resources/xslt/mm2twiki.xsl
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+ (c) by Stephen Fitch, 2005
+ This file is licensed under the GPL.
+-->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <xsl:output method="text" indent="no"/>
+
+ <xsl:strip-space elements="*"/>
+
+ <xsl:template match="map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <!-- match "node" -->
+ <xsl:template match="node">
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$depth=0">
+ <xsl:choose>
+ <xsl:when test="@LINK">
+ <xsl:text>---+ [[</xsl:text><xsl:value-of select="@LINK"/><xsl:text> </xsl:text><xsl:value-of select="@TEXT"/><xsl:text>]]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>---+ </xsl:text><xsl:value-of select="@TEXT"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>
</xsl:text>
+ <xsl:apply-templates select="hook"/>
+ <xsl:apply-templates select="node"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="ancestor::node[@FOLDED='true']">
+ <xsl:apply-templates select=".." mode="childoutput">
+ <xsl:with-param name="nodeText">
+ <xsl:value-of select="@TEXT"/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select=".." mode="childoutput">
+ <xsl:with-param name="nodeText">
+ <xsl:if test="$depth=1">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="spaces">
+ <xsl:with-param name="count"
+ select="$depth * 3"/>
+ </xsl:call-template>
+ <!-- Do we have text with a LINK attribute? -->
+ <xsl:choose>
+ <xsl:when test="@LINK">
+ <xsl:text>* [[</xsl:text><xsl:value-of select="@LINK"/><xsl:text> </xsl:text><xsl:value-of select="@TEXT"/><xsl:text>]]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>* </xsl:text><xsl:value-of select="@TEXT"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>
</xsl:text>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- <xsl:apply-templates select="hook|@LINK"/> -->
+ <xsl:apply-templates select="node"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="spaces">
+ <xsl:param name="count" select="1"/>
+ <xsl:if test="$count > 0">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="spaces">
+ <xsl:with-param name="count" select="$count - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- hook -->
+ <xsl:template match="hook"/>
+
+ <!-- hook -->
+ <xsl:template match="hook[@NAME='accessories/plugins/NodeNote.properties']">
+ <xsl:choose>
+ <xsl:when test="./text">
+ <xsl:value-of select="./text"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Node - Output -->
+ <xsl:template match="node" mode="childoutput">
+ <xsl:param name="nodeText"></xsl:param>
+ <xsl:copy-of select="$nodeText"/>
+ </xsl:template>
+
+ <!-- Node Depth Mesurement -->
+ <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>
+
+ <!-- Map Depth Mesurement -->
+ <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/resources/xslt/opml2mm.xsl b/freeplane/resources/xslt/opml2mm.xsl
new file mode 100644
index 0000000..5ade781
--- /dev/null
+++ b/freeplane/resources/xslt/opml2mm.xsl
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='ISO-8859-1'?>
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+ <xsl:output media-type='text/xml' />
+ <xsl:template match='/'>
+ <map version='0.7.1'>
+ <xsl:apply-templates select='opml' />
+ </map>
+ </xsl:template>
+ <xsl:template match='opml'>
+ <xsl:apply-templates select='body' />
+ </xsl:template>
+ <xsl:template match='body'>
+ <node>
+ <xsl:attribute name='COLOR'>#006633</xsl:attribute>
+ <xsl:attribute name='TEXT'><xsl:value-of
+ select='//title' /></xsl:attribute>
+ <xsl:attribute name='FOLDED'>true</xsl:attribute>
+ <font Name='SansSerif' SIZE='18' />
+ <xsl:apply-templates select='outline' />
+ </node>
+ </xsl:template>
+ <xsl:template match='outline'>
+ <xsl:choose>
+ <xsl:when test='count(child::*)!=0'>
+ <node>
+ <xsl:attribute name='COLOR'>#006633</xsl:attribute>
+ <xsl:attribute name='TEXT'><xsl:value-of
+ select='@text' /></xsl:attribute>
+ <xsl:attribute name='FOLDED'>true</xsl:attribute>
+ <font Name='SansSerif' SIZE='18' />
+ <xsl:apply-templates select='outline' />
+ </node>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test='@type='link''>
+ <node>
+ <xsl:attribute name='COLOR'>#006633</xsl:attribute>
+ <xsl:attribute name='TEXT'><xsl:value-of
+ select='@text' /></xsl:attribute>
+ <xsl:attribute name='LINK'><xsl:choose><xsl:when
+ test='contains(@url,'.opml') or contains(@url,'.OPML')'><xsl:value-of
+ select='concat(@url,'.mm')' /></xsl:when><xsl:otherwise><xsl:value-of
+ select='@url' /></xsl:otherwise>
+</xsl:choose>
+</xsl:attribute>
+ <font Name='SansSerif' SIZE='16' />
+ <xsl:apply-templates select='outline' />
+ </node>
+ </xsl:when>
+ <xsl:when test='@type='img''>
+ <node>
+ <xsl:attribute name='TEXT'><xsl:value-of
+ select='concat('<html><img src="', at url,'">')' /></xsl:attribute>
+ <font Name='SansSerif' SIZE='16' />
+ <xsl:apply-templates select='outline' />
+ </node>
+ </xsl:when>
+ <xsl:otherwise>
+ <node>
+ <xsl:attribute name='TEXT'><xsl:value-of
+ select='@text' /></xsl:attribute>
+ <font Name='SansSerif' SIZE='16' BOLD='true' />
+ <xsl:apply-templates select='outline' />
+ </node>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/freeplane/resources/xslt/patterns_updater.xslt b/freeplane/resources/xslt/patterns_updater.xslt
new file mode 100644
index 0000000..ddd59ff
--- /dev/null
+++ b/freeplane/resources/xslt/patterns_updater.xslt
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:template
+ match="/ | node() | @* | comment() | processing-instruction()">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="node">
+ <xsl:choose>
+ <xsl:when test="@background_color">
+ <xsl:element name="pattern_node_background_color">
+ <xsl:attribute name="value"><xsl:value-of select="@background_color"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_background_color/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@color">
+ <xsl:element name="pattern_node_color">
+ <xsl:attribute name="value"><xsl:value-of select="@color"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_color/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@style">
+ <xsl:element name="pattern_node_style">
+ <xsl:attribute name="value"><xsl:value-of select="@style"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_style/>
+ </xsl:otherwise>
+ </xsl:choose>
+<!-- <xsl:choose>
+ <xsl:when test="@text">
+ <xsl:element name="pattern_node_text">
+ <xsl:attribute name="value"><xsl:value-of select="@text"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_text/>
+ </xsl:otherwise>
+ </xsl:choose>-->
+ <xsl:apply-templates select="font"/>
+ <xsl:choose>
+ <xsl:when test="@icon and @icon != 'none'">
+ <xsl:element name="pattern_icon">
+ <xsl:attribute name="value"><xsl:value-of select="@icon"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="@icon = 'none'">
+ <pattern_icon/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="edge"/>
+ <xsl:apply-templates select="child"/>
+ </xsl:template>
+
+
+ <xsl:template match="edge">
+ <xsl:choose>
+ <xsl:when test="@color">
+ <xsl:element name="pattern_edge_color">
+ <xsl:attribute name="value"><xsl:value-of select="@color"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_edge_color/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@style">
+ <xsl:element name="pattern_edge_style">
+ <xsl:attribute name="value"><xsl:value-of select="@style"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_edge_style/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@width">
+ <xsl:element name="pattern_edge_width">
+ <xsl:attribute name="value"><xsl:value-of select="@width"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_edge_width/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="font">
+ <xsl:choose>
+ <xsl:when test="@name">
+ <xsl:element name="pattern_node_font_name">
+ <xsl:attribute name="value"><xsl:value-of select="@name"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_font_name/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@bold">
+ <xsl:element name="pattern_node_font_bold">
+ <xsl:attribute name="value"><xsl:value-of select="@bold"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_font_bold/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@italic">
+ <xsl:element name="pattern_node_font_italic">
+ <xsl:attribute name="value"><xsl:value-of select="@italic"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_font_italic/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@size">
+ <xsl:element name="pattern_node_font_size">
+ <xsl:attribute name="value"><xsl:value-of select="@size"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <pattern_node_font_size/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="child">
+ <xsl:element name="pattern_child">
+ <xsl:attribute name="value"><xsl:value-of select="@pattern"/></xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/toxhtml.xsl b/freeplane/resources/xslt/toxhtml.xsl
new file mode 100644
index 0000000..ed2817f
--- /dev/null
+++ b/freeplane/resources/xslt/toxhtml.xsl
@@ -0,0 +1,384 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ The contents of this file are subject to the Mozilla Public License Version
+ 1.1 (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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ for the specific language governing rights and limitations under the
+ License.
+
+mmTree - alternate XHTML+Javascript export style sheet for Freeplane.
+
+ Miika Nurminen (minurmin at cc.jyu.fi) 12.12.2003.
+
+Transforms Freeplane (0.6.7 - 0.8.0) mm file to XHTML 1.1 with JavaScript-based keyboard navigation (MarkTree).
+Output is valid (possibly apart HTML entered by user in Freeplane).
+
+Update (MN / 14.12.2004):
+ - Support for mm 0.7.1 - 0.8.0 constructs (clouds, internal links. opens internal link also if collapsed).
+ - Support for icons. Some code adapted from Markus Brueckner's freeplane2html.xsl style sheet.
+ - newlines 

 behaviour (find and convert to <br/>)
+
+Bug fix (FC/ 25.04.2006):
+ - Export of local hyperlinks corrected.
+
+Update (EWL / 2006-06-02):
+ - add export of notes & attributes
+ - re-format/re-arrange/modularize the file to align with freeplane2html.xsl
+
+Todo:
+ - Can CSS fonts be used with Freeplane fonts?
+ - Change licence to MIT -style.
+ - integrate JS file to stylesheet
+ - parameters: use_icons (true/false)
+-->
+<xsl:stylesheet version="1.0"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ >
+<!-- mozilla doesn't parse method xhtml (in xslt 2.0) -->
+<xsl:output method="xml"
+ version="1.0"
+ encoding="UTF-8"
+ doctype-public="-//W3C//DTD XHTML 1.1//EN"
+ doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
+ omit-xml-declaration="no"
+ />
+
+<!-- fc, 17.10.2004: The following parameter is set by freeplane. -->
+<xsl:param name="destination_dir">./</xsl:param>
+
+<!-- if true, external links urls are shown, default is false. -->
+<xsl:param name="show_link_url">false</xsl:param>
+
+<!-- if false, does not show standard freeplane icons
+(assumed to be in ./icons directory), default is true -->
+<xsl:param name="show_icons">true</xsl:param>
+
+<xsl:strip-space elements="*" />
+<!-- note! nonempty links are required for opera! (tested with opera 7).
+ #160 is non-breaking space. / mn, 11.12.2003 -->
+
+<!-- ### THE ROOT TEMPLATE ### -->
+
+<xsl:template match="/">
+
+<xsl:processing-instruction name="xml-stylesheet">href="treestyles.css" type="text/css"</xsl:processing-instruction>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:comment>This file has been created with toxhtml.xsl</xsl:comment>
+<!-- Thanks to gulpman, wolfgangradke: -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+
+
+ <title><xsl:call-template name="output-title" /></title>
+ <xsl:element name="link">
+ <xsl:attribute name="rel">stylesheet</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$destination_dir"/>treestyles.css</xsl:attribute>
+ <xsl:attribute name="type">text/css</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="script">
+ <xsl:attribute name="type">text/javascript</xsl:attribute>
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>marktree.js</xsl:attribute>
+ </xsl:element>
+</head>
+
+<body>
+
+<div class="basetop">
+<a href="#" onclick="expandAll(document.getElementById('base'))">Expand</a> -
+<a href="#" onclick="collapseAll(document.getElementById('base'))">Collapse</a>
+</div>
+
+<div id="base" class="basetext">
+<ul>
+
+<xsl:apply-templates />
+
+</ul>
+</div>
+
+</body>
+</html>
+</xsl:template>
+
+<!-- ### THE MATCHED TEMPLATES ### -->
+
+<xsl:template match="node">
+ <xsl:if test="count(child::node)=0">
+ <xsl:call-template name="listnode">
+ <xsl:with-param name="lifold">basic</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="count(child::node)>0" >
+ <xsl:choose>
+ <xsl:when test="@FOLDED='true'">
+ <xsl:call-template name="listnode">
+ <xsl:with-param name="lifold">exp</xsl:with-param>
+ <xsl:with-param name="ulfold">sub</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="listnode">
+ <xsl:with-param name="lifold">col</xsl:with-param>
+ <xsl:with-param name="ulfold">subexp</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template> <!-- xsl:template match="node" -->
+
+<xsl:template name="listnode">
+<xsl:param name="lifold" /> <xsl:param name="ulfold" />
+ <xsl:text>
+ </xsl:text> <!-- adds a line-break in the html code -->
+ <li class="{$lifold}">
+ <xsl:if test="cloud/@COLOR">
+ <xsl:attribute name="style">background-color:<xsl:value-of select="cloud/@COLOR" />;</xsl:attribute>
+ </xsl:if>
+ <!-- check if this node has an ID (for the document internal links) -->
+ <xsl:if test="@ID">
+ <!-- note: as Freeplane sometimes prepends the IDs with an underscore
+ which is not valid as the first character in an HTML id,
+ we surround the ID with FM<ID>FM -->
+ <xsl:attribute name="id">FM<xsl:value-of select="@ID"/>FM</xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="output-icons" />
+ <xsl:choose>
+ <xsl:when test="richcontent[@TYPE='NOTE'] or attribute">
+ <div class="boxed">
+ <xsl:call-template name="output-node" />
+ <div class="note-and-attributes">
+ <xsl:call-template name="output-note" />
+ <xsl:call-template name="output-attributes" />
+ </div>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="output-node" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="child::node">
+ <xsl:text>
+ </xsl:text> <!-- adds a line-break in the html code -->
+ <ul class="{$ulfold}"><xsl:apply-templates select="node"/></ul>
+ </xsl:if>
+ <!-- if there are arrowlinks inside this node (i.e. this node is
+ connected to another node in Freeplane using an arrow), then create a
+ document internal link -->
+ <xsl:if test="child::arrowlink">
+ <xsl:call-template name="output-arrowlinks" />
+ </xsl:if>
+ </li>
+</xsl:template> <!-- xsl:template name="listnode" -->
+
+<!-- ### XHTML LIBRARY ### -->
+<!-- (this part could be extracted and 'import'ed from toxhtml.xsl and
+ freeplanetohtml.xsl if there wouldn't be issues with the path -->
+
+<xsl:template match="font">
+ <xsl:if test="string-length(@SIZE) > 0">font-size:<xsl:value-of select="round((number(@SIZE) div 12)*100)" />%;</xsl:if><xsl:if test="@BOLD='true'">font-weight:bold;</xsl:if><xsl:if test="@ITALIC='true'">font-style:italic;</xsl:if>
+</xsl:template>
+
+<xsl:template name="output-node">
+ <xsl:element name="div">
+ <xsl:attribute name="class">nodecontent</xsl:attribute>
+ <xsl:if test="@COLOR or @BACKGROUND_COLOR or font">
+ <xsl:attribute name="style">
+ <xsl:if test="@COLOR">color:<xsl:value-of select="@COLOR" />;</xsl:if>
+ <xsl:if test="@BACKGROUND_COLOR">background-color:<xsl:value-of select="@BACKGROUND_COLOR" />;</xsl:if>
+ <xsl:apply-templates select="font" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@LINK">
+ <xsl:call-template name="output-node-with-link" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+</xsl:template> <!-- xsl:template name="output-node" -->
+
+<xsl:template name="output-node-with-link">
+ <xsl:choose>
+ <xsl:when test="not($show_link_url='true')">
+ <xsl:variable name="link">
+ <xsl:choose>
+ <!-- test for local hyperlinks. -->
+ <xsl:when test="starts-with(@LINK, '#')">#FM<xsl:value-of select="substring(@LINK,2)" />FM</xsl:when>
+ <xsl:otherwise><xsl:value-of select="@LINK" /></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$link" />
+ </xsl:attribute>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:element>
+ <xsl:if test="not($show_icons='false')">
+ <xsl:text> </xsl:text>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$link"/>
+ </xsl:attribute>
+ <xsl:element name="img">
+ <xsl:attribute name="src"><xsl:value-of select="$destination_dir"/>ilink.png</xsl:attribute>
+ <xsl:attribute name="alt">User Link</xsl:attribute>
+ <xsl:attribute name="style">border-width:0</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="output-nodecontent" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$show_link_url='true'">
+ - [ <a><xsl:attribute name="href"><xsl:value-of select="@LINK" />
+ </xsl:attribute><xsl:value-of select="@LINK"/></a> ]
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-node-with-link" -->
+
+<xsl:template name="output-nodecontent">
+ <xsl:choose>
+ <xsl:when test="richcontent[@TYPE='NODE']">
+ <xsl:apply-templates select="richcontent[@TYPE='NODE']/html/body" mode="richcontent" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="textnode" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="richcontent[@TYPE='DETAILS']">
+ <xsl:apply-templates select="richcontent[@TYPE='DETAILS']/html/body" mode="richcontent" />
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-nodecontent" -->
+
+<xsl:template match="body" mode="richcontent">
+ <xsl:copy-of select="*|text()"/>
+</xsl:template> <!-- xsl:template name="htmlnode" -->
+
+<xsl:template name="textnode">
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:value-of select="@TEXT" />
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template> <!-- xsl:template name="textnode" -->
+
+<xsl:template name="output-title">
+ <!-- look if there is any node inside the map (there should never be
+ none, but who knows?) and take its text as the title -->
+ <xsl:choose>
+ <xsl:when test="/map/node/@TEXT">
+ <xsl:value-of select="normalize-space(/map/node/@TEXT)" />
+ </xsl:when>
+ <xsl:when test="/map/node/richcontent[@TYPE='NODE']">
+ <xsl:variable name="t">
+ <xsl:apply-templates select="/map/node/richcontent[@TYPE='NODE']/html/body" mode="strip-tags" />
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($t)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Mind Map</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="text()|@*" mode="strip-tags">
+ <xsl:value-of select="string(.)"/>
+</xsl:template>
+
+
+<!-- replace ASCII line breaks through HTML line breaks (br) -->
+<xsl:template name="format_text">
+ <xsl:param name="nodetext" />
+ <xsl:if test="string-length(substring-after($nodetext,'
')) = 0">
+ <xsl:value-of select="$nodetext" />
+ </xsl:if>
+ <xsl:if test="string-length(substring-after($nodetext,'
')) > 0">
+ <xsl:value-of select="substring-before($nodetext,'
')" />
+ <br />
+ <xsl:call-template name="format_text">
+ <xsl:with-param name="nodetext">
+ <xsl:value-of select="substring-after($nodetext,'
')" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="format_text" -->
+
+<xsl:template name="output-note">
+ <xsl:if test="richcontent[@TYPE='NOTE']">
+ <span class="note">
+ <xsl:apply-templates select="richcontent[@TYPE='NOTE']/html/body" mode="richcontent" />
+ </span>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-note" -->
+
+<xsl:template name="output-attributes">
+ <xsl:if test="attribute">
+ <table class="attributes" summary="Attributes Names and Values">
+ <caption>Attributes</caption>
+ <tr><th>Name</th><th>Value</th></tr>
+ <xsl:for-each select="attribute">
+ <tr>
+ <td><xsl:value-of select="@NAME" /></td>
+ <td><xsl:value-of select="@VALUE" /></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-attributes" -->
+
+<!-- function is defined in such a way that an undefined show_icons variable
+ leads to output of the icons (important for reuse) -->
+<xsl:template name="output-arrowlinks">
+ <xsl:if test="$show_icons='false'"> - [ </xsl:if>
+ <xsl:for-each select="arrowlink">
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="onclick">getVisibleParents('FM<xsl:value-of select="@DESTINATION" />FM')</xsl:attribute>
+ <xsl:attribute name="href">#FM<xsl:value-of select="@DESTINATION" />FM</xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="$show_icons='false'">
+ <xsl:value-of
+ select="concat('&','rArr',';')"
+ disable-output-escaping="yes" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="img">
+ <xsl:attribute name="src"><xsl:value-of select="$destination_dir"/>ilink.png</xsl:attribute>
+ <xsl:attribute name="class">ilink</xsl:attribute>
+ <xsl:attribute name="alt">Connector</xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:for-each>
+ <xsl:if test="$show_icons='false'"> ] </xsl:if>
+</xsl:template> <!-- xsl:template name="output-arrowlinks" -->
+
+<xsl:template name="output-icons">
+ <xsl:if test="not($show_icons='false')">
+ <xsl:for-each select="icon">
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$destination_dir"/>icons/<xsl:value-of select="@BUILTIN" />.png</xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="@BUILTIN" />
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template> <!-- xsl:template name="output-icons" -->
+
+</xsl:stylesheet>
diff --git a/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java b/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java
new file mode 100644
index 0000000..2d995d8
--- /dev/null
+++ b/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java
@@ -0,0 +1,426 @@
+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
new file mode 100644
index 0000000..26cac59
--- /dev/null
+++ b/freeplane/src/com/thebuzzmedia/imgscalr/Scalr.java
@@ -0,0 +1,1924 @@
+/**
+ * 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/org/freeplane/core/extension/ExtensionContainer.java b/freeplane/src/org/freeplane/core/extension/ExtensionContainer.java
new file mode 100644
index 0000000..afc19ce
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/extension/ExtensionContainer.java
@@ -0,0 +1,66 @@
+package org.freeplane.core.extension;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Contains an extension map and utility methods to handle them.
+ *
+ * @author robert.ladstaetter
+ */
+public class ExtensionContainer {
+ private final Map<Class<? extends IExtension>, IExtension> extensions;
+
+ public ExtensionContainer(final Map<Class<? extends IExtension>, IExtension> extensions) {
+ super();
+ this.extensions = extensions;
+ }
+
+ public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ assert(clazz.isAssignableFrom(extension.getClass()));
+ final IExtension oldExtension = getExtensions().put(clazz, extension);
+ if (oldExtension != null && !oldExtension.equals(extension)) {
+ getExtensions().put(clazz, oldExtension);
+ throw new RuntimeException("extension of class " + clazz.getName() + " already registered");
+ }
+ }
+
+ public void addExtension(final IExtension extension) {
+ addExtension(extension.getClass(), extension);
+ }
+
+ public IExtension putExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ final IExtension oldExtension = getExtensions().put(clazz, extension);
+ return oldExtension;
+ }
+
+ public IExtension putExtension(final IExtension extension) {
+ return putExtension(extension.getClass(), extension);
+ }
+
+ public boolean containsExtension(final Class<? extends IExtension> clazz) {
+ return extensions.containsKey(clazz);
+ }
+
+ public Iterator<IExtension> extensionIterator() {
+ return getExtensions().values().iterator();
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends IExtension> T getExtension(final Class<T> clazz) {
+ return (T) getExtensions().get(clazz);
+ }
+
+ public Map<Class<? extends IExtension>, IExtension> getExtensions() {
+ return extensions;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends IExtension> T removeExtension(final Class<T> clazz) {
+ return (T) getExtensions().remove(clazz);
+ }
+
+ public boolean removeExtension(final IExtension extension) {
+ return getExtensions().remove(extension.getClass()) != null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/extension/IExtension.java b/freeplane/src/org/freeplane/core/extension/IExtension.java
new file mode 100644
index 0000000..73bbe48
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/extension/IExtension.java
@@ -0,0 +1,23 @@
+/*
+ * 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.extension;
+
+public interface IExtension {
+}
diff --git a/freeplane/src/org/freeplane/core/extension/SmallExtensionMap.java b/freeplane/src/org/freeplane/core/extension/SmallExtensionMap.java
new file mode 100644
index 0000000..6a8457d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/extension/SmallExtensionMap.java
@@ -0,0 +1,163 @@
+/*
+ * 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.extension;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class SmallExtensionMap implements Map<Class<? extends IExtension>, IExtension> {
+ private static final int INITIAL_CAPACITY = 5;
+ private List<IExtension> collection;
+
+ public void clear() {
+ collection = null;
+ }
+
+ public boolean containsKey(final Object key) {
+ if (collection == null) {
+ return false;
+ }
+ if (!(key instanceof Class<?>)) {
+ return false;
+ }
+ for (int i = 0; i < collection.size(); i++) {
+ final Object extension = collection.get(i);
+ if (key.equals(extension.getClass())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean containsValue(final Object value) {
+ if (collection == null) {
+ return false;
+ }
+ if (!(value instanceof IExtension)) {
+ return false;
+ }
+ for (int i = 0; i < collection.size(); i++) {
+ if ( value.equals(collection.get(i))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private List<IExtension> createCollection() {
+ if (collection == null) {
+ collection = new ArrayList<IExtension>(INITIAL_CAPACITY);
+ }
+ return collection;
+ }
+
+ public Set<java.util.Map.Entry<Class<? extends IExtension>, IExtension>> entrySet() {
+ throw new NoSuchMethodError();
+ }
+
+ private int find(final Class<? extends IExtension> clazz) {
+ if (collection == null) {
+ return -1;
+ }
+ for (int i = 0; i < collection.size(); i++) {
+ if (clazz.equals(collection.get(i).getClass())) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ @SuppressWarnings("unchecked")
+ public IExtension get(final Object key) {
+ if (!(key instanceof Class<?>)) {
+ return null;
+ }
+ final int index = find((Class<? extends IExtension>) key);
+ if (index >= 0) {
+ return collection.get(index);
+ }
+ return null;
+ }
+
+ public boolean isEmpty() {
+ return collection == null;
+ }
+
+ public Set<Class<? extends IExtension>> keySet() {
+ throw new NoSuchMethodError();
+ }
+
+ public IExtension put(final Class<? extends IExtension> key, final IExtension value) {
+ final int index = find(key);
+ if (index >= 0) {
+ final IExtension oldValue = collection.get(index);
+ collection.set(index, value);
+ return oldValue;
+ }
+ else {
+ if (!key.equals(value.getClass())) {
+ throw new ClassCastException();
+ }
+ createCollection().add(value);
+ return null;
+ }
+ }
+
+ public void putAll(final Map<? extends Class<? extends IExtension>, ? extends IExtension> source) {
+ for (final Entry<? extends Class<? extends IExtension>, ? extends IExtension> entry : source.entrySet()) {
+ final Class<? extends IExtension> key = entry.getKey();
+ final IExtension value = entry.getValue();
+ put(key, value);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public IExtension remove(final Object key) {
+ if (collection == null || !(key instanceof Class<?>)) {
+ return null;
+ }
+ final int index = find((Class<? extends IExtension>) key);
+ if (index == -1) {
+ return null;
+ }
+ final IExtension remove = collection.remove(index);
+ removeEmptyCollection();
+ return remove;
+ }
+
+ private void removeEmptyCollection() {
+ if (collection.size() == 0) {
+ collection = null;
+ }
+ }
+
+ public int size() {
+ return collection == null ? 0 : collection.size();
+ }
+
+ public Collection<IExtension> values() {
+ final Collection<IExtension> emptyList = Collections.emptyList();
+ return collection == null ? emptyList : collection;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/IAttributeHandler.java b/freeplane/src/org/freeplane/core/io/IAttributeHandler.java
new file mode 100644
index 0000000..07b70ab
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IAttributeHandler.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+public interface IAttributeHandler {
+ void setAttribute(Object node, String value);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IAttributeWriter.java b/freeplane/src/org/freeplane/core/io/IAttributeWriter.java
new file mode 100644
index 0000000..f810f41
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IAttributeWriter.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+public interface IAttributeWriter {
+ void writeAttributes(ITreeWriter writer, Object userObject, String tag);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IElementContentHandler.java b/freeplane/src/org/freeplane/core/io/IElementContentHandler.java
new file mode 100644
index 0000000..1f14bc6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IElementContentHandler.java
@@ -0,0 +1,26 @@
+/*
+ * 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.n3.nanoxml.XMLElement;
+
+public interface IElementContentHandler extends IElementHandler {
+ void endElement(Object parent, String tag, Object node, XMLElement attributes, String content);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IElementDOMHandler.java b/freeplane/src/org/freeplane/core/io/IElementDOMHandler.java
new file mode 100644
index 0000000..d060f33
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IElementDOMHandler.java
@@ -0,0 +1,30 @@
+/*
+ * 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.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 28.12.2008
+ */
+public interface IElementDOMHandler extends IElementHandler {
+ void endElement(Object parent, String tag, Object element, XMLElement dom);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IElementHandler.java b/freeplane/src/org/freeplane/core/io/IElementHandler.java
new file mode 100644
index 0000000..4bc9fbe
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IElementHandler.java
@@ -0,0 +1,26 @@
+/*
+ * 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.n3.nanoxml.XMLElement;
+
+public interface IElementHandler {
+ Object createElement(Object parent, String tag, XMLElement attributes);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IElementWriter.java b/freeplane/src/org/freeplane/core/io/IElementWriter.java
new file mode 100644
index 0000000..b6dc71d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IElementWriter.java
@@ -0,0 +1,26 @@
+/*
+ * 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 java.io.IOException;
+
+public interface IElementWriter {
+ void writeContent(ITreeWriter writer, Object element, String tag) throws IOException;
+}
diff --git a/freeplane/src/org/freeplane/core/io/IExtensionAttributeWriter.java b/freeplane/src/org/freeplane/core/io/IExtensionAttributeWriter.java
new file mode 100644
index 0000000..3549e73
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IExtensionAttributeWriter.java
@@ -0,0 +1,26 @@
+/*
+ * 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 interface IExtensionAttributeWriter {
+ void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IExtensionElementWriter.java b/freeplane/src/org/freeplane/core/io/IExtensionElementWriter.java
new file mode 100644
index 0000000..6027339
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IExtensionElementWriter.java
@@ -0,0 +1,28 @@
+/*
+ * 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 java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+
+public interface IExtensionElementWriter {
+ void writeContent(ITreeWriter writer, Object element, IExtension extension) throws IOException;
+}
diff --git a/freeplane/src/org/freeplane/core/io/IHintProvider.java b/freeplane/src/org/freeplane/core/io/IHintProvider.java
new file mode 100644
index 0000000..6148a9e
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IHintProvider.java
@@ -0,0 +1,32 @@
+/*
+ * 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.io;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 8, 2009
+ */
+public interface IHintProvider {
+ public Object getHint(Object key);
+
+ public void setHint(Object key, Object value);
+
+ public void setHint(Object key);
+}
diff --git a/freeplane/src/org/freeplane/core/io/IReadCompletionListener.java b/freeplane/src/org/freeplane/core/io/IReadCompletionListener.java
new file mode 100644
index 0000000..e90efe1
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/IReadCompletionListener.java
@@ -0,0 +1,31 @@
+/*
+ * 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 java.util.Map;
+
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev 22.11.2008
+ */
+public interface IReadCompletionListener {
+ public void readingCompleted(NodeModel topNode, Map<String, String> newIds);
+}
diff --git a/freeplane/src/org/freeplane/core/io/ITreeWriter.java b/freeplane/src/org/freeplane/core/io/ITreeWriter.java
new file mode 100644
index 0000000..bacc1cd
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/ITreeWriter.java
@@ -0,0 +1,46 @@
+/*
+ * 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 java.io.IOException;
+import java.util.Collection;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public interface ITreeWriter extends IHintProvider {
+ void addAttribute(String name, double value);
+
+ void addAttribute(String name, int value);
+
+ void addAttribute(String name, String value);
+
+ void addComment(String string) throws IOException;
+
+ void addElement(Object userObject, String name) throws IOException;
+
+ void addElement(Object userObject, XMLElement element) throws IOException;
+
+ void addElementContent(String content) throws IOException;
+
+ void addExtensionAttributes(Object o, Collection<IExtension> extensions);
+
+ void addExtensionNodes(Object o, Collection<IExtension> extensions) throws IOException;
+}
diff --git a/freeplane/src/org/freeplane/core/io/ListHashTable.java b/freeplane/src/org/freeplane/core/io/ListHashTable.java
new file mode 100644
index 0000000..8779e33
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/ListHashTable.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.io;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+public class ListHashTable<K, V> {
+ /**
+ * @author Dimitry Polivaev
+ */
+ private static class EmptyIterator<V> implements Iterator<V> {
+ public boolean hasNext() {
+ return false;
+ }
+
+ public V next() {
+ throw new NoSuchElementException();
+ }
+
+ public void remove() {
+ throw new IllegalStateException();
+ }
+ }
+
+ final private Map<K, List<V>> table = new Hashtable<K, List<V>>();
+
+ public void add(final K tag, final V element) {
+ List<V> elementsForTag = table.get(tag);
+ if (elementsForTag == null) {
+ elementsForTag = new LinkedList<V>();
+ table.put(tag, elementsForTag);
+ }
+ elementsForTag.add(element);
+ }
+
+ public boolean isEmpty(final K tag) {
+ final List<V> elementsForTag = list(tag);
+ if (elementsForTag == null) {
+ return true;
+ }
+ return elementsForTag.isEmpty();
+ }
+
+ public Iterator<V> iterator(final K tag) {
+ final List<V> elementsForTag = list(tag);
+ if (elementsForTag == null) {
+ return new EmptyIterator<V>();
+ }
+ return elementsForTag.listIterator();
+ }
+
+ public List<V> list(final K tag) {
+ return table.get(tag);
+ }
+
+ public boolean remove(final K tag, final V element) {
+ final List<V> elementsForTag = list(tag);
+ if (elementsForTag == null) {
+ return false;
+ }
+ return elementsForTag.remove(element);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/ReadManager.java b/freeplane/src/org/freeplane/core/io/ReadManager.java
new file mode 100644
index 0000000..87a3d70
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/ReadManager.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.core.io;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.freeplane.features.map.NodeModel;
+
+public class ReadManager {
+ final private Hashtable<String, Hashtable<String, IAttributeHandler>> attributeHandlers;
+ final private ListHashTable<String, IElementHandler> elementHandlers;
+ final private Collection<IReadCompletionListener> readCompletionListeners;
+
+ public ReadManager() {
+ super();
+ elementHandlers = new ListHashTable<String, IElementHandler>();
+ attributeHandlers = new Hashtable<String, Hashtable<String, IAttributeHandler>>();
+ readCompletionListeners = new LinkedList<IReadCompletionListener>();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Reader#addAttributeLoader(java.lang.String,
+ * freeplane.persistence.AttributeLoader)
+ */
+ public void addAttributeHandler(final String parentTag, final String attributeName, final IAttributeHandler a) {
+ Hashtable<String, IAttributeHandler> tagHandlers = attributeHandlers.get(parentTag);
+ if (tagHandlers == null) {
+ tagHandlers = new Hashtable<String, IAttributeHandler>();
+ attributeHandlers.put(parentTag, tagHandlers);
+ }
+ if (null != tagHandlers.put(attributeName, a)) {
+ throw new RuntimeException("attribute handler " + parentTag + ", " + attributeName + " already registered");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Reader#addNodeCreator(java.lang.String,
+ * freeplane.persistence.NodeCreator)
+ */
+ public void addElementHandler(final String parentTag, final IElementHandler handler) {
+ elementHandlers.add(parentTag, handler);
+ }
+
+ public void addReadCompletionListener(final IReadCompletionListener listener) {
+ readCompletionListeners.add(listener);
+ }
+
+ public Hashtable<String, Hashtable<String, IAttributeHandler>> getAttributeHandlers() {
+ return attributeHandlers;
+ }
+
+ public ListHashTable<String, IElementHandler> getElementHandlers() {
+ return elementHandlers;
+ }
+
+ public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
+ final Iterator<IReadCompletionListener> iterator = readCompletionListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().readingCompleted(topNode, newIds);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Reader#removeAttributeLoader(java.lang.String,
+ * freeplane.persistence.AttributeLoader)
+ */
+ public void removeAttributeHandler(final String parentTag, final String attributeName, final IAttributeHandler a) {
+ final Hashtable<String, IAttributeHandler> hashtable = attributeHandlers.get(parentTag);
+ hashtable.remove(attributeName);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Reader#removeNodeCreator(java.lang.String,
+ * freeplane.persistence.NodeCreator)
+ */
+ public void removeElementHandler(final String parentTag, final IElementHandler handler) {
+ final boolean removed = elementHandlers.remove(parentTag, handler);
+ assert removed;
+ }
+
+ public void removeReadCompletionListener(final IReadCompletionListener listener) {
+ final boolean removed = readCompletionListeners.remove(listener);
+ assert removed;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/UnknownElementWriter.java b/freeplane/src/org/freeplane/core/io/UnknownElementWriter.java
new file mode 100644
index 0000000..b4e548b
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/UnknownElementWriter.java
@@ -0,0 +1,57 @@
+/*
+ * 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 java.io.IOException;
+import java.util.Enumeration;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 17.01.2009
+ */
+public class UnknownElementWriter implements IExtensionAttributeWriter, IExtensionElementWriter {
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
+ final UnknownElements elements = (UnknownElements) extension;
+ final XMLElement unknownElements = elements.getUnknownElements();
+ if (unknownElements != null) {
+ final Enumeration<String> unknownAttributes = unknownElements.enumerateAttributeNames();
+ while (unknownAttributes.hasMoreElements()) {
+ final String name = unknownAttributes.nextElement();
+ final String value = unknownElements.getAttribute(name, null);
+ writer.addAttribute(name, value);
+ }
+ }
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object element, final IExtension extension)
+ throws IOException {
+ final UnknownElements elements = (UnknownElements) extension;
+ final XMLElement unknownElements = elements.getUnknownElements();
+ if (unknownElements != null) {
+ final Enumeration<XMLElement> unknownChildren = unknownElements.enumerateChildren();
+ while (unknownChildren.hasMoreElements()) {
+ writer.addElement(null, unknownChildren.nextElement());
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/UnknownElements.java b/freeplane/src/org/freeplane/core/io/UnknownElements.java
new file mode 100644
index 0000000..c7a947a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/UnknownElements.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 17.01.2009
+ */
+public class UnknownElements implements IExtension {
+ final private XMLElement unknownElements;
+
+ public UnknownElements(final XMLElement unknownElements) {
+ super();
+ this.unknownElements = unknownElements;
+ }
+
+ public XMLElement getUnknownElements() {
+ return unknownElements;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/WriteManager.java b/freeplane/src/org/freeplane/core/io/WriteManager.java
new file mode 100644
index 0000000..5cde946
--- /dev/null
+++ b/freeplane/src/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 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/StdXMLBuilder.java b/freeplane/src/org/freeplane/core/io/xml/StdXMLBuilder.java
new file mode 100644
index 0000000..24aa2d9
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/xml/StdXMLBuilder.java
@@ -0,0 +1,295 @@
+/*
+ * 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.core.io.xml;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Stack;
+
+import org.freeplane.n3.nanoxml.IXMLBuilder;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * 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 $ Modified by Dimitry
+ * Polivaev: method getLastBuiltElement added
+ */
+class StdXMLBuilder implements IXMLBuilder {
+ /**
+ * The last built element of the parsed XML tree.
+ */
+ private XMLElement last;
+ /**
+ * 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;
+ last = 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 = 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) {
+ 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) {
+ 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;
+ last = null;
+ stack.clear();
+ stack = null;
+ super.finalize();
+ }
+
+ public XMLElement getLastBuiltElement() {
+ return last;
+ }
+
+ public XMLElement getParentElement() {
+ return root != null ? (XMLElement) stack.peek() : null;
+ }
+
+ /**
+ * 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;
+ last = 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);
+ last = elt;
+ 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/core/io/xml/TreeXmlReader.java b/freeplane/src/org/freeplane/core/io/xml/TreeXmlReader.java
new file mode 100644
index 0000000..be40a28
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/xml/TreeXmlReader.java
@@ -0,0 +1,316 @@
+/*
+ * 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/io/xml/TreeXmlWriter.java b/freeplane/src/org/freeplane/core/io/xml/TreeXmlWriter.java
new file mode 100644
index 0000000..053f177
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/xml/TreeXmlWriter.java
@@ -0,0 +1,215 @@
+/*
+ * 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.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Vector;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeWriter;
+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.ListHashTable;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class TreeXmlWriter implements ITreeWriter {
+ public static String BooleanToXml(final boolean col) {
+ return (col) ? "true" : "false";
+ }
+
+ public static String dateToString(final Date date) {
+ return Long.toString(date.getTime());
+ }
+
+ public static String listToString(final List<?> list) {
+ final ListIterator<?> it = list.listIterator(0);
+ final StringBuilder sb = new StringBuilder();
+ while (it.hasNext()) {
+ sb.append(it.next().toString()).append(";");
+ }
+ return sb.toString();
+ }
+
+ public static String PointToXml(final Point col) {
+ if (col == null) {
+ return null;
+ }
+ final Vector<String> l = new Vector<String>();
+ l.add(Integer.toString(col.x));
+ l.add(Integer.toString(col.y));
+ return TreeXmlWriter.listToString(l);
+ }
+
+ private boolean elementStarted = false;
+ final private HashMap<Object, Object> hints;
+ final private WriteManager writeManager;
+ private XMLElement xmlElement;
+ final private XMLWriter xmlwriter;
+
+ public void flush() {
+ xmlwriter.flush();
+ }
+
+ public TreeXmlWriter(final WriteManager writeManager, final Writer writer) {
+ super();
+ this.writeManager = writeManager;
+ xmlwriter = new XMLWriter(writer);
+ hints = new HashMap<Object, Object>();
+ }
+
+ public void addAttribute(final String key, final double value) {
+ addAttribute(key, Double.toString(value));
+ }
+
+ public void addAttribute(final String key, final int value) {
+ addAttribute(key, Integer.toString(value));
+ }
+
+ public void addAttribute(final String key, final String value) {
+ if (elementStarted) {
+ throw new RuntimeException("elementStarted");
+ }
+ if (null != xmlElement.getAttribute(key, null)) {
+ LogUtils.warn("attribute \"" + key + "\" already exist with value \"" + value);
+ return;
+ }
+ xmlElement.setAttribute(key, value);
+ }
+
+ public void addComment(final String comment) throws IOException {
+ xmlwriter.write("<!-- ");
+ xmlwriter.write(comment);
+ xmlwriter.write(" -->\n");
+ }
+
+ public void addElement(final Object userObject, final String name) throws IOException {
+ final XMLElement element = new XMLElement(name);
+ addElement(userObject, element);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void addElement(final Object userObject, final XMLElement element) throws IOException {
+ final boolean isString = userObject instanceof String;
+ if (elementStarted == false && xmlElement != null) {
+ xmlwriter.write(xmlElement, ! isString, 0, true, false);
+ }
+ final String name = element.getName();
+ xmlElement = element;
+ elementStarted = false;
+ {
+ final Iterator<IAttributeWriter> iterator = getAttributeWriters().iterator(name);
+ while (iterator.hasNext()) {
+ final IAttributeWriter as = iterator.next();
+ as.writeAttributes(this, userObject, name);
+ }
+ if (userObject instanceof List<?>) {
+ addExtensionAttributes(userObject, (List<IExtension>) userObject);
+ }
+ }
+ if (isString) {
+ addElementContent((String)userObject);
+ }
+ else {
+ final Iterator<IElementWriter> iterator = getNodeWriters().iterator(name);
+ while (iterator.hasNext()) {
+ final IElementWriter nw = iterator.next();
+ nw.writeContent(this, userObject, name);
+ }
+ if (userObject instanceof List<?>) {
+ addExtensionNodes(userObject, (List<IExtension>) userObject);
+ }
+ }
+ if (elementStarted == false) {
+ xmlwriter.write(xmlElement, true, 0, true, true);
+ elementStarted = true;
+ }
+ else {
+ xmlwriter.endElement(name, true);
+ }
+ }
+
+ public void addElementContent(final String content) throws IOException {
+ if (content.equals("")) {
+ return;
+ }
+ if (elementStarted == false && xmlElement != null) {
+ xmlwriter.write(xmlElement, true, 0, true, false);
+ elementStarted = true;
+ }
+ xmlwriter.write(content);
+ }
+
+ public void addExtensionAttributes(final Object map, final Collection<IExtension> extensions) {
+ final Iterator<IExtension> extensionIterator = extensions.iterator();
+ while (extensionIterator.hasNext()) {
+ final IExtension extension = extensionIterator.next();
+ final Iterator<IExtensionAttributeWriter> writerIterator = writeManager.getExtensionAttributeWriters()
+ .iterator(extension.getClass());
+ while (writerIterator.hasNext()) {
+ writerIterator.next().writeAttributes(this, map, extension);
+ }
+ }
+ }
+
+ public void addExtensionNodes(final Object map, final Collection<IExtension> extensions) throws IOException {
+ final Iterator<IExtension> extensionIterator = extensions.iterator();
+ while (extensionIterator.hasNext()) {
+ final IExtension extension = extensionIterator.next();
+ final Iterator<IExtensionElementWriter> writerIterator = writeManager.getExtensionElementWriters()
+ .iterator(extension.getClass());
+ while (writerIterator.hasNext()) {
+ writerIterator.next().writeContent(this, map, extension);
+ }
+ }
+ }
+
+ private ListHashTable<String, IAttributeWriter> getAttributeWriters() {
+ return writeManager.getAttributeWriters();
+ }
+
+ public Object getHint(final Object key) {
+ final Object object = hints.get(key);
+ return object == null ? Boolean.FALSE : object;
+ }
+
+ private ListHashTable<String, IElementWriter> getNodeWriters() {
+ return writeManager.getElementWriters();
+ }
+
+ public void setHint(final Object key) {
+ hints.put(key, Boolean.TRUE);
+ }
+
+ public void setHint(final Object key, final Object value) {
+ hints.put(key, value);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/xml/XMLParser.java b/freeplane/src/org/freeplane/core/io/xml/XMLParser.java
new file mode 100644
index 0000000..5c7e601
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/xml/XMLParser.java
@@ -0,0 +1,123 @@
+/*
+ * 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.io.IOException;
+import java.util.Properties;
+
+import org.freeplane.n3.nanoxml.IXMLParser;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.StdXMLParser;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+class XMLParser extends StdXMLParser implements IXMLParser {
+ private boolean skipNextElementContent = false;
+
+ void notParseNextElementContent() {
+ skipNextElementContent = true;
+ }
+
+ @Override
+ protected void processElement(final String defaultNamespace, final Properties namespaces) throws Exception {
+ try {
+ super.processElement(defaultNamespace, namespaces);
+ }
+ finally {
+ skipNextElementContent = false;
+ }
+ }
+
+ @Override
+ protected void processElementContent(final String defaultNamespace, final Properties namespaces,
+ final String fullName, final String name, final String prefix)
+ throws IOException, XMLParseException, Exception {
+ if (skipNextElementContent) {
+ boolean inComment = false;
+ final TreeXmlReader builder = (TreeXmlReader) getBuilder();
+ final StringBuilder waitingBuf = new StringBuilder();
+ int level = 1;
+ for (;;) {
+ final IXMLReader reader = getReader();
+ char ch = reader.read();
+ if (inComment) {
+ waitingBuf.append(ch);
+ if (ch != '-') {
+ continue;
+ }
+ ch = reader.read();
+ waitingBuf.append(ch);
+ if (ch != '-') {
+ continue;
+ }
+ ch = reader.read();
+ waitingBuf.append(ch);
+ if (ch != '>') {
+ continue;
+ }
+ inComment = false;
+ continue;
+ }
+ if (ch == '<') {
+ ch = reader.read();
+ if (ch == '/') {
+ level--;
+ if (level == 0) {
+ break;
+ }
+ }
+ else if (ch == '!') {
+ final char read1 = reader.read();
+ final char read2 = reader.read();
+ if (read1 != '-' || read2 != '-') {
+ throw new XMLParseException(reader.getSystemID(), reader.getLineNr(), "Invalid input: <!"
+ + read1 + read2);
+ }
+ inComment = true;
+ waitingBuf.append("<!--");
+ continue;
+ }
+ else {
+ level++;
+ }
+ waitingBuf.append('<');
+ }
+ else if (ch == '/') {
+ ch = reader.read();
+ if (ch == '>') {
+ level--;
+ if (level == 0) {
+ throw new XMLParseException(reader.getSystemID(), reader.getLineNr(), "Invalid input: />");
+ }
+ }
+ else if (ch == '<') {
+ waitingBuf.append('/');
+ reader.unread(ch);
+ continue;
+ }
+ waitingBuf.append('/');
+ }
+ waitingBuf.append(ch);
+ }
+ builder.setElementContent(waitingBuf.toString());
+ return;
+ }
+ super.processElementContent(defaultNamespace, namespaces, fullName, name, prefix);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/xml/XMLWriter.java b/freeplane/src/org/freeplane/core/io/xml/XMLWriter.java
new file mode 100644
index 0000000..8bfd89d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/io/xml/XMLWriter.java
@@ -0,0 +1,277 @@
+/*
+ * Modified by Dimitry Polivaev (2010)
+ *
+ * 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.core.io.xml;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * An XMLWriter writes XML data to a stream.
+ *
+ * @see org.freeplane.n3.nanoxml.XMLElement
+ * @see java.io.Writer
+ * @author Marc De Scheemaecker Modified by Dimitry Polivaev: optionally not
+ * write closing element tag
+ */
+class XMLWriter {
+ /**
+ * Where to write the output to.
+ */
+ private PrintWriter writer;
+
+ public void flush() {
+ writer.flush();
+ }
+
+ /**
+ * 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);
+ }
+ }
+
+ public void endElement(final String fullName, final boolean prettyPrint) {
+ writer.print("</" + fullName + '>');
+ if (prettyPrint) {
+ writer.println();
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ flush();
+ writer = null;
+ super.finalize();
+ }
+
+ /**
+ * Writes an XML element.
+ *
+ * @param xml
+ * the non-null XML element to write.
+ */
+ public void startElement(final XMLElement xml) throws IOException {
+ this.write(xml, false, 0, true, false);
+ }
+
+ /**
+ */
+ public void write(final String content) {
+ writeEncoded(content, false, true);
+ }
+
+ /**
+ * 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, 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.
+ * @param endElement
+ */
+ protected void write(final XMLElement xml, final boolean prettyPrint, final int indent,
+ final boolean collapseEmptyElements, final boolean endElement) throws IOException {
+ if (prettyPrint) {
+ for (int i = 0; i < indent; i++) {
+ writer.print(' ');
+ }
+ }
+ if (xml.getName() == null) {
+ if (xml.getContent() != null) {
+ if (prettyPrint) {
+ this.writeEncoded(xml.getContent().trim(), false, false);
+ writer.println();
+ }
+ else {
+ this.writeEncoded(xml.getContent(), false, false);
+ }
+ }
+ }
+ else {
+ writer.print('<');
+ final String fullName = xml.getFullName();
+ writer.print(fullName);
+ final Vector<String> nsprefixes = new Vector<String>();
+ if (xml.getNamespace() != null) {
+ if (xml.getName().equals(fullName)) {
+ writer.print(" xmlns=\"" + xml.getNamespace() + '"');
+ }
+ else {
+ String prefix = fullName;
+ 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 = (String) 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 = (String) enumAttributeNames.nextElement();
+ final String value = xml.getAttribute(key, null);
+ writer.print(" " + key + "=\"");
+ this.writeEncoded(value, true, false);
+ writer.print('"');
+ }
+ if ((xml.getContent() != null) && (xml.getContent().length() > 0)) {
+ writer.print('>');
+ this.writeEncoded(xml.getContent(), false, false);
+ if (endElement) {
+ endElement(fullName, prettyPrint);
+ }
+ }
+ else if (xml.hasChildren() || (!collapseEmptyElements)) {
+ writer.print('>');
+ if (prettyPrint) {
+ writer.println();
+ }
+ Enumeration<XMLElement> enumeration = xml.enumerateChildren();
+ while (enumeration.hasMoreElements()) {
+ final XMLElement child = enumeration.nextElement();
+ this.write(child, prettyPrint, indent + 4, collapseEmptyElements, true);
+ }
+ if (prettyPrint) {
+ for (int i = 0; i < indent; i++) {
+ writer.print(' ');
+ }
+ }
+ if (endElement) {
+ endElement(fullName, prettyPrint);
+ }
+ }
+ else {
+ if (endElement) {
+ writer.print("/>");
+ }
+ else {
+ writer.print(">");
+ }
+ if (prettyPrint) {
+ writer.println();
+ }
+ }
+ }
+ }
+
+ /**
+ * Writes a string encoding reserved characters.
+ */
+ private void writeEncoded(final String str, final boolean atributeValue, final boolean xmlInclude) {
+ for (int i = 0; i < str.length(); i++) {
+ final char c = str.charAt(i);
+ if (c > 0x7E) {
+ writer.print("&#x");
+ writer.print(Integer.toString(c, 16));
+ writer.print(';');
+ continue;
+ }
+ if (xmlInclude) {
+ writer.print(c);
+ continue;
+ }
+ switch (c) {
+ case '<':
+ writer.print("<");
+ continue;
+ case '>':
+ writer.print(">");
+ continue;
+ case '&':
+ writer.print("&");
+ continue;
+ case '\'':
+ writer.print("'");
+ continue;
+ case '"':
+ writer.print(""");
+ continue;
+ case 0x0A:
+ if (atributeValue) {
+ writer.print("
");
+ }
+ else {
+ writer.print(c);
+ }
+ continue;
+ default:
+ if (c < ' ') {
+ writer.print("&#x");
+ writer.print(Integer.toString(c, 16));
+ writer.print(';');
+ continue;
+ }
+ writer.print(c);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/IFreeplanePropertyListener.java b/freeplane/src/org/freeplane/core/resources/IFreeplanePropertyListener.java
new file mode 100644
index 0000000..269abf2
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/IFreeplanePropertyListener.java
@@ -0,0 +1,28 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is to be reworked.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have 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;
+
+/**
+ * Is issued by the OptionPanel when the user accepted a change of its
+ * preferences.
+ */
+public interface IFreeplanePropertyListener {
+ void propertyChanged(String propertyName, String newValue, String oldValue);
+}
diff --git a/freeplane/src/org/freeplane/core/resources/NamedObject.java b/freeplane/src/org/freeplane/core/resources/NamedObject.java
new file mode 100644
index 0000000..7040b70
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/NamedObject.java
@@ -0,0 +1,148 @@
+/*
+ * 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/ResourceBundles.java b/freeplane/src/org/freeplane/core/resources/ResourceBundles.java
new file mode 100644
index 0000000..ab6ff87
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/ResourceBundles.java
@@ -0,0 +1,238 @@
+/*
+ * 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.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.ResourceBundle;
+
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.collection.MultipleValueMap;
+
+/**
+ * Class for managing localized resources. See translation property files.
+ */
+public class ResourceBundles extends ResourceBundle {
+ public static final String LANGUAGE_AUTOMATIC = "automatic";
+ private static final String DEFAULT_LANGUAGE = "en";
+ public static final String POSTFIX_TRANSLATE_ME = "[translate me]";
+ public static final String RESOURCE_LANGUAGE = "language";
+ /**
+ *
+ */
+ final private ResourceController controller;
+ private Map<String, String> defaultResources;
+ private final MultipleValueMap<String, URL> externalResources;
+ private String lang;
+ private Map<String, String> languageResources;
+ final private boolean isUserDefined;
+
+ ResourceBundles(final ResourceController controller) {
+ this.controller = controller;
+ final URL systemResource = getSystemResourceUrl(DEFAULT_LANGUAGE);
+ isUserDefined = systemResource.getProtocol().equalsIgnoreCase("file");
+ externalResources = new MultipleValueMap<String, URL>();
+ try {
+ loadLocalLanguageResources();
+ if(lang.equals(DEFAULT_LANGUAGE))
+ defaultResources = languageResources;
+ else
+ defaultResources = getLanguageResources(DEFAULT_LANGUAGE);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ LogUtils.severe("Error loading Resources");
+ }
+ }
+
+ public void addResources(final String language, final Map<String, String> resources) {
+ if (language.equalsIgnoreCase(DEFAULT_LANGUAGE)) {
+ defaultResources.putAll(resources);
+ }
+ else if (language.equalsIgnoreCase(lang)) {
+ languageResources.putAll(resources);
+ }
+ }
+
+ public void addResources(final String language, final URL url) {
+ try {
+ addResources(language, getLanguageResources(url));
+ externalResources.put(language, url);
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public Enumeration getKeys() {
+ final Iterator<String> iterator = defaultResources.keySet().iterator();
+ return new Enumeration() {
+ public boolean hasMoreElements() {
+ return iterator.hasNext();
+ }
+
+ public Object nextElement() {
+ return iterator.next();
+ }
+ };
+ }
+
+ public String getLanguageCode() {
+ return lang;
+ }
+
+ public String getDefaultLanguageCode() {
+ return DEFAULT_LANGUAGE;
+ }
+
+ /**
+ * @throws IOException
+ */
+ private Map<String, String> getLanguageResources(final String lang) throws IOException {
+ final URL systemResource = getSystemResourceUrl(lang);
+ if (systemResource == null) {
+ // no double logging: System.out.println("core resource " + resourceName + " not found");
+ return null;
+ }
+ final Map<String, String> resources = getLanguageResources(systemResource);
+ final Iterator<URL> iterator = externalResources.get(lang).iterator();
+ while (iterator.hasNext()) {
+ resources.putAll(getLanguageResources(iterator.next()));
+ }
+ return resources;
+ }
+
+ protected URL getSystemResourceUrl(final String lang) {
+ String resourceName = "/translations/Resources" + "_" + lang + ".properties";
+ final URL systemResource = ResourceController.getResourceController().getResource(resourceName);
+ return systemResource;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private Map<String, String> getLanguageResources(final URL systemResource) throws IOException {
+ InputStream in = null;
+ try {
+ in = new BufferedInputStream(systemResource.openStream());
+ final Properties bundle = new Properties();
+ bundle.load(in);
+ return new HashMap(bundle);
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ }
+
+ public String getResourceString(final String key) {
+ final String resourceString = getResourceString(key, key);
+ if (resourceString == key) {
+ if(isUserDefined)
+ System.out.println("missing key " + key);
+ else
+ System.err.println("missing key " + key);
+ return '[' + key + ']';
+ }
+ return resourceString;
+ }
+
+ public String getResourceString(final String key, final String resource) {
+ String value = languageResources.get(key);
+ if (value != null) {
+ return value;
+ }
+ value = defaultResources.get(key);
+ if (value != null) {
+ return value + ResourceBundles.POSTFIX_TRANSLATE_ME;
+ }
+ return resource;
+ }
+
+ public String putResourceString(final String key, final String resource) {
+ return languageResources.put(key, resource);
+ }
+
+ @Override
+ protected Object handleGetObject(final String key) {
+ try {
+ return languageResources.get(key);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe("Warning - resource string not found:" + key);
+ return defaultResources.get(key) + ResourceBundles.POSTFIX_TRANSLATE_ME;
+ }
+ }
+
+ private void loadLocalLanguageResources() throws IOException {
+ lang = controller.getProperty(ResourceBundles.RESOURCE_LANGUAGE);
+ if (lang == null || lang.equals(LANGUAGE_AUTOMATIC)) {
+ final String country = Locale.getDefault().getCountry();
+ if(! country.equals("")){
+ lang = Locale.getDefault().getLanguage() + "_" + country;
+ languageResources = getLanguageResources(lang);
+ if (languageResources != null) {
+ LogUtils.info("language resources for " + lang + " found");
+ return;
+ }
+ }
+ lang = Locale.getDefault().getLanguage();
+ languageResources = getLanguageResources(lang);
+ if (languageResources != null) {
+ LogUtils.info("language resources for " + lang + " found");
+ return;
+ }
+ LogUtils.info("language resources for " + lang + " not found");
+ }
+ if ("no".equals(lang)) {
+ lang = "nb";
+ }
+ languageResources = getLanguageResources(lang);
+ if (languageResources != null) {
+ return;
+ }
+ LogUtils.info("language resources for " + lang + " not found");
+ lang = DEFAULT_LANGUAGE;
+ languageResources = getLanguageResources(lang);
+ if (languageResources != null) {
+ return;
+ }
+ LogUtils.severe("language resources for " + lang + " not found, aborting");
+ System.exit(1);
+ }
+
+ public void loadAnotherLanguage() {
+ try {
+ if(! lang.equals(controller.getProperty(ResourceBundles.RESOURCE_LANGUAGE)))
+ loadLocalLanguageResources();
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/ResourceController.java b/freeplane/src/org/freeplane/core/resources/ResourceController.java
new file mode 100644
index 0000000..c1a0af9
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/ResourceController.java
@@ -0,0 +1,281 @@
+/*
+ * 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.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();
+ }
+
+ protected 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 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
new file mode 100644
index 0000000..6b23db1
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/SetBooleanPropertyAction.java
@@ -0,0 +1,56 @@
+/*
+ * 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
new file mode 100644
index 0000000..e640484
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/WindowConfigurationStorage.java
@@ -0,0 +1,138 @@
+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
new file mode 100644
index 0000000..045a913
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/BooleanProperty.java
@@ -0,0 +1,75 @@
+/*
+ * 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
new file mode 100644
index 0000000..2e7fbed
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/ColorProperty.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.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
new file mode 100644
index 0000000..a26cc5e
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/ComboProperty.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.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 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() + "/" + getLabel());
+ 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
new file mode 100644
index 0000000..ba19fa3
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/EditableComboProperty.java
@@ -0,0 +1,93 @@
+/*
+ * 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
new file mode 100644
index 0000000..731b393
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/FontProperty.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.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
new file mode 100644
index 0000000..0f0fb91
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/GrabKeyDialog.java
@@ -0,0 +1,421 @@
+/*
+ * 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/IKeystrokeValidator.java b/freeplane/src/org/freeplane/core/resources/components/IKeystrokeValidator.java
new file mode 100644
index 0000000..649d25f
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/IKeystrokeValidator.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.resources.components;
+
+import javax.swing.KeyStroke;
+
+/**
+ * @author Dimitry Polivaev
+ * 12.04.2009
+ */
+public interface IKeystrokeValidator {
+ boolean isValid(KeyStroke keystroke, Character character);
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IPropertyControl.java b/freeplane/src/org/freeplane/core/resources/components/IPropertyControl.java
new file mode 100644
index 0000000..2a5c1f9
--- /dev/null
+++ b/freeplane/src/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 getDescription();
+
+ 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/org/freeplane/core/resources/components/IPropertyControlCreator.java
new file mode 100644
index 0000000..eff7c34
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/IPropertyControlCreator.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * 26.12.2008
+ */
+public interface IPropertyControlCreator {
+ IPropertyControl createControl();
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IValidator.java b/freeplane/src/org/freeplane/core/resources/components/IValidator.java
new file mode 100644
index 0000000..6391c28
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/IValidator.java
@@ -0,0 +1,48 @@
+package org.freeplane.core.resources.components;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+public interface IValidator {
+ public static final class ValidationResult {
+ private ArrayList<String> warnings = new ArrayList<String>(0);
+ private ArrayList<String> errors = new ArrayList<String>(0);
+
+ public boolean isValid() {
+ return errors.isEmpty();
+ }
+
+ public boolean hasWarnings() {
+ return !warnings.isEmpty();
+ }
+
+ public void addError(String error) {
+ errors.add(error);
+ }
+
+ public void addWarning(String warning) {
+ warnings.add(warning);
+ }
+
+ public ArrayList<String> getWarnings() {
+ return warnings;
+ }
+
+ public ArrayList<String> getErrors() {
+ return errors;
+ }
+
+ @Override
+ public String toString() {
+ return "Validation errors: " + errors + ", warnings: " + warnings;
+ }
+
+ public void add(ValidationResult result) {
+ warnings.addAll(result.warnings);
+ errors.addAll(result.errors);
+ }
+ }
+
+ /** validates properties. Note that these may differ from the state that the ResourceController has. */
+ ValidationResult validate(Properties properties);
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IconProperty.java b/freeplane/src/org/freeplane/core/resources/components/IconProperty.java
new file mode 100644
index 0000000..cca145d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/IconProperty.java
@@ -0,0 +1,110 @@
+/*
+ * 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/KeyEventTranslator.java b/freeplane/src/org/freeplane/core/resources/components/KeyEventTranslator.java
new file mode 100644
index 0000000..a817a2f
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/KeyEventTranslator.java
@@ -0,0 +1,261 @@
+/*
+ * 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.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * In conjunction with the <code>KeyEventWorkaround</code>, hides some warts in
+ * the AWT key event API.
+ *
+ */
+class KeyEventTranslator {
+ static class Key {
+ final public char input;
+ final public int key;
+ final public String modifiers;
+
+ public Key(final String modifiers, final int key, final char input) {
+ this.modifiers = modifiers;
+ this.key = key;
+ this.input = input;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (o instanceof Key) {
+ final Key k = (Key) o;
+ if ((modifiers.equals(k.modifiers)) && key == k.key && input == k.input) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key + input;
+ }
+
+ @Override
+ public String toString() {
+ return (modifiers == null ? "" : modifiers) + "<" + Integer.toString(key, 16) + ","
+ + Integer.toString(input, 16) + ">";
+ }
+ }
+
+ static int c, a, m, s;
+ private static Map<Key, Key> transMap = new HashMap<Key, Key>();
+ static {
+ KeyEventTranslator.setModifierMapping(InputEvent.CTRL_MASK, InputEvent.ALT_MASK, InputEvent.META_MASK,
+ InputEvent.SHIFT_MASK);
+ }
+
+ /**
+ * Returns a string containing symbolic modifier names set in the specified
+ * event.
+ *
+ * @param evt
+ * The event
+ * @since jEdit 4.2pre3
+ */
+ public static String getModifierString(final InputEvent evt) {
+ final StringBuilder buf = new StringBuilder();
+ if (evt.isControlDown()) {
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.CTRL_MASK));
+ }
+ if (evt.isAltDown()) {
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.ALT_MASK));
+ }
+ if (evt.isMetaDown()) {
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.META_MASK));
+ }
+ if (evt.isShiftDown()) {
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.SHIFT_MASK));
+ }
+ return (buf.length() == 0 ? null : buf.toString());
+ }
+
+ /**
+ * Returns a the symbolic modifier name for the specified Java modifier
+ * flag.
+ *
+ * @param mod
+ * A modifier constant from <code>InputEvent</code>
+ * @since jEdit 4.2pre3
+ */
+ public static String getSymbolicModifierName(final int mod) {
+ if ((mod & KeyEventTranslator.c) != 0) {
+ return "control";
+ }
+ else if ((mod & KeyEventTranslator.a) != 0) {
+ return "alt";
+ }
+ else if ((mod & KeyEventTranslator.m) != 0) {
+ return "meta";
+ }
+ else if ((mod & KeyEventTranslator.s) != 0) {
+ return "shift";
+ }
+ else {
+ return "";
+ }
+ }
+
+ public static String modifiersToString(final int mods) {
+ StringBuilder buf = null;
+ if ((mods & InputEvent.CTRL_MASK) != 0) {
+ buf = new StringBuilder();
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.CTRL_MASK));
+ }
+ if ((mods & InputEvent.ALT_MASK) != 0) {
+ if (buf == null) {
+ buf = new StringBuilder();
+ }
+ else {
+ buf.append(GrabKeyDialog.MODIFIER_SEPARATOR);
+ }
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.ALT_MASK));
+ }
+ if ((mods & InputEvent.META_MASK) != 0) {
+ if (buf == null) {
+ buf = new StringBuilder();
+ }
+ else {
+ buf.append(GrabKeyDialog.MODIFIER_SEPARATOR);
+ }
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.META_MASK));
+ }
+ if ((mods & InputEvent.SHIFT_MASK) != 0) {
+ if (buf == null) {
+ buf = new StringBuilder();
+ }
+ else {
+ buf.append(GrabKeyDialog.MODIFIER_SEPARATOR);
+ }
+ buf.append(KeyEventTranslator.getSymbolicModifierName(InputEvent.SHIFT_MASK));
+ }
+ if (buf == null) {
+ return null;
+ }
+ else {
+ return buf.toString();
+ }
+ }
+
+ /**
+ * Changes the mapping between symbolic modifier key names (<code>C</code>,
+ * <code>A</code>, <code>M</code>, <code>S</code>) and Java modifier flags.
+ * You can map more than one Java modifier to a symobolic modifier, for
+ * example :
+ * <p>
+ * <code><pre>
+ * setModifierMapping(
+ * InputEvent.CTRL_MASK,
+ * InputEvent.ALT_MASK | InputEvent.META_MASK,
+ * 0,
+ * InputEvent.SHIFT_MASK);
+ * <pre></code>
+ * </p>
+ * You cannot map a Java modifer to more than one symbolic modifier.
+ *
+ * @param c
+ * The modifier(s) to map the <code>C</code> modifier to
+ * @param a
+ * The modifier(s) to map the <code>A</code> modifier to
+ * @param m
+ * The modifier(s) to map the <code>M</code> modifier to
+ * @param s
+ * The modifier(s) to map the <code>S</code> modifier to
+ * @since jEdit 4.2pre3
+ */
+ public static void setModifierMapping(final int c, final int a, final int m, final int s) {
+ final int duplicateMapping = ((c & a) | (c & m) | (c & s) | (a & m) | (a & s) | (m & s));
+ if ((duplicateMapping & InputEvent.CTRL_MASK) != 0) {
+ throw new IllegalArgumentException("CTRL is mapped to more than one modifier");
+ }
+ if ((duplicateMapping & InputEvent.ALT_MASK) != 0) {
+ throw new IllegalArgumentException("ALT is mapped to more than one modifier");
+ }
+ if ((duplicateMapping & InputEvent.META_MASK) != 0) {
+ throw new IllegalArgumentException("META is mapped to more than one modifier");
+ }
+ if ((duplicateMapping & InputEvent.SHIFT_MASK) != 0) {
+ throw new IllegalArgumentException("SHIFT is mapped to more than one modifier");
+ }
+ KeyEventTranslator.c = c;
+ KeyEventTranslator.a = a;
+ KeyEventTranslator.m = m;
+ KeyEventTranslator.s = s;
+ }
+
+ /**
+ * Pass this an event from
+ * {@link KeyEventWorkaround#processKeyEvent(java.awt.event.KeyEvent)}.
+ *
+ * @since jEdit 4.2pre3
+ */
+ public static Key translateKeyEvent(final KeyEvent evt) {
+ final int modifiers = evt.getModifiers();
+ Key returnValue = null;
+ switch (evt.getID()) {
+ case KeyEvent.KEY_PRESSED:
+ final int keyCode = evt.getKeyCode();
+ if ((keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9)
+ || (keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z)) {
+ returnValue = new Key(KeyEventTranslator.modifiersToString(modifiers), '\0', Character
+ .toUpperCase((char) keyCode));
+ }
+ else {
+ if (keyCode > 0 && keyCode <= KeyEvent.VK_SPACE
+ || keyCode == KeyEvent.VK_DELETE) {
+ evt.consume();
+ returnValue = new Key(KeyEventTranslator.modifiersToString(modifiers), keyCode,
+ KeyEvent.CHAR_UNDEFINED);
+ }
+ else {
+ returnValue = new Key(KeyEventTranslator.modifiersToString(modifiers), keyCode, evt
+ .getKeyChar());
+ }
+ }
+ break;
+ default:
+ return null;
+ }
+ /*
+ * I guess translated events do not have the 'evt' field set so
+ * consuming won't work. I don't think this is a problem as nothing uses
+ * translation anyway
+ */
+ final Key trans = KeyEventTranslator.transMap.get(returnValue);
+ if (trans == null) {
+ return returnValue;
+ }
+ else {
+ return trans;
+ }
+ }
+
+ public static final boolean ALT_KEY_PRESSED_DISABLED = false;
+ static int modifiers;
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/KeyProperty.java b/freeplane/src/org/freeplane/core/resources/components/KeyProperty.java
new file mode 100644
index 0000000..16eb8f9
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/KeyProperty.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.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;
+
+/**
+ * @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("fill:20dlu");
+ }
+ 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
new file mode 100644
index 0000000..8756913
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..c368181
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..88b6cd2
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/NumberProperty.java
@@ -0,0 +1,110 @@
+/*
+ * 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 org.freeplane.core.util.LogUtils;
+
+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)
+ {
+ someValue = 1.0;
+ try {
+ someValue = Double.parseDouble(value);
+ }
+ catch (final NumberFormatException e) {
+ LogUtils.severe(e);
+ }
+ }
+ else
+ {
+ someValue = 100;
+ try {
+ someValue = Integer.parseInt(value);
+ }
+ catch (final NumberFormatException e) {
+ LogUtils.severe(e);
+ }
+ }
+ 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
new file mode 100644
index 0000000..c596418
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/OptionPanel.java
@@ -0,0 +1,247 @@
+/*
+ * 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
new file mode 100644
index 0000000..95b8c05
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/OptionPanelBuilder.java
@@ -0,0 +1,587 @@
+/*
+ * 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 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 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("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/OptionPanelWindowConfigurationStorage.java b/freeplane/src/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.java
new file mode 100644
index 0000000..5aca7d1
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.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.JDialog;
+
+import org.freeplane.core.resources.WindowConfigurationStorage;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class OptionPanelWindowConfigurationStorage extends WindowConfigurationStorage {
+ public OptionPanelWindowConfigurationStorage() {
+ super("option_panel_window_configuration_storage");
+ }
+
+ public static OptionPanelWindowConfigurationStorage decorateDialog(final String marshalled, final JDialog dialog) {
+ final OptionPanelWindowConfigurationStorage storage = new OptionPanelWindowConfigurationStorage();
+ final XMLElement xml = storage.unmarschall(marshalled, dialog);
+ if (xml != null) {
+ storage.panel = xml.getAttribute("panel", null);
+ return storage;
+ }
+ return null;
+ }
+
+ protected String panel;
+
+ public String getPanel() {
+ return panel;
+ }
+
+ @Override
+ protected void marshallSpecificElements(final XMLElement xml) {
+ xml.setAttribute("panel", panel);
+ }
+
+ public void setPanel(final String panel) {
+ this.panel = panel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/PathProperty.java b/freeplane/src/org/freeplane/core/resources/components/PathProperty.java
new file mode 100644
index 0000000..d53abe0
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/PathProperty.java
@@ -0,0 +1,173 @@
+/*
+ * 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
new file mode 100644
index 0000000..a4bb537
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/PropertyAction.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.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) {
+ dialog.pack();
+ }
+ 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
new file mode 100644
index 0000000..2ba65e6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/PropertyAdapter.java
@@ -0,0 +1,76 @@
+/*
+ * 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
new file mode 100644
index 0000000..f7cce41
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/PropertyBean.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.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
new file mode 100644
index 0000000..4a53d42
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/RemindValueProperty.java
@@ -0,0 +1,123 @@
+/*
+ * 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
new file mode 100644
index 0000000..3f8d3e1
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..fd46ebc
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/StringProperty.java
@@ -0,0 +1,68 @@
+/*
+ * 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
new file mode 100644
index 0000000..d0d6276
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..b5f4a51
--- /dev/null
+++ b/freeplane/src/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 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/VariableSizeCardLayout.java b/freeplane/src/org/freeplane/core/resources/components/VariableSizeCardLayout.java
new file mode 100644
index 0000000..dac4340
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/resources/components/VariableSizeCardLayout.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is to be reworked.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have 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.CardLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Insets;
+
+public class VariableSizeCardLayout extends CardLayout {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public VariableSizeCardLayout() {
+ super();
+ }
+
+ public VariableSizeCardLayout(final int hgap, final int vgap) {
+ super(hgap, vgap);
+ }
+
+ /**
+ * Determines the preferred size of the container argument using this card
+ * layout.
+ *
+ * @param parent
+ * the parent container in which to do the layout
+ * @return the preferred dimensions to lay out the subcomponents of the
+ * specified container
+ * @see java.awt.Container#getPreferredSize
+ * @see java.awt.CardLayout#minimumLayoutSize
+ */
+ @Override
+ public Dimension preferredLayoutSize(final Container parent) {
+ synchronized (parent.getTreeLock()) {
+ final Insets insets = parent.getInsets();
+ final int ncomponents = parent.getComponentCount();
+ int w = 0;
+ int h = 0;
+ for (int i = 0; i < ncomponents; i++) {
+ final Component comp = parent.getComponent(i);
+ if (comp.isVisible()) {
+ final Dimension d = comp.getPreferredSize();
+ if (d.width > w) {
+ w = d.width;
+ }
+ if (d.height > h) {
+ h = d.height;
+ }
+ }
+ }
+ return new Dimension(insets.left + insets.right + w + getHgap() * 2, insets.top + insets.bottom + h
+ + getVgap() * 2);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java b/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java
new file mode 100644
index 0000000..2cc92da
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java
@@ -0,0 +1,206 @@
+/*
+ * 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;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @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 checkEnabledOnPopup(final AFreeplaneAction action) {
+ final EnabledAction annotation = action.getClass().getAnnotation(EnabledAction.class);
+ if (annotation == null) {
+ return false;
+ }
+ return annotation.checkOnPopup();
+ }
+
+ 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() {
+ }
+
+
+
+ @Override
+ public boolean isEnabled() {
+ if(! Boolean.TRUE.equals(getValue("AFreeplaneAction.setEnabled")) && AFreeplaneAction.checkEnabledOnPopup(this)
+ && Controller.getCurrentController().getSelection() != null)
+ setEnabled();
+ return super.isEnabled();
+ }
+
+ @Override
+ public void setEnabled(boolean newValue) {
+ putValue("AFreeplaneAction.setEnabled", Boolean.TRUE);
+ super.setEnabled(newValue);
+ putValue("AFreeplaneAction.setEnabled", null);
+ }
+
+ 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/AMouseListener.java b/freeplane/src/org/freeplane/core/ui/AMouseListener.java
new file mode 100644
index 0000000..f0b63d9
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/AMouseListener.java
@@ -0,0 +1,26 @@
+package org.freeplane.core.ui;
+
+import java.awt.event.MouseEvent;
+
+public class AMouseListener implements IMouseListener{
+ public void mouseDragged(MouseEvent e) {
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/AMultipleNodeAction.java b/freeplane/src/org/freeplane/core/ui/AMultipleNodeAction.java
new file mode 100644
index 0000000..372a764
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/AMultipleNodeAction.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is to be deleted.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have 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.event.ActionEvent;
+import java.util.Collection;
+import javax.swing.ImageIcon;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public abstract class AMultipleNodeAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public AMultipleNodeAction(final String key) {
+ super(key);
+ }
+
+ public AMultipleNodeAction(final String key, final String name, final ImageIcon imageIcon) {
+ super(key, name, imageIcon);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Collection<NodeModel> selectedNodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel selected : selectedNodes.toArray(new NodeModel[]{})) {
+ actionPerformed(e, selected);
+ }
+ }
+
+ abstract protected void actionPerformed(ActionEvent e, NodeModel node);
+}
diff --git a/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java b/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java
new file mode 100644
index 0000000..48bdac9
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java
@@ -0,0 +1,267 @@
+/*
+ * 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;
+ final String titel = TextUtils.getText("SetAcceleratorOnNextClickAction.text");
+ String text = TextUtils.getText(SET_ACCELERATOR_ON_NEXT_CLICK_ACTION);
+ if(accelerator != null)
+ text = text + " " + toString(accelerator);
+ final Frame frame = Controller.getCurrentController().getViewController().getFrame();
+ setAcceleratorOnNextClickActionDialog = UITools.createCancelDialog(frame, titel, 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
new file mode 100644
index 0000000..f03717a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/ColorTracker.java
@@ -0,0 +1,130 @@
+/*
+ * 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.getViewController().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/ControllerPopupMenuListener.java b/freeplane/src/org/freeplane/core/ui/ControllerPopupMenuListener.java
new file mode 100644
index 0000000..39367bb
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/ControllerPopupMenuListener.java
@@ -0,0 +1,37 @@
+/*
+ * 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.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+
+import org.freeplane.features.mode.Controller;
+
+/**
+ * listener, that blocks the controler if the menu is active (PN) Take care!
+ * This listener is also used for modelpopups (as for graphical links).
+ */
+public class ControllerPopupMenuListener implements HierarchyListener {
+
+ public void hierarchyChanged(HierarchyEvent e) {
+ if(e.getID() != HierarchyEvent.ANCESTOR_MOVED && e.getID() != HierarchyEvent.ANCESTOR_RESIZED)
+ Controller.getCurrentModeController().setBlocked(e.getComponent().isShowing());
+ }
+ }
diff --git a/freeplane/src/org/freeplane/core/ui/DelayedMouseListener.java b/freeplane/src/org/freeplane/core/ui/DelayedMouseListener.java
new file mode 100644
index 0000000..5e3fdd6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/DelayedMouseListener.java
@@ -0,0 +1,97 @@
+package org.freeplane.core.ui;
+
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+
+import javax.swing.Timer;
+
+
+
+public class DelayedMouseListener implements IMouseListener {
+ final private IMouseListener delegate;
+ public IMouseListener getDelegate() {
+ return delegate;
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ delegate.mouseDragged(e);
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ delegate.mouseMoved(e);
+ }
+
+ final private int button;
+ private int clickCounter = 0;
+ private Timer timer = null;
+ static final private int MAX_TIME_BETWEEN_CLICKS;
+ static{
+ final Object p = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
+ MAX_TIME_BETWEEN_CLICKS = p instanceof Integer ? (Integer) p : 250;
+ }
+ private int maxClickNumber;
+
+
+ public int getMaxClickNumber() {
+ return maxClickNumber;
+ }
+
+ public void setMaxClickNumber(int maxClickNumber) {
+ this.maxClickNumber = maxClickNumber;
+ }
+
+ public void mouseClicked(final MouseEvent me) {
+ if(me.getButton() != button){
+ delegate.mouseClicked(me);
+ return;
+ }
+ if(timer != null){
+ timer.stop();
+ timer = null;
+ clickCounter++;
+ }
+ else{
+ clickCounter = 1;
+ }
+ if(clickCounter == maxClickNumber){
+ delegate.mouseClicked(me);
+ delegate.mouseReleased(me);
+ return;
+ }
+ timer = new Timer(MAX_TIME_BETWEEN_CLICKS, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final MouseEvent newMouseEvent = new MouseEvent(me.getComponent(),me.getID(), e.getWhen(), me.getModifiers(), me.getX(), me.getY(), clickCounter, me.isPopupTrigger(), button);
+ delegate.mouseClicked(newMouseEvent);
+ timer = null;
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+// me.consume();
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ delegate.mouseEntered(e);
+ }
+
+ public void mouseExited(MouseEvent e) {
+ delegate.mouseExited(e);
+ }
+
+ public void mousePressed(MouseEvent e) {
+ delegate.mousePressed(e);
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ delegate.mouseReleased(e);
+ }
+
+ public DelayedMouseListener(IMouseListener delegate, int maxClickNumber, int button) {
+ super();
+ this.delegate = delegate;
+ this.maxClickNumber = maxClickNumber;
+ this.button = button;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/DoubleClickTimer.java b/freeplane/src/org/freeplane/core/ui/DoubleClickTimer.java
new file mode 100644
index 0000000..24ada89
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/DoubleClickTimer.java
@@ -0,0 +1,53 @@
+package org.freeplane.core.ui;
+
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Timer;
+
+public class DoubleClickTimer{
+ static final public int MAX_TIME_BETWEEN_CLICKS;
+ static {
+ final Object p = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
+ MAX_TIME_BETWEEN_CLICKS = p instanceof Integer ? (Integer) p : 250;
+ }
+ private Timer timer;
+ private int delay;
+ public int getDelay() {
+ return delay;
+ }
+
+ public void setDelay(int delay) {
+ this.delay = delay;
+ }
+
+ public DoubleClickTimer() {
+ }
+
+ public void start(final Runnable runnable){
+ if(runnable == null)
+ return;
+ cancel();
+ if(delay == 0){
+ runnable.run();
+ return;
+ }
+ timer = new Timer(delay, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ timer = null;
+ runnable.run();
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+ }
+
+ public void cancel() {
+ if (timer != null){
+ timer.stop();
+ timer = null;
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/EnabledAction.java b/freeplane/src/org/freeplane/core/ui/EnabledAction.java
new file mode 100644
index 0000000..d22cc92
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/EnabledAction.java
@@ -0,0 +1,32 @@
+/*
+ * 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.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface EnabledAction {
+ static final String SELECTION_PROPERTY = "enabled";
+
+ boolean checkOnNodeChange() default false;
+
+ boolean checkOnPopup() default false;
+}
diff --git a/freeplane/src/org/freeplane/core/ui/ExampleFileFilter.java b/freeplane/src/org/freeplane/core/ui/ExampleFileFilter.java
new file mode 100644
index 0000000..e915677
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/ExampleFileFilter.java
@@ -0,0 +1,237 @@
+/*
+ * 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/>.
+ */
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. 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. -Redistribution in binary form must reproduct
+ * 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software is provided
+ * "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS,
+ * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
+ * HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR
+ * LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR RELATING TO USE,
+ * MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT
+ * WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
+ * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
+ * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE
+ * USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES. You acknowledge that Software is not designed,
+ * licensed or intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ */
+/*
+ * @(#)ExampleFileFilter.java 1.14 03/01/23
+ */
+package org.freeplane.core.ui;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * A convenience implementation of FileFilter that filters out all files except
+ * for those type extensions that it knows about. Extensions are of the type
+ * ".foo", which is typically found on Windows and Unix boxes, but not on
+ * Macinthosh. Case is ignored. Example - create a new filter that filerts out
+ * all files but gif and jpg image files: JFileChooser chooser = new
+ * JFileChooser(); ExampleFileFilter filter = new ExampleFileFilter( new
+ * String{"gif", "jpg"}, "JPEG & GIF Images")
+ * chooser.addChoosableFileFilter(filter); chooser.showOpenDialog(this);
+ *
+ * @version 1.14 01/23/03
+ * @author Jeff Dinkins
+ */
+public class ExampleFileFilter extends FileFilter {
+ private String description = null;
+ private Hashtable<String, FileFilter> filters = null;
+ private String fullDescription = null;
+ private String mainExtension = null;
+ private boolean useExtensionsInDescription = true;
+
+ /**
+ * Creates a file filter. If no filters are added, then all files are
+ * accepted.
+ */
+ public ExampleFileFilter() {
+ filters = new Hashtable<String, FileFilter>();
+ }
+
+ /**
+ * Creates a file filter that accepts files with the given extension.
+ * Example: new ExampleFileFilter("jpg");
+ */
+ public ExampleFileFilter(final String extension) {
+ this(extension, null);
+ }
+
+ /**
+ * Creates a file filter that accepts the given file type. Example: new
+ * ExampleFileFilter("jpg", "JPEG Image Images"); Note that the "." before
+ * the extension is not needed. If provided, it will be ignored.
+ */
+ public ExampleFileFilter(final String extension, final String description) {
+ this();
+ if (extension != null) {
+ addExtension(extension);
+ }
+ if (description != null) {
+ setDescription(description);
+ }
+ }
+
+ /**
+ * Creates a file filter from the given string array. Example: new
+ * ExampleFileFilter(String {"gif", "jpg"}); Note that the "." before the
+ * extension is not needed adn will be ignored.
+ */
+ public ExampleFileFilter(final String[] filters) {
+ this(filters, null);
+ }
+
+ /**
+ * Creates a file filter from the given string array and description.
+ * Example: new ExampleFileFilter(String {"gif", "jpg"},
+ * "Gif and JPG Images"); Note that the "." before the extension is not
+ * needed and will be ignored.
+ */
+ public ExampleFileFilter(final String[] filters, final String description) {
+ this();
+ for (int i = 0; i < filters.length; i++) {
+ addExtension(filters[i]);
+ }
+ if (description != null) {
+ setDescription(description);
+ }
+ }
+
+ /**
+ * Return true if this file should be shown in the directory pane, false if
+ * it shouldn't. Files that begin with "." are ignored.
+ */
+ @Override
+ public boolean accept(final File f) {
+ if (f != null) {
+ if (f.isDirectory()) {
+ return true;
+ }
+ final String extension = getExtension(f);
+ if (extension != null && filters.get(getExtension(f)) != null) {
+ return true;
+ };
+ }
+ return false;
+ }
+
+ /**
+ * Adds a filetype "dot" extension to filter against. For example: the
+ * following code will create a filter that filters out all files except
+ * those that end in ".jpg" and ".tif": ExampleFileFilter filter = new
+ * ExampleFileFilter(); filter.addExtension("jpg");
+ * filter.addExtension("tif"); Note that the "." before the extension is not
+ * needed and will be ignored.
+ */
+ public void addExtension(final String extension) {
+ if (filters == null) {
+ filters = new Hashtable<String, FileFilter>(5);
+ }
+ if (mainExtension == null) {
+ mainExtension = extension;
+ }
+ filters.put(extension.toLowerCase(), this);
+ fullDescription = null;
+ }
+
+ /**
+ * Returns the human readable description of this filter. For example:
+ * "JPEG and GIF Image Files (*.jpg, *.gif)"
+ */
+ @Override
+ public String getDescription() {
+ if (fullDescription == null) {
+ if (description == null || isExtensionListInDescription()) {
+ fullDescription = description == null ? "(" : description + " (";
+ final Enumeration<String> extensions = filters.keys();
+ if (extensions != null) {
+ fullDescription += "." + extensions.nextElement();
+ while (extensions.hasMoreElements()) {
+ fullDescription += ", ." + extensions.nextElement();
+ }
+ }
+ fullDescription += ")";
+ }
+ else {
+ fullDescription = description;
+ }
+ }
+ return fullDescription;
+ }
+
+ /**
+ * Return the extension portion of the file's name .
+ */
+ private String getExtension(final File f) {
+ if (f != null) {
+ final String filename = f.getName();
+ final int i = filename.lastIndexOf('.');
+ if (i > 0 && i < filename.length() - 1) {
+ return filename.substring(i + 1).toLowerCase();
+ };
+ }
+ return null;
+ }
+
+ public String getExtensionProposal() {
+ return mainExtension;
+ }
+
+ /**
+ * Returns whether the extension list (.jpg, .gif, etc) should show up in
+ * the human readable description. Only relevent if a description was
+ * provided in the constructor or using setDescription();
+ */
+ public boolean isExtensionListInDescription() {
+ return useExtensionsInDescription;
+ }
+
+ /**
+ * Sets the human readable description of this filter. For example:
+ * filter.setDescription("Gif and JPG Images");
+ */
+ public void setDescription(final String description) {
+ this.description = description;
+ fullDescription = null;
+ }
+
+ /**
+ * Determines whether the extension list (.jpg, .gif, etc) should show up in
+ * the human readable description. Only relevent if a description was
+ * provided in the constructor or using setDescription();
+ */
+ public void setExtensionListInDescription(final boolean b) {
+ useExtensionsInDescription = b;
+ fullDescription = null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/FixedBasicComboBoxEditor.java b/freeplane/src/org/freeplane/core/ui/FixedBasicComboBoxEditor.java
new file mode 100644
index 0000000..44581f2
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/FixedBasicComboBoxEditor.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry Polivaev
+ *
+ * This file's 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.core.ui;
+
+import javax.swing.BorderFactory;
+import javax.swing.border.EmptyBorder;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+
+/**
+ * This class fixes a problem with BasicComboBoxEditor (too few left padding
+ * in the embedded JTextField => first character is half-way outside text field)
+ *
+ * @author Felix Natter
+ *
+ */
+public class FixedBasicComboBoxEditor extends BasicComboBoxEditor {
+ public FixedBasicComboBoxEditor()
+ {
+ // don't change the background color to grey, it would be harder to use :-(
+ //Color c = UIManager.getLookAndFeelDefaults().getColor("ComboBox.background");
+ //editor.setBackground(new Color(c.getRed(), c.getGreen(), c.getBlue()));
+
+ // add left padding to the embedded JTextField:
+ // this border-hack was proposed by John B. Matthews on comp.lang.java.gui
+ editor.setBorder(BorderFactory.createCompoundBorder(
+ editor.getBorder(), new EmptyBorder(0, 4, 0, 0)));
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java b/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java
new file mode 100644
index 0000000..7cc04df
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java
@@ -0,0 +1,31 @@
+/*
+ * 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/IEditHandler.java b/freeplane/src/org/freeplane/core/ui/IEditHandler.java
new file mode 100644
index 0000000..3fe01fc
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IEditHandler.java
@@ -0,0 +1,28 @@
+/*
+ * 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.core.ui;
+
+import java.awt.event.KeyEvent;
+
+public interface IEditHandler {
+ public enum FirstAction{EDIT_CURRENT, ADD_SIBLING, ADD_CHILD, IGNORE}
+ void edit(KeyEvent e, FirstAction keyTypeAction, boolean editLong);
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IFreeplaneAction.java b/freeplane/src/org/freeplane/core/ui/IFreeplaneAction.java
new file mode 100644
index 0000000..b1aadf0
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IFreeplaneAction.java
@@ -0,0 +1,37 @@
+/*
+ * 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.Action;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.07.2009
+ */
+public interface IFreeplaneAction extends Action {
+ public void afterMapChange(Object newMap);
+
+ public boolean isSelected();
+
+ public void setSelected(boolean b);
+
+ public String getIconKey();
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IMenuContributor.java b/freeplane/src/org/freeplane/core/ui/IMenuContributor.java
new file mode 100644
index 0000000..6c486bc
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IMenuContributor.java
@@ -0,0 +1,26 @@
+/*
+ * 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/IMenuItemEnabledListener.java b/freeplane/src/org/freeplane/core/ui/IMenuItemEnabledListener.java
new file mode 100644
index 0000000..6fa6f42
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IMenuItemEnabledListener.java
@@ -0,0 +1,29 @@
+/*
+ * 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 javax.swing.Action;
+import javax.swing.JMenuItem;
+
+/** @deprecated */
+ at Deprecated
+public interface IMenuItemEnabledListener {
+ boolean isEnabled(JMenuItem pItem, Action pAction);
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IMouseListener.java b/freeplane/src/org/freeplane/core/ui/IMouseListener.java
new file mode 100644
index 0000000..e4bea65
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IMouseListener.java
@@ -0,0 +1,26 @@
+/*
+ * 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.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+public interface IMouseListener extends MouseMotionListener, MouseListener {
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IMouseWheelEventHandler.java b/freeplane/src/org/freeplane/core/ui/IMouseWheelEventHandler.java
new file mode 100644
index 0000000..59b34cc
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IMouseWheelEventHandler.java
@@ -0,0 +1,30 @@
+/*
+ * 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.event.MouseWheelEvent;
+
+public interface IMouseWheelEventHandler {
+ /**
+ * @return true if the event was sucessfully processed and false if the
+ * event did not apply.
+ */
+ boolean handleMouseWheelEvent(MouseWheelEvent e);
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.java b/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.java
new file mode 100644
index 0000000..f0a6f9a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.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.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
new file mode 100644
index 0000000..6cf2a94
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/IndexedTree.java
@@ -0,0 +1,251 @@
+/*
+ * 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/KeyAlreadyUsedException.java b/freeplane/src/org/freeplane/core/ui/KeyAlreadyUsedException.java
new file mode 100644
index 0000000..0c13522
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/KeyAlreadyUsedException.java
@@ -0,0 +1,12 @@
+package org.freeplane.core.ui;
+
+public class KeyAlreadyUsedException extends RuntimeException {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public KeyAlreadyUsedException(final String message) {
+ super(message);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/MenuBuilder.java b/freeplane/src/org/freeplane/core/ui/MenuBuilder.java
new file mode 100644
index 0000000..8997cec
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/MenuBuilder.java
@@ -0,0 +1,969 @@
+/*
+ * 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.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 final String EXTRA_SUBMENU = MenuBuilder.class.getName()+".extra_submenu";
+ private static final int MAX_MENU_ITEM_COUNT = ResourceController.getResourceController().getIntProperty("max_menu_item_count");
+ 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;
+
+ 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 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 (action instanceof PopupMenuListener) {
+ addPopupMenuListener(key, (PopupMenuListener) action);
+ }
+ if (AFreeplaneAction.checkEnabledOnPopup(action)) {
+ addPopupMenuListener(key, new PopupMenuListener() {
+ public void popupMenuCanceled(final PopupMenuEvent e) {
+ }
+
+ public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
+ }
+
+ public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
+ action.setEnabled();
+ }
+ });
+ }
+ 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) {
+ final JMenu menu = (JMenu) container;
+ final JPopupMenu popupMenu = menu.getPopupMenu();
+ final int itemCount = popupMenu.getComponentCount();
+ if(itemCount < MAX_MENU_ITEM_COUNT || index < itemCount)
+ popupMenu.insert(component, index);
+ else{
+ final JMenu submenu;
+ final Component lastMenuItem = popupMenu.getComponent(itemCount - 1);
+ if(itemCount == MAX_MENU_ITEM_COUNT || ! isExtraSubMenu(lastMenuItem)){
+ if (component instanceof JPopupMenu.Separator)
+ return;
+ submenu = new JMenu("");
+ submenu.putClientProperty(EXTRA_SUBMENU, Boolean.TRUE);
+ popupMenu.add(submenu);
+ }
+ else{
+ submenu = (JMenu) lastMenuItem;
+ }
+ addComponent(submenu, component, submenu.getPopupMenu().getComponentCount());
+ }
+ return;
+ }
+ if (container instanceof JToolBar && component instanceof AbstractButton) {
+ {
+ ((AbstractButton) component).setMargin(MenuBuilder.nullInsets);
+ }
+ }
+ super.addComponent(container, component, index);
+ }
+
+ private boolean isExtraSubMenu(final Component c) {
+ return (c instanceof JMenu) && (Boolean.TRUE.equals(((JMenu)c).getClientProperty(EXTRA_SUBMENU)));
+ }
+
+ 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)
+ {
+ final Component lastComponent = parentComponent.getComponent(parentComponent.getComponentCount()-1);
+ if(isExtraSubMenu(lastComponent))
+ return (Container) lastComponent;
+ }
+ 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);
+ }
+
+ 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(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/SelectableAction.java b/freeplane/src/org/freeplane/core/ui/SelectableAction.java
new file mode 100644
index 0000000..60af215
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/SelectableAction.java
@@ -0,0 +1,34 @@
+/*
+ * 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.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface SelectableAction {
+ static final String SELECTION_PROPERTY = "selected";
+
+ boolean checkOnNodeChange() default false;
+
+ boolean checkOnPopup() default false;
+
+ String checkOnPropertyChange() default "";
+}
diff --git a/freeplane/src/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java b/freeplane/src/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java
new file mode 100644
index 0000000..05334ae
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java
@@ -0,0 +1,26 @@
+package org.freeplane.core.ui;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.KeyStroke;
+
+public class SetAcceleratorOnNextClickAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private KeyStroke accelerator;
+
+ public SetAcceleratorOnNextClickAction(final KeyStroke accelerator) {
+ super("SetAcceleratorOnNextClickAction");
+ this.accelerator = accelerator;
+ }
+
+ public SetAcceleratorOnNextClickAction() {
+ this(null);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ AccelerateableAction.setNewAcceleratorOnNextClick(accelerator);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java b/freeplane/src/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java
new file mode 100644
index 0000000..1703168
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/ShowSelectionAsRectangleAction.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.core.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.resources.ResourceController;
+
+ at SelectableAction(checkOnPopup = true)
+public class ShowSelectionAsRectangleAction extends AFreeplaneAction {
+ static final String NAME = "showSelectionAsRectangle";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public ShowSelectionAsRectangleAction() {
+ super("ShowSelectionAsRectangleAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ toggleSelectionAsRectangle();
+ }
+
+ private void toggleSelectionAsRectangle() {
+ ResourceController.getResourceController().setProperty(
+ ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION, Boolean.toString(!isSelectionAsRectangle()));
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isSelectionAsRectangle());
+ }
+
+ private boolean isSelectionAsRectangle() {
+ return Boolean.parseBoolean(ResourceController.getResourceController().getProperty(
+ ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION));
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/UIBuilder.java b/freeplane/src/org/freeplane/core/ui/UIBuilder.java
new file mode 100644
index 0000000..410539b
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/UIBuilder.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.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
new file mode 100644
index 0000000..9309a3e
--- /dev/null
+++ b/freeplane/src/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;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/AutoHide.java b/freeplane/src/org/freeplane/core/ui/components/AutoHide.java
new file mode 100644
index 0000000..f982fec
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/AutoHide.java
@@ -0,0 +1,49 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JComponent;
+import javax.swing.Timer;
+
+public class AutoHide {
+ private static final int DELAY = 500;
+ final Timer timer;
+ final JComponent popup;
+
+ public static void start(JComponent popup){
+ new AutoHide(popup);
+ }
+
+ private AutoHide(JComponent popup) {
+ super();
+ this.popup = popup;
+ this.timer = new Timer(DELAY, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ tryToClosePopup();
+ }
+ });
+ timer.setRepeats(true);
+ popup.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ AutoHide.this.popup.removeMouseListener(this);
+ timer.start();
+ }
+
+ });
+ }
+ protected void tryToClosePopup() {
+ if(popup.isVisible()) {
+ if (popup.getMousePosition(true) == null) {
+ popup.setVisible(false);
+ timer.stop();
+ }
+ }
+ else
+ timer.stop();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java b/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java
new file mode 100644
index 0000000..a4a45c8
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java
@@ -0,0 +1,104 @@
+/*
+ * 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
new file mode 100644
index 0000000..fa9e2f4
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/BitmapViewerComponent.java
@@ -0,0 +1,255 @@
+/*
+ * 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 = (ImageReader) 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 void writeCacheFile() {
+ File tempDir = new File (System.getProperty("java.io.tmpdir"), "freeplane");
+ tempDir.mkdirs();
+ try {
+ 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/BlindIcon.java b/freeplane/src/org/freeplane/core/ui/components/BlindIcon.java
new file mode 100644
index 0000000..d6730d7
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/BlindIcon.java
@@ -0,0 +1,58 @@
+/*
+ * 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.Component;
+import java.awt.Graphics;
+
+import javax.swing.Icon;
+
+/**
+ * @author foltin
+ */
+public class BlindIcon implements Icon {
+ final private int length;
+
+ public BlindIcon(final int length) {
+ this.length = length;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.Icon#getIconHeight()
+ */
+ public int getIconHeight() {
+ return length;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.Icon#getIconWidth()
+ */
+ public int getIconWidth() {
+ return length;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics,
+ * int, int)
+ */
+ public void paintIcon(final Component arg0, final Graphics arg1, final int arg2, final int arg3) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ContainerComboBoxEditor.java b/freeplane/src/org/freeplane/core/ui/components/ContainerComboBoxEditor.java
new file mode 100644
index 0000000..e72fead
--- /dev/null
+++ b/freeplane/src/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.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/EnterPasswordDialog.java b/freeplane/src/org/freeplane/core/ui/components/EnterPasswordDialog.java
new file mode 100644
index 0000000..b6033e3
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/EnterPasswordDialog.java
@@ -0,0 +1,281 @@
+/*
+ * 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.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPasswordField;
+import javax.swing.WindowConstants;
+
+import org.freeplane.core.util.TextUtils;
+
+/** */
+public class EnterPasswordDialog extends JDialog {
+ public static final int CANCEL = -1;
+ public static final int OK = 1;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean enterTwoPasswords = true;
+ private JButton jCancelButton = null;
+ private javax.swing.JPanel jContentPane = null;
+ private JLabel jLabel = null;
+ private JLabel jLabel1 = null;
+ private JLabel jLabel2 = null;
+ private JButton jOKButton = null;
+ private JPasswordField jPasswordField = null;
+ private JPasswordField jPasswordField1 = null;
+ private StringBuilder password = null;
+ private int result = EnterPasswordDialog.CANCEL;
+
+ /**
+ * @deprecated do not use. This is for visual editor only.
+ */
+ @Deprecated
+ public EnterPasswordDialog() {
+ }
+
+ /**
+ * This is the default constructor
+ */
+ public EnterPasswordDialog(final Frame frame, final boolean enterTwoPasswords) {
+ super(frame, "", true /* =modal */);
+ this.enterTwoPasswords = enterTwoPasswords;
+ initialize();
+ }
+
+ private void cancelPressed() {
+ password = null;
+ result = EnterPasswordDialog.CANCEL;
+ close();
+ }
+
+ /**
+ */
+ private boolean checkEqualAndMinimumSize() {
+ final char[] a1 = jPasswordField.getPassword();
+ if (a1.length < 2) {
+ return false;
+ }
+ if (enterTwoPasswords) {
+ final char[] a2 = jPasswordField1.getPassword();
+ if (a1.length != a2.length) {
+ return false;
+ }
+ for (int i = 0; i < a1.length; i++) {
+ if (a1[i] != a2[i]) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private void close() {
+ this.dispose();
+ }
+
+ /**
+ * This method initializes jButton1
+ *
+ * @return javax.swing.JButton
+ */
+ private JButton getJCancelButton() {
+ if (jCancelButton == null) {
+ jCancelButton = new JButton();
+ jCancelButton.setAction(new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ cancelPressed();
+ }
+ });
+ jCancelButton.setText(TextUtils.getText("accessories/plugins/EncryptNode.properties_7"));
+ }
+ return jCancelButton;
+ }
+
+ /**
+ * This method initializes jContentPane
+ *
+ * @return javax.swing.JPanel
+ */
+ private javax.swing.JPanel getJContentPane() {
+ if (jContentPane == null) {
+ jLabel2 = new JLabel();
+ jLabel1 = new JLabel();
+ jLabel = new JLabel();
+ final GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
+ final GridBagConstraints gridBagConstraints7 = new GridBagConstraints();
+ jContentPane = new javax.swing.JPanel();
+ jContentPane.setLayout(new GridBagLayout());
+ gridBagConstraints1.gridx = 0;
+ gridBagConstraints1.gridy = 1;
+ gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ jLabel.setText(TextUtils.getText("accessories/plugins/EncryptNode.properties_2"));
+ gridBagConstraints2.gridx = 0;
+ gridBagConstraints2.gridy = 2;
+ gridBagConstraints2.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ jLabel1.setText(TextUtils.getText("accessories/plugins/EncryptNode.properties_3"));
+ gridBagConstraints3.gridx = 1;
+ gridBagConstraints3.gridy = 1;
+ gridBagConstraints3.weightx = 1.0;
+ gridBagConstraints3.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints4.gridx = 1;
+ gridBagConstraints4.gridy = 2;
+ gridBagConstraints4.weightx = 1.0;
+ gridBagConstraints4.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints5.gridx = 0;
+ gridBagConstraints5.gridy = 0;
+ gridBagConstraints5.gridwidth = 2;
+ gridBagConstraints5.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints5.anchor = java.awt.GridBagConstraints.CENTER;
+ gridBagConstraints5.insets = new java.awt.Insets(0, 0, 20, 0);
+ jLabel2.setText(TextUtils.getText("accessories/plugins/EncryptNode.properties_4"));
+ jLabel2.setToolTipText(TextUtils.getText("accessories/plugins/EncryptNode.properties_5"));
+ gridBagConstraints6.gridx = 0;
+ gridBagConstraints6.gridy = 3;
+ gridBagConstraints6.insets = new java.awt.Insets(20, 0, 0, 0);
+ gridBagConstraints7.gridx = 1;
+ gridBagConstraints7.gridy = 3;
+ gridBagConstraints7.insets = new java.awt.Insets(20, 0, 0, 0);
+ jContentPane.add(jLabel, gridBagConstraints1);
+ jContentPane.add(getJPasswordField(), gridBagConstraints3);
+ jContentPane.add(jLabel2, gridBagConstraints5);
+ if (enterTwoPasswords) {
+ jContentPane.add(getJPasswordField1(), gridBagConstraints4);
+ jContentPane.add(jLabel1, gridBagConstraints2);
+ }
+ jContentPane.add(getJOKButton(), gridBagConstraints6);
+ jContentPane.add(getJCancelButton(), gridBagConstraints7);
+ getRootPane().setDefaultButton(getJOKButton());
+ }
+ return jContentPane;
+ }
+
+ /**
+ * This method initializes jButton
+ *
+ * @return javax.swing.JButton
+ */
+ private JButton getJOKButton() {
+ if (jOKButton == null) {
+ jOKButton = new JButton();
+ jOKButton.setAction(new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ okPressed();
+ }
+ });
+ jOKButton.setText(TextUtils.getText("accessories/plugins/EncryptNode.properties_6"));
+ }
+ return jOKButton;
+ }
+
+ /**
+ * This method initializes jPasswordField
+ *
+ * @return javax.swing.JPasswordField
+ */
+ private JPasswordField getJPasswordField() {
+ if (jPasswordField == null) {
+ jPasswordField = new JPasswordField();
+ }
+ return jPasswordField;
+ }
+
+ /**
+ * This method initializes jPasswordField1
+ *
+ * @return javax.swing.JPasswordField
+ */
+ private JPasswordField getJPasswordField1() {
+ if (jPasswordField1 == null) {
+ jPasswordField1 = new JPasswordField();
+ }
+ return jPasswordField1;
+ }
+
+ /**
+ * @return Returns the password.
+ */
+ public StringBuilder getPassword() {
+ return password;
+ }
+
+ /**
+ * @return Returns the result.
+ */
+ public int getResult() {
+ return result;
+ }
+
+ /**
+ * This method initializes this
+ *
+ * @return void
+ */
+ private void initialize() {
+ this.setTitle(TextUtils.getText("accessories/plugins/EncryptNode.properties_0"));
+ this.setSize(300, 200);
+ this.setContentPane(getJContentPane());
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent we) {
+ cancelPressed();
+ }
+ });
+ }
+
+ private void okPressed() {
+ if (!checkEqualAndMinimumSize()) {
+ JOptionPane.showMessageDialog(this, TextUtils.getText("accessories/plugins/EncryptNode.properties_1"));
+ return;
+ }
+ password = new StringBuilder();
+ password.append(jPasswordField.getPassword());
+ result = EnterPasswordDialog.OK;
+ close();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java b/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java
new file mode 100644
index 0000000..7b43594
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java
@@ -0,0 +1,360 @@
+/*
+ * 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
new file mode 100644
index 0000000..f465ee6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/FreeplaneMenuBar.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.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/FreeplaneToolBar.java b/freeplane/src/org/freeplane/core/ui/components/FreeplaneToolBar.java
new file mode 100644
index 0000000..7ada8a7
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/FreeplaneToolBar.java
@@ -0,0 +1,134 @@
+/*
+ * 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.Dimension;
+import java.awt.Insets;
+import java.awt.LayoutManager;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+
+import javax.swing.AbstractButton;
+import javax.swing.Action;
+import javax.swing.JToolBar;
+
+/**
+ * @author Stefan Zechmeister
+ */
+public class FreeplaneToolBar extends JToolBar {
+ protected static Insets nullInsets = new Insets(0, 0, 0, 0);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public FreeplaneToolBar(final String name, final int orientation) {
+ super(name, orientation);
+ this.setMargin(FreeplaneToolBar.nullInsets);
+ setFloatable(false);
+ setRollover(true);
+ if (orientation == HORIZONTAL) {
+ super.setLayout(ToolbarLayout.getInstance());
+ addHierarchyBoundsListener(new HierarchyBoundsListener() {
+ public void ancestorResized(final HierarchyEvent e) {
+ revalidate();
+ repaint();
+ }
+
+ public void ancestorMoved(final HierarchyEvent e) {
+ }
+ });
+ }
+ }
+
+
+
+ @Override
+ public void setLayout(LayoutManager mgr) {
+ if (getOrientation() != HORIZONTAL)
+ super.setLayout(mgr);
+ }
+
+
+
+ @Override
+ public Component add(final Component comp) {
+ super.add(comp);
+ configureComponent(comp);
+ return comp;
+ }
+
+ @Override
+ public Component add(final Component comp, final int index) {
+ super.add(comp, index);
+ configureComponent(comp);
+ return comp;
+ }
+
+ @Override
+ public void add(final Component comp, final Object constraints) {
+ super.add(comp, constraints);
+ configureComponent(comp);
+ }
+
+ @Override
+ public void add(final Component comp, final Object constraints, final int index) {
+ super.add(comp, constraints, index);
+ configureComponent(comp);
+ }
+
+ @Override
+ public Component add(final String name, final Component comp) {
+ super.add(name, comp);
+ configureComponent(comp);
+ return comp;
+ }
+
+ 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(FreeplaneToolBar.nullInsets);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/IKeyBindingManager.java b/freeplane/src/org/freeplane/core/ui/components/IKeyBindingManager.java
new file mode 100644
index 0000000..a821118
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/IKeyBindingManager.java
@@ -0,0 +1,5 @@
+package org.freeplane.core.ui.components;
+
+public interface IKeyBindingManager {
+ public boolean isKeyBindingProcessed();
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/IconSelectionPopupDialog.java b/freeplane/src/org/freeplane/core/ui/components/IconSelectionPopupDialog.java
new file mode 100644
index 0000000..1c896b8
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..341d919
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java
@@ -0,0 +1,89 @@
+/*
+ * 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
new file mode 100644
index 0000000..9f69dfe
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java
@@ -0,0 +1,89 @@
+/*
+ * 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/JAutoScrollBarPane.java b/freeplane/src/org/freeplane/core/ui/components/JAutoScrollBarPane.java
new file mode 100644
index 0000000..25cbe1b
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JAutoScrollBarPane.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.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Insets;
+
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class JAutoScrollBarPane extends JScrollPane {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public JAutoScrollBarPane(final Component view) {
+ super(view, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+ }
+
+ @Override
+ public void doLayout() {
+ super.doLayout();
+ final Insets insets = getInsets();
+ final int insetHeight = insets.top + insets.bottom;
+ final Dimension prefSize = getViewport().getPreferredSize();
+ int height = getHeight() - insetHeight;
+ if (getHorizontalScrollBar().isVisible()) {
+ height -= getHorizontalScrollBar().getHeight();
+ }
+ final boolean isVsbNeeded = height < prefSize.height;
+ boolean layoutAgain = false;
+ if (isVsbNeeded && getVerticalScrollBarPolicy() == ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER) {
+ setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+ layoutAgain = true;
+ }
+ else if (!isVsbNeeded && getVerticalScrollBarPolicy() == ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) {
+ setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
+ layoutAgain = true;
+ }
+ if (layoutAgain) {
+ super.doLayout();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ ((JComponent) getParent()).revalidate();
+ }
+ });
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#getPreferredSize()
+ */
+ @Override
+ public Dimension getPreferredSize() {
+ if (!isValid()) {
+ doLayout();
+ }
+ return super.getPreferredSize();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JAutoToggleButton.java b/freeplane/src/org/freeplane/core/ui/components/JAutoToggleButton.java
new file mode 100644
index 0000000..88af3b5
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JAutoToggleButton.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.core.ui.components;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.Action;
+import javax.swing.ButtonModel;
+import javax.swing.JToggleButton;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.IFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+public class JAutoToggleButton extends JToggleButton implements PropertyChangeListener, ChangeListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private PropertyChangeListener defaultPropertyChanegListener;
+
+ public JAutoToggleButton(final Action a) {
+ super(a);
+ }
+
+ public JAutoToggleButton(final IFreeplaneAction a, final ButtonModel model) {
+ super(a);
+ model.addChangeListener(this);
+ if (a.isSelected()) {
+ setSelected(true);
+ }
+ }
+
+ @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);
+ }
+ }
+
+ public void stateChanged(final ChangeEvent e) {
+ setSelected(((ButtonModel) e.getSource()).isSelected());
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JFreeplaneMenuItem.java b/freeplane/src/org/freeplane/core/ui/components/JFreeplaneMenuItem.java
new file mode 100644
index 0000000..b4fddd8
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JFreeplaneMenuItem.java
@@ -0,0 +1,55 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+public class JFreeplaneMenuItem extends JMenuItem implements IKeyBindingManager {
+ public JFreeplaneMenuItem() {
+ super();
+ }
+
+ public JFreeplaneMenuItem(final Action a) {
+ super(a);
+ }
+
+ public JFreeplaneMenuItem(final Icon icon) {
+ super(icon);
+ }
+
+ public JFreeplaneMenuItem(final String text, final Icon icon) {
+ super(text, icon);
+ }
+
+ public JFreeplaneMenuItem(final String text, final int mnemonic) {
+ super(text, mnemonic);
+ }
+
+ public JFreeplaneMenuItem(final String text) {
+ super(text);
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ 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
new file mode 100644
index 0000000..0d4f469
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JResizer.java
@@ -0,0 +1,141 @@
+/*
+ * 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.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
+
+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}
+
+ 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(size);
+ parent.revalidate();
+ parent.repaint();
+ }
+ else{
+ index = getIndex();
+ }
+ point = point2;
+ }
+ });
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java b/freeplane/src/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java
new file mode 100644
index 0000000..758864d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java
@@ -0,0 +1,34 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import javax.swing.JScrollPane;
+
+ at SuppressWarnings("serial")
+public class JRestrictedSizeScrollPane extends JScrollPane {
+
+ public JRestrictedSizeScrollPane(Component view) {
+ super(view);
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension preferredSize = super.getPreferredSize();
+ if(isPreferredSizeSet() || ! (isMaximumSizeSet() || isMinimumSizeSet())){
+ return preferredSize;
+ }
+ if(isMinimumSizeSet()){
+ final Dimension minimumSize = getMinimumSize();
+ preferredSize.width = Math.max(minimumSize.width, preferredSize.width);
+ preferredSize.height = Math.max(minimumSize.height, preferredSize.height);
+ }
+ if(isMaximumSizeSet()){
+ final Dimension maximumSize = getMaximumSize();
+ preferredSize.width = Math.min(maximumSize.width, preferredSize.width);
+ preferredSize.height = Math.min(maximumSize.height, preferredSize.height);
+ }
+ return preferredSize;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/MultipleImage.java b/freeplane/src/org/freeplane/core/ui/components/MultipleImage.java
new file mode 100644
index 0000000..1ab7ea6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/MultipleImage.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.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Icon;
+
+public class MultipleImage implements Icon {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ 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();
+ }
+ }
+};
diff --git a/freeplane/src/org/freeplane/core/ui/components/ObjectAndIcon.java b/freeplane/src/org/freeplane/core/ui/components/ObjectAndIcon.java
new file mode 100644
index 0000000..118c221
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/ObjectAndIcon.java
@@ -0,0 +1,46 @@
+/*
+ * 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 javax.swing.Icon;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 17, 2011
+ */
+public class ObjectAndIcon {
+ final Object object;
+ final Icon icon;
+ public ObjectAndIcon(Object object, Icon icon) {
+ super();
+ this.object = object;
+ this.icon = icon;
+ }
+ @Override
+ public String toString() {
+ return object.toString();
+ }
+ public Object getObject() {
+ return object;
+ }
+ public Icon getIcon() {
+ return icon;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java b/freeplane/src/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java
new file mode 100644
index 0000000..9e4ea73
--- /dev/null
+++ b/freeplane/src/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.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/PersistentEditableComboBox.java b/freeplane/src/org/freeplane/core/ui/components/PersistentEditableComboBox.java
new file mode 100644
index 0000000..9ae1226
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/PersistentEditableComboBox.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.core.ui.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+
+import org.freeplane.core.resources.ResourceController;
+
+public class PersistentEditableComboBox extends JComboBox {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ActionListener actionListener = null;
+ final private String pStorageKey;
+ private boolean sendExternalEvents = true;
+
+ public PersistentEditableComboBox(final String storageKey, final int maximumRowCount) {
+ pStorageKey = storageKey;
+ setEditable(true);
+ setMaximumRowCount(maximumRowCount);
+ final String storedUrls = ResourceController.getResourceController().getProperty(pStorageKey);
+ if (storedUrls != null) {
+ final String[] array = storedUrls.split("\t");
+ for (int i = 0; i < array.length; i++) {
+ if (i == maximumRowCount) {
+ break;
+ }
+ final String string = array[i];
+ addUrl(string);
+ }
+ }
+ setSelectedItem("");
+ super.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ final String text = getText();
+ if (text == null) {
+ return;
+ }
+ addUrl(text);
+ if (sendExternalEvents && actionListener != null) {
+ actionListener.actionPerformed(arg0);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void addActionListener(final ActionListener arg0) {
+ actionListener = arg0;
+ }
+
+ private void addUrl(final String selectedItem) {
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) getModel();
+ for (int i = 0; i < model.getSize(); i++) {
+ final String element = (String) model.getElementAt(i);
+ if (element.equals(selectedItem)) {
+ model.removeElementAt(i);
+ break;
+ }
+ }
+ model.insertElementAt(selectedItem, 0);
+ setSelectedIndex(0);
+ final StringBuilder resultBuffer = new StringBuilder();
+ for (int i = 0; i < model.getSize(); i++) {
+ final String element = (String) model.getElementAt(i);
+ resultBuffer.append(element);
+ resultBuffer.append("\t");
+ }
+ ResourceController.getResourceController().setProperty(pStorageKey, resultBuffer.toString());
+ };
+
+ public String getText() {
+ final Object selectedItem = getSelectedItem();
+ return selectedItem == null ? null : selectedItem.toString();
+ }
+
+ public void setText(final String text) {
+ sendExternalEvents = false;
+ addUrl(text);
+ sendExternalEvents = true;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ToolbarLayout.java b/freeplane/src/org/freeplane/core/ui/components/ToolbarLayout.java
new file mode 100644
index 0000000..0d3e28f
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/ToolbarLayout.java
@@ -0,0 +1,110 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+import javax.swing.JToolBar.Separator;
+
+class ToolbarLayout implements LayoutManager {
+ private static final ToolbarLayout instance = new ToolbarLayout();
+
+ public void addLayoutComponent(final String name, final Component comp) {
+ }
+
+ public void layoutContainer(final Container container) {
+ if(! container.isVisible())
+ return;
+ final int maxWidth = container.getParent().getWidth();
+ int heigth = 0;
+ int blockWidth = 0;
+ int blockHeight = 0;
+ int lastBlockWidth = 0;
+ int lastBlockHeight = 0;
+ int lastBlockStart = 0;
+ int lastBlockFinish = 0;
+ for (int i = 0;; i++) {
+ final Component component = i < container.getComponentCount() ? container.getComponent(i) : null;
+ if (component == null || component instanceof Separator) {
+ if (i > container.getComponentCount() || lastBlockWidth + blockWidth > maxWidth) {
+ int x = 0;
+ for (int j = lastBlockStart; j < lastBlockFinish; j++) {
+ final Component c = container.getComponent(j);
+ final Dimension cPreferredSize = c.getPreferredSize();
+ c.setBounds(x, heigth, cPreferredSize.width, lastBlockHeight);
+ x += cPreferredSize.width;
+ }
+ heigth += lastBlockHeight;
+ lastBlockWidth = blockWidth;
+ lastBlockHeight = blockHeight;
+ lastBlockStart = lastBlockFinish;
+ }
+ else {
+ lastBlockWidth += blockWidth;
+ lastBlockHeight = Math.max(blockHeight, lastBlockHeight);
+ }
+ lastBlockFinish = i;
+ blockWidth = 0;
+ blockHeight = 0;
+ }
+ if (component == null) {
+ if (lastBlockStart == container.getComponentCount()) {
+ break;
+ }
+ lastBlockFinish = container.getComponentCount();
+ continue;
+ }
+ final Dimension compPreferredSize = component.getPreferredSize();
+ blockWidth += compPreferredSize.width;
+ blockHeight = Math.max(compPreferredSize.height, blockHeight);
+ }
+ }
+
+ public Dimension minimumLayoutSize(final Container comp) {
+ return new Dimension(0, 0);
+ }
+
+ public Dimension preferredLayoutSize(final Container container) {
+ final int maxWidth = container.getParent().getWidth();
+ int width = 0;
+ int heigth = 0;
+ int blockWidth = 0;
+ int blockHeight = 0;
+ int lastBlockWidth = 0;
+ int lastBlockHeight = 0;
+ for (int i = 0;; i++) {
+ final Component component = i < container.getComponentCount() ? container.getComponent(i) : null;
+ if (component == null || component instanceof Separator) {
+ if (lastBlockWidth + blockWidth > maxWidth) {
+ width = Math.max(width, lastBlockWidth);
+ heigth += lastBlockHeight;
+ lastBlockWidth = blockWidth;
+ lastBlockHeight = blockHeight;
+ }
+ else {
+ lastBlockWidth += blockWidth;
+ lastBlockHeight = Math.max(blockHeight, lastBlockHeight);
+ }
+ blockWidth = 0;
+ blockHeight = 0;
+ }
+ if (component == null) {
+ width = Math.max(width, lastBlockWidth);
+ heigth += lastBlockHeight;
+ break;
+ }
+ final Dimension compPreferredSize = component.getPreferredSize();
+ blockWidth += compPreferredSize.width;
+ blockHeight = Math.max(compPreferredSize.height, blockHeight);
+ }
+ return new Dimension(width, heigth);
+ }
+
+ public void removeLayoutComponent(final Component comp) {
+ }
+
+ public static LayoutManager getInstance() {
+ return instance;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/TypedListCellRenderer.java b/freeplane/src/org/freeplane/core/ui/components/TypedListCellRenderer.java
new file mode 100644
index 0000000..30fcccb
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/TypedListCellRenderer.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.core.ui.components;
+
+import java.awt.Component;
+import java.net.URI;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JList;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 16, 2011
+ */
+public class TypedListCellRenderer extends DefaultListCellRenderer{
+
+ final private static TypedListCellRenderer instance = new TypedListCellRenderer();
+ static TypedListCellRenderer getInstance() {
+ return instance;
+ }
+
+ public TypedListCellRenderer() {
+ super();
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
+ super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ if (value instanceof String) {
+ setIcon(ViewController.textIcon);
+ }
+ else if (value instanceof FormattedDate) {
+ final FormattedDate fd = (FormattedDate) value;
+ if (fd.containsTime())
+ setIcon(ViewController.dateTimeIcon);
+ else
+ setIcon(ViewController.dateIcon);
+ }
+ else if (value instanceof URI) {
+ setIcon(ViewController.linkIcon);
+ }
+ else if (value instanceof Number) {
+ setIcon(ViewController.numberIcon);
+ }
+ else if (value instanceof ObjectAndIcon) {
+ setIcon(((ObjectAndIcon) value).getIcon());
+ }
+ return this;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/UITools.java b/freeplane/src/org/freeplane/core/ui/components/UITools.java
new file mode 100644
index 0000000..50faaf7
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/UITools.java
@@ -0,0 +1,620 @@
+/*
+ * 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.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.ViewController;
+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 ViewController viewController = Controller.getCurrentController().getViewController();
+ 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 ViewController viewController = controller.getViewController();
+ 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 ViewController viewController = controller.getViewController();
+ 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 ViewController viewController = controller.getViewController();
+ 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 ViewController viewController = controller.getViewController();
+ viewController.scrollNodeToVisible(node);
+ final Component parentComponent = viewController.getComponent(node);
+ return JOptionPane.showInputDialog(parentComponent, text, title, type);
+ }
+
+ private 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 = (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();
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JCalendar.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JCalendar.java
new file mode 100644
index 0000000..0ad2b37
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JCalendar.java
@@ -0,0 +1 @@
+/*
* JCalendar.java - A bean for choosing a date 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.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
/**
* JCalendar is a bean for entering a date by choosing the year, month and day.
*
* @author Kai Toedter
* @version $LastChangedRevision: 95 $
* @version $LastChangedDate: 2006-05-05 18:43:15 +0200 (Fr, 05 Mai 2006) $
*/
public class JCalendar extends JPanel implements PropertyChangeListener, MouseListener {
private final class JCalendarPopupMenu extends JPopupMenu {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void menuSelectionChanged(boolean isIncluded) {
if (!isIncluded) {
final Object source = EventQueue.getCurrentEvent().getSource();
if (source instanceof Component) {
final Component c = (Component) source;
isIncluded = SwingUtilities.isDescendingFrom(c, this);
}
}
super.menuSelectionChanged(isIncluded);
}
}
public static final String DATE_PROPERTY = "date";
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Creates a JFrame with a JCalendar 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("JCalendar");
final JCalendar jcalendar = new JCalendar();
frame.getContentPane().add(jcalendar);
frame.pack();
frame.setVisible(true);
}
private Calendar calendar;
private JPopupMenu calendarPopupMenu;
final private JTimeChooser timeChooser;
/** the day chooser */
final private JDayChooser dayChooser;
private boolean initialized = false;
/** the locale */
private Locale locale;
/** the month chooser */
final private JMonthChooser monthChooser;
final private JPanel monthYearPanel;
/** the year chhoser */
final private JYearChooser yearChooser;
/**
* Default JCalendar constructor.
*/
public JCalendar() {
this(null, null, true, true, true);
}
/**
* JCalendar constructor specifying the month spinner type.
*
* @param monthSpinner
* false, if no month spinner should be used
*/
public JCalendar(final boolean monthSpinner) {
this(null, null, monthSpinner, true, false);
}
/**
* JCalendar constructor which allows the initial calendar to be set.
*
* @param calendar
* the calendar
*/
public JCalendar(final Calendar calendar) {
this(null, null, true, true, false);
setCalendar(calendar);
}
/**
* JCalendar constructor which allows the initial date to be set.
*
* @param date
* the date
*/
public JCalendar(final Date date) {
this(date, null, true, true, false);
}
/**
* JCalendar constructor specifying both the initial date and the month
* spinner type.
*
* @param date
* the date
* @param monthSpinner
* false, if no month spinner should be used
*/
public JCalendar(final Date date, final boolean monthSpinner) {
this(date, null, monthSpinner, true, false);
}
/**
* JCalendar constructor specifying both the initial date and locale.
*
* @param date
* the date
* @param locale
* the new locale
*/
public JCalendar(final Date date, final Locale locale) {
this(date, locale, true, true, false);
}
/**
* JCalendar constructor with month spinner parameter.
*
* @param date
* the date
* @param locale
* the locale
* @param monthSpinner
* false, if no month spinner should be used
* @param weekOfYearVisible
* true, if weeks of year shall be visible
* @param timeVisible
* true, if hours and minutes shall be visible
*/
public JCalendar(final Date date, final Locale locale, final boolean monthSpinner, final boolean weekOfYearVisible, final boolean timeVisible) {
setName("JCalendar");
this.locale = locale;
if (locale == null) {
this.locale = Locale.getDefault();
}
calendar = Calendar.getInstance();
setLayout(new BorderLayout());
monthYearPanel = new JPanel();
monthYearPanel.setLayout(new BorderLayout());
monthChooser = new JMonthChooser(monthSpinner);
yearChooser = new JYearChooser();
monthChooser.setYearChooser(yearChooser);
monthYearPanel.add(monthChooser, BorderLayout.WEST);
monthYearPanel.add(yearChooser, BorderLayout.CENTER);
monthYearPanel.setBorder(BorderFactory.createEmptyBorder());
dayChooser = new JDayChooser(weekOfYearVisible);
dayChooser.addPropertyChangeListener(this);
dayChooser.addMouseListener(this);
monthChooser.setDayChooser(dayChooser);
monthChooser.addPropertyChangeListener(this);
yearChooser.setDayChooser(dayChooser);
yearChooser.addPropertyChangeListener(this);
dayChooser.setYearChooser(yearChooser);
dayChooser.setMonthChooser(monthChooser);
add(monthYearPanel, BorderLayout.NORTH);
add(dayChooser, BorderLayout.CENTER);
if(timeVisible){
timeChooser = new JTimeChooser();
add(timeChooser, BorderLayout.SOUTH);
}
else{
timeChooser = null;
}
if (date != null) {
calendar.setTime(date);
}
initialized = true;
setCalendar(calendar);
}
/**
* JCalendar constructor allowing the initial locale to be set.
*
* @param locale
* the new locale
*/
public JCalendar(final Locale locale) {
this(null, locale, true, true, false);
}
/**
* JCalendar constructor specifying both the locale and the month spinner.
*
* @param locale
* the locale
* @param monthSpinner
* false, if no month spinner should be used
*/
public JCalendar(final Locale locale, final boolean monthSpinner) {
this(null, locale, monthSpinner, true, false);
}
public JPopupMenu createPopupMenu() {
if (calendarPopupMenu != null) {
return calendarPopupMenu;
}
calendarPopupMenu = new JCalendarPopupMenu();
calendarPopupMenu.add(this);
return calendarPopupMenu;
}
/**
* Returns the calendar property.
*
* @return the value of the calendar property.
*/
public Calendar getCalendar() {
return calendar;
}
/**
* Returns a Date object.
*
* @return a date object constructed from the calendar property.
*/
public Date getDate() {
return new Date(calendar.getTimeInMillis());
}
/**
* Gets the dayChooser attribute of the JCalendar object
*
* @return the dayChooser value
*/
public JDayChooser getDayChooser() {
return dayChooser;
}
/**
* Returns the color of the decoration (day names and weeks).
*
* @return the color of the decoration (day names and weeks).
*/
public Color getDecorationBackgroundColor() {
return dayChooser.getDecorationBackgroundColor();
}
/**
* Returns the locale.
*
* @return the value of the locale property.
* @see #setLocale
*/
@Override
public Locale getLocale() {
return locale;
}
/**
* Gets the maximum number of characters of a day name or 0. If 0 is
* returned, dateFormatSymbols.getShortWeekdays() will be used.
*
* @return the maximum number of characters of a day name or 0.
*/
public int getMaxDayCharacters() {
return dayChooser.getMaxDayCharacters();
}
/**
* Gets the minimum selectable date.
*
* @return the minimum selectable date
*/
public Date getMaxSelectableDate() {
return dayChooser.getMaxSelectableDate();
}
/**
* Gets the maximum selectable date.
*
* @return the maximum selectable date
*/
public Date getMinSelectableDate() {
return dayChooser.getMinSelectableDate();
}
/**
* Gets the monthChooser attribute of the JCalendar object
*
* @return the monthChooser value
*/
public JMonthChooser getMonthChooser() {
return monthChooser;
}
/**
* Returns the Sunday foreground.
*
* @return Color the Sunday foreground.
*/
public Color getSundayForeground() {
return dayChooser.getSundayForeground();
}
/**
* Returns the weekday foreground.
*
* @return Color the weekday foreground.
*/
public Color getWeekdayForeground() {
return dayChooser.getWeekdayForeground();
}
/**
* Gets the yearChooser attribute of the JCalendar object
*
* @return the yearChooser value
*/
public JYearChooser getYearChooser() {
return yearChooser;
}
/**
* Gets the visibility of the decoration background.
*
* @return true, if the decoration background is visible.
*/
public boolean isDecorationBackgroundVisible() {
return dayChooser.isDecorationBackgroundVisible();
}
/**
* Gets the visibility of the decoration border.
*
* @return true, if the decoration border is visible.
*/
public boolean isDecorationBordersVisible() {
return dayChooser.isDecorationBordersVisible();
}
/**
* Indicates if the weeks of year are visible..
*
* @return boolean true, if weeks of year are visible
*/
public boolean isWeekOfYearVisible() {
return dayChooser.isWeekOfYearVisible();
}
public void mouseClicked(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseEntered(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseExited(final MouseEvent e) {
processMouseEvent(e);
}
public void mousePressed(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseReleased(final MouseEvent e) {
processMouseEvent(e);
}
/**
* JCalendar is a PropertyChangeListener, for its day, month and year
* chooser.
*
* @param evt
* the property change event
*/
public void propertyChange(final PropertyChangeEvent evt) {
if (calendar != null) {
if (evt.getPropertyName().equals(JDayChooser.DAY_PROPERTY)) {
calendar.set(Calendar.DAY_OF_MONTH, ((Integer) evt.getNewValue()).intValue());
}
else if (evt.getPropertyName().equals(JMonthChooser.MONTH_PROPERTY)) {
calendar.set(Calendar.MONTH, ((Integer) evt.getNewValue()).intValue());
}
else if (evt.getPropertyName().equals(JYearChooser.YEAR_PROPERTY)) {
calendar.set(Calendar.YEAR, ((Integer) evt.getNewValue()).intValue());
}
else if (evt.getPropertyName().equals(JCalendar.DATE_PROPERTY)) {
calendar.setTime((Date) evt.getNewValue());
}
}
firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
}
/**
* Sets the background color.
*
* @param bg
* the new background
*/
@Override
public void setBackground(final Color bg) {
super.setBackground(bg);
if (dayChooser != null) {
dayChooser.setBackground(bg);
}
}
/**
* Sets the calendar property. This is a bound property.
*
* @param c
* the new calendar
* @throws NullPointerException
* - if c is null;
* @see #getCalendar
*/
public void setCalendar(final Calendar c) {
if (c == null) {
setDate(null);
}
final Calendar oldCalendar = calendar;
calendar = c;
yearChooser.setYear(c.get(Calendar.YEAR));
monthChooser.setMonth(c.get(Calendar.MONTH));
dayChooser.setDay(c.get(Calendar.DATE));
if(timeChooser != null)
timeChooser.setCalendar(calendar);
firePropertyChange("calendar", oldCalendar, calendar);
}
/**
* Sets the date. Fires the property change "date".
*
* @param date
* the new date.
* @throws NullPointerException
* - if tha date is null
*/
public void setDate(final Date date) {
final Date oldDate = calendar.getTime();
calendar.setTime(date);
final int year = calendar.get(Calendar.YEAR);
final int month = calendar.get(Calendar.MONTH);
final int day = calendar.get(Calendar.DAY_OF_MONTH);
yearChooser.setYear(year);
monthChooser.setMonth(month);
dayChooser.setCalendar(calendar);
dayChooser.setDay(day);
firePropertyChange(JCalendar.DATE_PROPERTY, oldDate, date);
}
/**
* Sets the background of days and weeks of year buttons.
*
* @param decorationBackgroundColor
* the background color
*/
public void setDecorationBackgroundColor(final Color decorationBackgroundColor) {
dayChooser.setDecorationBackgroundColor(decorationBackgroundColor);
}
/**
* Sets the decoration background visible.
*
* @param decorationBackgroundVisible
* true, if the decoration background should be visible.
*/
public void setDecorationBackgroundVisible(final boolean decorationBackgroundVisible) {
dayChooser.setDecorationBackgroundVisible(decorationBackgroundVisible);
setLocale(locale);
};
/**
* Sets the decoration borders visible.
*
* @param decorationBordersVisible
* true, if the decoration borders should be visible.
*/
public void setDecorationBordersVisible(final boolean decorationBordersVisible) {
dayChooser.setDecorationBordersVisible(decorationBordersVisible);
setLocale(locale);
}
/**
* Enable or disable the JCalendar.
*
* @param enabled
* the new enabled value
*/
@Override
public void setEnabled(final boolean enabled) {
super.setEnabled(enabled);
if (dayChooser != null) {
dayChooser.setEnabled(enabled);
monthChooser.setEnabled(enabled);
yearChooser.setEnabled(enabled);
}
}
/**
* Sets the font property.
*
* @param font
* the new font
*/
@Override
public void setFont(final Font font) {
super.setFont(font);
if (dayChooser != null) {
dayChooser.setFont(font);
monthChooser.setFont(font);
yearChooser.setFont(font);
}
}
/**
* Sets the foreground color.
*
* @param fg
* the new foreground
*/
@Override
public void setForeground(final Color fg) {
super.setForeground(fg);
if (dayChooser != null) {
dayChooser.setForeground(fg);
monthChooser.setForeground(fg);
yearChooser.setForeground(fg);
}
}
/**
* Sets the locale property. This is a bound property.
*
* @param l
* the new locale value
* @see #getLocale
*/
@Override
public void setLocale(final Locale l) {
if (!initialized) {
super.setLocale(l);
}
else {
final Locale oldLocale = locale;
locale = l;
dayChooser.setLocale(locale);
monthChooser.setLocale(locale);
firePropertyChange("locale", oldLocale, locale);
}
}
/**
* Sets the maximum number of characters per day in the day bar. Valid
* values are 0-4. If set to 0, dateFormatSymbols.getShortWeekdays() will be
* used, otherwise theses strings will be reduced to the maximum number of
* characters.
*
* @param maxDayCharacters
* the maximum number of characters of a day name.
*/
public void setMaxDayCharacters(final int maxDayCharacters) {
dayChooser.setMaxDayCharacters(maxDayCharacters);
}
/**
* Sets the maximum selectable date.
*
* @param max
* maximum selectable date
*/
public void setMaxSelectableDate(final Date max) {
dayChooser.setMaxSelectableDate(max);
}
/**
* Sets the minimum selectable date.
*
* @param min
* minimum selectable date
*/
public void setMinSelectableDate(final Date min) {
dayChooser.setMinSelectableDate(min);
}
/**
* Sets a valid date range for selectable dates. If max is before min, the
* default range with no limitation is set.
*
* @param min
* the minimum selectable date or null (then the minimum date is
* set to 01\01\0001)
* @param max
* the maximum selectable date or null (then the maximum date is
* set to 01\01\9999)
*/
public void setSelectableDateRange(final Date min, final Date max) {
dayChooser.setSelectableDateRange(min, max);
}
/**
* Sets the Sunday foreground.
*
* @param sundayForeground
* the sundayForeground to set
*/
public void setSundayForeground(final Color sundayForeground) {
dayChooser.setSundayForeground(sundayForeground);
}
/**
* Sets the weekday foreground.
*
* @param weekdayForeground
* the weekdayForeground to set
*/
public void setWeekdayForeground(final Color weekdayForeground) {
dayChooser.setWeekdayForeground(weekdayForeground);
}
/**
* Sets the week of year visible.
*
* @param weekOfYearVisible
* true, if weeks of year shall be visible
*/
public void setWeekOfYearVisible(final boolean weekOfYearVisible) {
dayChooser.setWeekOfYearVisible(weekOfYearVisible);
setLocale(locale);
}
public boolean isTimeVisible(){
return timeChooser != null;
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JDayChooser.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JDayChooser.java
new file mode 100644
index 0000000..64f8a4c
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JDayChooser.java
@@ -0,0 +1 @@
+/*
* JDayChooser.java - A bean for choosing a day 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.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
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.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicButtonUI;
/**
* JDayChooser is a bean for choosing a day.
*
* @author Kai Toedter
* @version $LastChangedRevision: 104 $
* @version $LastChangedDate: 2006-06-04 15:20:45 +0200 (So, 04 Jun 2006) $
*/
public class JDayChooser extends JPanel implements ActionListener, KeyListener, FocusListener, MouseListener {
static class JDayButton extends JButton{
private static final long serialVersionUID = 1L;
@Override
public void updateUI() {
setMargin(new Insets(0, 0, 0, 0));
super.updateUI();
final Insets insets = getInsets();
if(insets.left + insets.right > 8){
setUI(BasicButtonUI.createUI(this));
setBorder(BorderFactory.createLineBorder(Color.GRAY));
}
}
}
class DecoratorButton extends JDayButton {
private static final long serialVersionUID = 1L;
public DecoratorButton() {
setBackground(decorationBackgroundColor);
setContentAreaFilled(decorationBackgroundVisible);
setBorderPainted(decorationBordersVisible);
setFocusable(false);
}
@Override
public void paint(final Graphics g) {
if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
if (decorationBackgroundVisible) {
g.setColor(decorationBackgroundColor);
}
else {
g.setColor(days[7].getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
if (isBorderPainted()) {
setContentAreaFilled(true);
}
else {
setContentAreaFilled(false);
}
}
super.paint(g);
}
}
public static final String DAY_PROPERTY = "day";
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Creates a JFrame with a JDayChooser 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("JDayChooser");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JDayChooser());
frame.pack();
frame.setVisible(true);
}
private boolean alwaysFireDayProperty;
protected Calendar calendar;
protected int day;
protected boolean dayBordersVisible;
protected String[] dayNames;
protected JPanel dayPanel;
protected JButton[] days;
protected Color decorationBackgroundColor;
protected boolean decorationBackgroundVisible = true;
protected boolean decorationBordersVisible;
protected Date defaultMaxSelectableDate;
protected Date defaultMinSelectableDate;
protected boolean initialized;
protected Locale locale;
protected int maxDayCharacters;
protected Date maxSelectableDate;
protected Date minSelectableDate;
protected JMonthChooser monthChooser = null;
protected Color oldDayBackgroundColor;
protected Color selectedColor;
protected JButton selectedDay;
protected Color sundayForeground;
protected Calendar today;
protected Color weekdayForeground;
protected boolean weekOfYearVisible;
protected JPanel weekPanel;
protected JButton[] weeks;
protected JYearChooser yearChooser = null;
/**
* Default JDayChooser constructor.
*/
public JDayChooser() {
this(false);
}
/**
* JDayChooser constructor.
*
* @param weekOfYearVisible
* true, if the weeks of a year shall be shown
*/
public JDayChooser(final boolean weekOfYearVisible) {
setName("JDayChooser");
setBackground(Color.blue);
this.weekOfYearVisible = weekOfYearVisible;
locale = Locale.getDefault();
days = new JButton[49];
selectedDay = null;
calendar = Calendar.getInstance(locale);
today = (Calendar) calendar.clone();
setLayout(new BorderLayout());
dayPanel = new JPanel();
dayPanel.setLayout(new GridLayout(7, 7));
sundayForeground = new Color(164, 0, 0);
weekdayForeground = new Color(0, 90, 164);
decorationBackgroundColor = new Color(210, 228, 238);
for (int y = 0; y < 7; y++) {
for (int x = 0; x < 7; x++) {
final int index = x + (7 * y);
if (y == 0) {
days[index] = new DecoratorButton();
}
else {
days[index] = new JDayButton() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void paint(final Graphics g) {
if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
if (selectedDay == this) {
g.setColor(selectedColor);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
super.paint(g);
}
};
days[index].addActionListener(this);
days[index].addKeyListener(this);
days[index].addFocusListener(this);
}
days[index].setMargin(new Insets(0, 0, 0, 0));
days[index].setFocusPainted(false);
dayPanel.add(days[index]);
}
}
weekPanel = new JPanel();
weekPanel.setLayout(new GridLayout(7, 1));
weeks = new JButton[7];
for (int i = 0; i < 7; i++) {
weeks[i] = new DecoratorButton();
weeks[i].setMargin(new Insets(0, 0, 0, 0));
weeks[i].setFocusPainted(false);
weeks[i].setForeground(new Color(100, 100, 100));
if (i != 0) {
weeks[i].setText("0" + (i + 1));
}
weekPanel.add(weeks[i]);
}
final Calendar tmpCalendar = Calendar.getInstance();
tmpCalendar.set(1, 0, 1, 1, 1);
defaultMinSelectableDate = tmpCalendar.getTime();
minSelectableDate = defaultMinSelectableDate;
tmpCalendar.set(9999, 0, 1, 1, 1);
defaultMaxSelectableDate = tmpCalendar.getTime();
maxSelectableDate = defaultMaxSelectableDate;
init();
setDay(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
add(dayPanel, BorderLayout.CENTER);
if (weekOfYearVisible) {
add(weekPanel, BorderLayout.WEST);
}
initialized = true;
updateUI();
}
/**
* JDayChooser is the ActionListener for all day buttons.
*
* @param e
* the ActionEvent
*/
public void actionPerformed(final ActionEvent e) {
final JButton button = (JButton) e.getSource();
final String buttonText = button.getText();
final int day = new Integer(buttonText).intValue();
setDay(day);
}
/**
* Draws the day names of the day columnes.
*/
private void drawDayNames() {
final int firstDayOfWeek = calendar.getFirstDayOfWeek();
final DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
dayNames = dateFormatSymbols.getShortWeekdays();
int day = firstDayOfWeek;
for (int i = 0; i < 7; i++) {
if (maxDayCharacters > 0 && maxDayCharacters < 5) {
if (dayNames[day].length() >= maxDayCharacters) {
dayNames[day] = dayNames[day].substring(0, maxDayCharacters);
}
}
days[i].setText(dayNames[day]);
if (day == 1) {
days[i].setForeground(sundayForeground);
}
else {
days[i].setForeground(weekdayForeground);
}
if (day < 7) {
day++;
}
else {
day -= 6;
}
}
}
/**
* Hides and shows the day buttons.
*/
protected void drawDays() {
final Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
tmpCalendar.set(Calendar.MINUTE, 0);
tmpCalendar.set(Calendar.SECOND, 0);
tmpCalendar.set(Calendar.MILLISECOND, 0);
final Calendar minCal = Calendar.getInstance();
minCal.setTime(minSelectableDate);
minCal.set(Calendar.HOUR_OF_DAY, 0);
minCal.set(Calendar.MINUTE, 0);
minCal.set(Calendar.SECOND, 0);
minCal.set(Calendar.MILLISECOND, 0);
final Calendar maxCal = Calendar.getInstance();
maxCal.setTime(maxSelectableDate);
maxCal.set(Calendar.HOUR_OF_DAY, 0);
maxCal.set(Calendar.MINUTE, 0);
maxCal.set(Calendar.SECOND, 0);
maxCal.set(Calendar.MILLISECOND, 0);
final int firstDayOfWeek = tmpCalendar.getFirstDayOfWeek();
tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
int firstDay = tmpCalendar.get(Calendar.DAY_OF_WEEK) - firstDayOfWeek;
if (firstDay < 0) {
firstDay += 7;
}
int i;
for (i = 0; i < firstDay; i++) {
days[i + 7].setVisible(false);
days[i + 7].setText("");
}
tmpCalendar.add(Calendar.MONTH, 1);
final Date firstDayInNextMonth = tmpCalendar.getTime();
tmpCalendar.add(Calendar.MONTH, -1);
Date day = tmpCalendar.getTime();
int n = 0;
final Color foregroundColor = getForeground();
while (day.before(firstDayInNextMonth)) {
days[i + n + 7].setText(Integer.toString(n + 1));
days[i + n + 7].setVisible(true);
if ((tmpCalendar.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR))
&& (tmpCalendar.get(Calendar.YEAR) == today.get(Calendar.YEAR))) {
days[i + n + 7].setForeground(sundayForeground);
}
else {
days[i + n + 7].setForeground(foregroundColor);
}
if ((n + 1) == this.day) {
days[i + n + 7].setBackground(selectedColor);
selectedDay = days[i + n + 7];
}
else {
days[i + n + 7].setBackground(oldDayBackgroundColor);
}
if (tmpCalendar.before(minCal) || tmpCalendar.after(maxCal)) {
days[i + n + 7].setEnabled(false);
}
else {
days[i + n + 7].setEnabled(true);
}
n++;
tmpCalendar.add(Calendar.DATE, 1);
day = tmpCalendar.getTime();
}
for (int k = n + i + 7; k < 49; k++) {
days[k].setVisible(false);
days[k].setText("");
}
drawWeeks();
}
/**
* Hides and shows the week buttons.
*/
protected void drawWeeks() {
final Calendar tmpCalendar = (Calendar) calendar.clone();
for (int i = 1; i < 7; i++) {
tmpCalendar.set(Calendar.DAY_OF_MONTH, (i * 7) - 6);
final int week = tmpCalendar.get(Calendar.WEEK_OF_YEAR);
String buttonText = Integer.toString(week);
if (week < 10) {
buttonText = "0" + buttonText;
}
weeks[i].setText(buttonText);
if ((i == 5) || (i == 6)) {
weeks[i].setVisible(days[i * 7].isVisible());
}
}
}
/**
* JDayChooser is the FocusListener for all day buttons. (Added by Thomas
* Schaefer)
*
* @param e
* the FocusEvent
*/
/*
* Code below commented out by Mark Brown on 24 Aug 2004. This code breaks
* the JDateChooser code by triggering the actionPerformed method on the
* next day button. This causes the date chosen to always be incremented by
* one day.
*/
public void focusGained(final FocusEvent e) {
}
/**
* Does nothing.
*
* @param e
* the FocusEvent
*/
public void focusLost(final FocusEvent e) {
}
/**
* Returns the selected day.
*
* @return the day value
* @see #setDay
*/
public int getDay() {
return day;
}
/**
* Returns the day panel.
*
* @return the day panel
*/
public JPanel getDayPanel() {
return dayPanel;
}
/**
* Returns the color of the decoration (day names and weeks).
*
* @return the color of the decoration (day names and weeks).
*/
public Color getDecorationBackgroundColor() {
return decorationBackgroundColor;
}
/**
* Returns the locale.
*
* @return the locale value
* @see #setLocale
*/
@Override
public Locale getLocale() {
return locale;
}
/**
* Gets the maximum number of characters of a day name or 0. If 0 is
* returned, dateFormatSymbols.getShortWeekdays() will be used.
*
* @return the maximum number of characters of a day name or 0.
*/
public int getMaxDayCharacters() {
return maxDayCharacters;
}
/**
* Gets the maximum selectable date.
*
* @return the maximum selectable date
*/
public Date getMaxSelectableDate() {
return maxSelectableDate;
}
/**
* Gets the minimum selectable date.
*
* @return the minimum selectable date
*/
public Date getMinSelectableDate() {
return minSelectableDate;
}
/**
* Returns the Sunday foreground.
*
* @return Color the Sunday foreground.
*/
public Color getSundayForeground() {
return sundayForeground;
}
/**
* Returns the weekday foreground.
*
* @return Color the weekday foreground.
*/
public Color getWeekdayForeground() {
return weekdayForeground;
}
/**
* Initilizes the locale specific names for the days of the week.
*/
protected void init() {
final JButton testButton = new JButton();
oldDayBackgroundColor = testButton.getBackground();
selectedColor = new Color(160, 160, 160);
final Date date = calendar.getTime();
calendar = Calendar.getInstance(locale);
calendar.setTime(date);
drawDayNames();
drawDays();
}
/**
* Initializes both day names and weeks of the year.
*/
protected void initDecorations() {
for (int x = 0; x < 7; x++) {
days[x].setContentAreaFilled(decorationBackgroundVisible);
days[x].setBorderPainted(decorationBordersVisible);
days[x].invalidate();
days[x].repaint();
weeks[x].setContentAreaFilled(decorationBackgroundVisible);
weeks[x].setBorderPainted(decorationBordersVisible);
weeks[x].invalidate();
weeks[x].repaint();
}
}
public boolean isDayBordersVisible() {
return dayBordersVisible;
}
/**
* The decoration background is the background color of the day titles and
* the weeks of the year.
*
* @return Returns true, if the decoration background is painted.
*/
public boolean isDecorationBackgroundVisible() {
return decorationBackgroundVisible;
}
/**
* The decoration border is the button border of the day titles and the
* weeks of the year.
*
* @return Returns true, if the decoration border is painted.
*/
public boolean isDecorationBordersVisible() {
return decorationBordersVisible;
}
/**
* In some Countries it is often usefull to know in which week of the year a
* date is.
*
* @return boolean true, if the weeks of the year is shown
*/
public boolean isWeekOfYearVisible() {
return weekOfYearVisible;
}
/**
* JDayChooser is the KeyListener for all day buttons. (Added by Thomas
* Schaefer and modified by Austin Moore)
*
* @param e
* the KeyEvent
*/
public void keyPressed(final KeyEvent e) {
final int offset = (e.getKeyCode() == KeyEvent.VK_UP) ? (-7) : ((e.getKeyCode() == KeyEvent.VK_DOWN) ? (+7)
: ((e.getKeyCode() == KeyEvent.VK_LEFT) ? (-1) : ((e.getKeyCode() == KeyEvent.VK_RIGHT) ? (+1) : 0)));
final int newDay = getDay() + offset;
if ((newDay >= 1) && (newDay <= calendar.getActualMaximum(Calendar.DAY_OF_MONTH))) {
setDay(newDay);
}
else if (monthChooser != null && yearChooser != null) {
final GregorianCalendar tempCalendar = new GregorianCalendar(yearChooser.getYear(),
monthChooser.getMonth(), getDay());
tempCalendar.add(Calendar.DAY_OF_MONTH, offset);
final int month = tempCalendar.get(Calendar.MONTH);
final int year = tempCalendar.get(Calendar.YEAR);
final int day = tempCalendar.get(Calendar.DAY_OF_MONTH);
yearChooser.setYear(year);
monthChooser.setMonth(month);
this.setDay(day);
}
}
/**
* Does nothing.
*
* @param e
* the KeyEvent
*/
public void keyReleased(final KeyEvent e) {
}
/**
* Does nothing.
*
* @param e
* the KeyEvent
*/
public void keyTyped(final KeyEvent e) {
}
public void mouseClicked(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseEntered(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseExited(final MouseEvent e) {
processMouseEvent(e);
}
public void mousePressed(final MouseEvent e) {
processMouseEvent(e);
}
public void mouseReleased(final MouseEvent e) {
processMouseEvent(e);
}
/**
* this is needed for JDateChooser.
*
* @param alwaysFire
* true, if day property shall be fired every time a day is
* chosen.
*/
public void setAlwaysFireDayProperty(final boolean alwaysFire) {
alwaysFireDayProperty = alwaysFire;
}
/**
* Sets a specific calendar. This is needed for correct graphical
* representation of the days.
*
* @param calendar
* the new calendar
*/
public void setCalendar(final Calendar calendar) {
this.calendar = calendar;
drawDays();
}
/**
* Sets the day. This is a bound property.
*
* @param d
* the day
* @see #getDay
*/
public void setDay(int d) {
if (d < 1) {
d = 1;
}
final Calendar tmpCalendar = (Calendar) calendar.clone();
tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
tmpCalendar.add(Calendar.MONTH, 1);
tmpCalendar.add(Calendar.DATE, -1);
final int maxDaysInMonth = tmpCalendar.get(Calendar.DATE);
if (d > maxDaysInMonth) {
d = maxDaysInMonth;
}
final int oldDay = day;
day = d;
if (selectedDay != null) {
selectedDay.setBackground(oldDayBackgroundColor);
selectedDay.removeMouseListener(this);
selectedDay.setMultiClickThreshhold(0);
selectedDay.repaint();
}
for (int i = 7; i < 49; i++) {
if (days[i].getText().equals(Integer.toString(day))) {
selectedDay = days[i];
selectedDay.setMultiClickThreshhold(10000000);
EventQueue.invokeLater(new Runnable() {
public void run() {
selectedDay.addMouseListener(JDayChooser.this);
}
});
selectedDay.setBackground(selectedColor);
break;
}
}
if (alwaysFireDayProperty) {
firePropertyChange(JDayChooser.DAY_PROPERTY, 0, day);
}
else {
firePropertyChange(JDayChooser.DAY_PROPERTY, oldDay, day);
}
}
public void setDayBordersVisible(final boolean dayBordersVisible) {
this.dayBordersVisible = dayBordersVisible;
if (initialized) {
for (int x = 7; x < 49; x++) {
if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
days[x].setContentAreaFilled(dayBordersVisible);
}
else {
days[x].setContentAreaFilled(true);
}
days[x].setBorderPainted(dayBordersVisible);
}
}
}
/**
* Sets the background of days and weeks of year buttons.
*
* @param decorationBackgroundColor
* The background to set
*/
public void setDecorationBackgroundColor(final Color decorationBackgroundColor) {
this.decorationBackgroundColor = decorationBackgroundColor;
if (days != null) {
for (int i = 0; i < 7; i++) {
days[i].setBackground(decorationBackgroundColor);
}
}
if (weeks != null) {
for (int i = 0; i < 7; i++) {
weeks[i].setBackground(decorationBackgroundColor);
}
}
}
/**
* The decoration background is the background color of the day titles and
* the weeks of the year.
*
* @param decorationBackgroundVisible
* true, if the decoration background shall be painted.
*/
public void setDecorationBackgroundVisible(final boolean decorationBackgroundVisible) {
this.decorationBackgroundVisible = decorationBackgroundVisible;
initDecorations();
}
/**
* The decoration border is the button border of the day titles and the
* weeks of the year.
*
* @param decorationBordersVisible
* true, if the decoration border shall be painted.
*/
public void setDecorationBordersVisible(final boolean decorationBordersVisible) {
this.decorationBordersVisible = decorationBordersVisible;
initDecorations();
}
/**
* Enable or disable the JDayChooser.
*
* @param enabled
* The new enabled value
*/
@Override
public void setEnabled(final boolean enabled) {
super.setEnabled(enabled);
for (short i = 0; i < days.length; i++) {
if (days[i] != null) {
days[i].setEnabled(enabled);
}
}
for (short i = 0; i < weeks.length; i++) {
if (weeks[i] != null) {
weeks[i].setEnabled(enabled);
}
}
}
/**
* Requests that the selected day also have the focus.
*/
public void setFocus() {
if (selectedDay != null) {
selectedDay.requestFocusInWindow();
}
}
/**
* Sets the font property.
*
* @param font
* the new font
*/
@Override
public void setFont(final Font font) {
if (days != null) {
for (int i = 0; i < 49; i++) {
days[i].setFont(font);
}
}
if (weeks != null) {
for (int i = 0; i < 7; i++) {
weeks[i].setFont(font);
}
}
}
/**
* Sets the foregroundColor color.
*
* @param foreground
* the new foregroundColor
*/
@Override
public void setForeground(final Color foreground) {
super.setForeground(foreground);
if (days != null) {
for (int i = 7; i < 49; i++) {
days[i].setForeground(foreground);
}
drawDays();
}
}
/**
* Sets the locale.
*
* @param locale
* the new locale value
* @see #getLocale
*/
@Override
public void setLocale(final Locale locale) {
if (!initialized) {
super.setLocale(locale);
}
else {
this.locale = locale;
super.setLocale(locale);
init();
}
}
/**
* Sets the maximum number of characters per day in the day bar. Valid
* values are 0-4. If set to 0, dateFormatSymbols.getShortWeekdays() will be
* used, otherwise theses strings will be reduced to the maximum number of
* characters.
*
* @param maxDayCharacters
* the maximum number of characters of a day name.
*/
public void setMaxDayCharacters(final int maxDayCharacters) {
if (maxDayCharacters == this.maxDayCharacters) {
return;
}
if (maxDayCharacters < 0 || maxDayCharacters > 4) {
this.maxDayCharacters = 0;
}
else {
this.maxDayCharacters = maxDayCharacters;
}
drawDayNames();
drawDays();
invalidate();
}
/**
* Sets the maximum selectable date. If null, the date 01\01\9999 will be
* set instead.
*
* @param max
* the maximum selectable date
* @return the maximum selectable date
*/
public Date setMaxSelectableDate(final Date max) {
if (max == null) {
maxSelectableDate = defaultMaxSelectableDate;
}
else {
maxSelectableDate = max;
}
drawDays();
return maxSelectableDate;
}
/**
* Sets the minimum selectable date. If null, the date 01\01\0001 will be
* set instead.
*
* @param min
* the minimum selectable date
* @return the minimum selectable date
*/
public Date setMinSelectableDate(final Date min) {
if (min == null) {
minSelectableDate = defaultMinSelectableDate;
}
else {
minSelectableDate = min;
}
drawDays();
return minSelectableDate;
}
/**
* Sets a specific month. This is needed for correct graphical
* representation of the days.
*
* @param month
* the new month
*/
public void setMonth(final int month) {
final int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.MONTH, month);
if (maxDays == day) {
day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
final boolean storedMode = alwaysFireDayProperty;
alwaysFireDayProperty = false;
setDay(day);
alwaysFireDayProperty = storedMode;
drawDays();
}
public void setMonthChooser(final JMonthChooser monthChooser) {
this.monthChooser = monthChooser;
}
/**
* Sets a valid date range for selectable dates. If max is before min, the
* default range with no limitation is set.
*
* @param min
* the minimum selectable date or null (then the minimum date is
* set to 01\01\0001)
* @param max
* the maximum selectable date or null (then the maximum date is
* set to 01\01\9999)
*/
public void setSelectableDateRange(final Date min, final Date max) {
if (min == null) {
minSelectableDate = defaultMinSelectableDate;
}
else {
minSelectableDate = min;
}
if (max == null) {
maxSelectableDate = defaultMaxSelectableDate;
}
else {
maxSelectableDate = max;
}
if (maxSelectableDate.before(minSelectableDate)) {
minSelectableDate = defaultMinSelectableDate;
maxSelectableDate = defaultMaxSelectableDate;
}
drawDays();
}
/**
* Sets the Sunday foreground.
*
* @param sundayForeground
* The sundayForeground to set
*/
public void setSundayForeground(final Color sundayForeground) {
this.sundayForeground = sundayForeground;
drawDayNames();
drawDays();
}
/**
* Sets the weekday foreground.
*
* @param weekdayForeground
* The weekdayForeground to set
*/
public void setWeekdayForeground(final Color weekdayForeground) {
this.weekdayForeground = weekdayForeground;
drawDayNames();
drawDays();
}
/**
* In some Countries it is often usefull to know in which week of the year a
* date is.
*
* @param weekOfYearVisible
* true, if the weeks of the year shall be shown
*/
public void setWeekOfYearVisible(final boolean weekOfYearVisible) {
if (weekOfYearVisible == this.weekOfYearVisible) {
return;
}
else if (weekOfYearVisible) {
add(weekPanel, BorderLayout.WEST);
}
else {
remove(weekPanel);
}
this.weekOfYearVisible = weekOfYearVisible;
validate();
dayPanel.validate();
}
/**
* Sets a specific year. This is needed for correct graphical representation
* of the days.
*
* @param year
* the new year
*/
public void setYear(final int year) {
calendar.set(Calendar.YEAR, year);
drawDays();
}
public void setYearChooser(final JYearChooser yearChooser) {
this.yearChooser = yearChooser;
}
/**
* Updates the UI and sets the day button preferences.
*/
@Override
public void updateUI() {
super.updateUI();
setFont(Font.decode("Dialog Plain 11"));
if (weekPanel != null) {
weekPanel.updateUI();
}
if (initialized) {
if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
setDayBordersVisible(false);
setDecorationBackgroundVisible(true);
setDecorationBordersVisible(false);
}
else {
setDayBordersVisible(true);
setDecorationBackgroundVisible(decorationBackgroundVisible);
setDecorationBordersVisible(decorationBordersVisible);
}
}
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java
new file mode 100644
index 0000000..843515e
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java
@@ -0,0 +1 @@
+/*
* 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));
}
}
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JSpinField.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JSpinField.java
new file mode 100644
index 0000000..7c7843a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JSpinField.java
@@ -0,0 +1 @@
+/*
* JSpinField.java - A spin field using a JSpinner (JDK 1.4) 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.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.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* JSpinField is a numeric field with 2 spin buttons to increase or decrease the
* value. It has the same interface as the "old" JSpinField but uses a JSpinner
* internally (since J2SE SDK 1.4) rather than a scrollbar for emulating the
* spin buttons.
*
* @author Kai Toedter
* @version $LastChangedRevision: 85 $
* @version $LastChangedDate: 2006-04-28 13:50:52 +0200 (Fr, 28 Apr 2006) $
*/
class JSpinField extends JPanel implements ChangeListener, CaretListener, ActionListener, FocusListener {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Creates a JFrame with a JSpinField 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("JSpinField");
frame.getContentPane().add(new JSpinField());
frame.pack();
frame.setVisible(true);
}
private Color darkGreen;
private int max;
private int min;
private int minWidth;
int getMinWidth() {
return minWidth;
}
void setMinWidth(int minWidth) {
this.minWidth = minWidth;
}
protected JSpinner spinner;
/** the text (number) field */
private JTextField textField;
protected int value;
/**
* Default JSpinField constructor. The valid value range is between
* Integer.MIN_VALUE and Integer.MAX_VALUE. The initial value is 0.
*/
public JSpinField() {
this(Integer.MIN_VALUE, Integer.MAX_VALUE);
}
/**
* JSpinField constructor with given minimum and maximum vaues and initial
* value 0.
*/
public JSpinField(final int min, int max) {
super();
setName("JSpinField");
this.min = min;
if (max < min) {
max = min;
}
this.max = max;
value = 0;
if (value < min) {
value = min;
}
if (value > max) {
value = max;
}
darkGreen = new Color(0, 150, 0);
setLayout(new BorderLayout());
textField = new JTextField(){
private static final long serialVersionUID = 1L;
@Override
public void setText(String t) {
if(minWidth <= t.length()){
super.setText(t);
}
else{
StringBuilder sb = new StringBuilder(minWidth);
for(int i = minWidth; i > t.length(); i--){
sb.append('0');
}
sb.append(t);
super.setText(sb.toString());
}
}
};
textField.addCaretListener(this);
textField.addActionListener(this);
textField.setHorizontalAlignment(SwingConstants.RIGHT);
textField.setBorder(BorderFactory.createEmptyBorder());
textField.setText(Integer.toString(value));
textField.addFocusListener(this);
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.setEditor(textField);
spinner.addChangeListener(this);
add(spinner, BorderLayout.CENTER);
}
/**
* After any user input, the value of the textfield is proofed. Depending on
* being an integer, the value is colored green or red. If the textfield is
* green, the enter key is accepted and the new value is set.
*
* @param e
* Description of the Parameter
*/
public void actionPerformed(final ActionEvent e) {
if (textField.getForeground().equals(darkGreen)) {
setValue(Integer.valueOf(textField.getText()).intValue());
}
}
public void adjustWidthToMaximumValue() {
final JTextField testTextField = new JTextField(Integer.toString(max));
final int width = testTextField.getPreferredSize().width;
final int height = testTextField.getPreferredSize().height;
textField.setPreferredSize(new Dimension(width, height));
textField.revalidate();
}
/**
* After any user input, the value of the textfield is proofed. Depending on
* being an integer, the value is colored green or red.
*
* @param e
* the caret event
*/
public void caretUpdate(final CaretEvent e) {
try {
final int testValue = Integer.valueOf(textField.getText()).intValue();
if ((testValue >= min) && (testValue <= max)) {
textField.setForeground(darkGreen);
setValue(testValue, false, true);
}
else {
textField.setForeground(Color.red);
}
}
catch (final Exception ex) {
if (ex instanceof NumberFormatException) {
textField.setForeground(Color.red);
}
}
textField.repaint();
}
/*
* (non-Javadoc)
* @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
*/
public void focusGained(final FocusEvent e) {
}
/**
* The value of the text field is checked against a valid (green) value. If
* valid, the value is set and a property change is fired.
*/
public void focusLost(final FocusEvent e) {
actionPerformed(null);
}
/**
* Returns the maximum value.
*
* @return the maximum value
*/
public int getMaximum() {
return max;
}
/**
* Returns the minimum value.
*
* @return the minimum value
*/
public int getMinimum() {
return min;
}
/**
* Returns the year chooser's spinner (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 value.
*
* @return the value value
*/
public int getValue() {
return value;
}
/**
* Enable or disable the JSpinField.
*
* @param enabled
* The new enabled value
*/
@Override
public void setEnabled(final boolean enabled) {
super.setEnabled(enabled);
spinner.setEnabled(enabled);
textField.setEnabled(enabled);
/*
* Fixes the background bug 4991597 and sets the background explicitely
* to a TextField.inactiveBackground.
*/
if (!enabled) {
textField.setBackground(UIManager.getColor("TextField.inactiveBackground"));
}
}
/**
* Sets the font property.
*
* @param font
* the new font
*/
@Override
public void setFont(final Font font) {
if (textField != null) {
textField.setFont(font);
}
}
/**
* Sets the foreground
*
* @param fg
* the foreground
*/
@Override
public void setForeground(final Color fg) {
if (textField != null) {
textField.setForeground(fg);
}
}
/**
* Sets the horizontal alignment of the displayed value.
*
* @param alignment
* the horizontal alignment
*/
public void setHorizontalAlignment(final int alignment) {
textField.setHorizontalAlignment(alignment);
}
/**
* Sets the maximum value and adjusts the preferred width.
*
* @param newMaximum
* the new maximum value
* @see #getMaximum
*/
public void setMaximum(final int newMaximum) {
max = newMaximum;
}
/**
* Sets the minimum value.
*
* @param newMinimum
* the new minimum value
* @see #getMinimum
*/
public void setMinimum(final int newMinimum) {
min = newMinimum;
}
/**
* Sets the value. This is a bound property.
*
* @param newValue
* the new value
* @see #getValue
*/
public void setValue(final int newValue) {
setValue(newValue, true, true);
spinner.setValue(new Integer(value));
}
/**
* Sets the value attribute of the JSpinField object.
*
* @param newValue
* The new value
* @param updateTextField
* true if text field should be updated
*/
protected void setValue(final int newValue, final boolean updateTextField, final boolean firePropertyChange) {
final int oldValue = value;
if (newValue < min) {
value = min;
}
else if (newValue > max) {
value = max;
}
else {
value = newValue;
}
if (updateTextField) {
textField.setText(Integer.toString(value));
textField.setForeground(Color.black);
}
if (firePropertyChange) {
firePropertyChange("value", oldValue, value);
}
}
/**
* Is invoked when the spinner model changes
*
* @param e
* the ChangeEvent
*/
public void stateChanged(final ChangeEvent e) {
final SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel();
final int value = model.getNumber().intValue();
setValue(value);
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JTimeChooser.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JTimeChooser.java
new file mode 100644
index 0000000..e180c67
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JTimeChooser.java
@@ -0,0 +1 @@
+/*
* Freeplane - mind map editor
* Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is created 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.core.ui.components.calendar;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Calendar;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
public class JTimeChooser extends Box{
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String YEAR_PROPERTY = "year";
final private JSpinField hourChooser;
final private JSpinField minuteChooser;
private Calendar calendar;
Calendar getCalendar() {
return calendar;
}
void setCalendar(Calendar calendar) {
this.calendar = calendar;
hourChooser.setValue(calendar.get(Calendar.HOUR_OF_DAY));
minuteChooser.setValue(calendar.get(Calendar.MINUTE));
}
/**
* Default JCalendar constructor.
*/
public JTimeChooser() {
super(BoxLayout.X_AXIS);
setName("JTimeChooser");
hourChooser = new JSpinField(0, 59);
hourChooser.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if(e.getPropertyName().equals("value") && calendar != null){
calendar.set(Calendar.HOUR_OF_DAY, (Integer) hourChooser.getValue());
}
}
});
hourChooser.adjustWidthToMaximumValue();
minuteChooser = new JSpinField(0, 59);
minuteChooser.setMinWidth(2);
minuteChooser.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if(e.getPropertyName().equals("value") && calendar != null){
calendar.set(Calendar.MINUTE, (Integer) minuteChooser.getValue());
}
}
});
minuteChooser.adjustWidthToMaximumValue();
final Dimension preferredSize = minuteChooser.getPreferredSize();
minuteChooser.setPreferredSize(preferredSize);
minuteChooser.setMaximumSize(preferredSize);
hourChooser.setPreferredSize(preferredSize);
hourChooser.setMaximumSize(preferredSize);
setCalendar(Calendar.getInstance());
add(Box.createHorizontalGlue());
add(hourChooser);
add(new JLabel(":"));
add(minuteChooser);
add(Box.createHorizontalGlue());
}
public int getHour() {
return (Integer) hourChooser.getValue();
}
public int getMinute() {
return (Integer) minuteChooser.getValue();
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JTripleCalendar.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JTripleCalendar.java
new file mode 100644
index 0000000..6e4ec8a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JTripleCalendar.java
@@ -0,0 +1,134 @@
+/*
+ * Freeplane - A Program for creating and viewing MindmapsCopyright (C) 2007
+ * Christian Foltin <christianfoltin at users.sourceforge.net>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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+/* $Id: JTripleCalendar.java,v 1.1.2.2 2007/02/25 21:12:50 christianfoltin Exp $ */
+package org.freeplane.core.ui.components.calendar;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.WindowConstants;
+
+
+/** */
+public class JTripleCalendar extends JPanel implements PropertyChangeListener {
+ private static class JInfoPanel extends JPanel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JDayChooser dayChooser;
+ final private JMonthChooser monthChooser;
+ final private JYearChooser yearChooser;
+
+ public JInfoPanel() {
+ this.setLayout(new BorderLayout());
+ final JPanel monthYearPanel = new JPanel();
+ monthYearPanel.setLayout(new BorderLayout());
+ monthChooser = new JMonthChooser();
+ monthChooser.setEnabled(false);
+ yearChooser = new JYearChooser();
+ yearChooser.setEnabled(false);
+ monthYearPanel.add(monthChooser, BorderLayout.WEST);
+ monthYearPanel.add(yearChooser, BorderLayout.CENTER);
+ dayChooser = new JDayChooser(true) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void init() {
+ super.init();
+ selectedColor = oldDayBackgroundColor;
+ }
+ };
+ dayChooser.setEnabled(false);
+ this.add(monthYearPanel, BorderLayout.NORTH);
+ this.add(dayChooser, BorderLayout.CENTER);
+ }
+
+ public void setDate(final Calendar calendar) {
+ final int year = calendar.get(Calendar.YEAR);
+ final int month = calendar.get(Calendar.MONTH);
+ monthChooser.setMonth(month);
+ yearChooser.setYear(year);
+ dayChooser.setYear(year);
+ dayChooser.setMonth(month);
+ dayChooser.setEnabled(false);
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static void main(final String[] args) {
+ final JFrame frame = new JFrame("JTripleCalendar");
+ frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ final JTripleCalendar jcalendar = new JTripleCalendar();
+ frame.getContentPane().add(jcalendar);
+ frame.pack();
+ frame.setVisible(true);
+ }
+
+ final private JCalendar calendarWidget;
+ final private JInfoPanel leftPanel;
+ final private JInfoPanel rightPanel;
+
+ public JTripleCalendar() {
+ this.setName("JTripleCalendar");
+ final GridLayout gridLayout = new GridLayout(1, 3);
+ gridLayout.setVgap(10);
+ setLayout(gridLayout);
+ leftPanel = createInfoPanel();
+ rightPanel = createInfoPanel();
+ add(leftPanel);
+ calendarWidget = new JCalendar();
+ calendarWidget.addPropertyChangeListener(this);
+ add(calendarWidget);
+ add(rightPanel);
+ }
+
+ private JInfoPanel createInfoPanel() {
+ final JInfoPanel panel = new JInfoPanel();
+ return panel;
+ }
+
+ public JCalendar getCalendar() {
+ return calendarWidget;
+ }
+
+ public void propertyChange(final PropertyChangeEvent evt) {
+ final Calendar gregorianCalendar = (Calendar) calendarWidget.getCalendar().clone();
+ gregorianCalendar.add(Calendar.MONTH, -1);
+ leftPanel.setDate(gregorianCalendar);
+ gregorianCalendar.add(Calendar.MONTH, 2);
+ rightPanel.setDate(gregorianCalendar);
+ }
+
+ public void setCalendar(final Calendar c) {
+ calendarWidget.setCalendar(c);
+ }
+
+ public void setDate(final Date date) {
+ calendarWidget.setDate(date);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JYearChooser.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JYearChooser.java
new file mode 100644
index 0000000..ccdb3f0
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/JYearChooser.java
@@ -0,0 +1 @@
+/*
* JYearChooser.java - A bean for choosing a year 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.util.Calendar;
import javax.swing.JFrame;
/**
* JYearChooser is a bean for choosing a year.
*
* @version $LastChangedRevision: 85 $
* @version $LastChangedDate: 2006-04-28 13:50:52 +0200 (Fr, 28 Apr 2006) $
*/
public class JYearChooser extends JSpinField {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String YEAR_PROPERTY = "year";
/**
* Creates a JFrame with a JYearChooser inside and can be used for testing.
*
* @param s
* command line arguments
*/
static public void main(final String[] s) {
final JFrame frame = new JFrame("JYearChooser");
frame.getContentPane().add(new JYearChooser());
frame.pack();
frame.setVisible(true);
}
protected JDayChooser dayChooser;
protected int endYear;
protected int oldYear;
protected int startYear;
/**
* Default JCalendar constructor.
*/
public JYearChooser() {
setName("JYearChooser");
final Calendar calendar = Calendar.getInstance();
dayChooser = null;
setMinimum(calendar.getMinimum(Calendar.YEAR));
setMaximum(calendar.getMaximum(Calendar.YEAR));
setValue(calendar.get(Calendar.YEAR));
}
/**
* Returns the endy ear.
*
* @return the end year
*/
public int getEndYear() {
return getMaximum();
}
/**
* Returns the start year.
*
* @return the start year.
*/
public int getStartYear() {
return getMinimum();
}
/**
* Returns the year.
*
* @return the year
*/
public int getYear() {
return super.getValue();
}
/**
* Convenience method set a day chooser that might be updated directly.
*
* @param dayChooser
* the day chooser
*/
public void setDayChooser(final JDayChooser dayChooser) {
this.dayChooser = dayChooser;
}
/**
* Sets the end ear.
*
* @param endYear
* the end year
*/
public void setEndYear(final int endYear) {
setMaximum(endYear);
}
/**
* Sets the start year.
*
* @param startYear
* the start year
*/
public void setStartYear(final int startYear) {
setMinimum(startYear);
}
/**
* Sets the year value.
*
* @param value
* the year value
*/
@Override
public void setValue(final int value) {
setYear(value);
}
/**
* Sets the year. This is a bound property.
*
* @param y
* the new year
* @see #getYear
*/
public void setYear(final int y) {
super.setValue(y, true, false);
if (dayChooser != null) {
dayChooser.setYear(value);
}
spinner.setValue(new Integer(value));
firePropertyChange(JYearChooser.YEAR_PROPERTY, oldYear, value);
oldYear = value;
}
}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/jcalendar-license.txt b/freeplane/src/org/freeplane/core/ui/components/calendar/jcalendar-license.txt
new file mode 100644
index 0000000..9e7f66a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/calendar/jcalendar-license.txt
@@ -0,0 +1,506 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library 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.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that 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 library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+
diff --git a/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java b/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java
new file mode 100644
index 0000000..3d6be16
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java
@@ -0,0 +1,126 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e9d5c8
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/ui/components/html/ScaledHTML.java
@@ -0,0 +1,202 @@
+/*
+ * 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.io.*;
+import java.awt.*;
+import java.net.URL;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicHTML;
+import javax.swing.text.*;
+import javax.swing.text.html.*;
+
+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
new file mode 100644
index 0000000..a663232
--- /dev/null
+++ b/freeplane/src/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;
+ }
+
+
+}
\ 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
new file mode 100644
index 0000000..1ba884c
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/undo/CompoundActor.java
@@ -0,0 +1,78 @@
+/*
+ * 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/IActor.java b/freeplane/src/org/freeplane/core/undo/IActor.java
new file mode 100644
index 0000000..289c5ef
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/undo/IActor.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+public interface IActor {
+ void act();
+
+ String getDescription();
+
+ void undo();
+}
diff --git a/freeplane/src/org/freeplane/core/undo/IUndoHandler.java b/freeplane/src/org/freeplane/core/undo/IUndoHandler.java
new file mode 100644
index 0000000..055d5ea
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/undo/IUndoHandler.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.core.undo;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.extension.IExtension;
+
+public interface IUndoHandler extends IExtension {
+ void addActor(IActor actor);
+
+ boolean canRedo();
+
+ boolean canUndo();
+
+ void addChangeListener(ChangeListener listener);
+
+ void removeChangeListener(ChangeListener listener);
+
+ void commit();
+
+ String getLastDescription();
+
+ ActionListener getRedoAction();
+
+ ActionListener getUndoAction();
+
+ boolean isUndoActionRunning();
+
+ void redo();
+
+ public void resetRedo();
+
+ void rollback();
+
+ void startTransaction();
+
+ void forceNewTransaction();
+
+ void undo();
+
+ void deactivate();
+
+ public void delayedCommit();
+
+ public void delayedRollback();
+
+ public int getTransactionLevel();
+
+}
diff --git a/freeplane/src/org/freeplane/core/undo/UndoHandler.java b/freeplane/src/org/freeplane/core/undo/UndoHandler.java
new file mode 100644
index 0000000..307d535
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/undo/UndoHandler.java
@@ -0,0 +1,332 @@
+/*
+ * 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;
+
+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 && EventQueue.isDispatchThread()) {
+ actionFrameStarted = true;
+ EventQueue.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
new file mode 100644
index 0000000..0ff0687
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/ColorUtils.java
@@ -0,0 +1,36 @@
+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);
+ }
+ 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
new file mode 100644
index 0000000..69cded6
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/Compat.java
@@ -0,0 +1,216 @@
+package org.freeplane.core.util;
+
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.io.File;
+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 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 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 PREVIEW_DIR=File.separatorChar + "1.2.x";
+
+ public static String getFreeplaneUserDirectory() {
+ String userFpDir = System.getProperty("org.freeplane.userfpdir");
+ if(userFpDir == null){
+ userFpDir = System.getProperty("user.home")+ File.separator + ".freeplane";
+ }
+ if(PREVIEW_DIR != null)
+ return userFpDir + PREVIEW_DIR;
+ return userFpDir;
+ }
+
+ 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
new file mode 100644
index 0000000..f252c58
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/ConfigurationUtils.java
@@ -0,0 +1,51 @@
+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/FactoryMethod.java b/freeplane/src/org/freeplane/core/util/FactoryMethod.java
new file mode 100644
index 0000000..1c9798d
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/FactoryMethod.java
@@ -0,0 +1,32 @@
+/*
+ * 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.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface FactoryMethod {
+ String value();
+}
diff --git a/freeplane/src/org/freeplane/core/util/FileUtils.java b/freeplane/src/org/freeplane/core/util/FileUtils.java
new file mode 100644
index 0000000..83eb434
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/FileUtils.java
@@ -0,0 +1,308 @@
+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.OutputStream;
+import java.io.OutputStreamWriter;
+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 prefix, final String fileName, final File destinationDirectory) {
+ final String pathToResource = prefix + 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;
+ }
+
+ public static String slurpFile(final File file) throws IOException {
+ FileReader in = null;
+ try {
+ in = new FileReader(file);
+ final StringBuilder builder = new StringBuilder();
+ final char[] buf = new char[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ builder.append(buf, 0, len);
+ }
+ final String result = builder.toString();
+ return result;
+ }
+ 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/org/freeplane/core/util/FixedHTMLWriter.java
new file mode 100644
index 0000000..0ad0429
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/FixedHTMLWriter.java
@@ -0,0 +1,116 @@
+package org.freeplane.core.util;
+
+/*
+ * XHTMLWriter -- A simple XHTML document writer (C) 2004 Richard "Shred"
+ * Koerber http://www.shredzone.net/ This is free software. You can modify and
+ * use it at will.
+ */
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Enumeration;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.Element;
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.html.CSS;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLWriter;
+
+/**
+ * Create a new XHTMLWriter which is able to write out a HTMLDocument as XHTML.
+ * <p>
+ * The result will be a valid XML file, but it is not granted that the file will
+ * really be XHTML 1.0 transitional conformous. The basic purpose of this class
+ * is to give an XSL processor access to plain HTML files.
+ *
+ * @author Richard "Shred" Körber
+ */
+public class FixedHTMLWriter extends HTMLWriter {
+ /**
+ * Create an older style of HTML attributes. This will convert character
+ * level attributes that have a StyleConstants mapping over to an HTML
+ * tag/attribute. Other CSS attributes will be placed in an HTML style
+ * attribute.
+ */
+ private static void convertToHTML(final AttributeSet from, final MutableAttributeSet to) {
+ if (from == null) {
+ return;
+ }
+ final Enumeration<?> keys = from.getAttributeNames();
+ String value = "";
+ while (keys.hasMoreElements()) {
+ final Object key = keys.nextElement();
+ if (key instanceof CSS.Attribute) {
+ if (value.length() > 0) {
+ value = value + "; ";
+ }
+ value = value + key + ": " + from.getAttribute(key);
+ }
+ else {
+ to.addAttribute(key, from.getAttribute(key));
+ }
+ }
+ if (value.length() > 0) {
+ to.addAttribute(HTML.Attribute.STYLE, value);
+ }
+ }
+
+ final private MutableAttributeSet convAttr = new SimpleAttributeSet();
+
+ /**
+ * Create a new XHTMLWriter that will write the entire HTMLDocument.
+ *
+ * @param writer
+ * Writer to write to
+ * @param doc
+ * Source document
+ */
+ public FixedHTMLWriter(final Writer writer, final HTMLDocument doc) {
+ this(writer, doc, 0, doc.getLength());
+ }
+
+ /**
+ * Create a new XHTMLWriter that will write a part of a HTMLDocument.
+ *
+ * @param writer
+ * Writer to write to
+ * @param doc
+ * Source document
+ * @param pos
+ * Starting position
+ * @param len
+ * Length
+ */
+ public FixedHTMLWriter(final Writer writer, final HTMLDocument doc, final int pos, final int len) {
+ super(writer, doc, pos, len);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @seejavax.swing.text.html.HTMLWriter#writeAttributes(javax.swing.text.
+ * AttributeSet)
+ */
+ @Override
+ protected void writeAttributes(final AttributeSet attr) throws IOException {
+ if (attr instanceof Element) {
+ final Element elem = (Element) attr;
+ if (elem.isLeaf() || elem.getName().equalsIgnoreCase("p-implied")) {
+ super.writeAttributes(attr);
+ return;
+ }
+ }
+ convAttr.removeAttributes(convAttr);
+ FixedHTMLWriter.convertToHTML(attr, convAttr);
+ final Enumeration<?> names = convAttr.getAttributeNames();
+ while (names.hasMoreElements()) {
+ final Object name = names.nextElement();
+ if (name instanceof HTML.Tag || name instanceof StyleConstants || name == HTML.Attribute.ENDTAG) {
+ continue;
+ }
+ write(" " + name + "=\"" + convAttr.getAttribute(name) + "\"");
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/FreeplaneIconUtils.java b/freeplane/src/org/freeplane/core/util/FreeplaneIconUtils.java
new file mode 100644
index 0000000..953c44f
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/FreeplaneIconUtils.java
@@ -0,0 +1,41 @@
+package org.freeplane.core.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.factory.MindIconFactory;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+
+/** utility methods to access Freeplane's (builtin and user) icons. */
+public class FreeplaneIconUtils {
+
+ public static Icon createStandardIcon(String iconKey) {
+ return MindIconFactory.create(iconKey).getIcon();
+ }
+
+ /** lists all icons that are available in the icon selection dialog. This may include user icons
+ * if there are some installed. */
+ public static List<String> listStandardIconKeys() {
+ // the source of this list is the property "icons.list" in freeplane.properties
+ ArrayList<String> result = new ArrayList<String>();
+ final MIconController mIconController = (MIconController) IconController.getController();
+ for (MindIcon mindIcon : mIconController.getMindIcons())
+ result.add(mindIcon.getName());
+ return result;
+ }
+
+ public static ImageIcon createImageIcon(final String resourcePath) {
+ return new ImageIcon(ResourceController.getResourceController().getResource(resourcePath));
+ }
+
+ public static ImageIcon createImageIconByResourceKey(final String resourceKey) {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ return new ImageIcon(resourceController.getResource(resourceController.getProperty(resourceKey)));
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java b/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java
new file mode 100644
index 0000000..547dc62
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java
@@ -0,0 +1,221 @@
+/*
+ * 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>Controller.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.2.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;
+ }
+
+ public static FreeplaneVersion getVersion(final String pString) throws IllegalArgumentException {
+ if (pString == null)
+ return null;
+ final StringTokenizer t = new StringTokenizer(pString, ". ", 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>
+ * FreeplaneVersion required = FreeplaneVersion.getVersion("1.0.38");
+ * if (FreeplaneVersion.getVersion().compareTo(required) < 0)
+ * UITools.errorMessage("Freeplane version 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
new file mode 100644
index 0000000..83641ad
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/HtmlUtils.java
@@ -0,0 +1,749 @@
+/*
+ * 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();
+ }
+
+ 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) {
+ initialize(text);
+ final Matcher matcher = pattern.matcher(stringWithoutTags);
+ if (! matcher.find()) {
+ return text;
+ }
+ 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(text, pair.originalStart, pair.originalEnd);
+ }
+ else if(pureTextPosition <= pair.pureTextEnd){
+ sbResult.append(text, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
+ }
+ }
+ if(pureTextPosition < pair.pureTextStart){
+ pureTextPosition = pair.pureTextStart;
+ }
+ }
+
+ sbResult.append(text,
+ 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(text, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
+ pureTextPosition = pair.pureTextEnd;
+ }
+ pair = null;
+ }
+ continue;
+ }
+ for(;;){
+ if(pureTextPosition <= pair.pureTextEnd){
+ sbResult.append(text, pair.originalStart + pureTextPosition - pair.pureTextStart, text.length());
+ return sbResult.toString();
+ }
+ if(pair.mIsTag){
+ sbResult.append(text, 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");
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/LogUtils.java b/freeplane/src/org/freeplane/core/util/LogUtils.java
new file mode 100644
index 0000000..b0bd974
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/LogUtils.java
@@ -0,0 +1,153 @@
+/*
+ * 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.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.io.File;
+import java.io.PrintStream;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * Utilities for logging to the standard logfile.
+ * <p>
+ * In scripts this class can be accessed via the "global" variable <code>logger</code>,
+ * so this is the way to log in scripts:
+ * <pre>
+ * try {
+ * logger.info("this node as date: " + node.to.date)
+ * } catch (Exception ex) {
+ * logger.severe('error on conversion of "' + node.text + '" to date', ex)
+ * }
+ * </pre>
+ *
+ * @author foltin
+ */
+public class LogUtils {
+ private static final Logger LOGGER = Logger.global;
+ static private boolean loggerCreated = false;
+
+ public static void createLogger() {
+ if (loggerCreated) {
+ return;
+ }
+ loggerCreated = true;
+ FileHandler mFileHandler = null;
+ final Logger parentLogger = Logger.getAnonymousLogger().getParent();
+ final Handler[] handlers = parentLogger.getHandlers();
+ for (int i = 0; i < handlers.length; i++) {
+ final Handler handler = handlers[i];
+ if (handler instanceof ConsoleHandler) {
+ parentLogger.removeHandler(handler);
+ }
+ }
+ try {
+ final String logDirectoryPath = getLogDirectory();
+ final File logDirectory = new File(logDirectoryPath);
+ logDirectory.mkdirs();
+ if(logDirectory.isDirectory()){
+ final String pathPattern = logDirectoryPath + File.separatorChar + "log";
+ mFileHandler = new FileHandler(pathPattern, 1400000, 5, false);
+ mFileHandler.setFormatter(new StdFormatter());
+ parentLogger.addHandler(mFileHandler);
+ }
+ final ConsoleHandler stdConsoleHandler = new ConsoleHandler();
+ stdConsoleHandler.setFormatter(new StdFormatter());
+ if(System.getProperty("java.util.logging.config.file", null) == null){
+ mFileHandler.setLevel(Level.INFO);
+ stdConsoleHandler.setLevel(Level.INFO);
+ }
+ parentLogger.addHandler(stdConsoleHandler);
+ LoggingOutputStream los;
+ Logger logger = Logger.getLogger(StdFormatter.STDOUT.getName());
+ los = new LoggingOutputStream(logger, StdFormatter.STDOUT);
+ System.setOut(new PrintStream(los, true));
+ logger = Logger.getLogger(StdFormatter.STDERR.getName());
+ los = new LoggingOutputStream(logger, StdFormatter.STDERR);
+ System.setErr(new PrintStream(los, true));
+ }
+ catch (final Exception e) {
+ LogUtils.warn("Error creating logging File Handler", e);
+ }
+ }
+
+ public static String getLogDirectory() {
+ final String logDirectory = ResourceController.getResourceController().getFreeplaneUserDirectory() + File.separatorChar + "logs";
+ return logDirectory;
+ }
+
+ public static void info(final String string) {
+ LOGGER.log(Level.INFO, string);
+ }
+
+ public static void info(final Transferable t) {
+ System.out.println();
+ System.out.println("BEGIN OF Transferable:\t" + t);
+ final DataFlavor[] dataFlavors = t.getTransferDataFlavors();
+ for (int i = 0; i < dataFlavors.length; i++) {
+ System.out.println(" Flavor:\t" + dataFlavors[i]);
+ System.out.println(" Supported:\t" + t.isDataFlavorSupported(dataFlavors[i]));
+ try {
+ System.out.println(" Content:\t" + t.getTransferData(dataFlavors[i]));
+ }
+ catch (final Exception e) {
+ }
+ }
+ System.out.println("END OF Transferable");
+ System.out.println();
+ }
+
+ public static void severe(final String message) {
+ LOGGER.log(Level.SEVERE, message);
+ }
+
+ public static void severe(final String comment, final Throwable e) {
+ if(e instanceof SecurityException || e.getCause() instanceof SecurityException)
+ warn(comment, e);
+ else
+ LOGGER.log(Level.SEVERE, comment, e);
+ }
+
+ public static void severe(final Throwable e) {
+ LogUtils.severe("", e);
+ }
+
+ public static void warn(final String msg) {
+ LOGGER.log(Level.WARNING, msg);
+ }
+
+ public static void warn(final String comment, final Throwable e) {
+ LOGGER.log(Level.WARNING, comment, e);
+ }
+
+ public static void warn(final Throwable e) {
+ LogUtils.warn("", e);
+ }
+
+ public static Logger getLogger() {
+ return LOGGER;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/LoggingOutputStream.java b/freeplane/src/org/freeplane/core/util/LoggingOutputStream.java
new file mode 100644
index 0000000..41d5a21
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/LoggingOutputStream.java
@@ -0,0 +1,69 @@
+/*
+ * 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.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * An OutputStream that writes contents to a Logger upon each call to flush()
+ * See http://blogs.sun.com/nickstephen/entry/java_redirecting_system_out_and
+ */
+class LoggingOutputStream extends ByteArrayOutputStream {
+ final private Level level;
+ final private String lineSeparator;
+ final private Logger logger;
+
+ /**
+ * Constructor
+ *
+ * @param logger
+ * Logger to write to
+ * @param level
+ * Level at which to write the log message
+ */
+ public LoggingOutputStream(final Logger logger, final Level level) {
+ super();
+ this.logger = logger;
+ this.level = level;
+ lineSeparator = System.getProperty("line.separator");
+ }
+
+ /**
+ * upon flush() write the existing contents of the OutputStream to the
+ * logger as a log record.
+ *
+ * @throws java.io.IOException
+ * in case of error
+ */
+ @Override
+ public void flush() throws IOException {
+ String record;
+ synchronized (this) {
+ super.flush();
+ record = this.toString();
+ super.reset();
+ }
+ if (record.length() == 0 || record.equals(lineSeparator)) {
+ return;
+ }
+ logger.logp(level, "", "", record);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/MenuUtils.java b/freeplane/src/org/freeplane/core/util/MenuUtils.java
new file mode 100644
index 0000000..c566ec0
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/MenuUtils.java
@@ -0,0 +1,295 @@
+/*
+ * 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;
+
+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;
+ }
+
+ /**
+ * Same as {@link #createMenuEntryTree(String, Controller)} 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;
+ }
+
+ @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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ public static String makeAcceleratorKey(String menuItemKey) {
+ return "acceleratorForMindMap/$" + menuItemKey + "$0";
+ }
+
+ 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;
+ }
+
+ 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/SerializationMethod.java b/freeplane/src/org/freeplane/core/util/SerializationMethod.java
new file mode 100644
index 0000000..c08044a
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/SerializationMethod.java
@@ -0,0 +1,32 @@
+/*
+ * 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.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface SerializationMethod {
+ String value();
+}
diff --git a/freeplane/src/org/freeplane/core/util/StdFormatter.java b/freeplane/src/org/freeplane/core/util/StdFormatter.java
new file mode 100644
index 0000000..87e1c21
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/StdFormatter.java
@@ -0,0 +1,69 @@
+/*
+ * 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.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+class StdFormatter extends SimpleFormatter {
+ private static class StdOutErrLevel extends Level {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public StdOutErrLevel(final String name, final int value) {
+ super(name, value);
+ }
+ }
+
+ /**
+ * Level for STDERR activity
+ */
+ public final static Level STDERR = new StdOutErrLevel("STDERR", Level.SEVERE.intValue() + 53);
+ /**
+ * Level for STDOUT activity.
+ */
+ public final static Level STDOUT = new StdOutErrLevel("STDOUT", Level.WARNING.intValue() + 53);
+ final private String lineSeparator = System.getProperty("line.separator");
+
+ /**
+ * Format the given LogRecord.
+ *
+ * @param record
+ * the log record to be formatted.
+ * @return a formatted log record
+ */
+ @Override
+ public synchronized String format(final LogRecord record) {
+ if (!StdFormatter.STDERR.getName().equals(record.getLoggerName())
+ && !StdFormatter.STDOUT.getName().equals(record.getLoggerName())) {
+ return super.format(record);
+ }
+ final StringBuilder sb = new StringBuilder();
+ sb.append(lineSeparator);
+ final String message = formatMessage(record);
+ sb.append(record.getLevel().getLocalizedName());
+ sb.append(": ");
+ sb.append(message);
+ return sb.toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/SysUtils.java b/freeplane/src/org/freeplane/core/util/SysUtils.java
new file mode 100644
index 0000000..cbf9638
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/SysUtils.java
@@ -0,0 +1,33 @@
+/*
+ * 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.util;
+
+import java.util.Date;
+import java.util.Timer;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.07.2009
+ */
+public class SysUtils {
+ static public Timer createTimer(final String name) {
+ return new Timer(name + '(' + new Date().toString() + ')');
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/TextUtils.java b/freeplane/src/org/freeplane/core/util/TextUtils.java
new file mode 100644
index 0000000..3c25d6c
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/TextUtils.java
@@ -0,0 +1,164 @@
+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.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();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/TypeReference.java b/freeplane/src/org/freeplane/core/util/TypeReference.java
new file mode 100644
index 0000000..b4b10c0
--- /dev/null
+++ b/freeplane/src/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);
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/util/XHTMLWriter.java b/freeplane/src/org/freeplane/core/util/XHTMLWriter.java
new file mode 100644
index 0000000..b805a8e
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/XHTMLWriter.java
@@ -0,0 +1,352 @@
+package org.freeplane.core.util;
+
+/*
+ * XHTMLWriter -- A simple XHTML document writer (C) 2004 Richard "Shred"
+ * Koerber http://www.shredzone.net/ This is free software. You can modify and
+ * use it at will.
+ */
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.Option;
+
+/**
+ * Create a new XHTMLWriter which is able to write out a HTMLDocument as XHTML.
+ * <p>
+ * The result will be a valid XML file, but it is not granted that the file will
+ * really be XHTML 1.0 transitional conformous. The basic purpose of this class
+ * is to give an XSL processor access to plain HTML files.
+ *
+ * @author Richard "Shred" Koerber
+ */
+class XHTMLWriter extends FixedHTMLWriter {
+ /**
+ * This FilterWriter will convert the output of Swing's HTMLWriter to XHTML
+ * format. This is done by converting tags like <br> to
+ * <br />. Also, special characters in tag attributes are
+ * escaped.
+ * <p>
+ * This filter relies on known flaws of the HTMLWriter. It is known to work
+ * with Java 1.4, but might not work with future Java releases.
+ */
+ public static class XHTMLFilterWriter extends FilterWriter {
+ private boolean insideTag = false;
+ private boolean insideValue = false;
+
+ /**
+ * Create a new XHTMLFilterWriter.
+ *
+ * @param writer
+ * Writer to write to
+ */
+ public XHTMLFilterWriter(final Writer writer) {
+ super(writer);
+ }
+
+ /**
+ * Write a char array to the Writer.
+ *
+ * @param cbuf
+ * Char array to be written
+ * @param off
+ * Start offset within the array
+ * @param len
+ * Number of chars to be written
+ */
+ @Override
+ public void write(final char[] cbuf, int off, int len) throws IOException {
+ while (len-- > 0) {
+ write(cbuf[off++]);
+ }
+ }
+
+ /**
+ * Write a single char to the Writer.
+ *
+ * @param c
+ * Char to be written
+ */
+ @Override
+ public void write(final int c) throws IOException {
+ if (insideValue) {
+ if (c == '&') {
+ super.write("&", 0, 5);
+ return;
+ }
+ else if (c == '<') {
+ super.write("<", 0, 4);
+ return;
+ }
+ else if (c == '>') {
+ super.write(">", 0, 4);
+ return;
+ }
+ else if (c == '"') {
+ insideValue = false;
+ }
+ }
+ else if (insideTag) {
+ if (c == '"') {
+ insideValue = true;
+ }
+ else if (c == '>') {
+ insideTag = false;
+ }
+ }
+ else if (c == '<') {
+ insideTag = true;
+ }
+ if (c > 126) {
+ super.write("&#x", 0, 3);
+ super.write(Integer.toString(c, 16));
+ super.write(';');
+ return;
+ }
+ super.write(c);
+ }
+
+ /**
+ * Write a String to the Writer.
+ *
+ * @param str
+ * String to be written
+ * @param off
+ * Start offset within the String
+ * @param len
+ * Number of chars to be written
+ */
+ @Override
+ public void write(final String str, final int off, final int len) throws IOException {
+ write(str.toCharArray(), off, len);
+ }
+ }
+
+ /**
+ * Read HTML from the Reader, and send XHTML to the writer. Common mistakes
+ * in the HTML code will also be corrected. The result is pretty-printed.
+ *
+ * @param reader
+ * HTML source
+ * @param writer
+ * XHTML target
+ */
+ public static void html2xhtml(final Reader reader, final Writer writer) throws IOException, BadLocationException {
+ final HTMLEditorKit kit = new HTMLEditorKit();
+ final Document doc = kit.createDefaultDocument();
+ kit.read(reader, doc, doc.getLength());
+ final XHTMLWriter xhw = new XHTMLWriter(writer, (HTMLDocument) doc);
+ xhw.write();
+ }
+
+ /**
+ * External call to convert a source HTML file to a target XHTML file.
+ * <p>
+ * Usage: <tt>java XHTMLWriter <source file> <target file></tt>
+ *
+ * @param args
+ * Shell arguments
+ */
+ public static void main(final String[] args) {
+ try {
+ final FileReader reader = new FileReader(args[0]);
+ final FileWriter writer = new FileWriter(args[1]);
+ XHTMLWriter.html2xhtml(reader, writer);
+ writer.close();
+ reader.close();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ private boolean writeLineSeparatorEnabled = true;
+ private boolean insideEmptyTag;
+
+ /**
+ * Create a new XHTMLWriter that will write the entire HTMLDocument.
+ *
+ * @param writer
+ * Writer to write to
+ * @param doc
+ * Source document
+ */
+ public XHTMLWriter(final Writer writer, final HTMLDocument doc) {
+ this(writer, doc, 0, doc.getLength());
+ }
+
+ /**
+ * Create a new XHTMLWriter that will write a part of a HTMLDocument.
+ *
+ * @param writer
+ * Writer to write to
+ * @param doc
+ * Source document
+ * @param pos
+ * Starting position
+ * @param len
+ * Length
+ */
+ public XHTMLWriter(final Writer writer, final HTMLDocument doc, final int pos, final int len) {
+ super(new XHTMLFilterWriter(writer), doc, pos, len);
+ setLineLength(Integer.MAX_VALUE);
+ }
+
+ /**
+ * Start the writing process. An XML and DOCTYPE header will be written
+ * prior to the XHTML output.
+ */
+ @Override
+ public void write() throws IOException, BadLocationException {
+ super.write();
+ }
+
+ @Override
+ protected void writeLineSeparator() throws IOException {
+ if (writeLineSeparatorEnabled) {
+ super.writeLineSeparator();
+ }
+ }
+
+ @Override
+ protected void writeOption(final Option option) throws IOException {
+ writeLineSeparatorEnabled = false;
+ super.writeOption(option);
+ writeLineSeparatorEnabled = true;
+ write("</option>");
+ writeLineSeparator();
+ }
+
+ /* (non-Javadoc)
+ * @see javax.swing.text.html.HTMLWriter#writeAttributes(javax.swing.text.AttributeSet)
+ */
+ @Override
+ protected void writeAttributes(final AttributeSet attributeSet) throws IOException {
+ final Object nameTag = (attributeSet != null) ? attributeSet.getAttribute(StyleConstants.NameAttribute) : null;
+ final Object endTag = (attributeSet != null) ? attributeSet.getAttribute(HTML.Attribute.ENDTAG) : null;
+ // write no attributes for end tags
+ if (nameTag != null && endTag != null && (endTag instanceof String) && ((String) endTag).equals("true")) {
+ return;
+ }
+ super.writeAttributes(attributeSet);
+ if (insideEmptyTag) {
+ write('/');
+ }
+ }
+
+ // remove invalid characters
+ @Override
+ protected void output(final char[] chars, final int start, final int length) throws IOException {
+ for (int i = start; i < start + length; i++) {
+ final char c = chars[i];
+ if (c < 32 && c != '\r' && c != '\n' && c != '\t') {
+ chars[i] = ' ';
+ }
+ }
+ super.output(chars, start, length);
+ }
+
+ @Override
+ protected void emptyTag(final Element elem) throws BadLocationException, IOException {
+ try {
+ final boolean isEndtag = isEndtag(elem);
+ final int balance = balance(elem, isEndtag);
+ if (balance == 0 || balance > 0 && isEndtag || balance < 0 && !isEndtag) {
+ super.emptyTag(elem);
+ return;
+ }
+ if (isEndtag) {
+ write('<');
+ write(elem.getName());
+ write('/');
+ write('>');
+ return;
+ }
+ insideEmptyTag = true;
+ super.emptyTag(elem);
+ }
+ finally {
+ insideEmptyTag = false;
+ }
+ }
+
+ private int balance(final Element elem, final boolean isEndtag) {
+ final Element parentElement = elem.getParentElement();
+ final int elementCount = parentElement.getElementCount();
+ int balance = 0;
+ final String elemName = elem.getName();
+ for (int i = 0; i < elementCount; i++) {
+ final Element childElement = parentElement.getElement(i);
+ if (isEndtag) {
+ if (childElement.equals(elem)) {
+ balance--;
+ break;
+ }
+ }
+ else {
+ if (childElement.equals(elem)) {
+ balance = 1;
+ continue;
+ }
+ if (balance == 0) {
+ continue;
+ }
+ }
+ if (!elemName.equals(childElement.getName())) {
+ continue;
+ }
+ if (isEndtag(childElement)) {
+ if (balance > 0) {
+ balance--;
+ continue;
+ }
+ }
+ else {
+ balance++;
+ }
+ }
+ return balance;
+ }
+
+ private boolean isEndtag(final Element elem) {
+ final AttributeSet attributes = elem.getAttributes();
+ final Object endTag = attributes.getAttribute(HTML.Attribute.ENDTAG);
+ final boolean isEndtag = (endTag instanceof String) && ((String) endTag).equals("true");
+ return isEndtag;
+ }
+
+ @Override
+ protected void closeOutUnwantedEmbeddedTags(final AttributeSet attr) throws IOException {
+ final boolean insideEmptyTag = this.insideEmptyTag;
+ this.insideEmptyTag = false;
+ try {
+ super.closeOutUnwantedEmbeddedTags(attr);
+ }
+ finally {
+ this.insideEmptyTag = insideEmptyTag;
+ }
+ }
+
+ @Override
+ protected void writeEmbeddedTags(final AttributeSet attr) throws IOException {
+ final boolean insideEmptyTag = this.insideEmptyTag;
+ this.insideEmptyTag = false;
+ try {
+ super.writeEmbeddedTags(attr);
+ }
+ finally {
+ this.insideEmptyTag = insideEmptyTag;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/XmlUtils.java b/freeplane/src/org/freeplane/core/util/XmlUtils.java
new file mode 100644
index 0000000..29e6070
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/XmlUtils.java
@@ -0,0 +1,8 @@
+package org.freeplane.core.util;
+
+public class XmlUtils {
+ /** \0 is not allowed: */
+ public static String makeValidXml(final String pXmlNoteText) {
+ return pXmlNoteText.replace('\0', ' ');
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/DoubleListModel.java b/freeplane/src/org/freeplane/core/util/collection/DoubleListModel.java
new file mode 100644
index 0000000..0a9302c
--- /dev/null
+++ b/freeplane/src/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
+ */
+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/org/freeplane/core/util/collection/ExtendedComboBoxModel.java
new file mode 100644
index 0000000..9e1f481
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/collection/ExtendedComboBoxModel.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.core.util.collection;
+
+import java.util.Vector;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.ListModel;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ExtendedComboBoxModel extends DefaultComboBoxModel {
+ private class ExtensionDataListener implements ListDataListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.ListDataListener#contentsChanged(javax.swing.event
+ * .ListDataEvent)
+ */
+ public void contentsChanged(final ListDataEvent e) {
+ final int size = getOwnSize();
+ fireContentsChanged(getModel(), size + e.getIndex0(), size + e.getIndex1());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.ListDataListener#intervalAdded(javax.swing.event
+ * .ListDataEvent)
+ */
+ public void intervalAdded(final ListDataEvent e) {
+ final int size = getOwnSize();
+ fireIntervalAdded(getModel(), size + e.getIndex0(), size + e.getIndex1());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.ListDataListener#intervalRemoved(javax.swing.event
+ * .ListDataEvent)
+ */
+ public void intervalRemoved(final ListDataEvent e) {
+ final int size = getOwnSize();
+ fireIntervalRemoved(getModel(), size + e.getIndex0(), size + e.getIndex1());
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ListModel extension = null;
+ final private ExtensionDataListener extensionDataListener = new ExtensionDataListener();
+
+ public ExtendedComboBoxModel() {
+ super();
+ }
+
+ public ExtendedComboBoxModel(final Object[] o) {
+ super(o);
+ }
+
+ public ExtendedComboBoxModel(final Vector<?> v) {
+ super(v);
+ }
+
+ public void addExtensionList(final ListModel listModel) {
+ if (extension == null) {
+ setExtensionList(listModel);
+ }
+ else {
+ final int oldSize = getOwnSize();
+ extension.removeListDataListener(extensionDataListener);
+ extension = new DoubleListModel(extension, listModel);
+ final int newListSize = listModel.getSize();
+ if (newListSize != 0) {
+ fireIntervalAdded(listModel, oldSize + 1, oldSize + newListSize);
+ }
+ extension.addListDataListener(extensionDataListener);
+ }
+ }
+
+ @Override
+ public Object getElementAt(final int i) {
+ final int s = getOwnSize();
+ if (i < s || extension == null) {
+ return super.getElementAt(i);
+ }
+ return extension.getElementAt(i - s);
+ }
+
+ private int getExtensionSize() {
+ return extension != null ? extension.getSize() : 0;
+ }
+
+ @Override
+ public int getIndexOf(final Object o) {
+ final int idx = super.getIndexOf(o);
+ if (idx > -1 || extension == null) {
+ return idx;
+ }
+ final int extIdx = getExtensionIndex(o);
+ return extIdx > -1 ? extIdx + getOwnSize() : -1;
+ }
+
+ private int getExtensionIndex(final Object o) {
+ final int size = extension.getSize();
+ for (int count = 0; count < size; count++) {
+ if (extension.getElementAt(count).equals(o)) {
+ return count;
+ }
+ }
+ return -1;
+ }
+
+ private ExtendedComboBoxModel getModel() {
+ return this;
+ }
+
+ /**
+ */
+ private int getOwnSize() {
+ return super.getSize();
+ }
+
+ @Override
+ public int getSize() {
+ return getOwnSize() + getExtensionSize();
+ }
+
+ @Override
+ public void insertElementAt(final Object o, final int i) {
+ super.insertElementAt(o, Math.min(getOwnSize(), i));
+ }
+
+ @Override
+ public void removeAllElements() {
+ super.removeAllElements();
+ if (extension != null) {
+ setExtensionList(null);
+ }
+ }
+
+ @Override
+ public void removeElement(final Object o) {
+ super.removeElement(o);
+ }
+
+ @Override
+ public void removeElementAt(final int i) {
+ if (i < getOwnSize()) {
+ super.removeElementAt(i);
+ }
+ }
+
+ /**
+ */
+ public void setExtensionList(final ListModel sortedListModel) {
+ final int ownSize = getOwnSize();
+ {
+ if (extension != null) {
+ extension.removeListDataListener(extensionDataListener);
+ final int extensionSize = getExtensionSize();
+ if (extensionSize > 0) {
+ fireIntervalRemoved(this, ownSize, ownSize + extensionSize - 1);
+ }
+ }
+ }
+ {
+ extension = sortedListModel;
+ final int extensionSize = getExtensionSize();
+ if (extensionSize > 0) {
+ fireIntervalAdded(this, ownSize, ownSize + extensionSize - 1);
+ }
+ if (extension != null) {
+ extension.addListDataListener(extensionDataListener);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/IListModel.java b/freeplane/src/org/freeplane/core/util/collection/IListModel.java
new file mode 100644
index 0000000..8642ff8
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/collection/IListModel.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.core.util.collection;
+
+import javax.swing.ListModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public interface IListModel extends ListModel {
+ /**
+ */
+ void add(Object o);
+
+ /**
+ *
+ */
+ void clear();
+
+ /**
+ */
+ boolean contains(Object o);
+
+ /**
+ */
+ int getIndexOf(Object o);
+
+ void remove(Object o);
+
+ void replace(Object oldO, Object newO);
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/MultipleValueMap.java b/freeplane/src/org/freeplane/core/util/collection/MultipleValueMap.java
new file mode 100644
index 0000000..3f70a86
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/collection/MultipleValueMap.java
@@ -0,0 +1,59 @@
+/*
+ * 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 java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.01.2009
+ */
+public class MultipleValueMap<K, V> {
+ final private Map<K, List<V>> map;
+
+ public MultipleValueMap() {
+ super();
+ this.map = new HashMap<K, List<V>>();
+ }
+
+ public boolean containsKey(final Object key) {
+ return map.containsKey(key);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<V> get(final Object key) {
+ final List<V> list = map.get(key);
+ return list == null ? Collections.EMPTY_LIST : list;
+ }
+
+ // FIXME: value is not used - how should it? - VB
+ public List<V> put(final K key, final V value) {
+ List<V> list = map.get(key);
+ if (list == null) {
+ list = new LinkedList<V>();
+ map.put(key, list);
+ }
+ return list;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/SortedComboBoxModel.java b/freeplane/src/org/freeplane/core/util/collection/SortedComboBoxModel.java
new file mode 100644
index 0000000..1f708f7
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/collection/SortedComboBoxModel.java
@@ -0,0 +1,182 @@
+/*
+ * 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 java.util.Iterator;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.swing.AbstractListModel;
+import javax.swing.ComboBoxModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class SortedComboBoxModel extends AbstractListModel implements ComboBoxModel, IListModel, Iterable<Object> {
+ static private class Comparator implements Comparable<Object>{
+ final private Object obj;
+ private Comparator(Object obj) {
+ this.obj = obj;
+ }
+ public int compareTo(Object o) {
+ return compareTo((Comparator)o);
+ }
+ private int compareTo(Comparator o) {
+ final int stringCompare = obj.toString().compareTo(o.obj.toString());
+ if(stringCompare != 0)
+ return stringCompare;
+ final int typeCompare = obj.getClass().getName().compareTo(o.obj.getClass().getName());
+ return typeCompare;
+ }
+ @Override
+ public int hashCode() {
+ return obj.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return obj.getClass().equals(o.getClass()) && obj.equals(((Comparator)o).obj);
+ }
+ @Override
+ public String toString() {
+ return obj.toString();
+ }
+
+ }
+ private static final long serialVersionUID = 1L;
+ private Object selectedItem;
+ private final SortedMap<Comparator, Object> model;
+
+ public SortedComboBoxModel() {
+ model = new TreeMap<Comparator, Object>();
+ }
+
+ public void add(final Object element) {
+ if(addImpl(element))
+ fireContentsChanged(this, 0, getSize());
+ }
+
+ private boolean addImpl(final Object element) {
+ final Comparator key = key(element);
+ if(model.containsKey(key))
+ return false;
+ model.put(key, element);
+ return true;
+ }
+
+ private Comparator key(Object o){
+ return new Comparator(o);
+ }
+ public void addAll(final Object elements[]) {
+ for(Object e : elements)
+ addImpl(e);
+ fireContentsChanged(this, 0, getSize());
+ }
+
+ public void clear() {
+ final int oldSize = getSize();
+ if (oldSize > 0) {
+ model.clear();
+ fireIntervalRemoved(this, 0, oldSize - 1);
+ }
+ }
+
+ public boolean contains(final Object element) {
+ return model.containsKey(key(element));
+ }
+
+ public Object firstElement() {
+ return model.get(model.firstKey());
+ }
+
+ public Object getElementAt(final int index) {
+ return model.values().toArray()[index];
+ }
+
+ /**
+ */
+ public int getIndexOf(final Object o) {
+ int count = -1;
+ for (final Object element : this) {
+ count++;
+ if (element.equals(o)) {
+ return count;
+ }
+ }
+ return -1;
+ }
+
+ public int getSize() {
+ return model.size();
+ }
+
+ public Iterator<Object> iterator() {
+ return model.values().iterator();
+ }
+
+ public Object lastElement() {
+ return model.get(model.lastKey());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#delete(java.lang.Object)
+ */
+ public void remove(final Object element) {
+ if (null != model.remove(key(element))) {
+ fireContentsChanged(this, 0, getSize());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#replace(java.lang.Object,
+ * java.lang.Object)
+ */
+ public void replace(final Object oldO, final Object newO) {
+ if (oldO.equals(newO)) {
+ return;
+ }
+ final boolean removed = null != model.remove(key(oldO));
+ final boolean added = addImpl(newO);
+ if (removed || added) {
+ fireContentsChanged(this, 0, getSize());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.ComboBoxModel#getSelectedItem()
+ */
+ public Object getSelectedItem() {
+ return selectedItem;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.ComboBoxModel#setSelectedItem(java.lang.Object)
+ */
+ public void setSelectedItem(final Object o) {
+ selectedItem = o;
+ fireContentsChanged(this, -1, -1);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/SortedMapVector.java b/freeplane/src/org/freeplane/core/util/collection/SortedMapVector.java
new file mode 100644
index 0000000..c732caa
--- /dev/null
+++ b/freeplane/src/org/freeplane/core/util/collection/SortedMapVector.java
@@ -0,0 +1,167 @@
+/*
+ * 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 java.util.NoSuchElementException;
+import java.util.Vector;
+
+/**
+ * @author Dimitry Polivaev
+ */
+ at SuppressWarnings({"rawtypes", "unchecked"})
+public class SortedMapVector {
+ private static class MapElement {
+ final private Comparable key;
+ private final Object value;
+
+ public MapElement(final Comparable key, final Object value) {
+ super();
+ this.key = key;
+ this.value = value;
+ }
+
+ Comparable getKey() {
+ return key;
+ }
+
+ Object getValue() {
+ return value;
+ }
+ }
+
+ private static final int CAPACITY_INCREMENT = 10;
+ private static final int ELEMENT_NOT_FOUND_FLAG = 1 << 31;
+ final private Vector<MapElement> elements;
+
+ public SortedMapVector() {
+ elements = new Vector<MapElement>(0, SortedMapVector.CAPACITY_INCREMENT);
+ }
+
+ public int add(final Comparable key, final Object value) {
+ int index = findElement(key);
+ if ((index & SortedMapVector.ELEMENT_NOT_FOUND_FLAG) != 0) {
+ index &= ~SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ elements.add(index, new MapElement(key, value));
+ }
+ return index;
+ }
+
+ public int capacity() {
+ return elements.capacity();
+ }
+
+ public void clear() {
+ elements.clear();
+ }
+
+ public boolean containsKey(final Comparable key) {
+ final int index = findElement(key);
+ return (index & SortedMapVector.ELEMENT_NOT_FOUND_FLAG) == 0;
+ }
+
+ private int findElement(final Comparable key) {
+ return findElement(key, 0, size());
+ }
+
+ private int findElement(final Comparable key, final int first, final int size) {
+ if (size == 0) {
+ return first | SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ }
+ final int halfSize = size / 2;
+ final int middle = first + halfSize;
+ final MapElement middleElement = elements.get(middle);
+ int comparationResult = key.compareTo(middleElement.getKey());
+ final int last = first + size - 1;
+ if (comparationResult < 0) {
+ if (halfSize <= 1) {
+ if (middle != first) {
+ comparationResult = key.compareTo(elements.get(first).getKey());
+ }
+ if (comparationResult < 0) {
+ return first | SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ }
+ if (comparationResult == 0) {
+ return first;
+ }
+ return middle | SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ }
+ return findElement(key, first, halfSize);
+ }
+ else if (comparationResult == 0) {
+ return middle;
+ }
+ else {
+ if (halfSize <= 1) {
+ if (middle != last) {
+ comparationResult = key.compareTo(elements.get(last).getKey());
+ }
+ if (comparationResult < 0) {
+ return last | SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ }
+ if (comparationResult == 0) {
+ return last;
+ }
+ return last + 1 | SortedMapVector.ELEMENT_NOT_FOUND_FLAG;
+ }
+ return findElement(key, middle, size - halfSize);
+ }
+ }
+
+ public Comparable getKey(final int index) {
+ return elements.get(index).getKey();
+ }
+
+ public Object getValue(final Comparable key) {
+ final int index = findElement(key);
+ if ((index & SortedMapVector.ELEMENT_NOT_FOUND_FLAG) == 0) {
+ return elements.get(index).getValue();
+ }
+ throw new NoSuchElementException();
+ }
+
+ public Object getValue(final int index) {
+ return elements.get(index).getValue();
+ }
+
+ public int indexOf(final Comparable key) {
+ final int index = findElement(key);
+ if ((index & SortedMapVector.ELEMENT_NOT_FOUND_FLAG) == 0) {
+ return index;
+ }
+ return -1;
+ }
+
+ public boolean remove(final Comparable key) {
+ final int index = findElement(key);
+ if ((index & SortedMapVector.ELEMENT_NOT_FOUND_FLAG) == 0) {
+ elements.remove(index);
+ return true;
+ }
+ return false;
+ }
+
+ public void remove(final int index) {
+ elements.removeElementAt(index);
+ }
+
+ public int size() {
+ return elements.size();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/Attribute.java b/freeplane/src/org/freeplane/features/attribute/Attribute.java
new file mode 100644
index 0000000..aeadc7b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/Attribute.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.attribute;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class Attribute {
+ private String name;
+ private Object value;
+
+ /**
+ * @param pAttribute
+ * deep copy.
+ */
+ public Attribute(final Attribute pAttribute) {
+ name = pAttribute.name;
+ value = pAttribute.value;
+ }
+
+ /**
+ */
+ public Attribute(final String name) {
+ this.name = name;
+ value = "";
+ }
+
+ public Attribute(final String name, final Object value) {
+ this.name = name;
+ setValue(value);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public void setValue(final Object value) {
+ if(value == null)
+ throw new NullPointerException();
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return "[" + name + ", " + value + "]";
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java b/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java
new file mode 100644
index 0000000..99b659d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java
@@ -0,0 +1,324 @@
+/*
+ * 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
new file mode 100644
index 0000000..6445994
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeCompareCondition.java
@@ -0,0 +1,123 @@
+/*
+ * 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
new file mode 100644
index 0000000..7e23dba
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeConditionController.java
@@ -0,0 +1,186 @@
+/*
+ * 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.ViewController;
+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 ViewController.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
new file mode 100644
index 0000000..df4348a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeContainsCondition.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 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(!matchCase)
+// text = text.toLowerCase();
+
+ return stringMatchingStrategy.matches(comparedValue, text, true, matchCase);
+
+// if(text.contains(comparedValue))
+// 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
new file mode 100644
index 0000000..d7bf239
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeController.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.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);
+ if(object instanceof URI){
+ tooltip.append("<a");
+ tooltip.append(" href=\"");
+ tooltip.append(object);
+ tooltip.append("\"");
+ tooltip.append(">");
+ tooltip.append(object);
+ tooltip.append("</a>");
+ }
+ else{
+ final String value = getTransformedValue(node, textController, String.valueOf(object));
+ tooltip.append(value);
+ }
+ tooltip.append("</td></tr>");
+ }
+ tooltip.append("</table></body></html>");
+ return tooltip.toString();
+ }
+
+ private String getTransformedValue(NodeModel node, final TextController textController, final String originalText) {
+ try {
+ final String text = textController.getTransformedText(originalText, node, null);
+ final boolean markTransformedText = TextController.isMarkTransformedTextSet();
+ final String unicodeText = HtmlUtils.unicodeToHTMLUnicodeEntity(text);
+ if (markTransformedText && text != originalText)
+ return colorize(unicodeText, "green");
+ else
+ return unicodeText;
+ }
+ catch (Throwable e) {
+ LogUtils.warn(e.getMessage(), e);
+ return colorize(
+ TextUtils.format("MainView.errorUpdateText", originalText, 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
new file mode 100644
index 0000000..0bf79d3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeExistsCondition.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.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
new file mode 100644
index 0000000..a8913c9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeMatchesCondition.java
@@ -0,0 +1,109 @@
+/*
+ * 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;
+ }
+ 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
new file mode 100644
index 0000000..c446107
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeNotExistsCondition.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.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
new file mode 100644
index 0000000..e360748
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeRegistry.java
@@ -0,0 +1,439 @@
+/*
+ * 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/AttributeRegistryComboBoxColumnModel.java b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java
new file mode 100644
index 0000000..cf8a0c6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java
@@ -0,0 +1,150 @@
+/*
+ * 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.AbstractListModel;
+import javax.swing.ComboBoxModel;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+
+import org.freeplane.core.util.collection.IListModel;
+
+class AttributeRegistryComboBoxColumnModel extends AbstractListModel implements TableModelListener, ComboBoxModel,
+ IListModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private AttributeRegistry model;
+ private Object selectedItem;
+
+ public AttributeRegistryComboBoxColumnModel(final AttributeRegistry model) {
+ super();
+ this.model = model;
+ model.getTableModel().addTableModelListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#add(java.lang.Object)
+ */
+ public void add(final Object o) {
+ final String s = o.toString();
+ if (-1 == model.indexOf(s)) {
+ model.getAttributeController().performRegistryAttributeValue(s, "", false);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.controller.filter.util.SortedListModel#clear()
+ */
+ public void clear() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#contains(java.lang.Object
+ * )
+ */
+ public boolean contains(final Object o) {
+ return model.containsElement(o.toString());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.ListModel#getElementAt(int)
+ */
+ public Object getElementAt(final int row) {
+ return model.getKey(row);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#getIndexOf(java.lang.
+ * Object)
+ */
+ public int getIndexOf(final Object o) {
+ return model.indexOf(o.toString());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.ComboBoxModel#getSelectedItem()
+ */
+ public Object getSelectedItem() {
+ return selectedItem;
+ }
+
+ public int getSize() {
+ return model.size();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#delete(java.lang.Object)
+ */
+ public void remove(final Object o) {
+ model.removeAtribute(o);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.util.SortedListModel#replace(java.lang.Object,
+ * java.lang.Object)
+ */
+ public void replace(final Object oldO, final Object newO) {
+ model.getAttributeController().performReplaceAtributeName(oldO.toString(), newO.toString());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.ComboBoxModel#setSelectedItem(java.lang.Object)
+ */
+ public void setSelectedItem(final Object o) {
+ selectedItem = o;
+ fireContentsChanged(this, -1, -1);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event.
+ * TableModelEvent)
+ */
+ public void tableChanged(final TableModelEvent e) {
+ if (e.getType() == TableModelEvent.DELETE) {
+ fireIntervalRemoved(this, e.getFirstRow(), e.getLastRow());
+ return;
+ }
+ if (e.getType() == TableModelEvent.UPDATE) {
+ fireContentsChanged(this, e.getFirstRow(), e.getLastRow());
+ return;
+ }
+ if (e.getType() == TableModelEvent.INSERT) {
+ fireIntervalAdded(this, e.getFirstRow(), e.getLastRow());
+ return;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistryElement.java b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryElement.java
new file mode 100644
index 0000000..88262ad
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryElement.java
@@ -0,0 +1,204 @@
+/*
+ * 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.TypeReference;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeRegistryElement {
+ private class RegisteredAttributeValues extends SortedComboBoxModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void _add(final Object element) {
+ super.add(element);
+ }
+
+ public void _remove(final Object element) {
+ super.remove(element);
+ }
+
+ public void _replace(final Object oldO, final Object newO) {
+ super.replace(oldO, newO);
+ }
+
+ @Override
+ public void add(final Object element) {
+ registry.getAttributeController().performRegistryAttributeValue(getKey(), element.toString(), true);
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public void remove(final Object element) {
+ registry.getAttributeController().performRemoveAttributeValue(getKey(), element.toString());
+ }
+
+ @Override
+ public void replace(final Object oldO, final Object newO) {
+ registry.getAttributeController().performReplaceAttributeValue(getKey(), oldO.toString(), newO.toString());
+ }
+ }
+
+ private boolean isManual;
+ private boolean isRestricted;
+ private boolean isVisible;
+ private String key;
+ final private AttributeRegistry registry;
+ private Boolean restrictionModel;
+ final private RegisteredAttributeValues values;
+ private Boolean visibilityModel;
+
+ public AttributeRegistryElement(final AttributeRegistry registry, final String key) {
+ super();
+ this.key = key;
+ this.registry = registry;
+ values = new RegisteredAttributeValues();
+ isVisible = false;
+ visibilityModel = isVisible;
+ isRestricted = false;
+ isManual = false;
+ restrictionModel = isRestricted;
+ }
+
+ public void addValue(final Object s) {
+ values._add(s);
+ registry.fireAttributesChanged();
+ }
+
+ public Comparable<?> getKey() {
+ return key;
+ }
+
+ Boolean getRestriction() {
+ return restrictionModel;
+ }
+
+ public SortedComboBoxModel getValues() {
+ return values;
+ }
+
+ Boolean getVisibilityModel() {
+ return visibilityModel;
+ }
+
+ public boolean isManual() {
+ return isManual;
+ }
+
+ public boolean isRestricted() {
+ return isRestricted;
+ }
+
+ public boolean isVisible() {
+ return isVisible;
+ }
+
+ public void removeAllValues() {
+ values.clear();
+ registry.fireAttributesChanged();
+ }
+
+ public void removeValue(final Object s) {
+ values._remove(s);
+ registry.fireAttributesChanged();
+ }
+
+ public void replaceValue(final String oldValue, final String newValue) {
+ values._replace(oldValue, newValue);
+ registry.fireAttributesChanged();
+ }
+
+ /**
+ */
+ public XMLElement save() {
+ final XMLElement element = new XMLElement();
+ if (isVisible()) {
+ element.setAttribute("VISIBLE", "true");
+ }
+ if (isManual()) {
+ element.setAttribute("MANUAL", "true");
+ }
+ if (isRestricted()) {
+ element.setAttribute("RESTRICTED", "true");
+ }
+ if (isManual() || isRestricted()) {
+ for (int i = 0; i < values.getSize(); i++) {
+ final XMLElement xmlValue = new XMLElement();
+ xmlValue.setName(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE);
+ final Object value = values.getElementAt(i);
+ final String string = value.toString();
+ xmlValue.setAttribute("VALUE", string);
+ if(! (value instanceof String)){
+ final String spec = TypeReference.toSpec(value);
+ xmlValue.setAttribute("OBJECT", spec);
+ }
+ element.addChild(xmlValue);
+ }
+ }
+ element.setName(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME);
+ element.setAttribute("NAME", key.toString());
+ return element;
+ }
+
+ public void setKey(final String key) {
+ this.key = key;
+ }
+
+ public void setManual(final boolean isManual) {
+ this.isManual = isManual;
+ }
+
+ public void setRestriction(final boolean isRestricted) {
+ this.isRestricted = isRestricted;
+ restrictionModel = isRestricted;
+ registry.fireAttributesChanged();
+ }
+
+ void setRestrictionModel(final Boolean restrictionModel) {
+ this.restrictionModel = restrictionModel;
+ }
+
+ public void setVisibility(final boolean isVisible) {
+ if (this.isVisible != isVisible) {
+ this.isVisible = isVisible;
+ visibilityModel = Boolean.valueOf(isVisible);
+ if (isVisible) {
+ registry.incrementVisibleElementsNumber();
+ }
+ else {
+ registry.decrementVisibleElementsNumber();
+ }
+ registry.fireAttributeLayoutChanged();
+ }
+ }
+
+ void setVisibilityModel(final Boolean visibilityModel) {
+ this.visibilityModel = visibilityModel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistryTableModel.java b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryTableModel.java
new file mode 100644
index 0000000..01b3b02
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeRegistryTableModel.java
@@ -0,0 +1,190 @@
+/*
+ * 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.table.AbstractTableModel;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.IListModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeRegistryTableModel extends AbstractTableModel {
+ static private String attributeColumnName = null;
+ static private String editorColumnName = null;
+ static private String restrictionColumnName = null;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ static private String visibilityColumnName = null;
+ final private String allAttributes = TextUtils.getText("attributes_all");
+ final private AttributeRegistry attributeRegistry;
+
+ AttributeRegistryTableModel(final AttributeRegistry registry) {
+ attributeRegistry = registry;
+ }
+
+ /**
+ */
+ public void fireRestrictionsUpdated(final int row) {
+ fireTableRowsUpdated(row + 1, row + 1);
+ }
+
+ @Override
+ public void fireTableCellUpdated(final int row, final int column) {
+ super.fireTableCellUpdated(row + 1, column);
+ }
+
+ public void fireTableRowsDeleted() {
+ if (getRowCount() > 1) {
+ fireTableRowsDeleted(1, getRowCount() - 1);
+ }
+ }
+
+ @Override
+ public void fireTableRowsDeleted(final int firstRow, final int lastRow) {
+ super.fireTableRowsDeleted(firstRow + 1, lastRow + 1);
+ }
+
+ @Override
+ public void fireTableRowsInserted(final int firstRow, final int lastRow) {
+ super.fireTableRowsInserted(firstRow + 1, lastRow + 1);
+ }
+
+ @Override
+ public void fireTableRowsUpdated(final int firstRow, final int lastRow) {
+ super.fireTableRowsUpdated(firstRow + 1, lastRow + 1);
+ }
+
+ /**
+ */
+ public void fireVisibilityUpdated(final int row) {
+ fireTableCellUpdated(row + 1, 1);
+ }
+
+ @Override
+ public Class<?> getColumnClass(final int c) {
+ switch (c) {
+ case 0:
+ return String.class;
+ case 1:
+ return Boolean.class;
+ case 2:
+ return Boolean.class;
+ case 3:
+ return IListModel.class;
+ }
+ return Object.class;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getColumnCount()
+ */
+ public int getColumnCount() {
+ return 4;
+ }
+
+ @Override
+ public String getColumnName(final int column) {
+ switch (column) {
+ case 0:
+ if (AttributeRegistryTableModel.attributeColumnName == null) {
+ AttributeRegistryTableModel.attributeColumnName = TextUtils.getText("attributes_attribute");
+ }
+ return AttributeRegistryTableModel.attributeColumnName;
+ case 1:
+ if (AttributeRegistryTableModel.visibilityColumnName == null) {
+ AttributeRegistryTableModel.visibilityColumnName = TextUtils.getText("attributes_visible");
+ }
+ return AttributeRegistryTableModel.visibilityColumnName;
+ case 2:
+ if (AttributeRegistryTableModel.restrictionColumnName == null) {
+ AttributeRegistryTableModel.restrictionColumnName = TextUtils.getText("attributes_restriction");
+ }
+ return AttributeRegistryTableModel.restrictionColumnName;
+ case 3:
+ if (AttributeRegistryTableModel.editorColumnName == null) {
+ AttributeRegistryTableModel.editorColumnName = TextUtils.getText("attributes_edit");
+ }
+ return AttributeRegistryTableModel.editorColumnName;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getRowCount()
+ */
+ public int getRowCount() {
+ return attributeRegistry.size() + 1;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getValueAt(int, int)
+ */
+ public Object getValueAt(int row, final int col) {
+ if (row == 0 && col < 2) {
+ if (col == 0) {
+ return allAttributes;
+ }
+ return null;
+ }
+ row--;
+ switch (col) {
+ case 0:
+ return attributeRegistry.getKey(row);
+ case 1:
+ return attributeRegistry.getElement(row).getVisibilityModel();
+ case 2:
+ return attributeRegistry.getRestriction(row);
+ case 3:
+ return attributeRegistry.getValues(row);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isCellEditable(final int row, final int col) {
+ return col >= 1;
+ }
+
+ @Override
+ public void setValueAt(final Object o, final int row, final int col) {
+ if (row == 0 && col != 2) {
+ return;
+ }
+ if (col == 3) {
+ return;
+ }
+ final Boolean value = (Boolean) o;
+ switch (col) {
+ case 1:
+ attributeRegistry.setVisibilityModel(row - 1, value);
+ break;
+ case 2:
+ attributeRegistry.setRestrictionModel(row - 1, value);
+ break;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.java b/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.java
new file mode 100644
index 0000000..6476ec1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.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 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/AttributeViewTypeAction.java b/freeplane/src/org/freeplane/features/attribute/AttributeViewTypeAction.java
new file mode 100644
index 0000000..e1dce5b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/AttributeViewTypeAction.java
@@ -0,0 +1,23 @@
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+public abstract class AttributeViewTypeAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public AttributeViewTypeAction(final String key) {
+ super(key);
+ }
+
+ protected void setAttributeViewType(final String type) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ ModelessAttributeController.getController().setAttributeViewType(map, type);
+ }
+
+ protected String getAttributeViewType() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ return ModelessAttributeController.getController().getAttributeViewType(map);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/ColumnWidthChangeEvent.java b/freeplane/src/org/freeplane/features/attribute/ColumnWidthChangeEvent.java
new file mode 100644
index 0000000..28545e1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/ColumnWidthChangeEvent.java
@@ -0,0 +1,44 @@
+/*
+ * 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.EventObject;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ColumnWidthChangeEvent extends EventObject {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private int col;
+
+ /**
+ */
+ public ColumnWidthChangeEvent(final Object source, final int col) {
+ super(source);
+ this.col = col;
+ }
+
+ public int getColumnNumber() {
+ return col;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/HideAllAttributesAction.java b/freeplane/src/org/freeplane/features/attribute/HideAllAttributesAction.java
new file mode 100644
index 0000000..e955c2e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/HideAllAttributesAction.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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.SelectableAction;
+
+ at SelectableAction(checkOnPopup = true)
+class HideAllAttributesAction extends AttributeViewTypeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public HideAllAttributesAction() {
+ super("HideAllAttributesAction");
+ };
+
+ public void actionPerformed(final ActionEvent e) {
+ setAttributeViewType(AttributeTableLayoutModel.HIDE_ALL);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(AttributeTableLayoutModel.HIDE_ALL.equals(getAttributeViewType()));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java b/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java
new file mode 100644
index 0000000..3b3076e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java
@@ -0,0 +1,35 @@
+/*
+ * 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/IAttributesListener.java b/freeplane/src/org/freeplane/features/attribute/IAttributesListener.java
new file mode 100644
index 0000000..29c9147
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/IAttributesListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.EventListener;
+
+import javax.swing.event.ChangeEvent;
+
+public interface IAttributesListener extends EventListener {
+ void attributesChanged(ChangeEvent changeEvent);
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/IColumnWidthChangeListener.java b/freeplane/src/org/freeplane/features/attribute/IColumnWidthChangeListener.java
new file mode 100644
index 0000000..ac3b396
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/IColumnWidthChangeListener.java
@@ -0,0 +1,31 @@
+/*
+ * 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.EventListener;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public interface IColumnWidthChangeListener extends EventListener {
+ /**
+ */
+ void columnWidthChanged(ColumnWidthChangeEvent event);
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/ModelessAttributeController.java b/freeplane/src/org/freeplane/features/attribute/ModelessAttributeController.java
new file mode 100644
index 0000000..ec4722c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/ModelessAttributeController.java
@@ -0,0 +1,81 @@
+/*
+ * 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.extension.IExtension;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ModelessAttributeController implements IExtension {
+ public static final String ATTRIBUTE_VIEW_TYPE = "AttributeViewType";
+
+ public static ModelessAttributeController getController() {
+ Controller controller = Controller.getCurrentController();
+ return (ModelessAttributeController) controller.getExtension(ModelessAttributeController.class);
+ }
+
+ public static void install() {
+ Controller controller = Controller.getCurrentController();
+ controller.addExtension(ModelessAttributeController.class, new ModelessAttributeController());
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(1000, new AttributeConditionController());
+ }
+
+// // // final private Controller controller;
+
+ public ModelessAttributeController() {
+ super();
+// this.controller = controller;
+ Controller controller = Controller.getCurrentController();
+ final AFreeplaneAction showAllAttributes = new ShowAllAttributesAction();
+ final AFreeplaneAction showSelectedAttributes = new ShowSelectedAttributesAction();
+ final AFreeplaneAction hideAllAttributes = new HideAllAttributesAction();
+ controller.addAction(showAllAttributes);
+ controller.addAction(showSelectedAttributes);
+ controller.addAction(hideAllAttributes);
+ }
+
+ protected void setAttributeViewType(final MapModel map, final String type) {
+ final String attributeViewType = getAttributeViewType(map);
+ if (attributeViewType != null && attributeViewType != type) {
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ attributes.setAttributeViewType(type);
+ final MapChangeEvent mapChangeEvent = new MapChangeEvent(this, map, ATTRIBUTE_VIEW_TYPE, attributeViewType, type);
+ Controller.getCurrentModeController().getMapController().fireMapChanged(mapChangeEvent);
+ }
+ }
+
+ protected String getAttributeViewType(final MapModel map) {
+ if (map == null) {
+ return null;
+ }
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ if (attributes == null) {
+ return null;
+ }
+ final String attributeViewType = attributes.getAttributeViewType();
+ return attributeViewType;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.java b/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.java
new file mode 100644
index 0000000..0b3df5a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.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;
+
+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/ShowAllAttributesAction.java b/freeplane/src/org/freeplane/features/attribute/ShowAllAttributesAction.java
new file mode 100644
index 0000000..8ab39cb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/ShowAllAttributesAction.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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.SelectableAction;
+
+ at SelectableAction(checkOnPopup = true)
+class ShowAllAttributesAction extends AttributeViewTypeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public ShowAllAttributesAction() {
+ super("ShowAllAttributesAction");
+ };
+
+ public void actionPerformed(final ActionEvent e) {
+ setAttributeViewType(AttributeTableLayoutModel.SHOW_ALL);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(AttributeTableLayoutModel.SHOW_ALL.equals(getAttributeViewType()));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/ShowSelectedAttributesAction.java b/freeplane/src/org/freeplane/features/attribute/ShowSelectedAttributesAction.java
new file mode 100644
index 0000000..ea2fb46
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/ShowSelectedAttributesAction.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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.SelectableAction;
+
+ at SelectableAction(checkOnPopup = true)
+class ShowSelectedAttributesAction extends AttributeViewTypeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public ShowSelectedAttributesAction() {
+ super("ShowSelectedAttributesAction");
+ };
+
+ public void actionPerformed(final ActionEvent e) {
+ setAttributeViewType(AttributeTableLayoutModel.SHOW_SELECTED);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(AttributeTableLayoutModel.SHOW_SELECTED.equals(getAttributeViewType()));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
new file mode 100644
index 0000000..b9be01a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
@@ -0,0 +1,182 @@
+/*
+ * 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
new file mode 100644
index 0000000..3393d86
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java
@@ -0,0 +1,508 @@
+/*
+ * 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
new file mode 100644
index 0000000..4d6aa56
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java
@@ -0,0 +1,47 @@
+/*
+ * 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
new file mode 100644
index 0000000..cf9a8ff
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java
@@ -0,0 +1,297 @@
+/*
+ * 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/AttributeRegistryTable.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java
new file mode 100644
index 0000000..2e8e4f2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java
@@ -0,0 +1,216 @@
+/*
+ * 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.Component;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.AbstractCellEditor;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.SwingConstants;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.IListModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AttributeRegistryTable extends JTable {
+ static private class ButtonEditor extends AbstractCellEditor implements TableCellEditor {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JButton editButton;
+ private Object value;
+
+ public ButtonEditor(final Action action) {
+ editButton = new JButton(action);
+ editButton.setFocusable(false);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.CellEditor#getCellEditorValue()
+ */
+ public Object getCellEditorValue() {
+ return value;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax
+ * .swing.JTable, java.lang.Object, boolean, int, int)
+ */
+ public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected,
+ final int row, final int column) {
+ this.value = value;
+ return editButton;
+ }
+ }
+
+ static private class ButtonRenderer implements TableCellRenderer {
+ final private JButton renderingEditButton;
+
+ public ButtonRenderer(final Icon image, final String toolTip) {
+ renderingEditButton = new JButton(image);
+ renderingEditButton.setFocusable(false);
+ renderingEditButton.setToolTipText(toolTip);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.table.TableCellRenderer#getTableCellRendererComponent
+ * (javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
+ */
+ public Component getTableCellRendererComponent(final JTable table, final Object value,
+ final boolean isSelected, final boolean hasFocus, final int row,
+ final int column) {
+ return renderingEditButton;
+ }
+ }
+
+ private class ToggleAllAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ToggleAllAction() {
+ super(null, AttributeRegistryTable.checkBoxImage);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final int rowCount = getRowCount();
+ if (rowCount <= 1) {
+ return;
+ }
+ Boolean checked = (Boolean) getValueAt(1, 1);
+ checked = Boolean.valueOf(!checked.booleanValue());
+ for (int i = 1; i < rowCount; i++) {
+ setValueAt(checked, i, 1);
+ }
+ }
+ }
+
+ static final private Icon checkBoxImage = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/checkbox12.png"));
+ private static final ButtonRenderer editButtonRenderer = new ButtonRenderer(AttributeManagerDialog.editButtonImage,
+ TextUtils.getText("attributes_edit_tooltip"));
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private AttributeManagerDialog.EditListAction editListAction;
+ final private ButtonEditor selectAllButtonEditor;
+ final private ButtonRenderer selectAllButtonRenderer;
+
+ public AttributeRegistryTable(final AttributeManagerDialog.EditListAction editListAction) {
+ super();
+ this.editListAction = editListAction;
+ getTableHeader().setReorderingAllowed(false);
+ selectAllButtonRenderer = new ButtonRenderer(AttributeRegistryTable.checkBoxImage, TextUtils
+ .getText("attributes_select_all_tooltip"));
+ selectAllButtonEditor = new ButtonEditor(new ToggleAllAction());
+ setDefaultEditor(IListModel.class, new ButtonEditor(editListAction));
+ setDefaultRenderer(IListModel.class, AttributeRegistryTable.editButtonRenderer);
+ setRowHeight(20);
+ setRowSelectionAllowed(false);
+ }
+
+ @Override
+ public TableCellEditor getCellEditor(final int row, final int column) {
+ if (row == 0 && column == 1) {
+ return selectAllButtonEditor;
+ }
+ return super.getCellEditor(row, column);
+ }
+
+ @Override
+ public TableCellRenderer getCellRenderer(final int row, final int column) {
+ if (row == 0 && column == 1) {
+ return selectAllButtonRenderer;
+ }
+ final TableCellRenderer tableCellRenderer = super.getCellRenderer(row, column);
+ if (tableCellRenderer instanceof JLabel) {
+ final JLabel label = (JLabel) tableCellRenderer;
+ if (row == 0) {
+ label.setHorizontalAlignment(SwingConstants.CENTER);
+ }
+ else {
+ label.setHorizontalAlignment(SwingConstants.LEFT);
+ }
+ }
+ else if (tableCellRenderer instanceof JComponent) {
+ final JComponent label = (JComponent) tableCellRenderer;
+ switch (column) {
+ case 1:
+ label.setToolTipText(TextUtils.getText("attributes_visible_tooltip"));
+ break;
+ case 2:
+ if (row == 0) {
+ label.setToolTipText(TextUtils.getText("attributes_restricted_attributes_tooltip"));
+ }
+ else {
+ label.setToolTipText(TextUtils.getText("attributes_restricted_values_tooltip"));
+ }
+ break;
+ }
+ }
+ return tableCellRenderer;
+ }
+
+ @Override
+ public Component prepareEditor(final TableCellEditor editor, final int row, final int column) {
+ if (column == 3) {
+ final IListModel list = (IListModel) getModel().getValueAt(row, column);
+ final String title = getModel().getValueAt(row, 0).toString();
+ final String labelText = TextUtils.getText("attribute_list_box_label_text");
+ editListAction.setListBoxModel(title, labelText, list);
+ }
+ return super.prepareEditor(editor, row, column);
+ }
+
+ @Override
+ public void setModel(final TableModel dataModel) {
+ super.setModel(dataModel);
+ if (dataModel.getColumnCount() >= 1) {
+ for (int i = 1; i < getColumnCount(); i++) {
+ getColumnModel().getColumn(i).setMinWidth(20);
+ final int prefWidth = getTableHeader().getDefaultRenderer().getTableCellRendererComponent(this,
+ getColumnName(i), false, false, -1, i).getPreferredSize().width;
+ getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java
new file mode 100644
index 0000000..f60a49d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java
@@ -0,0 +1,66 @@
+/*
+ * 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 org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+
+ at EnabledAction(checkOnNodeChange = true)
+public class AttributeUtilities {
+ /**
+ * @author Stefan Ott
+ *
+ * This class has methods to get informations
+ * about attributes from a NodeModel
+ */
+ private static final long serialVersionUID = 1L;
+
+ public AttributeUtilities() {
+ };
+
+ /**
+ *
+ * @return : the number of attributes attached to the node. 0 for none.
+ */
+ public int getNumberOfAttributes(final NodeModel node) {
+ if (hasAttributes(node)) {
+ final NodeAttributeTableModel natm = NodeAttributeTableModel.getModel(node);
+ return natm.getRowCount();
+ }
+ else {
+ return 0;
+ }
+ }
+
+ /**
+ *
+ * @return : true if the node has at least one attribute attached.
+ */
+ public boolean hasAttributes(final NodeModel node) {
+ final NodeAttributeTableModel natm = NodeAttributeTableModel.getModel(node);
+ if (natm.getRowCount() > 0) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java
new file mode 100644
index 0000000..e5adbad
--- /dev/null
+++ b/freeplane/src/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(checkOnPopup = 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(checkOnPopup = 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
new file mode 100644
index 0000000..8322a67
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..f2e4805
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..46df3a4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/MAttributeController.java
@@ -0,0 +1,870 @@
+/*
+ * 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/RemoveAllAttributesAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java
new file mode 100644
index 0000000..7ebffe7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java
@@ -0,0 +1,69 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at EnabledAction(checkOnNodeChange = true)
+public class RemoveAllAttributesAction extends AMultipleNodeAction {
+ /**
+ * @author Stefan Ott
+ *
+ * This action removes all attribute of a node
+ */
+ private static final long serialVersionUID = 1L;
+
+ public RemoveAllAttributesAction() {
+ super("attributes_RemoveAllAttributesAction");
+ };
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ if (atrUtil.hasAttributes(node)) {
+ final NodeAttributeTableModel natm = NodeAttributeTableModel.getModel(node);
+ final int j = natm.getRowCount();
+ for (int i = 0; i < j; i++) {
+ AttributeController.getController().performRemoveRow(natm, 0);
+ }
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && atrUtil.hasAttributes(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java
new file mode 100644
index 0000000..daea462
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java
@@ -0,0 +1,66 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at EnabledAction(checkOnNodeChange = true)
+public class RemoveFirstAttributeAction extends AMultipleNodeAction {
+ /**
+ * @author Stefan Ott
+ *
+ * This action removes the first attribute of a node
+ */
+ private static final long serialVersionUID = 1L;
+
+ public RemoveFirstAttributeAction() {
+ super("attributes_RemoveFirstAttributeAction");
+ };
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ if (atrUtil.hasAttributes(node)) {
+ final NodeAttributeTableModel natm = NodeAttributeTableModel.getModel(node);
+ AttributeController.getController().performRemoveRow(natm, 0);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && atrUtil.hasAttributes(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java
new file mode 100644
index 0000000..3796bda
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java
@@ -0,0 +1,66 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at EnabledAction(checkOnNodeChange = true)
+public class RemoveLastAttributeAction extends AMultipleNodeAction {
+ /**
+ * @author Stefan Ott
+ *
+ * This action removes the last attribute of a node
+ */
+ private static final long serialVersionUID = 1L;
+
+ public RemoveLastAttributeAction() {
+ super("attributes_RemoveLastAttributeAction");
+ };
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ if (atrUtil.hasAttributes(node)) {
+ final NodeAttributeTableModel natm = NodeAttributeTableModel.getModel(node);
+ AttributeController.getController().performRemoveRow(natm, natm.getRowCount() - 1);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final AttributeUtilities atrUtil = new AttributeUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && atrUtil.hasAttributes(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
new file mode 100644
index 0000000..6208020
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
@@ -0,0 +1,59 @@
+/*
+ * 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
new file mode 100644
index 0000000..535a04c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/ClipboardController.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.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 = size - 1;
+ for (NodeModel node : source) {
+ target.set(i, duplicate(node, false));
+ 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/CopyAction.java b/freeplane/src/org/freeplane/features/clipboard/CopyAction.java
new file mode 100644
index 0000000..cebb9eb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/CopyAction.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.clipboard;
+
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class CopyAction extends AFreeplaneAction {
+// private static final String NAME = "copy";
+ private static final long serialVersionUID = 1L;
+
+ public CopyAction() {
+ super("CopyAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IMapSelection selection = controller.getSelection();
+ if (selection != null) {
+ final ClipboardController clipboardController = (ClipboardController) modeController
+ .getExtension(ClipboardController.class);
+ final Transferable copy = clipboardController.copy(selection);
+ if (copy != null) {
+ clipboardController.setClipboardContents(copy);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopyIDAction.java b/freeplane/src/org/freeplane/features/clipboard/CopyIDAction.java
new file mode 100644
index 0000000..13524b9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/CopyIDAction.java
@@ -0,0 +1,39 @@
+package org.freeplane.features.clipboard;
+
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class CopyIDAction extends AFreeplaneAction {
+ public CopyIDAction() {
+ super("CopyIDAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final Collection<NodeModel> selectedNodes = controller.getSelection().getSelection();
+ StringBuilder sb = null;
+ for (final NodeModel node : selectedNodes) {
+ if (sb == null) {
+ sb = new StringBuilder();
+ }
+ else {
+ sb.append(", ");
+ }
+ sb.append(node.createID());
+ }
+ final String idString = sb.toString();
+ final ClipboardController clipboardController = (ClipboardController) Controller.getCurrentModeController().getExtension(
+ ClipboardController.class);
+ clipboardController.setClipboardContents(new StringSelection(idString));
+ controller.getViewController().out(idString);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopyNodeURIAction.java b/freeplane/src/org/freeplane/features/clipboard/CopyNodeURIAction.java
new file mode 100644
index 0000000..81725ed
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/CopyNodeURIAction.java
@@ -0,0 +1,36 @@
+package org.freeplane.features.clipboard;
+
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.io.File;
+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;
+
+public class CopyNodeURIAction extends AFreeplaneAction {
+ public CopyNodeURIAction() {
+ super("CopyNodeURIAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel node = controller.getSelection().getSelected();
+ File mindmapFile = node.getMap().getFile();
+ if(mindmapFile == null) {
+ UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
+ return;
+ }
+ final String idString = mindmapFile.toURI().toString() + '#' + node.createID();
+ final ClipboardController clipboardController = (ClipboardController) Controller.getCurrentModeController().getExtension(
+ ClipboardController.class);
+ clipboardController.setClipboardContents(new StringSelection(idString));
+ controller.getViewController().out(idString);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopySingleAction.java b/freeplane/src/org/freeplane/features/clipboard/CopySingleAction.java
new file mode 100644
index 0000000..f1dfd1e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/CopySingleAction.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.features.clipboard;
+
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class CopySingleAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CopySingleAction() {
+ super("CopySingleAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final Collection<NodeModel> selection = controller.getSelection().getSelection();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Transferable copy = ((ClipboardController) modeController.getExtension(ClipboardController.class))
+ .copySingle(selection);
+ if (copy != null) {
+ ((ClipboardController) modeController.getExtension(ClipboardController.class)).setClipboardContents(copy);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java b/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java
new file mode 100644
index 0000000..1bcae3a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java
@@ -0,0 +1,521 @@
+/*
+ * 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.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 {
+ 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("" + MindMapHTMLWriter.el + "<script type=\"text/javascript\">" + MindMapHTMLWriter.el
+ + " // Here we implement folding. It works fine with MSIE5.5, MSIE6.0 and" + MindMapHTMLWriter.el
+ + " // Mozilla 0.9.6." + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + " if (document.layers) {" + MindMapHTMLWriter.el + " //Netscape 4 specific code"
+ + MindMapHTMLWriter.el + " pre = 'document.';" + MindMapHTMLWriter.el + " post = ''; }"
+ + MindMapHTMLWriter.el + " if (document.getElementById) {" + MindMapHTMLWriter.el
+ + " //Netscape 6 specific code" + MindMapHTMLWriter.el
+ + " pre = 'document.getElementById(\"';" + MindMapHTMLWriter.el + " post = '\").style'; }"
+ + MindMapHTMLWriter.el + " if (document.all) {" + MindMapHTMLWriter.el + " //IE4+ specific code"
+ + MindMapHTMLWriter.el + " pre = 'document.all.';" + MindMapHTMLWriter.el
+ + " post = '.style'; }" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + "function layer_exists(layer) {" + MindMapHTMLWriter.el + " try {" + MindMapHTMLWriter.el
+ + " eval(pre + layer + post);" + MindMapHTMLWriter.el + " return true; }"
+ + MindMapHTMLWriter.el + " catch (error) {" + MindMapHTMLWriter.el + " return false; }}"
+ + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el + "function show_layer(layer) {"
+ + MindMapHTMLWriter.el + " eval(pre + layer + post).position = 'relative'; " + MindMapHTMLWriter.el
+ + " eval(pre + layer + post).visibility = 'visible'; }" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el + "function hide_layer(layer) {" + MindMapHTMLWriter.el
+ + " eval(pre + layer + post).visibility = 'hidden';" + MindMapHTMLWriter.el
+ + " eval(pre + layer + post).position = 'absolute'; }" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el + "function hide_folder(folder) {" + MindMapHTMLWriter.el
+ + " hide_folding_layer(folder)" + MindMapHTMLWriter.el + " show_layer('show'+folder);"
+ + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + " scrollBy(0,0); // This is a work around to make it work in Browsers (Explorer, Mozilla)"
+ + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + "function show_folder(folder) {" + MindMapHTMLWriter.el
+ + " // Precondition: all subfolders are folded" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + " show_layer('hide'+folder);" + MindMapHTMLWriter.el + " hide_layer('show'+folder);"
+ + MindMapHTMLWriter.el + " show_layer('fold'+folder);" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el
+ + " scrollBy(0,0); // This is a work around to make it work in Browsers (Explorer, Mozilla)"
+ + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el + " var i;" + MindMapHTMLWriter.el
+ + " for (i=1; layer_exists('fold'+folder+'_'+i); ++i) {" + MindMapHTMLWriter.el
+ + " show_layer('show'+folder+'_'+i); }" + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el + ""
+ + "function show_folder_completely(folder) {" + MindMapHTMLWriter.el
+ + " // Precondition: all subfolders are folded" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + " show_layer('hide'+folder);" + MindMapHTMLWriter.el + " hide_layer('show'+folder);"
+ + MindMapHTMLWriter.el + " show_layer('fold'+folder);" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el
+ + " scrollBy(0,0); // This is a work around to make it work in Browsers (Explorer, Mozilla)"
+ + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el + " var i;" + MindMapHTMLWriter.el
+ + " for (i=1; layer_exists('fold'+folder+'_'+i); ++i) {" + MindMapHTMLWriter.el
+ + " show_folder_completely(folder+'_'+i); }" + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el
+ + "" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + "function hide_folding_layer(folder) {" + MindMapHTMLWriter.el + " var i;" + MindMapHTMLWriter.el
+ + " for (i=1; layer_exists('fold'+folder+'_'+i); ++i) {" + MindMapHTMLWriter.el
+ + " hide_folding_layer(folder+'_'+i); }" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + " hide_layer('hide'+folder);" + MindMapHTMLWriter.el + " hide_layer('show'+folder);"
+ + MindMapHTMLWriter.el + " hide_layer('fold'+folder);" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el
+ + " scrollBy(0,0); // This is a work around to make it work in Browsers (Explorer, Mozilla)"
+ + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el + "" + MindMapHTMLWriter.el
+ + "function fold_document() {" + MindMapHTMLWriter.el + " var i;" + MindMapHTMLWriter.el
+ + " var folder = '1';" + MindMapHTMLWriter.el
+ + " for (i=1; layer_exists('fold'+folder+'_'+i); ++i) {" + MindMapHTMLWriter.el
+ + " hide_folder(folder+'_'+i); }" + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el + ""
+ + MindMapHTMLWriter.el + "function unfold_document() {" + MindMapHTMLWriter.el + " var i;"
+ + MindMapHTMLWriter.el + " var folder = '1';" + MindMapHTMLWriter.el
+ + " for (i=1; layer_exists('fold'+folder+'_'+i); ++i) {" + MindMapHTMLWriter.el
+ + " show_folder_completely(folder+'_'+i); }" + MindMapHTMLWriter.el + "}" + MindMapHTMLWriter.el
+ + "" + 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(" li { list-style: none; margin: 0; }" + MindMapHTMLWriter.el);
+ fileout.write(" p { margin: 0; }" + MindMapHTMLWriter.el);
+ if (writeFoldingCode) {
+ fileout
+ .write(" span.foldopened { color: white; font-size: xx-small;"
+ + MindMapHTMLWriter.el
+ + " border-width: 1; font-family: monospace; padding: 0em 0.25em 0em 0.25em; background: #e0e0e0;"
+ + MindMapHTMLWriter.el
+ + " VISIBILITY: visible;"
+ + MindMapHTMLWriter.el
+ + " cursor:pointer; }"
+ + MindMapHTMLWriter.el
+ + ""
+ + MindMapHTMLWriter.el
+ + ""
+ + MindMapHTMLWriter.el
+ + " span.foldclosed { color: #666666; font-size: xx-small;"
+ + MindMapHTMLWriter.el
+ + " border-width: 1; font-family: monospace; padding: 0em 0.25em 0em 0.25em; background: #e0e0e0;"
+ + MindMapHTMLWriter.el
+ + " VISIBILITY: hidden;"
+ + MindMapHTMLWriter.el
+ + " cursor:pointer; }"
+ + MindMapHTMLWriter.el
+ + ""
+ + MindMapHTMLWriter.el
+ + " span.foldspecial { color: #666666; font-size: xx-small; border-style: none solid solid none;"
+ + MindMapHTMLWriter.el
+ + " border-color: #CCCCCC; border-width: 1; font-family: sans-serif; padding: 0em 0.1em 0em 0.1em; background: #e0e0e0;"
+ + MindMapHTMLWriter.el + " cursor:pointer; }" + MindMapHTMLWriter.el);
+ }
+ fileout.write(MindMapHTMLWriter.el + " span.l { color: red; font-weight: bold; }" + MindMapHTMLWriter.el
+ + "" + MindMapHTMLWriter.el + " a.mapnode:link {text-decoration: none; color: black; }"
+ + MindMapHTMLWriter.el + " a.mapnode:visited {text-decoration: none; color: black; }"
+ + MindMapHTMLWriter.el + " a.mapnode:active {text-decoration: none; color: black; }"
+ + MindMapHTMLWriter.el
+ + " a.mapnode:hover {text-decoration: none; color: black; background: #eeeee0; }"
+ + 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
new file mode 100644
index 0000000..2bd11be
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/MindMapNodesSelection.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.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/mindmapmode/CutAction.java b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/CutAction.java
new file mode 100644
index 0000000..3813232
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/CutAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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 javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class CutAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CutAction() {
+ super("CutAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController mMindMapController = Controller.getCurrentModeController();
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel root = controller.getMap().getRootNode();
+ if (controller.getSelection().isSelected(root)) {
+ UITools.errorMessage(TextUtils.getText("cannot_delete_root"));
+ return;
+ }
+ final int showResult = OptionalDontShowMeAgainDialog.show("really_cut_node", "confirmation",
+ MClipboardController.RESOURCES_CUT_NODES_WITHOUT_QUESTION,
+ OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
+ if (showResult != JOptionPane.OK_OPTION) {
+ return;
+ }
+ final MClipboardController clipboardController = (MClipboardController) mMindMapController
+ .getExtension(ClipboardController.class);
+ clipboardController.cut(controller.getSelection().getSortedSelection(true));
+ controller.getViewController().obtainFocusForSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
new file mode 100644
index 0000000..88a5978
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
@@ -0,0 +1,793 @@
+/*
+ * 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.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);
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links")
+ .equals("relative");
+ ((MLinkController) LinkController.getController()).setLink(node, href,
+ useRelativeUri);
+ }
+ }
+ ((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());
+ final URI uri;
+ if (ResourceController.getResourceController().getProperty("links").equals("relative")) {
+ uri = LinkController.toRelativeURI(node.getMap().getFile(), file);
+ }
+ else {
+ uri = file.getAbsoluteFile().toURI();
+ }
+ ((MLinkController) LinkController.getController()).setLink(node, uri, false);
+ 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;
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
+ "relative");
+ if (useRelativeUri) {
+ uri = LinkController.toRelativeURI(mindmapFile, file);
+ }
+ else{
+ uri = file.toURI();
+ }
+ 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));
+ 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;
+ }
+
+ @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();
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
+ "relative");
+ 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;
+ if (useRelativeUri && "file".equals(linkUri.getScheme())) {
+ final File mapFile = map.getFile();
+ uri = LinkController.toRelativeURI(mapFile, new File(linkUri));
+ 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/clipboard/mindmapmode/PasteAction.java b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/PasteAction.java
new file mode 100644
index 0000000..8cad90a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/PasteAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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 PasteAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public PasteAction() {
+ super("PasteAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController
+ .getController();
+ final NodeModel parent = Controller.getCurrentController().getSelection().getSelected();
+ clipboardController.paste(clipboardController.getClipboardContents(), parent, false, parent.isNewChildLeft());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java
new file mode 100644
index 0000000..9763218
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.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.features.clipboard.mindmapmode;
+
+import java.awt.Component;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController.IDataFlavorHandler;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class SelectedPasteAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SelectedPasteAction() {
+ super("SelectedPasteAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController
+ .getController();
+ final Collection<IDataFlavorHandler> flavorHandlers = clipboardController.getFlavorHandlers();
+ if (flavorHandlers.isEmpty()) {
+ return;
+ }
+ final JPanel options = createPane(flavorHandlers);
+ if (JOptionPane.CANCEL_OPTION == JOptionPane.showConfirmDialog((Component) e.getSource(), options, e
+ .getActionCommand(), JOptionPane.OK_CANCEL_OPTION)) {
+ return;
+ }
+ final NodeModel parent = Controller.getCurrentController().getSelection().getSelected();
+ final Transferable clipboardContents = clipboardController.getClipboardContents();
+ clipboardController.paste(clipboardContents, selectedHandler, parent, false, parent.isNewChildLeft());
+ selectedHandler = null;
+ }
+
+ private IDataFlavorHandler selectedHandler;
+
+ private JPanel createPane(final Collection<IDataFlavorHandler> flavorHandlers) {
+ final ButtonGroup group = new ButtonGroup();
+ final JRadioButton[] buttons = new JRadioButton[flavorHandlers.size()];
+ int i = 0;
+ selectedHandler = null;
+ for (final IDataFlavorHandler handler : flavorHandlers) {
+ final JRadioButton radioButton = new JRadioButton(TextUtils.getText(handler.getClass().getSimpleName()));
+ group.add(radioButton);
+ if (selectedHandler == null) {
+ selectedHandler = handler;
+ radioButton.setSelected(true);
+ }
+ radioButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ selectedHandler = handler;
+ }
+ });
+ buttons[i++] = radioButton;
+ }
+ return createPane(buttons);
+ }
+
+ private JPanel createPane(final JRadioButton[] radioButtons) {
+ final int numChoices = radioButtons.length;
+ final JPanel box = new JPanel();
+ box.setLayout(new BoxLayout(box, BoxLayout.PAGE_AXIS));
+ for (int i = 0; i < numChoices; i++) {
+ box.add(radioButtons[i]);
+ }
+ return box;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/CloudBuilder.java b/freeplane/src/org/freeplane/features/cloud/CloudBuilder.java
new file mode 100644
index 0000000..bacd72a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/CloudBuilder.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.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/cloud/CloudController.java b/freeplane/src/org/freeplane/features/cloud/CloudController.java
new file mode 100644
index 0000000..f374a95
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/CloudController.java
@@ -0,0 +1,154 @@
+/*
+ * 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.cloud;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Stroke;
+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.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.cloud.CloudModel.Shape;
+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 CloudController implements IExtension {
+ protected static class CloudAdapterListener implements IFreeplanePropertyListener {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.equals(CloudController.RESOURCES_CLOUD_COLOR)) {
+ standardColor = ColorUtils.stringToColor(newValue);
+ }
+ }
+ }
+
+ static final Stroke DEF_STROKE = new BasicStroke(3);
+ public static final int DEFAULT_WIDTH = -1;
+ private static CloudAdapterListener listener = null;
+ public static final int NORMAL_WIDTH = 3;
+ public static final String RESOURCES_CLOUD_COLOR = "standardcloudcolor";
+ private static Color standardColor = null;
+
+ public static Color getStandardColor() {
+ return standardColor;
+ }
+
+ public static CloudController getController() {
+ return getController(Controller.getCurrentModeController());
+ }
+
+ public static CloudController getController(ModeController modeController) {
+ return (CloudController) modeController.getExtension(CloudController.class);
+ }
+ public static void install( final CloudController cloudController) {
+ Controller.getCurrentModeController().addExtension(CloudController.class, cloudController);
+ }
+
+ final private ExclusivePropertyChain<CloudModel, NodeModel> cloudHandlers;
+// private final ModeController modeController;
+
+ public CloudController(final ModeController modeController) {
+// this.modeController = modeController;
+ cloudHandlers = new ExclusivePropertyChain<CloudModel, NodeModel>();
+ if (listener == null) {
+ listener = new CloudAdapterListener();
+ ResourceController.getResourceController().addPropertyChangeListener(listener);
+ }
+ updateStandards();
+ addCloudGetter(IPropertyHandler.STYLE, new IPropertyHandler<CloudModel, NodeModel>() {
+ public CloudModel getProperty(final NodeModel node, final CloudModel currentValue) {
+ return getStyleCloud(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final CloudBuilder cloudBuilder = new CloudBuilder(mapController, this);
+ cloudBuilder.registerBy(readManager, writeManager);
+ }
+
+ protected CloudModel getStyleCloud(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 CloudModel styleModel = CloudModel.getModel(styleNode);
+ if (styleModel != null) {
+ return styleModel;
+ }
+ }
+ return null;
+ }
+
+ public IPropertyHandler<CloudModel, NodeModel> addCloudGetter(final Integer key,
+ final IPropertyHandler<CloudModel, NodeModel> getter) {
+ return cloudHandlers.addGetter(key, getter);
+ }
+
+ public Color getColor(final NodeModel node) {
+ final CloudModel cloud = getCloud(node);
+ return cloud != null ? cloud.getColor() : null;
+ }
+
+ public Color getExteriorColor(final NodeModel node) {
+ return getColor(node).darker();
+ }
+
+ public int getWidth(final NodeModel node) {
+ return NORMAL_WIDTH;
+ }
+
+ public IPropertyHandler<CloudModel, NodeModel> removeCloudGetter(final Integer key) {
+ return cloudHandlers.removeGetter(key);
+ }
+
+ private void updateStandards() {
+ if (standardColor == null) {
+ final String stdColor = ResourceController.getResourceController().getProperty(
+ CloudController.RESOURCES_CLOUD_COLOR);
+ standardColor = ColorUtils.stringToColor(stdColor);
+ }
+ }
+
+ public CloudModel getCloud(final NodeModel model) {
+ return cloudHandlers.getProperty(model);
+ }
+
+ public Shape getShape(NodeModel node) {
+ final CloudModel cloud = getCloud(node);
+ return cloud != null ? cloud.getShape() : null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/CloudModel.java b/freeplane/src/org/freeplane/features/cloud/CloudModel.java
new file mode 100644
index 0000000..f099a5e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/CloudModel.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.cloud;
+
+import java.awt.Color;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+public class CloudModel implements IExtension {
+ public enum Shape{
+ ARC, STAR, RECT, ROUND_RECT
+ };
+ public static CloudModel getModel(final NodeModel node) {
+ return (CloudModel) node.getExtension(CloudModel.class);
+ }
+
+ public static CloudModel createModel(final NodeModel node) {
+ final CloudModel extension = (CloudModel) node.getExtension(CloudModel.class);
+ if (extension != null) {
+ return extension;
+ }
+ final CloudModel cloudModel = new CloudModel();
+ node.addExtension(cloudModel);
+ return cloudModel;
+ }
+
+ public static void setModel(final NodeModel node, final CloudModel cloud) {
+ final CloudModel oldCloud = CloudModel.getModel(node);
+ if (cloud != null && oldCloud == null) {
+ node.addExtension(cloud);
+ }
+ else if (cloud == null && oldCloud != null) {
+ node.removeExtension(CloudModel.class);
+ }
+ }
+
+ private Color color;
+
+ private Shape shape;
+
+ public Shape getShape() {
+ return shape;
+ }
+
+ public void setShape(Shape shape) {
+ this.shape = shape;
+ }
+
+ public CloudModel() {
+ color = CloudController.getStandardColor();
+ shape = Shape.ARC;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void setColor(final Color color) {
+ this.color = color != null ? color : CloudController.getStandardColor();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudAction.java b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudAction.java
new file mode 100644
index 0000000..df6101e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudAction.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.cloud.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+ at SelectableAction(checkOnNodeChange = true)
+class CloudAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CloudAction() {
+ super("CloudAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MCloudController cloudController = (MCloudController) CloudController.getController();
+ cloudController.setCloud(node, CloudModel.getModel(node) == null);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(CloudModel.getModel(Controller.getCurrentModeController().getMapController().getSelectedNode()) != null);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java
new file mode 100644
index 0000000..7efb71c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudColorAction.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.cloud.mindmapmode;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class CloudColorAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Color actionColor;
+
+ public CloudColorAction() {
+ super("CloudColorAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ Color selectedColor = null;
+ ModeController controller;
+ {
+ controller = Controller.getCurrentModeController();
+ final NodeModel selected = controller.getMapController().getSelectedNode();
+ final MCloudController cloudController = (MCloudController) CloudController
+ .getController();
+ cloudController.setCloud(selected, true);
+ selectedColor = cloudController.getColor(selected);
+ }
+ actionColor = ColorTracker.showCommonJColorChooserDialog(controller.getController()
+ .getSelection().getSelected(), TextUtils.getText("choose_cloud_color"), selectedColor, CloudController.getStandardColor());
+ super.actionPerformed(e);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MCloudController cloudController = (MCloudController) CloudController.getController();
+ cloudController.setColor(node, actionColor);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java
new file mode 100644
index 0000000..db6e84c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.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.features.cloud.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.cloud.CloudModel.Shape;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+ at SelectableAction(checkOnNodeChange = true)
+class CloudShapeAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Shape actionShape;
+
+ public CloudShapeAction(Shape actionShape) {
+ super("CloudShapeAction." + actionShape.toString());
+ this.actionShape = actionShape;
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ ModeController controller;
+ {
+ controller = Controller.getCurrentModeController();
+ final NodeModel selected = controller.getMapController().getSelectedNode();
+ final MCloudController cloudController = (MCloudController) CloudController
+ .getController();
+ cloudController.setCloud(selected, true);
+ }
+ super.actionPerformed(e);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MCloudController cloudController = (MCloudController) CloudController.getController();
+ cloudController.setShape(node, actionShape);
+ }
+
+ @Override
+ public void setSelected() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final CloudModel model = CloudModel.getModel(node);
+ if (model != null) {
+ if (actionShape.equals(model.getShape())) {
+ setSelected(true);
+ return;
+ }
+ }
+ setSelected(false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/MCloudController.java b/freeplane/src/org/freeplane/features/cloud/mindmapmode/MCloudController.java
new file mode 100644
index 0000000..88e925c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/cloud/mindmapmode/MCloudController.java
@@ -0,0 +1,193 @@
+/*
+ * 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.cloud.mindmapmode;
+
+import java.awt.Color;
+
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.cloud.CloudModel.Shape;
+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.styles.LogicalStyleKeys;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MCloudController extends CloudController {
+ private static class ExtensionCopier implements IExtensionCopier {
+ 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 CloudModel fromStyle = (CloudModel) from.getExtension(CloudModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ final CloudModel toStyle = CloudModel.createModel(to);
+ final Color color = fromStyle.getColor();
+ if(color != null)
+ toStyle.setColor(color);
+ final Shape shape = fromStyle.getShape();
+ if(shape != null)
+ toStyle.setShape(shape);
+ }
+
+ public void remove(final Object key, final NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ from.removeExtension(CloudModel.class);
+ }
+
+ public void remove(final Object key, final NodeModel from, final NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ final CloudModel whichStyle = (CloudModel) which.getExtension(CloudModel.class);
+ if (whichStyle == null) {
+ return;
+ }
+ final CloudModel fromStyle = (CloudModel) from.getExtension(CloudModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ from.removeExtension(fromStyle);
+ }
+
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ }
+ }
+
+ public MCloudController(final ModeController modeController) {
+ super(modeController);
+ modeController.registerExtensionCopier(new ExtensionCopier());
+ modeController.addAction(new CloudAction());
+ modeController.addAction(new CloudColorAction());
+ for(Shape shape : Shape.values()){
+ modeController.addAction(new CloudShapeAction(shape));
+ }
+ }
+
+ public void setCloud(final NodeModel node, final boolean enable) {
+ final CloudModel cloud = CloudModel.getModel(node);
+ if ((cloud != null) == enable) {
+ return;
+ }
+ final Color color = cloud != null ? cloud.getColor() : CloudController.getStandardColor();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ if (enable) {
+ enable();
+ }
+ else {
+ disable();
+ }
+ }
+
+ private void disable() {
+ final MapController mapController = modeController.getMapController();
+ CloudModel.setModel(node, null);
+ mapController.nodeChanged(node);
+ }
+
+ private void enable() {
+ final CloudModel cloud = new CloudModel();
+ cloud.setColor(color);
+ final MapController mapController = modeController.getMapController();
+ CloudModel.setModel(node, cloud);
+ mapController.nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setCloud";
+ }
+
+ public void undo() {
+ if (enable) {
+ disable();
+ }
+ else {
+ enable();
+ }
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setColor(final NodeModel node, final Color color) {
+ setCloud(node, true);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Color oldColor = CloudModel.getModel(node).getColor();
+ if (color == oldColor || color != null && color.equals(oldColor)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ CloudModel.getModel(node).setColor(color);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setColor";
+ }
+
+ public void undo() {
+ CloudModel.getModel(node).setColor(oldColor);
+ modeController.getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setShape(final NodeModel node, final CloudModel.Shape shape) {
+ setCloud(node, true);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final CloudModel.Shape oldShape = CloudModel.getModel(node).getShape();
+ if (shape == oldShape || shape != null && shape.equals(oldShape)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ CloudModel.getModel(node).setShape(shape);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setShape";
+ }
+
+ public void undo() {
+ CloudModel.getModel(node).setShape(oldShape);
+ modeController.getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java b/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java
new file mode 100644
index 0000000..31bbb08
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java
@@ -0,0 +1,169 @@
+/*
+ * 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_NODE, 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
new file mode 100644
index 0000000..3ae536f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/EdgeController.java
@@ -0,0 +1,233 @@
+/*
+ * 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/EdgeModel.java b/freeplane/src/org/freeplane/features/edge/EdgeModel.java
new file mode 100644
index 0000000..4854078
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/EdgeModel.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.edge;
+
+import java.awt.Color;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+public class EdgeModel implements IExtension {
+ public static final int WIDTH_PARENT = -1;
+ public static final int DEFAULT_WIDTH = -1;
+ static public final String EDGEWIDTH_THIN = "thin";
+ public static final int WIDTH_THIN = 0;
+
+ public static EdgeModel createEdgeModel(final NodeModel node) {
+ EdgeModel edge = (EdgeModel) node.getExtension(EdgeModel.class);
+ if (edge == null) {
+ edge = new EdgeModel();
+ node.addExtension(edge);
+ }
+ return edge;
+ }
+
+ public static EdgeModel getModel(final NodeModel node) {
+ return (EdgeModel) node.getExtension(EdgeModel.class);
+ }
+
+ public static void setModel(final NodeModel node, final EdgeModel edge) {
+ node.addExtension(edge);
+ }
+
+ private Color color;
+ private EdgeStyle style;
+ private int width = EdgeModel.DEFAULT_WIDTH;
+
+ public EdgeModel() {
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public EdgeStyle getStyle() {
+ return style;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setColor(final Color color) {
+ this.color = color;
+ }
+
+ public void setStyle(final EdgeStyle style) {
+ this.style = style;
+ }
+
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeStyle.java b/freeplane/src/org/freeplane/features/edge/EdgeStyle.java
new file mode 100644
index 0000000..c8ed7e6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/EdgeStyle.java
@@ -0,0 +1,46 @@
+package org.freeplane.features.edge;
+
+import org.freeplane.core.util.LogUtils;
+
+public enum EdgeStyle {
+ EDGESTYLE_BEZIER("bezier", 1f), EDGESTYLE_HIDDEN("hide_edge", 1f), EDGESTYLE_HORIZONTAL("horizontal", 1f),
+ EDGESTYLE_LINEAR("linear", 1f), EDGESTYLE_SHARP_BEZIER("sharp_bezier", 0.25f), EDGESTYLE_SHARP_LINEAR("sharp_linear", 0f),
+ EDGESTYLE_SUMMARY("summary", 1f);
+ private String name;
+ private float nodeLineWeight;
+
+ private EdgeStyle(final String name, final float nodeLineWeight) {
+ this.name = name;
+ this.nodeLineWeight = nodeLineWeight;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public int getNodeLineWidth(final int width) {
+ final int nlWidth = (int) (nodeLineWeight * width);
+ if (nlWidth == 0) {
+ return 1;
+ }
+ return nlWidth;
+ }
+
+ static public EdgeStyle getStyle(final String name) {
+ if (name == null) {
+ return null;
+ }
+ for (final EdgeStyle style : EdgeStyle.class.getEnumConstants()) {
+ if (style.name.equals(name)) {
+ return style;
+ }
+ }
+ LogUtils.warn("unknown edge style name " + name);
+ return null;
+ }
+
+ static public String toString(final EdgeStyle style) {
+ return style == null ? null : style.toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java
new file mode 100644
index 0000000..11ee1f8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java
@@ -0,0 +1,134 @@
+/*
+ * 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/EdgeColorAction.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java
new file mode 100644
index 0000000..af4dcbc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java
@@ -0,0 +1,66 @@
+/*
+ * 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.mindmapmode;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class EdgeColorAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Color actionColor;
+
+ public EdgeColorAction() {
+ super("EdgeColorAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel model = modeController.getMapController().getSelectedNode();
+ final Controller controller = modeController.getController();
+ final Color edgeColor = EdgeController.getController().getColor(model);
+ actionColor = ColorTracker.showCommonJColorChooserDialog(controller.getSelection().getSelected(),
+ TextUtils.getText("choose_edge_color"), edgeColor, EdgeController.STANDARD_EDGE_COLOR);
+ super.actionPerformed(e);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MEdgeController edgeController = (MEdgeController) EdgeController.getController();
+ edgeController.setColor(node, actionColor);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java
new file mode 100644
index 0000000..a5935da
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java
@@ -0,0 +1,68 @@
+/*
+ * 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.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction(checkOnNodeChange = true)
+class EdgeStyleAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private EdgeStyle mStyle;
+
+ public EdgeStyleAction( final EdgeStyle style) {
+ super("EdgeStyleAction." + style);
+ mStyle = style;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MEdgeController) EdgeController.getController()).setStyle(node, mStyle);
+ }
+
+ @Override
+ public void setSelected() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final EdgeModel model = EdgeModel.getModel(node);
+ if (model != null) {
+ if (mStyle.equals(model.getStyle())) {
+ setSelected(true);
+ return;
+ }
+ }
+ setSelected(false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java
new file mode 100644
index 0000000..68b72de
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java
@@ -0,0 +1,63 @@
+/*
+ * 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.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction(checkOnNodeChange = true)
+class EdgeStyleAsParentAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public EdgeStyleAsParentAction() {
+ super("EdgeStyleAsParentAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MEdgeController) EdgeController.getController()).setStyle(node, null);
+ }
+
+ @Override
+ public void setSelected() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final EdgeModel model = EdgeModel.getModel(node);
+ if (model == null || model.getStyle() == null) {
+ setSelected(true);
+ return;
+ }
+ setSelected(false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java
new file mode 100644
index 0000000..2ecd08d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java
@@ -0,0 +1,95 @@
+/*
+ * 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.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.edge.EdgeController;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction(checkOnNodeChange = true)
+class EdgeWidthAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static String getWidthTitle( final int width) {
+ String returnValue;
+ if (width <= 0) {
+ returnValue = TextUtils.getRawText(EdgeWidthAction.width2String(width) + ".text");
+ }
+ else {
+ returnValue = Integer.toString(width);
+ }
+ return returnValue;
+ }
+
+ private static String width2String(final int width) {
+ if (width == EdgeModel.WIDTH_PARENT) {
+ return "EdgeWidthAction_width_parent";
+ }
+ if (width == EdgeModel.WIDTH_THIN) {
+ return "EdgeWidthAction_width_thin";
+ }
+ return "EdgeWidthAction_" + width;
+ }
+
+ final private int mWidth;
+
+ public EdgeWidthAction( final int width) {
+ super(EdgeWidthAction.width2String(width), EdgeWidthAction.getWidthTitle(
+ width), null);
+ mWidth = width;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MEdgeController) EdgeController.getController()).setWidth(node, mWidth);
+ }
+
+ @Override
+ public void setSelected() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final EdgeModel model = EdgeModel.getModel(node);
+ if (model == null) {
+ if (mWidth == EdgeModel.WIDTH_PARENT) {
+ setSelected(true);
+ return;
+ }
+ }
+ else if (model.getWidth() == mWidth) {
+ setSelected(true);
+ return;
+ }
+ setSelected(false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java
new file mode 100644
index 0000000..7206df1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java
@@ -0,0 +1,290 @@
+/*
+ * 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/Base64Coding.java b/freeplane/src/org/freeplane/features/encrypt/Base64Coding.java
new file mode 100644
index 0000000..6d70c64
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/Base64Coding.java
@@ -0,0 +1,148 @@
+/*
+ * AbstractPreferences -- Partial implementation of a Preference node Copyright
+ * (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part
+ * of GNU Classpath. GNU Classpath is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2, or (at your
+ * option) any later version. GNU Classpath is distributed in the hope that it
+ * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details. You should have received a copy of the GNU
+ * General Public License along with GNU Classpath; see the file COPYING. If
+ * not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+ * Floor, Boston, MA 02110-1301 USA. Linking this library statically or
+ * dynamically with other mapViews is making a combined work based on this
+ * library. Thus, the terms and conditions of the GNU General Public License
+ * cover the whole combination. As a special exception, the copyright holders of
+ * this library give you permission to link this library with independent
+ * mapViews to produce an executable, regardless of the license terms of these
+ * independent mapViews, and to copy and distribute the resulting executable
+ * under terms of your choice, provided that you also meet, for each linked
+ * independent mapView, the terms and conditions of the license of that mapView.
+ * An independent mapView is a mapView which is not derived from or based on
+ * this library. If you modify this library, you may extend this exception to
+ * your version of the library, but you are not obligated to do so. If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+package org.freeplane.features.encrypt;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * Partial implementation of a Preference node.
+ *
+ * @since 1.4
+ * @author Mark Wielaard (mark at klomp.org) 22.3.2008: FC: Changed name from
+ * AbstractPreferences to the current, Removed all but base64 coding.
+ */
+public class Base64Coding {
+ /**
+ * Helper method for decoding a Base64 string as an byte array. Returns null
+ * on encoding error. This method does not allow any other characters
+ * present in the string then the 65 special base64 chars.
+ */
+ public static byte[] decode64(final String s) {
+ final ByteArrayOutputStream bs = new ByteArrayOutputStream((s.length() / 4) * 3);
+ final char[] c = new char[s.length()];
+ s.getChars(0, s.length(), c, 0);
+ int endchar = -1;
+ for (int j = 0; j < c.length && endchar == -1; j++) {
+ if (c[j] >= 'A' && c[j] <= 'Z') {
+ c[j] -= 'A';
+ }
+ else if (c[j] >= 'a' && c[j] <= 'z') {
+ c[j] = (char) (c[j] + 26 - 'a');
+ }
+ else if (c[j] >= '0' && c[j] <= '9') {
+ c[j] = (char) (c[j] + 52 - '0');
+ }
+ else if (c[j] == '+') {
+ c[j] = 62;
+ }
+ else if (c[j] == '/') {
+ c[j] = 63;
+ }
+ else if (c[j] == '=') {
+ endchar = j;
+ }
+ else {
+ return null;
+ }
+ }
+ int remaining = endchar == -1 ? c.length : endchar;
+ int i = 0;
+ while (remaining > 0) {
+ byte b0 = (byte) (c[i] << 2);
+ if (remaining >= 2) {
+ b0 += (c[i + 1] & 0x30) >> 4;
+ }
+ bs.write(b0);
+ if (remaining >= 3) {
+ byte b1 = (byte) ((c[i + 1] & 0x0F) << 4);
+ b1 += (byte) ((c[i + 2] & 0x3C) >> 2);
+ bs.write(b1);
+ }
+ if (remaining >= 4) {
+ byte b2 = (byte) ((c[i + 2] & 0x03) << 6);
+ b2 += c[i + 3];
+ bs.write(b2);
+ }
+ i += 4;
+ remaining -= 4;
+ }
+ return bs.toByteArray();
+ }
+
+ /**
+ * Helper method for encoding an array of bytes as a Base64 String.
+ */
+ public static String encode64(final byte[] b) {
+ final StringBuilder sb = new StringBuilder((b.length / 3) * 4);
+ int i = 0;
+ int remaining = b.length;
+ final char c[] = new char[4];
+ while (remaining > 0) {
+ c[0] = (char) ((b[i] & 0xFC) >> 2);
+ c[1] = (char) ((b[i] & 0x03) << 4);
+ if (remaining >= 2) {
+ c[1] += (char) ((b[i + 1] & 0xF0) >> 4);
+ c[2] = (char) ((b[i + 1] & 0x0F) << 2);
+ if (remaining >= 3) {
+ c[2] += (char) ((b[i + 2] & 0xC0) >> 6);
+ c[3] = (char) (b[i + 2] & 0x3F);
+ }
+ else {
+ c[3] = 64;
+ }
+ }
+ else {
+ c[2] = 64;
+ c[3] = 64;
+ }
+ for (int j = 0; j < 4; j++) {
+ if (c[j] < 26) {
+ c[j] += 'A';
+ }
+ else if (c[j] < 52) {
+ c[j] = (char) (c[j] - 26 + 'a');
+ }
+ else if (c[j] < 62) {
+ c[j] = (char) (c[j] - 52 + '0');
+ }
+ else if (c[j] == 62) {
+ c[j] = '+';
+ }
+ else if (c[j] == 63) {
+ c[j] = '/';
+ }
+ else {
+ c[j] = '=';
+ }
+ }
+ sb.append(c);
+ i += 3;
+ remaining -= 3;
+ }
+ return sb.toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/DesEncrypter.java b/freeplane/src/org/freeplane/features/encrypt/DesEncrypter.java
new file mode 100644
index 0000000..fb43042
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/DesEncrypter.java
@@ -0,0 +1,181 @@
+/*
+ * 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.encrypt;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.KeySpec;
+import java.util.Arrays;
+
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.IEncrypter;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.12.2008
+ */
+public class DesEncrypter implements IEncrypter {
+ private static final int SALT_LENGTH = 8;
+ private static final String SALT_PRESENT_INDICATOR = " ";
+
+ /**
+ * @throws IOException
+ */
+ public static byte[] fromBase64(final String base64String) {
+ return Base64Coding.decode64(base64String);
+ }
+
+ /**
+ */
+ public static String toBase64(final byte[] byteBuffer) {
+ return Base64Coding.encode64(byteBuffer);
+ }
+
+ private Cipher dcipher;
+ private Cipher ecipher;
+ int iterationCount = 19;
+ final private String mAlgorithm;
+ byte[] mSalt = { (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x35, (byte) 0xE3,
+ (byte) 0x03 };
+ private char[] passPhrase;
+
+ public DesEncrypter(final StringBuilder pPassPhrase, final String pAlgorithm) {
+ passPhrase = new char[pPassPhrase.length()];
+ pPassPhrase.getChars(0, passPhrase.length, passPhrase, 0);
+ mAlgorithm = pAlgorithm;
+ }
+
+ public String decrypt(String str) {
+ if (str == null) {
+ return null;
+ }
+ try {
+ byte[] salt = null;
+ final int indexOfSaltIndicator = str.indexOf(DesEncrypter.SALT_PRESENT_INDICATOR);
+ if (indexOfSaltIndicator >= 0) {
+ final String saltString = str.substring(0, indexOfSaltIndicator);
+ str = str.substring(indexOfSaltIndicator + 1);
+ salt = DesEncrypter.fromBase64(saltString);
+ }
+ final byte[] dec = DesEncrypter.fromBase64(str);
+ init(salt);
+ if (dcipher == null) {
+ return null;
+ }
+ final byte[] utf8 = dcipher.doFinal(dec);
+ return new String(utf8, "UTF8");
+ }
+ catch (final javax.crypto.BadPaddingException e) {
+ }
+ catch (final IllegalBlockSizeException e) {
+ }
+ catch (final UnsupportedEncodingException e) {
+ }
+ catch (final IllegalArgumentException e) {
+ }
+ return null;
+ }
+
+ public String encrypt(final String str) {
+ try {
+ initWithNewSalt();
+ if(ecipher == null)
+ return null;
+ final byte[] utf8 = str.getBytes("UTF8");
+ final byte[] enc = ecipher.doFinal(utf8);
+ return DesEncrypter.toBase64(mSalt) + DesEncrypter.SALT_PRESENT_INDICATOR + DesEncrypter.toBase64(enc);
+ }
+ catch (final javax.crypto.BadPaddingException e) {
+ }
+ catch (final IllegalBlockSizeException e) {
+ }
+ catch (final UnsupportedEncodingException e) {
+ }
+ return null;
+ }
+
+ public void initWithNewSalt() {
+ final byte[] newSalt = new byte[DesEncrypter.SALT_LENGTH];
+ for (int i = 0; i < newSalt.length; i++) {
+ newSalt[i] = (byte) (Math.random() * 256l - 128l);
+ }
+ init(newSalt);
+ }
+
+ /**
+ */
+ private void init(final byte[] salt) {
+ if (ecipher != null && mSalt != null && !Arrays.equals(mSalt, salt)) {
+ ecipher = null;
+ dcipher = null;
+ }
+ if (salt != null) {
+ mSalt = salt;
+ }
+ if (ecipher == null) {
+ try {
+ SecretKey key;
+ try{
+ KeySpec keySpec = new PBEKeySpec(passPhrase, mSalt, iterationCount);
+ key = SecretKeyFactory.getInstance(mAlgorithm).generateSecret(keySpec);
+ }
+ catch (final java.security.spec.InvalidKeySpecException e) {
+ try {
+ passPhrase = URLEncoder.encode(new String(passPhrase), "UTF-8").toCharArray();
+ }
+ catch (UnsupportedEncodingException e1) {
+ throw e;
+ }
+ KeySpec keySpec = new PBEKeySpec(passPhrase, mSalt, iterationCount);
+ key = SecretKeyFactory.getInstance(mAlgorithm).generateSecret(keySpec);
+ }
+ ecipher = Cipher.getInstance(mAlgorithm);
+ dcipher = Cipher.getInstance(mAlgorithm);
+ final AlgorithmParameterSpec paramSpec = new PBEParameterSpec(mSalt, iterationCount);
+ ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
+ dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
+ }
+ catch (final java.security.InvalidAlgorithmParameterException e) {
+ LogUtils.severe(e);
+ }
+ catch (final java.security.spec.InvalidKeySpecException e) {
+ LogUtils.severe(e);
+ }
+ catch (final javax.crypto.NoSuchPaddingException e) {
+ LogUtils.severe(e);
+ }
+ catch (final java.security.NoSuchAlgorithmException e) {
+ LogUtils.severe(e);
+ }
+ catch (final java.security.InvalidKeyException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java b/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java
new file mode 100644
index 0000000..5eb476d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java
@@ -0,0 +1,194 @@
+/*
+ * 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 javax.swing.JOptionPane;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.components.EnterPasswordDialog;
+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.IMapSelection;
+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 encNode = EncryptionModel.getModel(node);
+ if (encNode != null) {
+ if(encNode.isAccessible())
+ return decryptedIcon;
+ else
+ return encryptedIcon;
+ }
+ return null;
+ }
+ });
+ }
+ /**
+ * @param e
+ */
+ public void toggleCryptState(final NodeModel node) {
+ final ModeController mindMapController = Controller.getCurrentModeController();
+ final EncryptionModel encNode = EncryptionModel.getModel(node);
+ if (encNode != null) {
+ final boolean wasAccessible = encNode.isAccessible();
+ final boolean wasFolded = node.isFolded();
+ if (wasAccessible) {
+ encNode.setAccessible(false);
+ encNode.getEncryptedContent(mindMapController.getMapController());
+ node.setFolded(true);
+ }
+ else {
+ if (doPasswordCheckAndDecryptNode(encNode)) {
+ node.setFolded(false);
+ }
+ else {
+ return;
+ }
+ }
+ final Controller controller = Controller.getCurrentController();
+ final IMapSelection selection = controller.getSelection();
+ selection.selectAsTheOnlyOneSelected(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ encNode.setAccessible(!wasAccessible);
+ if (wasAccessible) {
+ node.setFolded(true);
+ }
+ mindMapController.getMapController().nodeRefresh(node);
+ }
+
+ public String getDescription() {
+ return "toggleCryptState";
+ }
+
+ public void undo() {
+ encNode.setAccessible(wasAccessible);
+ if (wasAccessible) {
+ node.setFolded(wasFolded);
+ }
+ mindMapController.getMapController().nodeRefresh(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+ else {
+ encrypt(node);
+ }
+ }
+ /**
+ * @param e
+ */
+ private boolean doPasswordCheckAndDecryptNode(final EncryptionModel encNode) {
+ while (true) {
+ final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(Controller.getCurrentController().getViewController()
+ .getFrame(), false);
+ pwdDialog.setModal(true);
+ pwdDialog.setVisible(true);
+ if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
+ return false;
+ }
+ final StringBuilder password = pwdDialog.getPassword();
+ if (!encNode.decrypt(Controller.getCurrentModeController().getMapController(), new SingleDesEncrypter(password))) {
+ final Controller controller = Controller.getCurrentController();
+ JOptionPane.showMessageDialog(controller.getViewController().getContentPane(), TextUtils
+ .getText("accessories/plugins/EncryptNode.properties_wrong_password"), "Freeplane",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+ }
+
+ /**
+ */
+ private void encrypt(final NodeModel node) {
+ final StringBuilder password = getUsersPassword();
+ if (password == null) {
+ return;
+ }
+ final EncryptionModel encryptedMindMapNode = new EncryptionModel(node);
+ encryptedMindMapNode.setEncrypter(new SingleDesEncrypter(password));
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addExtension(encryptedMindMapNode);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "encrypt";
+ }
+
+ public void undo() {
+ node.removeExtension(encryptedMindMapNode);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ /**
+ */
+ 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;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/EnterPassword.java b/freeplane/src/org/freeplane/features/encrypt/EnterPassword.java
new file mode 100644
index 0000000..0de39a3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/EnterPassword.java
@@ -0,0 +1,74 @@
+/*
+ * 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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+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;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class EnterPassword extends AFreeplaneAction{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private EncryptionController encryptionController;
+
+ public EnterPassword(EncryptionController encryptionController) {
+ super("EnterPassword");
+ this.encryptionController = encryptionController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ encryptionController.toggleCryptState(node);
+ }
+
+ public boolean canBeEnabled() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null) {
+ return false;
+ }
+ boolean isEncryptedNode = false;
+ boolean isOpened = false;
+ final MapController mapController = modeController.getMapController();
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ if (selectedNode != null) {
+ if (modeController.canEdit()) {
+ return true;
+ }
+ final EncryptionModel enode = EncryptionModel.getModel(selectedNode);
+ if (enode != null) {
+ isEncryptedNode = true;
+ isOpened = enode.isAccessible();
+ }
+ }
+ return (isEncryptedNode && !isOpened);
+ }
+
+ @Override
+ public void setEnabled() {
+ super.setEnabled(canBeEnabled());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/SingleDesEncrypter.java b/freeplane/src/org/freeplane/features/encrypt/SingleDesEncrypter.java
new file mode 100644
index 0000000..208ed3f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/SingleDesEncrypter.java
@@ -0,0 +1,30 @@
+/*
+ * 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.encrypt;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.12.2008
+ */
+public class SingleDesEncrypter extends DesEncrypter {
+ public SingleDesEncrypter(final StringBuilder pPassPhrase) {
+ super(pPassPhrase, "PBEWithMD5AndDES");
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/TripleDesEncrypter.java b/freeplane/src/org/freeplane/features/encrypt/TripleDesEncrypter.java
new file mode 100644
index 0000000..cb12cb6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/TripleDesEncrypter.java
@@ -0,0 +1,30 @@
+/*
+ * 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.encrypt;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.12.2008
+ */
+public class TripleDesEncrypter extends DesEncrypter {
+ public TripleDesEncrypter(final StringBuilder pPassPhrase) {
+ super(pPassPhrase, "PBEWithMD5AndTripleDES");
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java
new file mode 100644
index 0000000..a880126
--- /dev/null
+++ b/freeplane/src/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.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/encrypt/mindmapmode/MEncryptionController.java b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java
new file mode 100644
index 0000000..eef8855
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java
@@ -0,0 +1,75 @@
+/*
+ * 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.mindmapmode;
+
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.encrypt.EncryptionController;
+import org.freeplane.features.map.EncryptionModel;
+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 MEncryptionController extends EncryptionController {
+ public MEncryptionController(ModeController modeController) {
+ super(modeController);
+ }
+
+ public static void install(MEncryptionController encryptionController){
+ EncryptionController.install(encryptionController);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final RemoveEncryption removeEncryptionAction = new RemoveEncryption(encryptionController);
+ modeController.addAction(removeEncryptionAction);
+ final EncryptedMap encryptedMapAction = new EncryptedMap();
+ modeController.addAction(encryptedMapAction);
+ }
+
+ public void removeEncryption(final NodeModel node) {
+ final EncryptionModel encryptedMindMapNode = EncryptionModel.getModel(node);
+ if (encryptedMindMapNode == null) {
+ return;
+ }
+ if(! encryptedMindMapNode.isAccessible())
+ toggleCryptState(node);
+ if(! encryptedMindMapNode.isAccessible())
+ return;
+ final IActor actor = new IActor() {
+ public void act() {
+ node.removeExtension(encryptedMindMapNode);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "removeEncryption";
+ }
+
+ public void undo() {
+ node.addExtension(encryptedMindMapNode);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java
new file mode 100644
index 0000000..5ba4019
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java
@@ -0,0 +1,69 @@
+/*
+ * 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.EnabledAction;
+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;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class RemoveEncryption extends AFreeplaneAction{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private MEncryptionController encryptionController;
+
+ public RemoveEncryption(MEncryptionController encryptionController) {
+ super("RemoveEncryption");
+ this.encryptionController = encryptionController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ encryptionController.removeEncryption(node);
+ }
+
+ private boolean canBeEnabled() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null) {
+ return false;
+ }
+ boolean isEncryptedNode = false;
+ final MapController mapController = modeController.getMapController();
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ if (selectedNode != null) {
+ final EncryptionModel enode = EncryptionModel.getModel(selectedNode);
+ if (enode != null) {
+ isEncryptedNode = true;
+ }
+ }
+ return isEncryptedNode;
+ }
+
+ @Override
+ public void setEnabled() {
+ super.setEnabled(canBeEnabled());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/AExportEngine.java b/freeplane/src/org/freeplane/features/export/mindmapmode/AExportEngine.java
new file mode 100644
index 0000000..883b3e0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/AExportEngine.java
@@ -0,0 +1,38 @@
+/*
+ * 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.export.mindmapmode;
+
+import java.awt.image.RenderedImage;
+
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+abstract public class AExportEngine implements IExportEngine {
+ public RenderedImage createBufferedImage(MapModel map) {
+ final Controller controller = Controller.getCurrentController();
+ if(! map.equals(controller.getMap())) {
+ return null;
+ }
+ return controller.getMapViewManager().createImage();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportAction.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportAction.java
new file mode 100644
index 0000000..afee5ff
--- /dev/null
+++ b/freeplane/src/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.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/ExportBranchToHTMLAction.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java
new file mode 100644
index 0000000..9e795e9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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.export.mindmapmode;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.ExampleFileFilter;
+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.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+
+class ExportBranchToHTMLAction implements IExportEngine {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ExportBranchToHTMLAction() {
+ }
+
+ public void export(MapModel map, File file) {
+ if (! ExportController.getContoller().checkCurrentMap(map)){
+ return;
+ }
+ try {
+ ClipboardController.getController().saveHTML(
+ Controller.getCurrentModeController().getMapController().getSelectedNode(), file);
+ ((UrlManager) Controller.getCurrentModeController().getExtension(UrlManager.class))
+ .loadURL(file.toURI());
+ }
+ catch (final IOException ex) {
+ LogUtils.warn(ex);
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ }
+ }
+
+ public FileFilter getFileFilter() {
+ return new ExampleFileFilter("html", TextUtils.getText("ExportBranchToHTMLAction.text"));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportController.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportController.java
new file mode 100644
index 0000000..93b4550
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportController.java
@@ -0,0 +1,133 @@
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.extension.IExtension;
+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.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+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;
+
+/**
+ * A registry of all XSLT scripts that are available to transform a .mm file into another format.
+ * The XSLT file directories are scanned anew by each instance of this class to account for changes during uptime.
+ * The filterMap maps descriptions onto a XSLT file. This enables multiple filters for one file extension.
+ */
+public class ExportController implements IExtension{
+ /** a hash where the key is the file extension and the value the filename of
+ * the corresponding XSLT sheet. */
+ final private HashMap<FileFilter, IExportEngine> filterMap = new HashMap<FileFilter, IExportEngine>();
+ final private ArrayList<FileFilter> fileFilters = new ArrayList<FileFilter>();
+
+ public static void install(ExportController exportController) {
+ Controller.getCurrentModeController().addExtension(ExportController.class, exportController);
+ }
+
+ public ExportController(final String xmlDescriptorFile) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final ExportAction action = new ExportAction();
+ modeController.addAction(action);
+
+ final ExportToHTMLAction exportToHTMLAction = new ExportToHTMLAction();
+ addExportEngine(exportToHTMLAction.getFileFilter(), exportToHTMLAction);
+ final ExportBranchToHTMLAction exportBranchToHTMLAction = new ExportBranchToHTMLAction();
+ addExportEngine(exportBranchToHTMLAction.getFileFilter(), exportBranchToHTMLAction);
+
+ final ExportToOoWriter exportToOoWriter = new ExportToOoWriter();
+
+ addExportEngine(exportToOoWriter.getFileFilter(), exportToOoWriter);
+ createImageExporters();
+ createXSLTExportActions(xmlDescriptorFile);
+ new XsltExportEngineFactory().gatherXsltScripts(this);
+ Collections.sort(fileFilters, new Comparator<FileFilter>() {
+ public int compare(FileFilter f1, FileFilter f2) {
+ return f1.getDescription().compareToIgnoreCase(f2.getDescription());
+ }
+ });
+ }
+
+ public void createImageExporters() {
+ final ExportToImage pngExport = new ExportToImage("png","Portable Network Graphic (PNG)");
+ addExportEngine(pngExport.getFileFilter(), pngExport);
+ final ExportToImage jpgExport = new ExportToImage("jpg","Compressed image (JPEG)");
+ addExportEngine(jpgExport.getFileFilter(), jpgExport);
+ }
+
+ private void createXSLTExportActions( final String xmlDescriptorFile) {
+ InputStream xmlDescriptorStream = null;
+ try {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ final URL resource = ResourceController.getResourceController().getResource(xmlDescriptorFile);
+ xmlDescriptorStream = resource.openStream();
+ final IXMLReader reader = new StdXMLReader(xmlDescriptorStream);
+ parser.setReader(reader);
+ final XMLElement xml = (XMLElement) parser.parse();
+ final Enumeration<XMLElement> actionDescriptors = xml.enumerateChildren();
+ while (actionDescriptors.hasMoreElements()) {
+ final XMLElement descriptor = actionDescriptors.nextElement();
+ final String name = descriptor.getAttribute("name", null);
+ final XMLElement xmlProperties = descriptor.getFirstChildNamed("properties");
+ final Properties properties = xmlProperties.getAttributes();
+ final ExportWithXSLT action = new ExportWithXSLT(name, properties);
+ addExportEngine(action.getFileFilter(), action);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ finally {
+ FileUtils.silentlyClose(xmlDescriptorStream);
+ }
+ }
+
+ public void addExportEngine(final FileFilter filter, final IExportEngine exporter) {
+ fileFilters.add(filter);
+ filterMap.put(filter, exporter);
+ }
+
+ /** returns a Map(description -> xsltFile). */
+ public HashMap<FileFilter, IExportEngine> getFilterMap() {
+ return filterMap;
+ }
+
+ /** returns a list of all appropriate FileFilters for a FileChooser. */
+ public List<FileFilter> getFileFilters() {
+ return fileFilters;
+ }
+
+ public static ExportController getContoller() {
+ return getController(Controller.getCurrentModeController());
+ }
+
+ public static ExportController getController(ModeController modeController) {
+ return (ExportController) modeController.getExtension(ExportController.class);
+ }
+
+ public boolean checkCurrentMap(MapModel map) {
+ if(map.equals(Controller.getCurrentController().getMap())){
+ return true;
+ }
+ UITools.errorMessage(TextUtils.getText("export_works_for_current_map_only"));
+ return false;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportDialog.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportDialog.java
new file mode 100644
index 0000000..965b761
--- /dev/null
+++ b/freeplane/src/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 ExampleFileFilter filter = (ExampleFileFilter) evt.getNewValue();
+ if (filter == null) {
+ return;
+ }
+ final File acceptableFile = getAcceptableFile(selectedFile, 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/ExportToHTMLAction.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java
new file mode 100644
index 0000000..14e5f95
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java
@@ -0,0 +1,66 @@
+/*
+ * 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.export.mindmapmode;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+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.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+
+class ExportToHTMLAction implements IExportEngine {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ExportToHTMLAction() {
+ super();
+ }
+
+ public FileFilter getFileFilter() {
+ return new ExampleFileFilter("html", TextUtils.getText("ExportToHTMLAction.text"));
+ }
+ public void export(MapModel map, File file) {
+ try {
+ ClipboardController.getController().saveHTML(map.getRootNode(), file);
+ if (ResourceController.getResourceController().getBooleanProperty("export_icons_in_html")) {
+ ExportWithXSLT.copyIconsToDirectory(map, new File(file.getAbsoluteFile().getParentFile(), "icons")
+ .getAbsolutePath());
+ }
+ ((UrlManager) Controller.getCurrentModeController().getExtension(UrlManager.class))
+ .loadURL(file.toURI());
+ }
+ catch (final IOException ex) {
+ LogUtils.warn(ex);
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToImage.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToImage.java
new file mode 100644
index 0000000..27dc6e2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToImage.java
@@ -0,0 +1,92 @@
+/*
+ * 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.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ * @author kakeda
+ * @author rreppel
+ */
+public class ExportToImage extends AExportEngine {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ private final String imageDescripton;
+ private final String imageType;
+
+ ExportToImage( final String imageType, final String imageDescripton) {
+ this.imageType = imageType;
+ this.imageDescripton = imageDescripton;
+ }
+
+ public void export(MapModel map, File toFile) {
+ try {
+ final RenderedImage image = createBufferedImage(map);
+ if (image != null) {
+ exportToImage(image, toFile);
+ }
+ }
+ catch (final OutOfMemoryError ex) {
+ UITools.errorMessage(TextUtils.getText("out_of_memory"));
+ }
+ }
+
+ /**
+ * Export image.
+ * @param toFile
+ */
+ public boolean exportToImage(final RenderedImage image, File chosenFile) {
+ try {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final FileOutputStream out = new FileOutputStream(chosenFile);
+ ImageIO.write(image, imageType, out);
+ out.close();
+ }
+ catch (final IOException e1) {
+ LogUtils.warn(e1);
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ }
+ finally{
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ return true;
+ }
+
+ public FileFilter getFileFilter() {
+ return new ExampleFileFilter(imageType, imageDescripton);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
new file mode 100644
index 0000000..af3e1fa
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
@@ -0,0 +1,157 @@
+/*
+ * 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 extends AExportEngine {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ 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);
+ }
+ }
+
+ // note: out is not closed
+ private void copyFromResource(final String fileName, final OutputStream out) {
+ InputStream in = null;
+ try {
+ final URL resource = ResourceController.getResourceController().getResource(fileName);
+ if (resource == null) {
+ LogUtils.severe("Cannot find resource: " + fileName);
+ return;
+ }
+ in = resource.openStream();
+ FileUtils.copyStream(in, out);
+ }
+ catch (final Exception e) {
+ LogUtils.severe("File not found or could not be copied. Was searching for " + fileName
+ + " and should go to " + out, e);
+ return;
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ }
+
+ 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/mm2oowriter.xsl", writer, result);
+ zipout.closeEntry();
+ entry = new ZipEntry("META-INF/manifest.xml");
+ zipout.putNextEntry(entry);
+ applyXsltFile("/xslt/mm2oowriter.manifest.xsl", writer, result);
+ zipout.closeEntry();
+ entry = new ZipEntry("styles.xml");
+ zipout.putNextEntry(entry);
+ copyFromResource("/xml/mm2oowriterStyles.xml", zipout);
+ 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
new file mode 100644
index 0000000..740a2e2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java
@@ -0,0 +1,300 @@
+/*
+ * 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 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.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 extends AExportEngine {
+
+ /**
+ * @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 String name;
+
+ public ExportWithXSLT(final String name, final Properties properties) {
+ this.name = name;
+ this.properties = properties;
+ }
+
+ /**
+ */
+ private void copyFilesFromResourcesToDirectory(final String directoryName, final String files,
+ final String filePrefix) {
+ final StringTokenizer tokenizer = new StringTokenizer(files, ",");
+ final File destinationDirectory = new File(directoryName);
+ while (tokenizer.hasMoreTokens()) {
+ final String next = tokenizer.nextToken();
+ FileUtils.copyFromResource(filePrefix, next, 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;
+ }
+
+ /**
+ * @param map
+ */
+ private boolean createImageFromMap(MapModel map, final String directoryName) {
+ if (Controller.getCurrentController().getViewController().getMapView() == null) {
+ return false;
+ }
+ final RenderedImage image = 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 || !property.startsWith("$")) {
+ return property;
+ }
+ return System.getProperty(property.substring(1), null);
+ }
+
+ 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");
+ boolean success = transformMapWithXslt(xsltFileName, saveFile, areaCode);
+ 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, files, filePrefix);
+ }
+ if (success && StringUtils.equals(getProperty("copy_icons"), "true")) {
+ success = copyIcons(map, directoryName);
+ }
+ if (success && StringUtils.equals(getProperty("copy_map"), "true")) {
+ 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;
+ }
+ }
+
+ /**
+ * @throws IOException
+ */
+ private boolean transformMapWithXslt(final String xsltFileName, final File saveFile, final String areaCode)
+ throws IOException {
+ final Mode mode = Mode.valueOf(getProperty("mode", Mode.EXPORT.name()));
+ 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"));
+ String[] parameters = getProperty("set_properties", "").split(",\\s*");
+ 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/org/freeplane/features/export/mindmapmode/IExportEngine.java
new file mode 100644
index 0000000..e17ed72
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/IExportEngine.java
@@ -0,0 +1,9 @@
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.File;
+
+import org.freeplane.features.map.MapModel;
+
+public interface IExportEngine {
+ public void export(MapModel map, File toFile);
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
new file mode 100644
index 0000000..0770fca
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
@@ -0,0 +1,132 @@
+/*
+ * 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/export/mindmapmode/XsltExportEngine.java b/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngine.java
new file mode 100644
index 0000000..cb4a9f2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngine.java
@@ -0,0 +1,73 @@
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+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.ui.components.UITools;
+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;
+
+public class XsltExportEngine implements IExportEngine {
+ public XsltExportEngine(File xsltFile) {
+ super();
+ this.xsltFile = xsltFile;
+ }
+ final private File xsltFile;
+
+ public void export(MapModel map, File toFile) {
+ final Source xsltSource = new StreamSource(xsltFile);
+ final Source xmlSource = getMapXml(map);
+ FileOutputStream outputStream = null;
+ try {
+ outputStream = new FileOutputStream(toFile);
+ final Result result = new StreamResult(outputStream);
+ final TransformerFactory transFact = TransformerFactory.newInstance();
+ final Transformer trans = transFact.newTransformer(xsltSource);
+ trans.transform(xmlSource, result);
+ }
+ catch (final Exception e) {
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ LogUtils.warn(e);
+ }
+ finally {
+ try {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+ /**
+ * @param mode
+ * @throws IOException
+ */
+ private StreamSource getMapXml(final MapModel map) {
+ final StringWriter writer = new StringWriter();
+ final ModeController modeController = Controller.getCurrentModeController();
+ try {
+ modeController.getMapController().getFilteredXml(map, writer, Mode.EXPORT, true);
+ }
+ catch (final IOException e) {
+ e.printStackTrace();
+ }
+ final StringReader stringReader = new StringReader(writer.getBuffer().toString());
+ return new StreamSource(stringReader);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java b/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java
new file mode 100644
index 0000000..e5f91ca
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java
@@ -0,0 +1,141 @@
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+
+class XsltExportEngineFactory {
+ final private static String EXPORT_FILTER_PATTERN = "^.*MINDMAPEXPORTFILTER\\s+(\\S+)\\s+(.*)(?:\\s+-->)?$";
+ /** A pattern which is "MINDMAPEXPORTFILTER ext1;ext2;... File format description" */
+ final private static String FILE_NAME_PATTERN = "mm2([\\w]+)\\.xsl";
+ final private static Pattern COMPILED_EXPORT_FILTER_PATTERN = Pattern.compile(EXPORT_FILTER_PATTERN);
+ final private static Pattern COMPILED_FILE_NAME_PATTERN = Pattern.compile(FILE_NAME_PATTERN);
+ /** Maximum number of lines we read in each XSLT files for performance reasons */
+ final private static int MAX_READ_LINES = 5;
+ private ExportController controller;
+
+ /** This method populates the {@link #filterMap} and the {@link #fileFilters} field. */
+ void gatherXsltScripts(ExportController controller) {
+ try{
+ this.controller = controller;
+ gatherXsltScripts(getXsltSysDirectory());
+ // overwrite with user settings
+ gatherXsltScripts(getXsltUserDirectory());
+ }
+ finally{
+ this.controller = null;
+ }
+ }
+
+ /**
+ * 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.
+ */
+ File getXsltSysDirectory() {
+ return new File(ResourceController.getResourceController().getResourceBaseDir(), "xslt");
+ }
+
+ /**
+ * 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.
+ */
+ File getXsltUserDirectory() {
+ return new File(ResourceController.getResourceController().getFreeplaneUserDirectory(), "xslt");
+ }
+
+ /**
+ * This methods checks all readable files ending in '.xsl' from a given directory,
+ * and passes them to the method {@link #extractFilterFromFile}.
+ * @param xsltdir the directory where XSLT files are to be searched for
+ */
+ private void gatherXsltScripts(final File xsltdir) {
+ if (!(xsltdir.isDirectory() && xsltdir.canRead())) {
+ return;
+ }
+ // we list the files using an anonymous filter class that accepts only files
+ // readable by the user and with name ending in .xsl
+ final File xsltFiles[] = xsltdir.listFiles(new java.io.FileFilter() {
+ public boolean accept(final File pathname) {
+ return (pathname.isFile() && pathname.canRead() && pathname.getPath().toLowerCase().endsWith(".xsl"));
+ }
+ });
+ // we compile the pattern for performance reasons.
+ // then for each found file, we check and extract a potentially present filter
+ for (int i = 0; i < xsltFiles.length; i++) {
+ extractFilterFromFile(xsltFiles[i]);
+ }
+ }
+
+ /**
+ * The function checks if the pattern matches with one of the lines in the file.
+ * @param xsltFile the file to open and search a line matching the pattern.
+ */
+ private void extractFilterFromFile(final File xsltFile) {
+ BufferedReader xsl = null;
+ try {
+ xsl = new BufferedReader(new FileReader(xsltFile));
+ String line;
+ int l = 0;
+ boolean keyFound = false;
+ // ...we open it and check if it contains the right marker
+ while ((line = xsl.readLine()) != null && l < MAX_READ_LINES) {
+ final Matcher m = COMPILED_EXPORT_FILTER_PATTERN.matcher(line);
+ if (m.matches()) { // if it does
+ keyFound = true;
+ final String[] extensions = m.group(1).split("\\s*;\\s*");
+ String description = m.group(2).trim();
+ if(description.startsWith("%")){
+ description = TextUtils.getText(description.substring(1));
+ }
+ addXsltFile(extensions, description, xsltFile);
+ // we want to allow for more than one filter line per XSLT file
+ // so we don't exit once we've found one and even account for
+ // the fact that we might trespass the MAX_READ_LINES limit
+ l--;
+ }
+ l++;
+ }
+ if (keyFound) {
+ return;
+ }
+ final Matcher m = COMPILED_FILE_NAME_PATTERN.matcher(xsltFile.getName());
+ if (m.matches()) { // if it does
+ final String extension = m.group(1);
+ final String description = TextUtils.format("exported_file", extension);
+ addXsltFile(new String[] { extension }, description, xsltFile);
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn(e);
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ }
+ finally {
+ if (xsl != null) {
+ try {
+ xsl.close();
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+ }
+
+ private void addXsltFile(final String[] extensions, String description, final File xsltFile) {
+ final ExampleFileFilter filter = new ExampleFileFilter(extensions, TextUtils.getOptionalTranslation(description));
+ final XsltExportEngine exporter = new XsltExportEngine(xsltFile);
+ controller.addExportEngine(filter, exporter);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java b/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java
new file mode 100644
index 0000000..9e1f3b9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java
@@ -0,0 +1,633 @@
+/*
+ * 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.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.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) {
+ if (elementaryConditionList.getMinSelectionIndex() == -1) {
+ btnNot.setEnabled(false);
+ btnSplit.setEnabled(false);
+ btnAnd.setEnabled(false);
+ btnOr.setEnabled(false);
+ btnDelete.setEnabled(false);
+ btnName.setEnabled(false);
+ return;
+ }
+ else if (elementaryConditionList.getMinSelectionIndex() == elementaryConditionList.getMaxSelectionIndex()) {
+ btnNot.setEnabled(true);
+ btnSplit.setEnabled(elementaryConditionList.getSelectedValue() instanceof ICombinedCondition);
+ btnAnd.setEnabled(false);
+ btnOr.setEnabled(false);
+ btnDelete.setEnabled(true);
+ btnName.setEnabled(true);
+ return;
+ }
+ else {
+ btnNot.setEnabled(false);
+ btnSplit.setEnabled(false);
+ btnAnd.setEnabled(true);
+ btnOr.setEnabled(true);
+ btnDelete.setEnabled(true);
+ btnName.setEnabled(false);
+ }
+ }
+ }
+
+ 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 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());
+ }
+ 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;
+ final private JButton btnAdd;
+ final private JButton btnAnd;
+ final private JButton btnApply;
+ final private JButton btnCancel;
+ final private JButton btnDelete;
+ final private JButton btnName;
+ 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;
+
+ 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);
+ final Box conditionButtonBox = Box.createVerticalBox();
+ conditionButtonBox.setBorder(new EmptyBorder(0, 10, 0, 10));
+ getContentPane().add(conditionButtonBox, BorderLayout.EAST);
+ btnAdd = new JButton(new AddElementaryConditionAction());
+ btnAdd.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(Box.createVerticalGlue());
+ conditionButtonBox.add(btnAdd);
+ btnNot = new JButton(new CreateNotSatisfiedConditionAction());
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnNot.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnNot);
+ btnNot.setEnabled(false);
+ btnAnd = new JButton(new CreateConjunctConditionAction());
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnAnd.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnAnd);
+ btnAnd.setEnabled(false);
+ btnOr = new JButton(new CreateDisjunctConditionAction());
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnOr.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnOr);
+ btnOr.setEnabled(false);
+ btnSplit = new JButton(new SplitConditionAction());
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnSplit.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnSplit);
+ btnSplit.setEnabled(false);
+ btnDelete = new JButton(new DeleteConditionAction());
+ btnDelete.setEnabled(false);
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnDelete.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnDelete);
+ btnName = new JButton(new NameConditionAction());
+ btnName.setEnabled(false);
+ conditionButtonBox.add(Box.createVerticalGlue());
+ btnName.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(btnName);
+ 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);
+ conditionScrollPane.setPreferredSize(new Dimension(500, 200));
+ getContentPane().add(conditionScrollPane, BorderLayout.CENTER);
+ UITools.addEscapeActionToDialog(this);
+ pack();
+ }
+
+ 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/ApplyNoFilteringAction.java b/freeplane/src/org/freeplane/features/filter/ApplyNoFilteringAction.java
new file mode 100644
index 0000000..e6a3174
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ApplyNoFilteringAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class ApplyNoFilteringAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ /**
+ * @param filterController
+ */
+ ApplyNoFilteringAction(final FilterController filterController) {
+ super("ApplyNoFilteringAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.applyNoFiltering();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ApplySelectedViewConditionAction.java b/freeplane/src/org/freeplane/features/filter/ApplySelectedViewConditionAction.java
new file mode 100644
index 0000000..d97dbe8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ApplySelectedViewConditionAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class ApplySelectedViewConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ /**
+ * @param filterController
+ */
+ ApplySelectedViewConditionAction(final FilterController filterController) {
+ super("ApplySelectedViewConditionAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.applySelectedViewCondition();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ApplyToVisibleAction.java b/freeplane/src/org/freeplane/features/filter/ApplyToVisibleAction.java
new file mode 100644
index 0000000..a74f553
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ApplyToVisibleAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 31, 2009
+ */
+ at SelectableAction
+class ApplyToVisibleAction extends AFreeplaneAction {
+ final static String NAME = "ApplyToVisibleAction";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ ApplyToVisibleAction(final FilterController filterController) {
+ super("ApplyToVisibleAction");
+ this.filterController = filterController;
+ filterController.getApplyToVisibleNodeOnly().addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent e) {
+ setSelected(isModelSelected());
+ }
+ });
+ setSelected(isModelSelected());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.getApplyToVisibleNodeOnly().setSelected(!isModelSelected());
+ }
+
+ private boolean isModelSelected() {
+ return filterController.getApplyToVisibleNodeOnly().isSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/DamerauLevenshtein.java b/freeplane/src/org/freeplane/features/filter/DamerauLevenshtein.java
new file mode 100644
index 0000000..5f5c85d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/DamerauLevenshtein.java
@@ -0,0 +1,197 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry Polivaev
+ *
+ * This file's 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 java.util.Arrays;
+
+/**
+ * Damerau-Levenshtein implementation, computes the edit distance (ins/del/subst/transpos)
+ * between a search term and a text to search against.
+ * see http://en.wikipedia.org/wiki/DamerauâLevenshtein_distance
+ * The basic algorithm is orignally from wikipedia, and was extended for semi-global alignments.
+ *
+ * Optionally the edit distance of a semi-global alignment is computed which
+ * allows the search term to be shifted free-of-cost (i.e. dist("file", "a file is")==0).
+ *
+ * Some properties are explained in the unit test, {@link org.freeplane.features.filter.EditDistanceStringMatchingStrategiesTest}.
+ *
+ * TODO: use unicode code points instead of chars !!
+ *
+ * @author Felix Natter <fnatter at gmx.net>
+ *
+ */
+public class DamerauLevenshtein implements EditDistanceStringMatchingStrategy {
+
+ private String searchTerm;
+ private String searchText;
+ private Type type;
+ private int alphabetLength;
+
+ public int distance()
+ {
+ final int INFINITY = searchTerm.length() + searchText.length();
+ int[][] H = new int[searchTerm.length()+2][searchText.length()+2];
+ H[0][0] = INFINITY;
+ for(int i = 0; i<=searchTerm.length(); i++) {
+ H[i+1][1] = i;
+ H[i+1][0] = INFINITY;
+ }
+ for(int j = 0; j<=searchText.length(); j++) {
+ H[1][j+1] = (type == Type.Global) ? j : 0;
+ H[0][j+1] = INFINITY;
+ }
+ int[] DA = new int[alphabetLength];
+ Arrays.fill(DA, 0);
+ for(int i = 1; i<=searchTerm.length(); i++) {
+ int DB = 0;
+ for(int j = 1; j<=searchText.length(); j++) {
+ int i1 = DA[searchText.charAt(j-1)];
+ int j1 = DB;
+ int d = ((searchTerm.charAt(i-1)==searchText.charAt(j-1))?0:1);
+ if(d==0) DB = j;
+ H[i+1][j+1] =
+ min(H[i][j]+d,
+ H[i+1][j] + 1,
+ H[i][j+1]+1,
+ H[i1][j1] + (i-i1-1) + 1 + (j-j1-1));
+ }
+ DA[searchTerm.charAt(i-1)] = i;
+ }
+ //writeMatrix(H);
+ if (type == Type.Global)
+ {
+ return H[searchTerm.length()+1][searchText.length()+1];
+ }
+ else
+ {
+ int min = Integer.MAX_VALUE;
+ for (int j = 1; j <= searchText.length() + 1; j++)
+ {
+ min = Math.min(min, H[searchTerm.length()+1][j]);
+ }
+ return min;
+ }
+ }
+
+ private void writeMatrix(int[][] H)
+ {
+ for (int i = 0; i < H.length; i++)
+ {
+ for (int j = 0; j < H[0].length; j++)
+ {
+ System.out.format(" %3d", H[i][j]);
+ }
+ System.out.println();
+ }
+ }
+
+ private static int min(int ... nums)
+ {
+ int min = Integer.MAX_VALUE;
+ for (int num : nums) {
+ min = Math.min(min, num);
+ }
+ return min;
+ }
+
+ public float matchProb()
+ {
+ if (type == Type.SemiGlobal)
+ {
+ return 1.0F - ((float)distance() / searchTerm.length());
+ }
+ else
+ {
+ return 1.0F - ((float)distance() / Math.min(searchTerm.length(), searchText.length()));
+ }
+ }
+
+ /*
+ public DamerauLevenshtein(final String searchTerm, final String searchText,
+ final Type type, final boolean caseSensitive)
+ {
+ if (caseSensitive)
+ {
+ this.searchTerm = searchTerm;
+ this.searchText = searchText;
+ }
+ else
+ {
+ this.searchTerm = searchTerm.toLowerCase();
+ this.searchText= searchText.toLowerCase();
+ }
+ this.type = type;
+ int maxCodePoint = 0;
+ for (int i = 0; i < searchTerm.length(); i++)
+ {
+ maxCodePoint = Math.max(maxCodePoint, searchTerm.charAt(i));
+ }
+ for (int i = 0; i < searchText.length(); i++)
+ {
+ maxCodePoint = Math.max(maxCodePoint, searchText.charAt(i));
+ }
+ alphabetLength = maxCodePoint + 1;
+ }
+ */
+
+ public DamerauLevenshtein() {
+
+ }
+
+ public void init(final String searchTerm, final String searchText, final boolean subStringMatch,
+ final boolean caseSensitive)
+ {
+ if (searchTerm == null || searchText == null)
+ {
+ throw new IllegalArgumentException("Null searchText/searchTerm!");
+ }
+
+ if (caseSensitive)
+ {
+ this.searchTerm = searchTerm;
+ this.searchText = searchText;
+ }
+ else
+ {
+ this.searchTerm = searchTerm.toLowerCase();
+ this.searchText= searchText.toLowerCase();
+ }
+ this.type = subStringMatch ? Type.SemiGlobal : Type.Global;
+ int maxCodePoint = 0;
+ for (int i = 0; i < this.searchTerm.length(); i++)
+ {
+ maxCodePoint = Math.max(maxCodePoint, this.searchTerm.charAt(i));
+ }
+ for (int i = 0; i < this.searchText.length(); i++)
+ {
+ maxCodePoint = Math.max(maxCodePoint, this.searchText.charAt(i));
+ }
+ alphabetLength = maxCodePoint + 1;
+ }
+
+ public boolean matches(final String searchTerm, final String searchText, final boolean subStringMatch,
+ final boolean caseSensitive)
+ {
+ //LogUtils.severe(String.format("DL(%s,%s)\n", searchTerm, searchText));
+ init(searchTerm, searchText, subStringMatch, caseSensitive);
+
+ return matchProb() > StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java b/freeplane/src/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java
new file mode 100644
index 0000000..febba4b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java
@@ -0,0 +1,16 @@
+package org.freeplane.features.filter;
+
+public interface EditDistanceStringMatchingStrategy extends
+ StringMatchingStrategy {
+
+ public enum Type { Global, SemiGlobal };
+
+ int distance();
+
+ float matchProb();
+
+ void init(final String searchTerm, final String searchText, final boolean subStringMatch,
+ final boolean caseSensitive);
+
+}
+
diff --git a/freeplane/src/org/freeplane/features/filter/EditFilterAction.java b/freeplane/src/org/freeplane/features/filter/EditFilterAction.java
new file mode 100644
index 0000000..8b26442
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/EditFilterAction.java
@@ -0,0 +1,107 @@
+/*
+ * 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/ExactStringMatchingStrategy.java b/freeplane/src/org/freeplane/features/filter/ExactStringMatchingStrategy.java
new file mode 100644
index 0000000..5245313
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ExactStringMatchingStrategy.java
@@ -0,0 +1,20 @@
+package org.freeplane.features.filter;
+
+public class ExactStringMatchingStrategy implements StringMatchingStrategy {
+
+ public boolean matches(final String searchTerm, final String searchText,
+ final boolean subStringMatch, final boolean caseSensitive) {
+
+ if (subStringMatch)
+ {
+ return caseSensitive ? searchText.contains(searchTerm) :
+ searchText.toLowerCase().contains(searchTerm.toLowerCase());
+ }
+ else
+ {
+ return caseSensitive ? searchText.equals(searchTerm) :
+ searchText.equalsIgnoreCase(searchTerm);
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/Filter.java b/freeplane/src/org/freeplane/features/filter/Filter.java
new file mode 100644
index 0000000..e87ae59
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/Filter.java
@@ -0,0 +1,246 @@
+/*
+ * 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;
+ private boolean cancelled = false;
+
+ public Filter(final ICondition condition, final boolean areAnchestorsShown,
+ final boolean areDescendantsShown, final boolean applyToVisibleNodesOnly) {
+ super();
+ this.condition = condition;
+ int options = FilterInfo.FILTER_INITIAL_VALUE | FilterInfo.FILTER_SHOW_MATCHED;
+ if (areAnchestorsShown) {
+ 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);
+ cancelled = 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 || cancelled) {
+ return true;
+ }
+ if (appliesToVisibleNodesOnly && !node.isVisible()) {
+ return false;
+ }
+ try {
+ return condition.checkNode(node);
+ } catch (FilterCancelledException e) {
+ cancelled = true;
+ return true;
+ }
+ }
+
+ 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/FilterCancelledException.java b/freeplane/src/org/freeplane/features/filter/FilterCancelledException.java
new file mode 100644
index 0000000..24e8a4d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FilterCancelledException.java
@@ -0,0 +1,20 @@
+package org.freeplane.features.filter;
+
+public class FilterCancelledException extends RuntimeException {
+
+ public FilterCancelledException() {
+ }
+
+ public FilterCancelledException(String message) {
+ super(message);
+ }
+
+ public FilterCancelledException(Throwable cause) {
+ super(cause);
+ }
+
+ public FilterCancelledException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java b/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java
new file mode 100644
index 0000000..6c384f5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java
@@ -0,0 +1,340 @@
+/*
+ * 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.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 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
new file mode 100644
index 0000000..67e5033
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FilterController.java
@@ -0,0 +1,594 @@
+/*
+ * 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.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.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().getViewController().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 (FilterController) 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 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 FilterConditionEditor quickEditor;
+
+ public FilterController() {
+ Controller controller = Controller.getCurrentController();
+ 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);
+ activeFilterConditionComboBox.setRenderer(this.getConditionRenderer());
+ 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"));
+ }
+ 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(filterConditions, pathToFilterFile);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ void loadConditions(final DefaultComboBoxModel filterConditionModel, final String pathToFilterFile)
+ throws IOException {
+ try {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ final IXMLReader reader = new StdXMLReader(new BufferedInputStream(new FileInputStream(pathToFilterFile)));
+ parser.setReader(reader);
+ 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);
+ 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);
+ }
+
+ 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterHistory.java b/freeplane/src/org/freeplane/features/filter/FilterHistory.java
new file mode 100644
index 0000000..fea6226
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FilterHistory.java
@@ -0,0 +1,107 @@
+/*
+ * 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.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+public class FilterHistory {
+// // private final Controller controller;
+ private ListIterator<Filter> filters;
+
+ FilterHistory() {
+// this.controller = controller;
+ init();
+ }
+
+ void add(final Filter filter) {
+ final Filter currentFilter = getCurrentFilter();
+ if (isConditionStronger(currentFilter, filter)) {
+ filters.previous();
+ filters.remove();
+ }
+ while (filters.hasNext()) {
+ filters.next();
+ filters.remove();
+ }
+ filters.add(filter);
+ }
+
+ void clear() {
+ init();
+ }
+
+ Filter getCurrentFilter() {
+ filters.previous();
+ return filters.next();
+ }
+
+ private void init() {
+ final List<Filter> list = new LinkedList<Filter>();
+ filters = list.listIterator();
+ filters.add(Filter.createTransparentFilter());
+ }
+
+ private boolean isConditionStronger(final Filter oldFilter, final Filter newFilter) {
+ return newFilter.isConditionStronger(oldFilter);
+ }
+
+ void redo() {
+ if (!filters.hasNext()) {
+ return;
+ }
+ Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final Filter next = filters.next();
+ next.applyFilter(this, map, true);
+ }
+
+ void undo() {
+ Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final Filter previous = filters.previous();
+ undoImpl(map);
+ while (previous != filters.next()) {
+ ;
+ }
+ if (filters.nextIndex() > 1) {
+ filters.previous();
+ }
+ }
+
+ private void undoImpl( final MapModel map) {
+ if (!filters.hasPrevious()) {
+ return;
+ }
+ final Filter previous = filters.previous();
+ if (previous.appliesToVisibleNodesOnly()) {
+ undoImpl(map);
+ }
+ previous.applyFilter(this, map, true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterInfo.java b/freeplane/src/org/freeplane/features/filter/FilterInfo.java
new file mode 100644
index 0000000..34ccfe5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FilterInfo.java
@@ -0,0 +1,83 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class FilterInfo {
+ public static final int FILTER_INITIAL_VALUE = 1;
+ public static final int FILTER_SHOW_ANCESTOR = 4;
+ public static final int FILTER_SHOW_DESCENDANT = 8;
+ public static final int FILTER_SHOW_ECLIPSED = 16;
+ public static final int FILTER_SHOW_HIDDEN = 32;
+ public static final int FILTER_SHOW_MATCHED = 2;
+ private int info = FilterInfo.FILTER_INITIAL_VALUE;
+
+ /**
+ *
+ */
+ public FilterInfo() {
+ super();
+ }
+
+ void add(final int flag) {
+ if ((flag & (FilterInfo.FILTER_SHOW_MATCHED | FilterInfo.FILTER_SHOW_HIDDEN)) != 0) {
+ info &= ~FilterInfo.FILTER_INITIAL_VALUE;
+ }
+ info |= flag;
+ }
+
+ int get() {
+ return info;
+ }
+
+ /**
+ */
+ public boolean isAncestor() {
+ return (info & FilterInfo.FILTER_SHOW_ANCESTOR) != 0;
+ }
+
+ /**
+ */
+ public boolean isMatched() {
+ return (info & FilterInfo.FILTER_SHOW_MATCHED) != 0;
+ }
+
+ public void reset() {
+ info = FilterInfo.FILTER_INITIAL_VALUE;
+ }
+
+ public void setAncestor() {
+ add(FilterInfo.FILTER_SHOW_ANCESTOR);
+ }
+
+ public void setDescendant() {
+ add(FilterInfo.FILTER_SHOW_DESCENDANT);
+ }
+
+ public void setMatched() {
+ add(FilterInfo.FILTER_SHOW_MATCHED);
+ }
+
+ public boolean isUnset() {
+ return info == FilterInfo.FILTER_INITIAL_VALUE;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/FindAction.java b/freeplane/src/org/freeplane/features/filter/FindAction.java
new file mode 100644
index 0000000..63b1c92
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/FindAction.java
@@ -0,0 +1,206 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+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.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapController.Direction;
+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();
+ ((FilterConditionEditor) component).focusInputField(true);
+ ((JComponent) component).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/NextNodeAction.java b/freeplane/src/org/freeplane/features/filter/NextNodeAction.java
new file mode 100644
index 0000000..d7b48ac
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/NextNodeAction.java
@@ -0,0 +1,33 @@
+package org.freeplane.features.filter;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.mode.Controller;
+
+public class NextNodeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final Direction direction;
+
+ public NextNodeAction( final Direction direction) {
+ super("NextNodeAction." + direction.toString());
+ this.direction = direction;
+ }
+
+ /**
+ *
+ */
+ 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, null);
+ if(next != null){
+ Controller.getCurrentModeController().getMapController().select(next);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/NextPresentationItemAction.java b/freeplane/src/org/freeplane/features/filter/NextPresentationItemAction.java
new file mode 100644
index 0000000..507a4da
--- /dev/null
+++ b/freeplane/src/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.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/PseudoDamerauLevenshtein.java b/freeplane/src/org/freeplane/features/filter/PseudoDamerauLevenshtein.java
new file mode 100644
index 0000000..e11327e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/PseudoDamerauLevenshtein.java
@@ -0,0 +1,566 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry Polivaev
+ *
+ * This file's 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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * Pseudo-Damerau-Levenshtein (aka "Optimal String Distance")
+ * implementation which allows some non-adjacent transpositions(?)
+ * Computes the edit distance with insertions/deletions/substitutions/transpositions.
+ *
+ * Optionally the edit distance of a semi-global alignment is computed which
+ * allows the search term to be shifted free-of-cost (i.e. dist("file", "a file is")==0).
+ *
+ * Some properties are explained in the unit test, {@link org.freeplane.features.filter.EditDistanceStringMatchingStrategiesTest}.
+ *
+ * TODO: use unicode code points instead of chars !!
+ * (but neither simplyhtml nor freeplane are currently codepoint-safe...)
+ *
+ * @author Felix Natter <fnatter at gmx.net>
+ *
+ */
+public class PseudoDamerauLevenshtein implements EditDistanceStringMatchingStrategy {
+ private int[][] matrix;
+ private String searchTerm;
+ private String searchText;
+ private final int costIndel = 1;
+ private final int costMismatch = 1;
+ private final int costTranspos = 1;
+ private Type type;
+ private Stack<Alignment> alignmentsInProgress;
+ private ArrayList<Alignment> alignmentsDone;
+
+ public class Alignment implements Comparable<Alignment>
+ {
+ private final String searchTermString;
+ private final String searchTextString;
+ private final double prob;
+ private final int matchStart;
+ private final int matchEnd;
+ private final int r, c;
+
+ public int getMatchStart()
+ {
+ return matchStart;
+ }
+
+ public int getMatchEnd()
+ {
+ return matchEnd;
+ }
+
+ public boolean overlapsWith(final Alignment other)
+ {
+ return (matchStart <= other.matchStart && other.matchStart <= matchEnd-1) || // endpoint of this lies in other
+ (other.matchStart <= matchStart && matchStart <= other.matchEnd-1); // endpoint of other lies in this
+
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + c;
+ result = prime * result + matchEnd;
+ result = prime * result + matchStart;
+ long temp;
+ temp = Double.doubleToLongBits(prob);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + r;
+ result = prime
+ * result
+ + ((searchTermString == null) ? 0 : searchTermString
+ .hashCode());
+ result = prime
+ * result
+ + ((searchTextString == null) ? 0 : searchTextString
+ .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;
+ }
+ Alignment other = (Alignment) obj;
+ if (!getOuterType().equals(other.getOuterType())) {
+ return false;
+ }
+ if (c != other.c) {
+ return false;
+ }
+ if (matchEnd != other.matchEnd) {
+ return false;
+ }
+ if (matchStart != other.matchStart) {
+ return false;
+ }
+ if (Double.doubleToLongBits(prob) != Double
+ .doubleToLongBits(other.prob)) {
+ return false;
+ }
+ if (r != other.r) {
+ return false;
+ }
+ if (searchTermString == null) {
+ if (other.searchTermString != null) {
+ return false;
+ }
+ } else if (!searchTermString.equals(other.searchTermString)) {
+ return false;
+ }
+ if (searchTextString == null) {
+ if (other.searchTextString != null) {
+ return false;
+ }
+ } else if (!searchTextString.equals(other.searchTextString)) {
+ return false;
+ }
+ return true;
+ }
+
+
+
+ public String getMatch()
+ {
+ return searchText.substring(matchStart, matchEnd);
+ }
+
+ public int compareTo(final Alignment other)
+ {
+ if (prob == other.prob)
+ {
+ return new Integer(getMatch().length()).compareTo(new Integer(other.getMatch().length()));
+ }
+ else
+ {
+ return new Double(prob).compareTo(new Double(other.prob));
+ }
+ }
+
+ public void print()
+ {
+ System.out.format("Alignment@%x[%.2f]:\n%s\n%s\n=> matches '%s' [%d,%d]\n",
+ hashCode(), prob, searchTermString, searchTextString, getMatch(),
+ matchStart,matchEnd);
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.format("Ali@%x[%s,%.2f,%d,%d]", hashCode(), getMatch(), prob, matchStart, matchEnd);
+ }
+
+ public Alignment(final String searchTermString, final String searchTextString, final double prob,
+ final int matchStart, final int matchEnd, final int r, final int c)
+ {
+ this.searchTermString = searchTermString;
+ this.searchTextString = searchTextString;
+ this.prob = prob;
+ this.matchStart = matchStart;
+ this.matchEnd = matchEnd;
+ this.r = r;
+ this.c = c;
+ }
+
+
+
+ private PseudoDamerauLevenshtein getOuterType() {
+ return PseudoDamerauLevenshtein.this;
+ }
+ }
+
+ private boolean isMatch(int i, int j)
+ {
+ char col = searchTerm.charAt(i-1);
+ char row = searchText.charAt(j-1);
+ if (col == row || row == '-')
+ return true;
+ else
+ return false;
+ }
+
+ public int distance() {
+
+ matrix = new int[searchTerm.length()+1][searchText.length()+1]; // [row][col]
+
+ // first column: start-gap penalties for searchTerm
+ for (int i = 0; i <= (int)searchTerm.length(); i++)
+ matrix[i][0] = i*costIndel;
+
+ // first row: start-gap penalties for searchText
+ if (type == Type.Global)
+ {
+ for (int j = 1; j <= (int)searchText.length(); j++)
+ matrix[0][j] = j*costIndel;
+ }
+ else if (type == Type.SemiGlobal)
+ {
+ Arrays.fill(matrix[0], 0);
+ }
+
+ // compute the rest of the matrix
+ for (int i = 1; i <= searchTerm.length(); i++)
+ {
+ for (int j = 1; j <= searchText.length(); j++)
+ {
+ int cost_try_match = matrix[i-1][j-1] + (isMatch(i,j) ? 0 : costMismatch);
+ int cost_ins = matrix[i-1][j] + costIndel;
+ int cost_del = matrix[i][j-1] + costIndel;
+ matrix[i][j] = Math.min(cost_try_match, Math.min(cost_ins, cost_del));
+
+ if (i >= 2 && j >= 2 &&
+ searchTerm.charAt(i-2) == searchText.charAt(j-1) &&
+ searchTerm.charAt(i-1) == searchText.charAt(j-2))
+ {
+ matrix[i][j] = Math.min(matrix[i][j], matrix[i-2][j-2] + costTranspos);
+ }
+ }
+ }
+ //writeMatrix(matrix);
+ if (type == Type.Global)
+ {
+ return matrix[searchTerm.length()][searchText.length()];
+ }
+ else
+ {
+ int min = Integer.MAX_VALUE;
+ for (int j = 1; j <= searchText.length()+1; j++)
+ {
+ min = Math.min(min, matrix[searchTerm.length()][j-1]);
+ }
+ return min;
+ }
+
+ }
+
+ private void writeMatrix(int[][] H)
+ {
+ for (int i = 0; i < H.length; i++)
+ {
+ for (int j = 0; j < H[0].length; j++)
+ {
+ System.out.format(" %3d", H[i][j]);
+ }
+ System.out.println();
+ }
+ }
+
+ public List<Alignment> computeAlignments(final double minProb)
+ {
+ alignmentsInProgress = new Stack<Alignment>();
+ alignmentsDone = new ArrayList<Alignment>();
+
+ int dist = distance(); // this computes the Dynamic Programming matrix according to Levenshtein
+
+ if (type == Type.Global && getMatchProb(dist) > minProb)
+ {
+ alignmentsInProgress.push(new Alignment("", "", getMatchProb(dist), 0, searchText.length(),
+ searchTerm.length(), searchText.length()));
+ }
+ else
+ {
+ // semi-global "substring" alignment
+ StringBuilder searchTermSuffix = new StringBuilder();
+ StringBuilder searchTextSuffix = new StringBuilder();
+ for (int c = searchText.length() + 1; c >= 1; c--)
+ {
+ if (c <= searchText.length())
+ {
+ searchTermSuffix.append('-');
+ searchTextSuffix.insert(0, searchText.charAt(c-1));
+ }
+ double prob = getMatchProb(matrix[searchTerm.length()][c-1]);
+ if (prob > minProb)
+ {
+ alignmentsInProgress.push(new Alignment(searchTermSuffix.toString(), searchTextSuffix.toString(),
+ prob, 0, searchText.length() - searchTextSuffix.length(), searchTerm.length(), c - 1));
+ }
+ }
+ }
+
+ while (!alignmentsInProgress.isEmpty())
+ {
+ developAlignment(alignmentsInProgress.pop());
+ }
+
+ // filter (overlapping) alignments
+ alignmentsDone = filterAlignments(alignmentsDone);
+
+ sortAlignments(alignmentsDone);
+
+ /*
+ System.out.format("--NON-OVERLAPPPING ALIGNMENTS-------------------\n");
+ for (Alignment ali: alignmentsDone)
+ {
+ ali.print();
+ }
+ */
+
+ matrix = null;
+
+ //return alignmentsDone.toArray(new Alignment[alignmentsDone.size()]);
+ return alignmentsDone;
+ }
+
+ /**
+ * Keep only non-overlapping matches (alignments) while preferring alignments with high score (prob)
+ * TODO: this is a heuristic, is the problem NP complete?
+ * => probably, see "maximum set packing"
+ *
+ * @param alignments alignments list to filter
+ * @return filtered alignment list
+ */
+ static ArrayList<Alignment> filterAlignments(final ArrayList<Alignment> alignments)
+ {
+ if (alignments.isEmpty())
+ return new ArrayList<Alignment>();
+
+ // sort by score and match length (see Alignment.compareTo())
+ Collections.sort(alignments, Collections.reverseOrder());
+
+ ArrayList<Alignment> clusters = new ArrayList<Alignment>(alignments.size());
+ // start with a single cluster
+ clusters.add(alignments.get(0));
+ alignments.remove(0);
+
+ // assign alignments to clusters
+ for (Alignment ali: alignments)
+ {
+ boolean found_cluster = false;
+ for (int j = 0; j < clusters.size(); j++)
+ {
+ if (ali.overlapsWith(clusters.get(j)))
+ {
+ found_cluster = true;
+ // keep either current cluster center or set to 'ali'
+ if (ali.compareTo(clusters.get(j)) > 0)
+ {
+ clusters.set(j, ali);
+ }
+ }
+ }
+ if (!found_cluster)
+ {
+ clusters.add(ali);
+ }
+ }
+ return clusters;
+ }
+
+ /**
+ * Sort alignments (matches) by start positions
+ * @param alignments list of alignments to sort
+ */
+ static void sortAlignments(final ArrayList<Alignment> alignments)
+ {
+ Collections.sort(alignments, new Comparator<Alignment>()
+ {
+
+ public int compare(Alignment o1, Alignment o2) {
+ return new Integer(o1.matchStart).compareTo(o2.matchStart);
+ }
+
+ });
+ }
+
+// private void printAlignmentsFrom(final String searchTermSuffix, final String searchTextSuffix, final int r, final int c,
+// double prob, int matchStart, int matchEnd)
+ private void developAlignment(final Alignment ali)
+ {
+ System.out.format("developAlignment(term=%s, text=%s, r=%d, c=%d)",
+ ali.searchTermString, ali.searchTextString, ali.r, ali.c);
+
+ if (ali.r == 0 && ali.c == 0)
+ {
+ alignmentsDone.add(ali);
+ System.out.println();
+ ali.print();
+ }
+ else
+ {
+ // TODO: comments!!
+
+ // match/mismatch
+ if (ali.r >= 1 && ali.c >= 1 && matrix[ali.r][ali.c] == matrix[ali.r-1][ali.c-1] + (isMatch(ali.r,ali.c) ? 0 : costMismatch))
+ {
+ System.out.format("=> match/mismatch\n");
+
+ alignmentsInProgress.push(new Alignment(
+ searchTerm.charAt(ali.r-1) + ali.searchTermString,
+ searchText.charAt(ali.c-1) + ali.searchTextString,
+ ali.prob, ali.matchStart, ali.matchEnd, ali.r - 1, ali.c - 1)
+ );
+ }
+
+ /*
+ // free insertions at the beginning of the searchTerm
+ if (ali.c >= 1 && type == Type.SemiGlobal && ali.r == 0 && matrix[ali.r][ali.c-1] == 0)
+ {
+ System.out.format("=> insertion at beginning\n");
+
+ alignmentsInProgress.push(new Alignment(
+ "-" + ali.searchTermString,
+ searchText.charAt(ali.c-1) + ali.searchTextString,
+ ali.prob, ali.matchStart + 1, ali.matchEnd, ali.r, ali.c - 1)
+ );
+ }
+ */
+ if (type == Type.SemiGlobal && ali.r == 0)
+ {
+ System.out.format("=> insertions at beginning\n");
+ int c = ali.c, matchStart = ali.matchStart;
+ StringBuilder searchTermPrefix = new StringBuilder();
+ StringBuilder searchTextPrefix = new StringBuilder();
+ while (c > 0)
+ {
+ searchTermPrefix.append('-');
+ searchTextPrefix.insert(0, searchText.charAt(c-1));
+ matchStart += 1;
+ c--;
+ }
+ alignmentsInProgress.push(new Alignment(
+ searchTermPrefix.toString() + ali.searchTermString,
+ searchTextPrefix.toString() + ali.searchTextString,
+ ali.prob, matchStart, ali.matchEnd, 0, 0)
+ );
+ }
+
+ // insertion
+ if (ali.c >= 1 && matrix[ali.r][ali.c] == matrix[ali.r][ali.c-1] + costIndel)
+ {
+ System.out.format("=> insertion\n");
+
+ alignmentsInProgress.push(new Alignment(
+ "-" + ali.searchTermString,
+ searchText.charAt(ali.c-1) + ali.searchTextString,
+ ali.prob, ali.matchStart, ali.matchEnd, ali.r, ali.c - 1)
+ );
+ }
+
+ // deletion
+ if (ali.r >= 1 && matrix[ali.r][ali.c] == matrix[ali.r-1][ali.c] + costIndel)
+ {
+ System.out.format("=> deletion\n");
+
+ alignmentsInProgress.push(new Alignment(
+ searchTerm.charAt(ali.r-1) + ali.searchTermString,
+ "-" + ali.searchTextString,
+ ali.prob, ali.matchStart, ali.matchEnd, ali.r - 1, ali.c)
+ );
+ }
+
+ // Damerau-Extension (transpositions)
+ if (ali.r >= 2 && ali.c >= 2 && matrix[ali.r][ali.c] == matrix[ali.r-2][ali.c-2] + costTranspos &&
+ searchTerm.charAt(ali.r-2) == searchText.charAt(ali.c-1) &&
+ searchTerm.charAt(ali.r-1) == searchText.charAt(ali.c-2))
+ {
+ System.out.format("=> transposition\n");
+
+ alignmentsInProgress.push(new Alignment(
+ searchTerm.substring(ali.r - 2, ali.r) + ali.searchTermString,
+ searchText.substring(ali.c - 2, ali.c) + ali.searchTextString,
+ ali.prob, ali.matchStart, ali.matchEnd, ali.r - 2, ali.c - 2)
+ );
+ }
+ }
+ }
+
+ private float getMatchProb(final int distance)
+ {
+ if (type == Type.SemiGlobal)
+ {
+ return 1.0F - ((float)distance / searchTerm.length());
+ }
+ else
+ {
+ return 1.0F - ((float)distance / Math.min(searchTerm.length(), searchText.length()));
+ }
+ }
+
+ public float matchProb()
+ {
+ //LogUtils.severe("minMatchProb=" +StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB);
+ int dist = distance();
+ matrix = null;
+ //LogUtils.severe(String.format("DLevDist(%s,%s) = %d\n", searchTerm, searchText, dist));
+ return getMatchProb(dist);
+ }
+
+ public PseudoDamerauLevenshtein() {
+ //LogUtils.severe("minMatchProb=" +StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB);
+ }
+
+ public void init(String searchTerm, String searchText,
+ boolean subStringMatch, boolean caseSensitive)
+ {
+ if (searchTerm == null || searchText == null)
+ {
+ throw new IllegalArgumentException("Null searchText/searchTerm!");
+ }
+
+ if (caseSensitive)
+ {
+ this.searchTerm = searchTerm;
+ this.searchText = searchText;
+ }
+ else
+ {
+ this.searchTerm = searchTerm.toLowerCase();
+ this.searchText= searchText.toLowerCase();
+ }
+ this.type = subStringMatch ? Type.SemiGlobal : Type.Global;
+ }
+
+ public boolean matches(String searchTerm, String searchText,
+ boolean subStringMatch, boolean caseSensitive)
+ {
+ init(searchTerm, searchText, subStringMatch, caseSensitive);
+
+ return matchProb() > StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB;
+ }
+
+ /*
+ public Match[] getMatches(String searchTerm,
+ String searchText, boolean subStringMatch, boolean caseSensitive, double minProb) {
+ init(searchTerm, searchText, subStringMatch, caseSensitive);
+ List<Match> matches = new ArrayList<Match>();
+ for (Alignment ali: computeAlignments(minProb))
+ {
+ matches.add(new Match(ali.matchStart, ali.matchEnd));
+ }
+ return matches.toArray(new Match[matches.size()]);
+ }
+ */
+}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java b/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java
new file mode 100644
index 0000000..404f021
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java
@@ -0,0 +1,62 @@
+/*
+ * 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;
+ }
+ if(condition.equals(filterController.getFilterConditions().getSelectedItem()))
+ filterController.applyFilter(true);
+ else
+ filterController.getFilterConditions().setSelectedItem(condition);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickFindAction.java b/freeplane/src/org/freeplane/features/filter/QuickFindAction.java
new file mode 100644
index 0000000..415a26e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/QuickFindAction.java
@@ -0,0 +1,100 @@
+/*
+ * 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/QuickFindAllAction.java b/freeplane/src/org/freeplane/features/filter/QuickFindAllAction.java
new file mode 100644
index 0000000..f008b17
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/QuickFindAllAction.java
@@ -0,0 +1,89 @@
+/*
+ * 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 QuickFindAllAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterConditionEditor filterEditor;
+ private final FilterController filterController;
+
+
+ /**
+ * @param filterController
+ * @param quickEditor
+ */
+ QuickFindAllAction(final FilterController filterController, FilterConditionEditor quickEditor) {
+ super("QuickFindAllAction");
+ this.filterController = filterController;
+ this.filterEditor = quickEditor;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ASelectableCondition condition = filterEditor.getCondition();
+ if(condition == null){
+ return;
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final NodeModel selected = selection.getSelected();
+ final NodeModel rootNode = selected.getMap().getRootNode();
+ boolean nodeFound = condition.checkNode(rootNode);
+ if(nodeFound){
+ selection.selectAsTheOnlyOneSelected(rootNode);
+ }
+ NodeModel next = rootNode;
+ for(;;){
+ next = filterController.findNext(next, rootNode, Direction.FORWARD, condition);
+ if(next == null){
+ break;
+ }
+ mapController.displayNode(next);
+ if(nodeFound){
+ selection.toggleSelected(next);
+ }
+ else{
+ selection.selectAsTheOnlyOneSelected(next);
+ nodeFound = true;
+ }
+ }
+ if(condition.checkNode(selected))
+ selection.makeTheSelected(selected);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickHighlightAction.java b/freeplane/src/org/freeplane/features/filter/QuickHighlightAction.java
new file mode 100644
index 0000000..81e4dde
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/QuickHighlightAction.java
@@ -0,0 +1,77 @@
+/*
+ * 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.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+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
+class QuickHighlightAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterConditionEditor filterEditor;
+ private final FilterController filterController;
+ /**
+ * @param filterController
+ * @param quickEditor
+ */
+ QuickHighlightAction(final FilterController filterController, FilterConditionEditor quickEditor) {
+ super("QuickHighlightAction");
+ this.filterController = filterController;
+ this.filterEditor = quickEditor;
+ filterController.getHighlightNodes().addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent e) {
+ setSelected(isModelSelected());
+ }
+ });
+ setSelected(isModelSelected());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ASelectableCondition condition = filterEditor.getCondition();
+ final boolean isSelected = ! isModelSelected();
+ filterController.getHighlightNodes().setSelected(isSelected);
+ if(isSelected){
+ filterController.setHighlightCondition(condition);
+ }
+ else{
+ setSelected(false);
+ filterController.setHighlightCondition(null);
+ }
+ }
+ private boolean isModelSelected() {
+ return filterController.getHighlightNodes().isSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ReapplyFilterAction.java b/freeplane/src/org/freeplane/features/filter/ReapplyFilterAction.java
new file mode 100644
index 0000000..289c22a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ReapplyFilterAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class ReapplyFilterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ /**
+ * @param filterController
+ */
+ ReapplyFilterAction(final FilterController filterController) {
+ super("ReapplyFilterAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.applyFilter(true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/RedoFilterAction.java b/freeplane/src/org/freeplane/features/filter/RedoFilterAction.java
new file mode 100644
index 0000000..b3f41b0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/RedoFilterAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class RedoFilterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ /**
+ * @param filterController
+ */
+ RedoFilterAction(final FilterController filterController) {
+ super("RedoFilterAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.redo();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ShowAncestorsAction.java b/freeplane/src/org/freeplane/features/filter/ShowAncestorsAction.java
new file mode 100644
index 0000000..b56a007
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ShowAncestorsAction.java
@@ -0,0 +1,65 @@
+/*
+ * 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.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 31, 2009
+ */
+ at SelectableAction
+class ShowAncestorsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ ShowAncestorsAction(final FilterController filterController) {
+ super("ShowAncestorsAction");
+ this.filterController = filterController;
+ filterController.getShowAncestors().addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent e) {
+ setSelected(isModelSelected());
+ }
+ });
+ setSelected(isModelSelected());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final boolean isSelected = !isModelSelected();
+ filterController.getShowAncestors().setSelected(isSelected);
+ setSelected(isSelected);
+ }
+
+ private boolean isModelSelected() {
+ return filterController.getShowAncestors().isSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ShowDescendantsAction.java b/freeplane/src/org/freeplane/features/filter/ShowDescendantsAction.java
new file mode 100644
index 0000000..cc9f56c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/ShowDescendantsAction.java
@@ -0,0 +1,65 @@
+/*
+ * 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.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 31, 2009
+ */
+ at SelectableAction
+class ShowDescendantsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ ShowDescendantsAction(final FilterController filterController) {
+ super("ShowDescendantsAction");
+ this.filterController = filterController;
+ filterController.getShowDescendants().addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent e) {
+ setSelected(isModelSelected());
+ }
+ });
+ setSelected(isModelSelected());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final boolean isSelected = !isModelSelected();
+ filterController.getShowDescendants().setSelected(isSelected);
+ setSelected(isSelected);
+ }
+
+ private boolean isModelSelected() {
+ return filterController.getShowDescendants().isSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java b/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java
new file mode 100644
index 0000000..1a91e37
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java
@@ -0,0 +1,42 @@
+/*
+ * 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/UndoFilterAction.java b/freeplane/src/org/freeplane/features/filter/UndoFilterAction.java
new file mode 100644
index 0000000..d305648
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/UndoFilterAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class UndoFilterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+
+ /**
+ * @param filterController
+ */
+ UndoFilterAction(final FilterController filterController) {
+ super("UndoFilterAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ filterController.undo();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java b/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java
new file mode 100644
index 0000000..4f5b541
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java
@@ -0,0 +1,123 @@
+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
new file mode 100644
index 0000000..4aee8ed
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/CompareConditionAdapter.java
@@ -0,0 +1,216 @@
+/*
+ * 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
new file mode 100644
index 0000000..234437e
--- /dev/null
+++ b/freeplane/src/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.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/ConditionNotSatisfiedDecorator.java b/freeplane/src/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java
new file mode 100644
index 0000000..e399eec
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java
@@ -0,0 +1,104 @@
+/*
+ * 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.Arrays;
+import java.util.Collection;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ConditionNotSatisfiedDecorator extends ASelectableCondition implements ICombinedCondition{
+ static final String NAME = "negate_condition";
+
+ static ASelectableCondition load(final ConditionFactory conditionFactory, final XMLElement element) {
+ final Vector<XMLElement> children = element.getChildren();
+ final ASelectableCondition cond = conditionFactory.loadCondition(children.get(0));
+ if(cond == null){
+ return null;
+ }
+ return new ConditionNotSatisfiedDecorator(cond);
+ }
+
+ final private ASelectableCondition originalCondition;
+
+ /**
+ *
+ */
+ public ConditionNotSatisfiedDecorator(final ASelectableCondition originalCondition) {
+ super();
+ assert originalCondition != null;
+ this.originalCondition = originalCondition;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ return !originalCondition.checkNode(node);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#getListCellRendererComponent
+ * ()
+ */
+ protected JComponent createRendererComponent() {
+ final JCondition component = new JCondition();
+ final String not = TextUtils.getText("filter_not");
+ final String text = not + ' ';
+ component.add(new JLabel(text));
+ originalCondition.getUserName();
+ final JComponent renderer = originalCondition.createShortRendererComponent();
+ component.add(renderer);
+ return component;
+ }
+
+ public void fillXML(final XMLElement child) {
+ originalCondition.toXml(child);
+ }
+
+ @Override
+ protected String createDescription() {
+ return NAME;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public Collection<ASelectableCondition> split() {
+ return Arrays.asList(new ASelectableCondition[]{originalCondition});
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ConjunctConditions.java b/freeplane/src/org/freeplane/features/filter/condition/ConjunctConditions.java
new file mode 100644
index 0000000..3c8f089
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/ConjunctConditions.java
@@ -0,0 +1,119 @@
+/*
+ * 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.Arrays;
+import java.util.Collection;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ConjunctConditions extends ASelectableCondition implements ICombinedCondition{
+ static final String NAME = "conjunct_condition";
+
+ static ASelectableCondition load(final ConditionFactory conditionFactory, final XMLElement element) {
+ final Vector<XMLElement> children = element.getChildren();
+ final ASelectableCondition[] conditions = new ASelectableCondition[children.size()];
+ for (int i = 0; i < conditions.length; i++) {
+ final ASelectableCondition condition = conditionFactory.loadCondition(children.get(i));
+ if(condition == null){
+ return null;
+ }
+ conditions[i] = condition;
+ }
+ return new ConjunctConditions(conditions);
+ }
+
+ final private ASelectableCondition[] conditions;
+
+ /**
+ *
+ */
+ public ConjunctConditions(final ASelectableCondition[] conditions) {
+ this.conditions = conditions;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ for (final ASelectableCondition condition : conditions) {
+ if (!condition.checkNode(node)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#getListCellRendererComponent
+ * ()
+ */
+ protected JComponent createRendererComponent() {
+ final JCondition component = new JCondition();
+ component.add(new JLabel("("));
+ ASelectableCondition cond = conditions[0];
+ JComponent rendererComponent = cond.createShortRendererComponent();
+ component.add(rendererComponent);
+ for (int i = 1; i < conditions.length; i++) {
+ final String and = TextUtils.getText("filter_and");
+ final String text = ' ' + and + ' ';
+ component.add(new JLabel(text));
+ cond = conditions[i];
+ rendererComponent = cond.createRendererComponent();
+ component.add(rendererComponent);
+ }
+ component.add(new JLabel(")"));
+ return component;
+ }
+
+ public void fillXML(final XMLElement child) {
+ for (final ASelectableCondition condition : conditions) {
+ condition.toXml(child);
+ }
+ }
+
+ @Override
+ protected String createDescription() {
+ return NAME;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public Collection<ASelectableCondition> split() {
+ return Arrays.asList(conditions);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/DefaultConditionRenderer.java b/freeplane/src/org/freeplane/features/filter/condition/DefaultConditionRenderer.java
new file mode 100644
index 0000000..b60f29c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/DefaultConditionRenderer.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.features.filter.condition;
+
+import java.awt.Component;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JTable;
+import javax.swing.ListCellRenderer;
+import javax.swing.table.TableCellRenderer;
+
+import org.freeplane.features.icon.UIIcon;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class DefaultConditionRenderer implements ListCellRenderer, TableCellRenderer {
+ private final String noValueText;
+
+ public DefaultConditionRenderer(String noValueText) {
+ this.noValueText = noValueText;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing
+ * .JList, java.lang.Object, int, boolean, boolean)
+ */
+ public Component getListCellRendererComponent(final JList list, final Object value, final int index,
+ final boolean isSelected, final boolean cellHasFocus) {
+ Component cellRendererComponent = getCellRendererComponent(value, isSelected);
+ if (isSelected) {
+ cellRendererComponent.setBackground(list.getSelectionBackground());
+ cellRendererComponent.setForeground(list.getSelectionForeground());
+ }
+ else {
+ cellRendererComponent.setBackground(list.getBackground());
+ cellRendererComponent.setForeground(list.getForeground());
+ }
+ return cellRendererComponent;
+ }
+
+ private Component getCellRendererComponent(final Object value, final boolean isSelected) {
+ final JComponent component;
+ if (value == null) {
+ component = new JLabel(noValueText);
+ }
+ else if (value instanceof UIIcon) {
+ component = new JLabel(((UIIcon) value).getIcon());
+ }
+ else if (value instanceof ASelectableCondition) {
+ final ASelectableCondition cond = (ASelectableCondition) value;
+ component = cond.getListCellRendererComponent();
+ }
+ else {
+ component = new JLabel(value.toString());
+ }
+ component.setOpaque(true);
+ component.setAlignmentX(Component.LEFT_ALIGNMENT);
+ return component;
+ }
+
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+ int row, int column) {
+ Component cellRendererComponent = getCellRendererComponent(value, isSelected);
+ if (isSelected) {
+ cellRendererComponent.setBackground(table.getSelectionBackground());
+ cellRendererComponent.setForeground(table.getSelectionForeground());
+ }
+ else {
+ cellRendererComponent.setBackground(table.getBackground());
+ cellRendererComponent.setForeground(table.getForeground());
+ }
+ return cellRendererComponent;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/DisjunctConditions.java b/freeplane/src/org/freeplane/features/filter/condition/DisjunctConditions.java
new file mode 100644
index 0000000..9744f85
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/DisjunctConditions.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.filter.condition;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class DisjunctConditions extends ASelectableCondition implements ICombinedCondition {
+ static final String NAME = "disjunct_condition";
+
+ static ASelectableCondition load(final ConditionFactory conditionFactory, final XMLElement element) {
+ final Vector<XMLElement> children = element.getChildren();
+ final ASelectableCondition[] conditions = new ASelectableCondition[children.size()];
+ for (int i = 0; i < conditions.length; i++) {
+ final ASelectableCondition condition = conditionFactory.loadCondition(children.get(i));
+ if(condition == null){
+ return null;
+ }
+ conditions[i] = condition;
+ }
+ return new DisjunctConditions(conditions);
+ }
+
+ final private ASelectableCondition[] conditions;
+
+ /**
+ *
+ */
+ public DisjunctConditions(final ASelectableCondition[] conditions) {
+ this.conditions = conditions;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ for (final ASelectableCondition condition : conditions) {
+ if (condition.checkNode(node)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#getListCellRendererComponent
+ * ()
+ */
+ protected JComponent createRendererComponent() {
+ final JCondition component = new JCondition();
+ component.add(new JLabel("("));
+ ASelectableCondition cond = conditions[0];
+ JComponent rendererComponent = cond.createShortRendererComponent();
+ component.add(rendererComponent);
+ for (int i = 1; i < conditions.length; i++) {
+ final String or = TextUtils.getText("filter_or");
+ final String text = ' ' + or + ' ';
+ component.add(new JLabel(text));
+ cond = conditions[i];
+ rendererComponent = cond.createRendererComponent();
+ component.add(rendererComponent);
+ }
+ component.add(new JLabel(")"));
+ return component;
+ }
+
+ public void fillXML(final XMLElement child) {
+ for (final ASelectableCondition condition : conditions) {
+ condition.toXml(child);
+ }
+ }
+
+ @Override
+ protected String createDescription() {
+ return NAME;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ public Collection<ASelectableCondition> split() {
+ return Arrays.asList(conditions);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ICombinedCondition.java b/freeplane/src/org/freeplane/features/filter/condition/ICombinedCondition.java
new file mode 100644
index 0000000..790e168
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/ICombinedCondition.java
@@ -0,0 +1,7 @@
+package org.freeplane.features.filter.condition;
+
+import java.util.Collection;
+
+public interface ICombinedCondition {
+ Collection<ASelectableCondition> split();
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ICondition.java b/freeplane/src/org/freeplane/features/filter/condition/ICondition.java
new file mode 100644
index 0000000..2af2391
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/ICondition.java
@@ -0,0 +1,26 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Dimitry Polivaev, Volker Boerchers
+ *
+ * This file authors are Dimitry Polivaev, 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.filter.condition;
+
+import org.freeplane.features.map.NodeModel;
+
+public interface ICondition {
+ boolean checkNode(NodeModel node);
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/IElementaryConditionController.java b/freeplane/src/org/freeplane/features/filter/condition/IElementaryConditionController.java
new file mode 100644
index 0000000..43ef99b
--- /dev/null
+++ b/freeplane/src/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.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/JCondition.java b/freeplane/src/org/freeplane/features/filter/condition/JCondition.java
new file mode 100644
index 0000000..53adf01
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/JCondition.java
@@ -0,0 +1,57 @@
+/*
+ * 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.awt.Component;
+
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class JCondition extends JPanel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public JCondition() {
+ super();
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ comp.setForeground(null);
+ comp.setBackground(null);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ comp.setForeground(null);
+ comp.setBackground(null);
+ return super.add(comp);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/NoFilteringCondition.java b/freeplane/src/org/freeplane/features/filter/condition/NoFilteringCondition.java
new file mode 100644
index 0000000..5657629
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/NoFilteringCondition.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 org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NoFilteringCondition extends ASelectableCondition {
+ private static final String NAME = "no_filtering_condition";
+ private static NoFilteringCondition condition;
+ private static String description;
+
+ public static ASelectableCondition createCondition() {
+ if (NoFilteringCondition.condition == null) {
+ NoFilteringCondition.condition = new NoFilteringCondition();
+ }
+ return NoFilteringCondition.condition;
+ }
+
+ private NoFilteringCondition() {
+ super();
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ return true;
+ }
+
+ @Override
+ protected String createDescription() {
+ if (NoFilteringCondition.description == null) {
+ NoFilteringCondition.description = TextUtils.getText("filter_no_filtering");
+ }
+ return NoFilteringCondition.description;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public void toXml(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
new file mode 100644
index 0000000..b7eafbd
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/SelectedViewCondition.java
@@ -0,0 +1,61 @@
+/*
+ * 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
new file mode 100644
index 0000000..f80aef0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java
@@ -0,0 +1,62 @@
+/*
+ * 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/DateFormatParser.java b/freeplane/src/org/freeplane/features/format/DateFormatParser.java
new file mode 100644
index 0000000..837e696
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/DateFormatParser.java
@@ -0,0 +1,75 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateFormatParser extends Parser {
+ private final SimpleDateFormat parser;
+ private final String missingFields;
+ private boolean forbidLeadingSpaces;
+
+ public DateFormatParser(final String format, final String type) {
+ super(Parser.STYLE_DATE, type, format);
+ forbidLeadingSpaces = (format.charAt(0) != ' ');
+ parser = new SimpleDateFormat(format.replaceFirst("^\\s", ""));
+ parser.setLenient(false);
+ missingFields = (format.contains("y") ? "" : "y") //
+ + (format.contains("M") ? "" : "M") //
+ + (format.contains("d") ? "" : "d");
+ }
+
+ public DateFormatParser(final String format) {
+ this(format, getTypeDependingOnFormat(format));
+ }
+
+ private static String getTypeDependingOnFormat(final String format) {
+ // if it contains minute format -> datetime
+ return format.contains("m") ? IFormattedObject.TYPE_DATETIME : IFormattedObject.TYPE_DATE;
+ }
+
+ @Override
+ Object parse(String string) {
+ if (string == null || (forbidLeadingSpaces && string.charAt(0) == ' '))
+ return null;
+ final ParsePosition parsePosition = new ParsePosition(0);
+ Date date = parser.parse(string, parsePosition);
+ if (parsePosition.getIndex() != string.length())
+ return null;
+ if (missingFields.length() != 0) {
+ final Calendar calendar = Calendar.getInstance();
+ final int year = calendar.get(Calendar.YEAR);
+ final int month = calendar.get(Calendar.MONTH);
+ final int day = calendar.get(Calendar.DAY_OF_MONTH);
+ calendar.setTime(date);
+ if (missingFields.contains("y"))
+ calendar.set(Calendar.YEAR, year);
+ if (missingFields.contains("M"))
+ calendar.set(Calendar.MONTH, month);
+ if (missingFields.contains("d"))
+ calendar.set(Calendar.DAY_OF_MONTH, day);
+ date = calendar.getTime();
+ }
+ return FormattedDate.createDefaultFormattedDate(date.getTime(), getType());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/DatePatternFormat.java b/freeplane/src/org/freeplane/features/format/DatePatternFormat.java
new file mode 100644
index 0000000..f90ee0a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/DatePatternFormat.java
@@ -0,0 +1,41 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.util.Date;
+
+
+class DatePatternFormat extends PatternFormat {
+ public DatePatternFormat(String pattern) {
+ super(pattern, IFormattedObject.TYPE_DATE);
+ }
+
+ @Override
+ public Object formatObject(Object obj) {
+ if(obj instanceof Date)
+ return new FormattedDate((Date)obj, getPattern());
+ return obj;
+ }
+
+ @Override
+ public String getStyle() {
+ return PatternFormat.STYLE_DATE;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/DecimalFormatParser.java b/freeplane/src/org/freeplane/features/format/DecimalFormatParser.java
new file mode 100644
index 0000000..bfe4a1a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/DecimalFormatParser.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
+
+public class DecimalFormatParser extends Parser {
+ private final DecimalFormat parser;
+
+ public DecimalFormatParser(Locale locale) {
+ super(Parser.STYLE_DECIMAL, IFormattedObject.TYPE_NUMBER, null);
+ parser = (DecimalFormat) NumberFormat.getInstance(locale);
+ }
+
+ @Override
+ Object parse(String string) {
+ if (string == null)
+ return null;
+ final ParsePosition parsePosition = new ParsePosition(0);
+ final Number result = parser.parse(string, parsePosition);
+ if (parsePosition.getIndex() != string.length())
+ return null;
+ return new FormattedNumber(result);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/DecimalPatternFormat.java b/freeplane/src/org/freeplane/features/format/DecimalPatternFormat.java
new file mode 100644
index 0000000..f5bf1b6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/DecimalPatternFormat.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+
+/**
+ * @author vboerchers
+ */
+class DecimalPatternFormat extends PatternFormat {
+
+ public DecimalPatternFormat(final String pattern) {
+ super(pattern, IFormattedObject.TYPE_NUMBER);
+ }
+
+ @Override
+ public Object formatObject(final Object obj) {
+ if (obj instanceof Number) {
+ final Number number = (obj instanceof FormattedNumber) ? ((FormattedNumber) obj).getNumber() : (Number) obj;
+ return new FormattedNumber(number, getPattern());
+ }
+ return obj;
+ }
+
+ @Override
+ public String getStyle() {
+ return PatternFormat.STYLE_DECIMAL;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormatController.java b/freeplane/src/org/freeplane/features/format/FormatController.java
new file mode 100644
index 0000000..0f42b3b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormatController.java
@@ -0,0 +1,473 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.IValidator;
+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.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 Volker Boerchers
+ */
+public class FormatController implements IExtension, IFreeplanePropertyListener {
+ private static final String RESOURCES_NUMBER_FORMAT = "number_format";
+ private static final String RESOURCES_DATETIME_FORMAT = "datetime_format";
+ private static final String RESOURCES_DATE_FORMAT = "date_format";
+ private static final String FORMATS_XML = "formats.xml";
+ private static final String ROOT_ELEMENT = "formats";
+ private String pathToFile;
+ private Locale locale;
+ private List<PatternFormat> dateFormats = new ArrayList<PatternFormat>();
+ private List<PatternFormat> numberFormats = new ArrayList<PatternFormat>();
+ private List<PatternFormat> stringFormats = new ArrayList<PatternFormat>();
+ private boolean formatsLoaded;
+ private SimpleDateFormat defaultDateFormat;
+ private SimpleDateFormat defaultDateTimeFormat;
+ private HashMap<String, SimpleDateFormat> dateFormatCache = new HashMap<String, SimpleDateFormat>();
+ private DecimalFormat defaultNumberFormat;
+ private HashMap<String, DecimalFormat> numberFormatCache = new HashMap<String, DecimalFormat>();
+ static private boolean firstError = true;
+
+ public IValidator createValidator (){
+ return new IValidator() {
+ public ValidationResult validate(Properties properties) {
+ final ValidationResult result = new ValidationResult();
+ try {
+ createDateFormat(properties.getProperty(RESOURCES_DATE_FORMAT));
+ }
+ catch (Exception e) {
+ result.addError(TextUtils.getText("OptionPanel.validate_invalid_date_format"));
+ }
+ try {
+ createDefaultDateTimeFormat(properties.getProperty(RESOURCES_DATETIME_FORMAT));
+ }
+ catch (Exception e) {
+ result.addError(TextUtils.getText("OptionPanel.validate_invalid_datetime_format"));
+ }
+ try {
+ getDecimalFormat(properties.getProperty(RESOURCES_NUMBER_FORMAT));
+ }
+ catch (Exception e) {
+ result.addError(TextUtils.getText("OptionPanel.validate_invalid_number_format"));
+ }
+ return result;
+ }
+ };
+ }
+
+ public FormatController() {
+ final String freeplaneUserDirectory = ResourceController.getResourceController().getFreeplaneUserDirectory();
+ // applets have no user directory and no file access anyhow
+ pathToFile = freeplaneUserDirectory == null ? null : freeplaneUserDirectory + File.separator + FORMATS_XML;
+ locale = FormatUtils.getFormatLocaleFromResources();
+ initPatternFormats();
+ final ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.addPropertyChangeListener(this);
+ }
+
+ public static FormatController getController() {
+ return getController(Controller.getCurrentController());
+ }
+
+ public static FormatController getController(Controller controller) {
+ return (FormatController) controller.getExtension(FormatController.class);
+ }
+
+ public static void install(final FormatController formatController) {
+ Controller.getCurrentController().addExtension(FormatController.class, formatController);
+ Controller.getCurrentController().addOptionValidator(formatController.createValidator());
+ }
+
+ private void initPatternFormats() {
+ if (formatsLoaded)
+ return;
+ try {
+ if (pathToFile != null)
+ loadFormats();
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ if(firstError){
+ firstError = false;
+ UITools.errorMessage(TextUtils.getText("formats_not_loaded"));
+ }
+ }
+ if (numberFormats.isEmpty() && dateFormats.isEmpty() && stringFormats.isEmpty()) {
+ addStandardFormats();
+ if (pathToFile != null)
+ saveFormatsNoThrow();
+ }
+ formatsLoaded = true;
+ }
+
+ private void addStandardFormats() {
+ String number = IFormattedObject.TYPE_NUMBER;
+ numberFormats.add(PatternFormat.create("#0.####", PatternFormat.STYLE_DECIMAL, number,
+ "default number", locale));
+ numberFormats.add(PatternFormat.create("#.00", PatternFormat.STYLE_DECIMAL, number, "decimal", locale));
+ numberFormats.add(PatternFormat.create("#", PatternFormat.STYLE_DECIMAL, number, "integer", locale));
+ numberFormats.add(PatternFormat.create("#.##%", PatternFormat.STYLE_DECIMAL, number, "percent", locale));
+ String dType = IFormattedObject.TYPE_DATE;
+ final String dStyle = PatternFormat.STYLE_DATE;
+ dateFormats.add(createLocalPattern("short date", SimpleDateFormat.SHORT, null));
+ dateFormats.add(createLocalPattern("medium date", SimpleDateFormat.MEDIUM, null));
+ dateFormats.add(createLocalPattern("short datetime", SimpleDateFormat.SHORT, SimpleDateFormat.SHORT));
+ dateFormats.add(createLocalPattern("medium datetime", SimpleDateFormat.MEDIUM, SimpleDateFormat.SHORT));
+ dateFormats.add(PatternFormat.create("yyyy-MM-dd", dStyle, dType, "short iso date", locale));
+ dateFormats.add(PatternFormat.create("yyyy-MM-dd HH:mm", dStyle, dType, "long iso date", locale));
+ dateFormats.add(PatternFormat.create(FormattedDate.ISO_DATE_TIME_FORMAT_PATTERN, dStyle, dType,
+ "full iso date", locale));
+ dateFormats.add(PatternFormat.create("HH:mm", dStyle, dType, "time", locale));
+ }
+
+ private PatternFormat createLocalPattern(String name, int dateStyle, Integer timeStyle) {
+ final SimpleDateFormat simpleDateFormat = (SimpleDateFormat) (timeStyle == null ? SimpleDateFormat
+ .getDateInstance(dateStyle, locale) : SimpleDateFormat.getDateTimeInstance(dateStyle, timeStyle, locale));
+ final String dStyle = PatternFormat.STYLE_DATE;
+ final String dType = IFormattedObject.TYPE_DATE;
+ return PatternFormat.create(simpleDateFormat.toPattern(), dStyle, dType, name, locale);
+ }
+
+ private void loadFormats() throws Exception {
+ BufferedInputStream inputStream = null;
+ final File configXml = new File(pathToFile);
+ if (!configXml.exists()) {
+ LogUtils.info(pathToFile + " does not exist yet");
+ return;
+ }
+ try {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ inputStream = new BufferedInputStream(new FileInputStream(configXml));
+ final IXMLReader reader = new StdXMLReader(inputStream);
+ parser.setReader(reader);
+ final XMLElement loader = (XMLElement) parser.parse();
+ final Vector<XMLElement> formats = loader.getChildren();
+ for (XMLElement elem : formats) {
+ final String type = elem.getAttribute("type", null);
+ final String style = elem.getAttribute("style", null);
+ final String name = elem.getAttribute("name", null);
+ final String locale = elem.getAttribute("locale", null);
+ final String content = elem.getContent();
+ if (StringUtils.isEmpty(type) || StringUtils.isEmpty(style) || StringUtils.isEmpty(content)) {
+ throw new RuntimeException("wrong format in " + configXml
+ + ": none of the following must be empty: type=" + type + ", style=" + style
+ + ", element content=" + content);
+ }
+ else {
+ final PatternFormat format = PatternFormat.create(content, style, type, name,
+ (locale == null ? null : new Locale(locale)));
+ if (type.equals(IFormattedObject.TYPE_DATE)) {
+ dateFormats.add(format);
+ }
+ else if (type.equals(IFormattedObject.TYPE_NUMBER)) {
+ numberFormats.add(format);
+ }
+ else if (type.equals(IFormattedObject.TYPE_STRING)) {
+ stringFormats.add(format);
+ }
+ else if (type.equals(PatternFormat.TYPE_STANDARD)) {
+ // ignore this pattern that crept in in some 1.2 beta version
+ }
+ else {
+ throw new RuntimeException("unknown type in " + configXml + ": type=" + type + ", style="
+ + style + ", element content=" + content);
+ }
+ }
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn("error parsing " + configXml, e);
+ }
+ finally {
+ FileUtils.silentlyClose(inputStream);
+ }
+ }
+
+ private void saveFormatsNoThrow() {
+ try {
+ saveFormats(getAllFormats());
+ }
+ catch (final Exception e) {
+ LogUtils.warn("cannot create " + pathToFile, e);
+ }
+ }
+
+ public ArrayList<PatternFormat> getAllFormats() {
+ final ArrayList<PatternFormat> formats = new ArrayList<PatternFormat>();
+ formats.add(PatternFormat.getStandardPatternFormat());
+ formats.add(PatternFormat.getIdentityPatternFormat());
+ formats.addAll(numberFormats);
+ formats.addAll(dateFormats);
+ formats.addAll(stringFormats);
+ return formats;
+ }
+
+ private void saveFormats(final List<PatternFormat> formats) throws IOException {
+ final XMLElement saver = new XMLElement();
+ saver.setName(ROOT_ELEMENT);
+ final String sep = System.getProperty("line.separator");
+ final String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ + sep //
+ + "<!-- 'type' selects the kind of data the formatter is intended to format. -->"
+ + sep //
+ + "<!-- 'style' selects the formatter implementation: -->"
+ + sep //
+ + "<!-- - 'date': http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html -->"
+ + sep //
+ + "<!-- - 'decimal': http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html -->"
+ + sep //
+ + "<!-- - 'formatter': http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html -->"
+ + sep //
+ + "<!-- - 'name': a informal name, a comment that's not visible in the app -->" + sep //
+ + "<!-- - 'locale': the name of the locale, only set for locale dependent format codes -->" + sep;
+ for (PatternFormat patternFormat : formats) {
+ if (!patternFormat.getType().equals(PatternFormat.TYPE_IDENTITY)
+ && !patternFormat.getType().equals(PatternFormat.TYPE_STANDARD)) {
+ saver.addChild(patternFormat.toXml());
+ }
+ }
+ final Writer writer = new FileWriter(pathToFile);
+ final XMLWriter xmlWriter = new XMLWriter(writer);
+ xmlWriter.addRawContent(header);
+ xmlWriter.write(saver, true);
+ writer.close();
+ }
+
+ public List<PatternFormat> getDateFormats() {
+ return dateFormats;
+ }
+
+ public List<PatternFormat> getNumberFormats() {
+ return numberFormats;
+ }
+
+ public List<PatternFormat> getStringFormats() {
+ return stringFormats;
+ }
+
+ /** @deprecated use getAllFormats() instead. */
+ public List<String> getAllPatterns() {
+ final ArrayList<PatternFormat> formats = getAllFormats();
+ ArrayList<String> result = new ArrayList<String>(formats.size());
+ for (PatternFormat patternFormat : formats) {
+ result.add(patternFormat.getPattern());
+ }
+ return result;
+ }
+
+ /** returns a matching {@link IFormattedObject} if possible and if <a>formatString</a> is not-null.
+ * Otherwise <a>defaultObject</a> is returned.
+ * Removes format if <a>formatString</a> is null. */
+ public static Object format(final Object obj, final String formatString, final Object defaultObject) {
+ try {
+ final PatternFormat format = PatternFormat.guessPatternFormat(formatString);
+ // logging for invalid pattern is done in guessPatternFormat()
+ if (obj == null)
+ return obj;
+ Object toFormat = extractObject(obj);
+ if (format == null)
+ return toFormat;
+ if (toFormat instanceof String) {
+ final String string = (String) toFormat;
+ if (string.startsWith("=")) {
+ return new FormattedFormula(string, formatString);
+ }
+ else {
+ final ScannerController scannerController = ScannerController.getController();
+ if (scannerController != null)
+ toFormat = scannerController.parse(string);
+ }
+ }
+ if (format.acceptsDate() && toFormat instanceof Date) {
+ return new FormattedDate((Date) toFormat, formatString);
+ }
+ else if (format.acceptsNumber() && toFormat instanceof Number) {
+ return new FormattedNumber((Number) toFormat, formatString, format.formatObject(toFormat).toString());
+ }
+ else {
+ return new FormattedObject(toFormat, format);
+ }
+ }
+ catch (Exception e) {
+ // Be quiet, just like Excel does...
+ // LogUtils.warn("cannot format '" + StringUtils.abbreviate(obj.toString(), 20) + "' of type "
+ // + obj.getClass().getSimpleName() + " with " + formatString + ": " + e.getMessage());
+ return defaultObject;
+ }
+ }
+
+ private static Object extractObject(final Object obj) {
+ return (obj instanceof IFormattedObject) ? ((IFormattedObject) obj).getObject() : obj;
+ }
+
+ /** returns a matching IFormattedObject if possible and if formatString is not-null.
+ * Otherwise <a>obj</a> is returned.
+ * Removes format if formatString is null. */
+ public static Object format(final Object obj, final String formatString) {
+ return format(obj, formatString, obj);
+ }
+
+ public static Object formatUsingDefault(final Object object) {
+ if (object instanceof Date)
+ return format(object, FormatController.getController().getDefaultDateTimeFormat().toPattern());
+ if (object instanceof Number)
+ return format(object, FormatController.getController().getDefaultNumberFormat().toPattern());
+ return object;
+ }
+
+ public Format getDefaultFormat(String type) {
+ if (type.equals(IFormattedObject.TYPE_DATE))
+ return getDefaultDateFormat();
+ else if (type.equals(IFormattedObject.TYPE_DATETIME))
+ return getDefaultDateTimeFormat();
+ else if (type.equals(IFormattedObject.TYPE_NUMBER))
+ return getDefaultNumberFormat();
+ else
+ throw new IllegalArgumentException("unknown format style");
+ }
+
+ public SimpleDateFormat getDefaultDateFormat() {
+ if (defaultDateFormat != null)
+ return defaultDateFormat;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ String datePattern = resourceController.getProperty(RESOURCES_DATE_FORMAT);
+ defaultDateFormat = createDateFormat(datePattern);
+ return defaultDateFormat;
+ }
+
+ private static SimpleDateFormat createDateFormat(final String datePattern) {
+ final Integer style = getDateStyle(datePattern);
+ if (style != null)
+ return (SimpleDateFormat) DateFormat.getDateInstance(style, FormatUtils.getFormatLocaleFromResources());
+ else
+ return new SimpleDateFormat(datePattern, FormatUtils.getFormatLocaleFromResources());
+ }
+
+ public SimpleDateFormat getDefaultDateTimeFormat() {
+ if (defaultDateTimeFormat != null)
+ return defaultDateTimeFormat;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ String datetimePattern = resourceController.getProperty(RESOURCES_DATETIME_FORMAT);
+ defaultDateTimeFormat = createDefaultDateTimeFormat(datetimePattern);
+ return defaultDateTimeFormat;
+ }
+
+ private SimpleDateFormat createDefaultDateTimeFormat(String datetimePattern) {
+ final String[] styles = datetimePattern.split("\\s*,\\s*");
+ if (styles.length == 2 && getDateStyle(styles[0]) != null && getDateStyle(styles[1]) != null)
+ return (SimpleDateFormat) DateFormat.getDateTimeInstance(getDateStyle(styles[0]), getDateStyle(styles[1]),
+ FormatUtils.getFormatLocaleFromResources());
+ else
+ return getDateFormat(datetimePattern);
+ }
+
+ private static Integer getDateStyle(final String string) {
+ if (string.equals("SHORT"))
+ return DateFormat.SHORT;
+ if (string.equals("MEDIUM"))
+ return DateFormat.MEDIUM;
+ if (string.equals("LONG"))
+ return DateFormat.LONG;
+ if (string.equals("FULL"))
+ return DateFormat.FULL;
+ return null;
+ }
+
+ public DecimalFormat getDefaultNumberFormat() {
+ if (defaultNumberFormat != null)
+ return defaultNumberFormat;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ defaultNumberFormat = getDecimalFormat(resourceController.getProperty(RESOURCES_NUMBER_FORMAT));
+ return defaultNumberFormat;
+ }
+
+ /** @param pattern either a string (see {@link DecimalFormat}) or null for a default formatter. */
+ public DecimalFormat getDecimalFormat(final String pattern) {
+ DecimalFormat format = numberFormatCache.get(pattern);
+ if (format == null) {
+ format = (DecimalFormat) ((pattern == null) ? getDefaultNumberFormat()
+ : new DecimalFormat(pattern, new DecimalFormatSymbols(FormatUtils.getFormatLocaleFromResources())));
+ numberFormatCache.put(pattern, format);
+ }
+ return format;
+ }
+
+ public SimpleDateFormat getDateFormat(String pattern) {
+ SimpleDateFormat parser = dateFormatCache.get(pattern);
+ if (parser == null) {
+ parser = new SimpleDateFormat(pattern, FormatUtils.getFormatLocaleFromResources());
+ dateFormatCache.put(pattern, parser);
+ }
+ return parser;
+ }
+
+ public void propertyChanged(String propertyName, String newValue, String oldValue) {
+ if (propertyName.equals(RESOURCES_DATE_FORMAT)) {
+ defaultDateFormat = createDateFormat(newValue);
+ final ScannerController scannerController = ScannerController.getController();
+ if (scannerController != null)
+ scannerController.addParsersForStandardFormats();
+ }
+ else if (propertyName.equals(RESOURCES_DATETIME_FORMAT)) {
+ defaultDateTimeFormat = createDefaultDateTimeFormat(newValue);
+ final ScannerController scannerController = ScannerController.getController();
+ if (scannerController != null)
+ scannerController.addParsersForStandardFormats();
+ }
+ else if (propertyName.equals(RESOURCES_NUMBER_FORMAT)) {
+ defaultNumberFormat = getDecimalFormat(newValue);
+ }
+ else if (FormatUtils.equalsFormatLocaleName(propertyName)) {
+ locale = FormatUtils.getFormatLocaleFromResources();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormatUtils.java b/freeplane/src/org/freeplane/features/format/FormatUtils.java
new file mode 100644
index 0000000..4743aa2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormatUtils.java
@@ -0,0 +1,19 @@
+package org.freeplane.features.format;
+
+import java.util.Locale;
+
+import org.freeplane.core.resources.ResourceBundles;
+import org.freeplane.core.resources.ResourceController;
+
+public final class FormatUtils {
+ private static final String RESOURCES_FORMAT_LOCALE = "format_locale";
+
+ static Locale getFormatLocaleFromResources() {
+ final String formatLoc = ResourceController.getResourceController().getProperty(RESOURCES_FORMAT_LOCALE);
+ return formatLoc.equals(ResourceBundles.LANGUAGE_AUTOMATIC) ? Locale.getDefault() : new Locale(formatLoc);
+ }
+
+ public static boolean equalsFormatLocaleName(String propertyName) {
+ return FormatUtils.RESOURCES_FORMAT_LOCALE.equals(propertyName);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormattedDate.java b/freeplane/src/org/freeplane/features/format/FormattedDate.java
new file mode 100644
index 0000000..4e76e25
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormattedDate.java
@@ -0,0 +1,197 @@
+/*
+ * 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.format;
+
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.util.FactoryMethod;
+import org.freeplane.core.util.SerializationMethod;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+ at SuppressWarnings("serial")
+ at FactoryMethod("deserialize")
+ at SerializationMethod("serialize")
+public class FormattedDate extends Date implements IFormattedObject {
+ public static final String ISO_DATE_FORMAT_PATTERN = "yyyy-MM-dd";
+ public static final String ISO_DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mmZ";
+ public static final Pattern ISO_DATE_TIME_REGEXP_PATTERN = Pattern.compile("\\d{4}(-?)\\d{2}(-?)\\d{2}" //
+ + "(([ T])?\\d{2}(:?)\\d{2}(:?)(\\d{2})?(\\.\\d{3})?([-+]\\d{4})?)?");
+ private SimpleDateFormat df;
+ private String defaultType;
+
+ public FormattedDate(FormattedDate date) {
+ this(date.getTime(), date.getDateFormat());
+ }
+
+ public FormattedDate(Date date, String pattern) {
+ super(date.getTime());
+ this.df = FormatController.getController().getDateFormat(pattern);
+ }
+
+ public FormattedDate(long date, SimpleDateFormat df) {
+ super(date);
+ this.df = df;
+ }
+
+ /**@deprecated use {@link #createDefaultFormattedDate(long, String)} instead. */
+ public FormattedDate(long date) {
+ this(date, FormatController.getController().getDefaultDateFormat());
+ this.defaultType = IFormattedObject.TYPE_DATE;
+ }
+
+ public static FormattedDate createDefaultFormattedDate(long time, String type) {
+ final FormattedDate formattedDate = new FormattedDate(time,
+ (SimpleDateFormat) FormatController.getController().getDefaultFormat(type));
+ formattedDate.defaultType = type;
+ return formattedDate;
+ }
+
+ @Override
+ public String toString() {
+ return df.format(this);
+ }
+
+ /** default formats are not saved to file. */
+ public static String serialize(final FormattedDate date) {
+ return toStringISO(date) + "|" + (date.defaultType != null ? date.defaultType : date.df.toPattern());
+ }
+
+ public static String toStringISO(final Date date) {
+ // use local timezone
+ return FormatController.getController().getDateFormat(ISO_DATE_TIME_FORMAT_PATTERN).format(date);
+ }
+
+ public static String toStringShortISO(final Date date) {
+ return FormatController.getController().getDateFormat(ISO_DATE_FORMAT_PATTERN).format(date);
+ }
+
+ public static Object deserialize(String text) {
+ final int index = text.indexOf('|');
+ final FormattedDate date;
+ final String arg;
+ if (index == -1) {
+ date = toDateISO(text);
+ arg = IFormattedObject.TYPE_DATE;
+ }
+ else {
+ date = toDateISO(text.substring(0, index));
+ arg = text.substring(index + 1);
+ }
+ if (date == null)
+ return text;
+ if (arg.equals(IFormattedObject.TYPE_DATE) || arg.equals(IFormattedObject.TYPE_DATETIME)) {
+ date.defaultType = arg;
+ date.df = (SimpleDateFormat) FormatController.getController().getDefaultFormat(arg);
+ }
+ else {
+ date.df = FormatController.getController().getDateFormat(arg);
+ }
+ return date;
+ }
+
+ public static FormattedDate toDate(String text) {
+ return toDateISO(text);
+ }
+
+ public static boolean isDate(String text) {
+ if (text == null)
+ return false;
+ return ISO_DATE_TIME_REGEXP_PATTERN.matcher(text).matches();
+ }
+
+ public static FormattedDate toDateISO(String text) {
+ // 1 2 34 5 6 7 8 9
+ // \\d{4}(-?)\\d{2}(-?)\\d{2}(([ T])?\\d{2}(:?)\\d{2}(:?)(\\d{2})?(\\.\\d{3})?([-+]\\d{4})?)?
+ final Matcher matcher = ISO_DATE_TIME_REGEXP_PATTERN.matcher(text);
+ if (matcher.matches()) {
+ StringBuilder builder = new StringBuilder("yyyy");
+ builder.append(matcher.group(1));
+ builder.append("MM");
+ builder.append(matcher.group(2));
+ builder.append("dd");
+ if (matcher.group(3) != null) {
+ if (matcher.group(4) != null) {
+ builder.append('\'');
+ builder.append(matcher.group(4));
+ builder.append('\'');
+ }
+ builder.append("HH");
+ builder.append(matcher.group(5));
+ builder.append("mm");
+ if (matcher.group(7) != null) {
+ builder.append(matcher.group(6));
+ builder.append("ss");
+ }
+ if (matcher.group(8) != null) {
+ builder.append(".SSS");
+ }
+ if (matcher.group(9) != null) {
+ builder.append("Z");
+ }
+ }
+ final String pattern = builder.toString();
+ return parseDate(text, pattern);
+ }
+ return null;
+ }
+
+ static private FormattedDate parseDate(String text, final String pattern) {
+ SimpleDateFormat parser = FormatController.getController().getDateFormat(pattern);
+ final ParsePosition pos = new ParsePosition(0);
+ final Date date = parser.parse(text, pos);
+ if (date != null && pos.getIndex() == text.length()) {
+ return new FormattedDate(date.getTime(), parser);
+ }
+ return null;
+ }
+
+ public boolean containsTime() {
+ return df.toPattern().contains("m");
+ }
+
+ public SimpleDateFormat getDateFormat() {
+ return df;
+ }
+
+ public String getPattern() {
+ return df.toPattern();
+ }
+
+ public Date getObject() {
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof FormattedDate && super.equals(obj) && ((FormattedDate) obj).getDateFormat().equals(df);
+ }
+
+ @Override
+ public int hashCode() {
+ return 37 * super.hashCode() + df.hashCode();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormattedFormula.java b/freeplane/src/org/freeplane/features/format/FormattedFormula.java
new file mode 100644
index 0000000..2bacc9a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormattedFormula.java
@@ -0,0 +1,113 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import org.freeplane.core.util.FactoryMethod;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.SerializationMethod;
+
+/**
+ * IFormattedObject that stores the format along a formula. This object does no formatting for itself but lets this
+ * delegate to the FormulaContentTransformer.
+ * @author vboerchers
+ */
+ at FactoryMethod("deserialize")
+ at SerializationMethod("serialize")
+public class FormattedFormula implements IFormattedObject {
+ private static final String BAR = "@B at A@R@";
+ private final String formula;
+ private final String pattern;
+
+ /** tries to guess the right pattern formatter from format. */
+ public FormattedFormula(final String formula, final String pattern) {
+ this.formula = formula;
+ this.pattern = pattern;
+ }
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ public String getObject() {
+ return formula;
+ }
+
+ public static String serialize(final FormattedFormula formattedObject) {
+ return encodeBar(formattedObject.formula) + "|" + formattedObject.pattern;
+ }
+
+ public static Object deserialize(final String text) {
+ try {
+ final int index = text.indexOf('|');
+ final String formula = decodeBar(text.substring(0, index));
+ return new FormattedFormula(formula, text.substring(index + 1));
+ }
+ catch (Exception e) {
+ LogUtils.warn("cannot deserialize " + text, e);
+ return text;
+ }
+ }
+
+ private static String encodeBar(String formulaText) {
+ return formulaText.replace("|", BAR);
+ }
+
+ private static String decodeBar(String formulaText) {
+ return formulaText.replace(BAR, "|");
+ }
+
+ @Override
+ public String toString() {
+ return formula;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((formula == null) ? 0 : formula.hashCode());
+ result = prime * result + ((pattern == null) ? 0 : pattern.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;
+ FormattedFormula other = (FormattedFormula) obj;
+ if (formula == null) {
+ if (other.formula != null)
+ return false;
+ }
+ else if (!formula.equals(other.formula))
+ return false;
+ if (pattern == null) {
+ if (other.pattern != null)
+ return false;
+ }
+ else if (!pattern.equals(other.pattern))
+ return false;
+ return true;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormattedNumber.java b/freeplane/src/org/freeplane/features/format/FormattedNumber.java
new file mode 100644
index 0000000..4d7bd9d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormattedNumber.java
@@ -0,0 +1,171 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.text.DecimalFormat;
+
+import org.freeplane.core.util.FactoryMethod;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.SerializationMethod;
+
+/**
+ * @author vboerchers
+ */
+ at SuppressWarnings("serial")
+ at FactoryMethod("deserialize")
+ at SerializationMethod("serialize")
+public class FormattedNumber extends Number implements IFormattedObject, Comparable<Number> {
+ private final Number number;
+ private final String pattern;
+ private final String formattedString;
+ private final boolean isDefaultFormat;
+
+ public FormattedNumber(final Number number) {
+ this(number, FormatController.getController().getDefaultNumberFormat());
+ }
+
+ public FormattedNumber(final Number number, final String pattern) {
+ this(number, pattern, number == null ? null //
+ : FormatController.getController().getDecimalFormat(pattern).format(number));
+ }
+
+ public FormattedNumber(final Number number, final String pattern, final String formattedString) {
+ this(number, pattern, formattedString, false);
+ }
+
+ // implementation detail
+ private FormattedNumber(final Number number, final DecimalFormat format) {
+ this(number, format, true);
+ }
+
+ // implementation detail
+ private FormattedNumber(final Number number, final DecimalFormat format, final boolean isDefault) {
+ this(number, format.toPattern(), number == null ? null : format.format(number), isDefault);
+ }
+
+ // implementation detail
+ private FormattedNumber(final Number number, final String pattern, final String formattedString,
+ final boolean isDefault) {
+ final long longValue = number.longValue();
+ if(longValue == number.doubleValue())
+ this.number = longValue;
+ else
+ this.number = number;
+ this.pattern = pattern;
+ this.formattedString = formattedString;
+ this.isDefaultFormat = isDefault;
+ }
+
+ public Number getNumber() {
+ return number;
+ }
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ /** implementation of {@link IFormattedObject}. */
+ public Object getObject() {
+ return number;
+ }
+
+ /** default formats are not saved to file. */
+ public static String serialize(final FormattedNumber formattedNumber) {
+ return formattedNumber.number + (formattedNumber.isDefaultFormat ? "" : "|" + formattedNumber.pattern);
+ }
+
+ public static Object deserialize(final String text) {
+ try {
+ final int index = text.indexOf('|');
+ if (index == -1)
+ return new FormattedNumber(Double.parseDouble(text));
+ else
+ return new FormattedNumber(Double.parseDouble(text.substring(0, index)), text.substring(index + 1));
+ }
+ catch (Exception e) {
+ LogUtils.warn("cannot deserialize " + text, e);
+ return text;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return formattedString;
+ }
+
+ @Override
+ public int intValue() {
+ return number.intValue();
+ }
+
+ @Override
+ public long longValue() {
+ return number.longValue();
+ }
+
+ @Override
+ public float floatValue() {
+ return number.floatValue();
+ }
+
+ @Override
+ public double doubleValue() {
+ return number.doubleValue();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((number == null) ? 0 : number.hashCode());
+ result = prime * result + ((pattern == null) ? 0 : pattern.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;
+ FormattedNumber other = (FormattedNumber) obj;
+ if (number == null) {
+ if (other.number != null)
+ return false;
+ }
+ else if (!number.equals(other.number))
+ return false;
+ if (pattern == null) {
+ if (other.pattern != null)
+ return false;
+ }
+ else if (!pattern.equals(other.pattern))
+ return false;
+ return true;
+ }
+
+ public int compareTo(final Number that) {
+ if (this.number != null && that != null)
+ return Double.compare(this.number.doubleValue(), that.doubleValue());
+ return (number == null ? 0 : 1) - (that == null ? 0 : 1);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormattedObject.java b/freeplane/src/org/freeplane/features/format/FormattedObject.java
new file mode 100644
index 0000000..391dea7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormattedObject.java
@@ -0,0 +1,134 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import org.freeplane.core.util.FactoryMethod;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.SerializationMethod;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.TypeReference;
+
+/**
+ * A generic multi purpose IFormattedObject but mainly for the formatting of strings.
+ * @author vboerchers
+ */
+ at FactoryMethod("deserialize")
+ at SerializationMethod("serialize")
+public class FormattedObject implements IFormattedObject {
+ private final Object object;
+ private final String formattedString;
+ private final PatternFormat patternFormat;
+
+ /** tries to guess the right pattern formatter from format.
+ * @throws IllegalArgumentException if value is not formattable with format. */
+ public FormattedObject(final Object value, final String format) {
+ this(value, PatternFormat.guessPatternFormat(format));
+ }
+
+ /** @throws IllegalArgumentException if value is not formattable with format. */
+ public FormattedObject(final Object object, final PatternFormat format) {
+ this.patternFormat = format;
+ this.object = object;
+ validate();
+ this.formattedString = String.valueOf(patternFormat.formatObject(object));
+ }
+
+ private void validate() {
+ if (patternFormat == null) {
+ throw new IllegalArgumentException(TextUtils.getText("format_invalid_pattern"));
+ }
+ }
+
+ public String getPattern() {
+ return patternFormat.getPattern();
+ }
+
+ public Object getObject() {
+ return object;
+ }
+
+ public static String serialize(final FormattedObject formattedObject) {
+ return serializeUnformattedObject(formattedObject) + "|" + formattedObject.patternFormat.serialize();
+ }
+
+ private static String serializeUnformattedObject(final FormattedObject formattedObject) {
+ // String unformattedObject;
+ // if (formattedObject.object instanceof IFormattedObject)
+ // unformattedObject = TypeReference.toSpec(formattedObject.object);
+ // else
+ // unformattedObject = formattedObject.object == null ? "" : formattedObject.object.toString();
+ return TypeReference.encode(TypeReference.toSpec(formattedObject.object));
+ }
+
+ public static Object deserialize(final String text) {
+ try {
+ final int index = text.indexOf('|');
+ final Object object = deserializeUnformattedObject(text, index);
+ return new FormattedObject(object, PatternFormat.deserialize(text.substring(index + 1)));
+ }
+ catch (Exception e) {
+ LogUtils.warn("cannot deserialize " + text, e);
+ return text;
+ }
+ }
+
+ private static Object deserializeUnformattedObject(final String text, final int index) {
+ final String spec = text.substring(0, index);
+ return TypeReference.create(TypeReference.decode(spec), false);
+ }
+
+ @Override
+ public String toString() {
+ return formattedString;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((patternFormat == null) ? 0 : patternFormat.hashCode());
+ result = prime * result + ((object == null) ? 0 : object.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;
+ FormattedObject other = (FormattedObject) obj;
+ if (patternFormat == null) {
+ if (other.patternFormat != null)
+ return false;
+ }
+ else if (!patternFormat.equals(other.patternFormat))
+ return false;
+ if (object == null) {
+ if (other.object != null)
+ return false;
+ }
+ else if (!object.equals(other.object))
+ return false;
+ return true;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/FormatterPatternFormat.java b/freeplane/src/org/freeplane/features/format/FormatterPatternFormat.java
new file mode 100644
index 0000000..0a25d97
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/FormatterPatternFormat.java
@@ -0,0 +1,58 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.text.FieldPosition;
+import java.util.Formatter;
+
+/**
+ * @author Volker Boerchers
+ */
+class FormatterPatternFormat extends PatternFormat {
+ private final Formatter formatter;
+
+ public FormatterPatternFormat(String pattern, String type) {
+ super(pattern, type);
+ this.formatter = new Formatter();
+ }
+
+ @Override
+ public final String formatObject (Object obj) {
+ return formatter.format(getPattern(), obj).toString();
+ }
+ /**
+ * Formats an object via {@link Formatter#format(String, Object...)}.
+ *
+ * @param obj the object to format
+ * @param toAppendTo the buffer to append to
+ * @param pos the position - ignored
+ * @return the buffer passed in
+ */
+ public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+ final String formatted = formatObject(obj);
+ toAppendTo.append(formatted);
+ return toAppendTo;
+ }
+
+ @Override
+ public String getStyle() {
+ return PatternFormat.STYLE_FORMATTER;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/IFormattedObject.java b/freeplane/src/org/freeplane/features/format/IFormattedObject.java
new file mode 100644
index 0000000..3965395
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/IFormattedObject.java
@@ -0,0 +1,36 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+/**
+ * @author vboerchers
+ */
+public interface IFormattedObject {
+ // do not change this constants since they are used for serialization!
+ public static final String TYPE_NUMBER = "number";
+ public static final String TYPE_DATE = "date";
+ public static final String TYPE_DATETIME = "datetime";
+ public static final String TYPE_STRING = "string";
+
+ String getPattern();
+
+ /** the unformatted object. */
+ Object getObject();
+}
diff --git a/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java b/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java
new file mode 100644
index 0000000..49830f4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java
@@ -0,0 +1,26 @@
+package org.freeplane.features.format;
+
+import org.freeplane.core.util.TextUtils;
+
+class IdentityPatternFormat extends PatternFormat {
+ public IdentityPatternFormat() {
+ super(IDENTITY_PATTERN, TYPE_IDENTITY);
+ }
+
+ @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(IDENTITY_PATTERN);
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/format/IsoDateParser.java b/freeplane/src/org/freeplane/features/format/IsoDateParser.java
new file mode 100644
index 0000000..cff352f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/IsoDateParser.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+/**
+ * A locale independent parser that uses the parsed input to decide between TYPE_DATE and TYPE_DATETIME.
+ *
+ * @author Volker Boerchers
+ */
+public class IsoDateParser extends Parser {
+ public IsoDateParser() {
+ super(Parser.STYLE_ISODATE, IFormattedObject.TYPE_DATE, null);
+ }
+
+ @Override
+ Object parse(String string) {
+ try {
+ if (string == null)
+ return null;
+ final FormattedDate date = FormattedDate.toDateISO(string);
+ final String type = date.containsTime() ? IFormattedObject.TYPE_DATETIME : IFormattedObject.TYPE_DATE;
+ return FormattedDate.createDefaultFormattedDate(date.getTime(), type);
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/NumberLiteralParser.java b/freeplane/src/org/freeplane/features/format/NumberLiteralParser.java
new file mode 100644
index 0000000..ac56b70
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/NumberLiteralParser.java
@@ -0,0 +1,20 @@
+package org.freeplane.features.format;
+
+public class NumberLiteralParser extends Parser {
+ public NumberLiteralParser() {
+ super(Parser.STYLE_NUMBERLITERAL, IFormattedObject.TYPE_NUMBER, null);
+ }
+
+ @Override
+ Object parse(String string) {
+ try {
+ if (string == null || string.indexOf(' ') != -1)
+ return null;
+ final Double doubleValue = Double.valueOf(string);
+ return new FormattedNumber(doubleValue);
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/Parser.java b/freeplane/src/org/freeplane/features/format/Parser.java
new file mode 100644
index 0000000..56b88a5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/Parser.java
@@ -0,0 +1,98 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.util.Locale;
+
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/** Scanner.scan(string) uses a number of Parsers to convert string into a Number, a Date or whatever. */
+public abstract class Parser {
+ public static final String STYLE_NUMBERLITERAL = "numberliteral";
+ public static final String STYLE_DECIMAL = "decimal";
+ public static final String STYLE_ISODATE = "isodate";
+ public static final String STYLE_DATE = "date";
+ private final String style;
+ private final String type;
+ private final String format;
+ private String comment;
+
+ public Parser(String style, String type, String format, String comment) {
+ this.style = style;
+ this.type = type;
+ this.format = format;
+ this.comment = comment;
+ }
+
+ public Parser(String style, String type, String format) {
+ this(style, type, format, null);
+ }
+
+ /** tries to parse the string. Returns null if parsing does not succeed.
+ * @throws nothing May not throw an exception. */
+ abstract Object parse(final String string);
+
+ public static Parser createParser(String style, String type, String format, Locale locale, String comment) {
+ final Parser parser;
+ if (style.equals(STYLE_NUMBERLITERAL))
+ parser = new NumberLiteralParser();
+ else if (style.equals(STYLE_DECIMAL))
+ parser = new DecimalFormatParser(locale);
+ else if (style.equals(STYLE_ISODATE))
+ parser = new IsoDateParser();
+ else if (style.equals(STYLE_DATE))
+ parser = new DateFormatParser(format, type);
+ else
+ throw new IllegalArgumentException("illegal parser style " + style);
+ parser.setComment(comment);
+ return parser;
+ }
+
+ public XMLElement toXml() {
+ final XMLElement xmlElement = new XMLElement("parser");
+ xmlElement.setAttribute("type", getType());
+ xmlElement.setAttribute("style", getStyle());
+ if (getFormat() != null)
+ xmlElement.setAttribute("format", getFormat());
+ if (getComment() != null)
+ xmlElement.setAttribute("comment", getComment());
+ return xmlElement;
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/PatternFormat.java b/freeplane/src/org/freeplane/features/format/PatternFormat.java
new file mode 100644
index 0000000..039aec8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/PatternFormat.java
@@ -0,0 +1,280 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.Formatter;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/** a thin wrapper around {@link SimpleDateFormat}, {@link DecimalFormat} and {@link Formatter}.
+ * <p>
+ * Parsing is not supported! */
+public abstract class PatternFormat /*extends Format*/ {
+ private static final String SERIALIZATION_SEPARATOR = ":";
+ public static final String IDENTITY_PATTERN = "NO_FORMAT";
+ public static final String STANDARD_FORMAT_PATTERN = "STANDARD_FORMAT";
+
+ private static final PatternFormat IDENTITY = new IdentityPatternFormat();
+ private static final PatternFormat STANDARD = new StandardPatternFormat();
+ static final String STYLE_FORMATTER = "formatter";
+ static final String STYLE_DATE = "date";
+ static final String STYLE_DECIMAL = "decimal";
+ static final String TYPE_IDENTITY = "identity";
+ static final String TYPE_STANDARD = "standard";
+ private static final String ELEMENT_NAME = "format";
+ private final String type;
+ private final String pattern;
+ private String name;
+ private Locale locale;
+
+ public PatternFormat(String pattern, String type) {
+ this.type = type;
+ this.pattern = pattern;
+ }
+
+ /** the formal format description. */
+ public String getPattern() {
+ return pattern;
+ }
+
+ /** selects the kind of data the formatter is intended to format. */
+ public String getType() {
+ return type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
+ /** selects the formatter implementation, e.g. "formatter" or "date" */
+ public abstract String getStyle();
+
+ public static PatternFormat create(final String pattern, final String style, final String type) {
+ if (pattern.equals(IDENTITY_PATTERN))
+ return new IdentityPatternFormat();
+ else if (pattern.equals(STANDARD_FORMAT_PATTERN))
+ return new StandardPatternFormat();
+ else if (style.equals(STYLE_DATE))
+ return new DatePatternFormat(pattern);
+ else if (style.equals(STYLE_FORMATTER))
+ return new FormatterPatternFormat(pattern, type);
+ else if (style.equals(STYLE_DECIMAL))
+ return new DecimalPatternFormat(pattern);
+ else
+ throw new IllegalArgumentException("unknown format style");
+ }
+
+ public static PatternFormat create(final String pattern, final String style, final String type,
+ final String name) {
+ final PatternFormat format = create(pattern, style, type);
+ format.setName(name);
+ return format;
+ }
+
+ public static PatternFormat create(final String pattern, final String style, final String type,
+ final String name, final Locale locale) {
+ final PatternFormat format = create(pattern, style, type, name);
+ format.setLocale(locale);
+ return format;
+ }
+
+ // yyyy-MM-dd HH:mm:ss
+ final static Pattern datePattern = Pattern.compile("yy|[Hh]{1,2}:mm");
+
+ // %[argument_index$] [flags] [width] conversion
+ // == conversions
+ // ignore boolean: bB
+ // ignore hash: hH
+ // sS
+ // ignore char: cC
+ // number: doxXeEfgGaA
+ // ignore literals: %n
+ // time prefix: tT
+ final static Pattern formatterPattern = Pattern.compile("%" //
+ // + "(?:[\\d<]+\\$)?" // Freeplane: no support for argument index$!
+ + "(?:[-#+ 0,(]+)?" // flags
+ + "(?:[\\d.]+)?" // width
+ + "([sSdoxXeEfgGaA]|[tT][HIklMSLNpzZsQBbhAaCYyjmdeRTrDFc])"); // conversion
+
+ // this method is null safe
+ public static PatternFormat guessPatternFormat(final String pattern) {
+ try {
+ if (pattern == null || pattern.length() == 0)
+ return null;
+ final Matcher matcher = formatterPattern.matcher(pattern);
+ if (matcher.find()) {
+ // System.err.println("pattern='" + pattern + "' match='" + matcher.group() + "'");
+ final char conversion = matcher.group(1).charAt(0);
+ if (matcher.find()) {
+ LogUtils.warn("found multiple formats in this formatter pattern: '" + pattern + "'");
+ return null;
+ }
+ switch (conversion) {
+ case 's':
+ case 'S':
+ return new FormatterPatternFormat(pattern, IFormattedObject.TYPE_STRING);
+ case 'd':
+ case 'o':
+ case 'x':
+ case 'X':
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
+ case 'G':
+ case 'a':
+ case 'A':
+ return new FormatterPatternFormat(pattern, IFormattedObject.TYPE_NUMBER);
+ case 't':
+ case 'T':
+ return new FormatterPatternFormat(pattern, IFormattedObject.TYPE_DATE);
+ }
+ }
+ if (datePattern.matcher(pattern).find()) {
+ return new DatePatternFormat(pattern);
+ }
+ if (pattern.indexOf('#') != -1 || pattern.indexOf('0') != -1) {
+ return new DecimalPatternFormat(pattern);
+ }
+ // only as a last resort?!
+ if (pattern.equals(IDENTITY_PATTERN)) {
+ return IDENTITY;
+ }
+ if (pattern.equals(STANDARD_FORMAT_PATTERN)) {
+ return STANDARD;
+ }
+ LogUtils.warn("not a pattern format: '" + pattern + "'");
+ return null;
+ }
+ catch (Exception e) {
+ LogUtils.warn("can't build a formatter for this pattern '" + pattern + "'", e);
+ return null;
+ }
+ }
+
+ public static PatternFormat getIdentityPatternFormat() {
+ return IDENTITY;
+ }
+
+ public static PatternFormat getStandardPatternFormat() {
+ return STANDARD;
+ }
+
+ public XMLElement toXml() {
+ final XMLElement xmlElement = new XMLElement(ELEMENT_NAME);
+ xmlElement.setAttribute("type", getType());
+ xmlElement.setAttribute("style", getStyle());
+ if (getName() != null)
+ xmlElement.setAttribute("name", getName());
+ if (getLocale() != null)
+ xmlElement.setAttribute("locale", getLocale().toString());
+ xmlElement.setContent(getPattern());
+ return xmlElement;
+ }
+
+ public String serialize() {
+ return getType() + SERIALIZATION_SEPARATOR + getStyle() + SERIALIZATION_SEPARATOR + TypeReference.encode(getPattern());
+ }
+
+ public static PatternFormat deserialize(String string) {
+ final String[] tokens = string.split(SERIALIZATION_SEPARATOR, 3);
+ return create(TypeReference.decode(tokens[2]), tokens[1], tokens[0]);
+ }
+
+ public boolean acceptsDate() {
+ return getType().equals(IFormattedObject.TYPE_DATE) || getPattern().equals(STANDARD_FORMAT_PATTERN);
+ }
+
+ public boolean acceptsNumber() {
+ return getType().equals(IFormattedObject.TYPE_NUMBER) || getPattern().equals(STANDARD_FORMAT_PATTERN);
+ }
+
+ public boolean acceptsString() {
+ return getType().equals(IFormattedObject.TYPE_STRING) || getPattern().equals(STANDARD_FORMAT_PATTERN);
+ }
+
+ abstract public Object formatObject(Object toFormat);
+
+ @Override
+ public int hashCode() {
+ final String style = getStyle();
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((pattern == null) ? 0 : pattern.hashCode());
+ result = prime * result + ((style == null) ? 0 : style.hashCode());
+ result = prime * result + ((type == null) ? 0 : type.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;
+ PatternFormat other = (PatternFormat) obj;
+ if (pattern == null) {
+ if (other.pattern != null)
+ return false;
+ }
+ else if (!pattern.equals(other.pattern))
+ return false;
+ final String style = getStyle();
+ if (style == null) {
+ if (other.getStyle() != null)
+ return false;
+ }
+ else if (!style.equals(other.getStyle()))
+ return false;
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ }
+ else if (!type.equals(other.type))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return pattern;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/Scanner.java b/freeplane/src/org/freeplane/features/format/Scanner.java
new file mode 100644
index 0000000..13eba94
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/Scanner.java
@@ -0,0 +1,121 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/** Scanner.scan(string) uses a number of Parsers to convert string into a Number, a Date or whatever. */
+public class Scanner {
+ private static final String ELEM_SCANNER = "scanner";
+ private static final String ATTRIB_LOCALE = "locale";
+ private static final String ATTRIB_DEFAULT = "default";
+ private static final String ELEM_CHECKFIRSTCHAR = "checkfirstchar";
+ private static final String ATTRIB_DISABLED = "disabled";
+ private static final String ATTRIB_CHARS = "chars";
+ private final ArrayList<String> locales;
+ private final boolean isDefault;
+ private String firstChars;
+ private boolean checkFirstChars;
+ private ArrayList<Parser> parsers = new ArrayList<Parser>();
+
+ public Scanner(String[] locales, boolean isDefault) {
+ this.locales = new ArrayList<String>(Arrays.asList(locales));
+ this.isDefault = isDefault;
+ validate();
+ }
+
+ private void validate() {
+ if (locales.isEmpty())
+ throw new IllegalArgumentException("attribute " + ATTRIB_LOCALE + " is mandatory and may not be empty");
+ }
+
+ public ArrayList<String> getLocales() {
+ return locales;
+ }
+
+ public boolean isDefault() {
+ return isDefault;
+ }
+
+ public String getFirstChars() {
+ return firstChars;
+ }
+
+ public void setFirstChars(String firstChars) {
+ this.firstChars = firstChars;
+ checkFirstChars = !TextUtils.isEmpty(firstChars);
+ }
+
+ public void addParser(Parser parser) {
+ parsers.add(parser);
+ }
+
+ public List<Parser> getParsers() {
+ return new ArrayList<Parser>(parsers);
+ }
+
+ public XMLElement toXml() {
+ final XMLElement xmlElement = new XMLElement(ELEM_SCANNER);
+ xmlElement.setAttribute(ATTRIB_LOCALE, StringUtils.join(locales.iterator(), ","));
+ if (isDefault)
+ xmlElement.setAttribute(ATTRIB_DEFAULT, "true");
+ xmlElement.addChild(firstCharsToXml());
+ for (Parser parser : parsers) {
+ xmlElement.addChild(parser.toXml());
+ }
+ return xmlElement;
+ }
+
+ private XMLElement firstCharsToXml() {
+ final XMLElement xmlElement = new XMLElement(ELEM_CHECKFIRSTCHAR);
+ if (checkFirstChars)
+ xmlElement.setAttribute(ATTRIB_CHARS, firstChars);
+ else
+ xmlElement.setAttribute(ATTRIB_DISABLED, "true");
+ return xmlElement;
+ }
+
+ public boolean localeMatchesExactly(String locale) {
+ return locales.contains(locale);
+ }
+
+ public boolean countryMatches(String locale) {
+ return locales.contains(locale.replaceFirst("_.*", ""));
+ }
+
+ public Object parse(String string) {
+ if (TextUtils.isEmpty(string) || (checkFirstChars && firstChars.indexOf(string.charAt(0)) == -1))
+ return string;
+ if(string.charAt(0) == '\'')
+ return string;
+ for (Parser parser : parsers) {
+ final Object object = parser.parse(string);
+ if (object != null)
+ return object;
+ }
+ return string;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/ScannerController.java b/freeplane/src/org/freeplane/features/format/ScannerController.java
new file mode 100644
index 0000000..664e036
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/format/ScannerController.java
@@ -0,0 +1,390 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 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.format;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Vector;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+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.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 Volker Boerchers
+ */
+public class ScannerController implements IExtension, IFreeplanePropertyListener {
+ private static final String SCANNER_XML = "scanner.xml";
+ private static final String ROOT_ELEMENT = "scanners";
+ private String pathToFile;
+ private Scanner selectedScanner;
+ private static List<Scanner> scanners = new ArrayList<Scanner>();
+ private static boolean scannersLoaded;
+
+ public ScannerController() {
+ final String freeplaneUserDirectory = ResourceController.getResourceController().getFreeplaneUserDirectory();
+ // applets have no user directory and no file access anyhow
+ pathToFile = freeplaneUserDirectory == null ? null : freeplaneUserDirectory + File.separator + SCANNER_XML;
+ initScanners();
+ selectScanner(FormatUtils.getFormatLocaleFromResources());
+ addParsersForStandardFormats();
+ final ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.addPropertyChangeListener(this);
+ }
+
+ public static ScannerController getController() {
+ return getController(Controller.getCurrentController());
+ }
+
+ public static ScannerController getController(Controller controller) {
+ return (ScannerController) controller.getExtension(ScannerController.class);
+ }
+
+ public static void install(final ScannerController scannerController) {
+ Controller.getCurrentController().addExtension(ScannerController.class, scannerController);
+ }
+
+ public void selectScanner(final Locale locale) {
+ selectedScanner = findScanner(locale);
+ }
+
+ public Object parse(String string) {
+ return selectedScanner.parse(string);
+ }
+
+ private Scanner findScanner(final Locale locale) {
+ final String localeAsString = locale.toString();
+ Scanner countryScanner = null;
+ Scanner defaultScanner = null;
+ for (Scanner scanner : scanners) {
+ if (scanner.localeMatchesExactly(localeAsString))
+ return scanner;
+ else if (localeAsString.contains("_") && scanner.countryMatches(localeAsString))
+ countryScanner = scanner;
+ else if (scanner.isDefault())
+ defaultScanner = scanner;
+ }
+ return countryScanner == null ? defaultScanner : countryScanner;
+ }
+
+ private Scanner findGoodMatch(final Locale locale) {
+ final String localeAsString = locale.toString();
+ Scanner countryScanner = null;
+ for (Scanner scanner : scanners) {
+ if (scanner.localeMatchesExactly(localeAsString))
+ return scanner;
+ else if (localeAsString.contains("_") && scanner.countryMatches(localeAsString))
+ countryScanner = scanner;
+ }
+ return countryScanner;
+ }
+
+ private void initScanners() {
+ if (scannersLoaded)
+ return;
+ scannersLoaded = true;
+ try {
+ if (pathToFile != null)
+ loadScanners();
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ UITools.errorMessage(TextUtils.getText("scanners_not_loaded"));
+ }
+ addAndSaveStandardScanners();
+ }
+
+ /** if standard formats wouldn't be parseable it would be difficult to edit recognized dates since the standard
+ * format is used by the editor. */
+ public void addParsersForStandardFormats() {
+ final HashSet<String> patterns = new HashSet<String>();
+ final List<Parser> parsers = selectedScanner.getParsers();
+ for (Parser parser : parsers) {
+ patterns.add(parser.getFormat());
+ }
+ final String standardDateFormat = FormatController.getController().getDefaultDateFormat().toPattern();
+ if (!patterns.contains(standardDateFormat)) {
+ selectedScanner.addParser(Parser.createParser(Parser.STYLE_DATE, IFormattedObject.TYPE_DATETIME,
+ standardDateFormat, Locale.getDefault(), "STANDARD FORMAT"));
+ LogUtils.info("added parsing support for standard date format " + standardDateFormat);
+ }
+ final String standardDateTimeFormat = FormatController.getController().getDefaultDateTimeFormat().toPattern();
+ if (!patterns.contains(standardDateTimeFormat)) {
+ selectedScanner.addParser(Parser.createParser(Parser.STYLE_DATE, IFormattedObject.TYPE_DATETIME,
+ standardDateTimeFormat, Locale.getDefault(), "STANDARD FORMAT"));
+ LogUtils.info("added parsing support for standard date time format " + standardDateTimeFormat);
+ }
+ // let's hope that for every locale a proper decimal number parser is defined.
+ }
+
+ private void addAndSaveStandardScanners() {
+ final int originalCount = scanners.size();
+ if (findGoodMatch(new Locale("en")) == null)
+ scanners.add(createScanner_en());
+ if (findGoodMatch(new Locale("de")) == null)
+ scanners.add(createScanner_de());
+ if (findGoodMatch(new Locale("hr")) == null)
+ scanners.add(createScanner_hr());
+ if (findGoodMatch(Locale.getDefault()) == null) {
+ // "de_DE_WIN" -> "de_DE"
+ final String shortLocale = Locale.getDefault().toString().replaceAll("(.*_.*)_.*", "$1");
+ scanners.add(createScanner(new Locale(shortLocale)));
+ }
+ if (scanners.size() != originalCount)
+ saveScannersNoThrow();
+ }
+
+ private Scanner createScanner_en() {
+ final Scanner s = new Scanner(new String[] { "en" }, true);
+ s.setFirstChars("+-0123456789.");
+ final String tNumber = IFormattedObject.TYPE_NUMBER;
+ final String tDate = IFormattedObject.TYPE_DATETIME;
+ final Locale loc = new Locale("en");
+ s.addParser(Parser.createParser(Parser.STYLE_DECIMAL, tNumber, null, loc, "supports locale specific numbers"));
+ // number literals are a subset of english localized decimal parser
+ // s.addParser(Parser.createParser(Parser.STYLE_NUMBERLITERAL, tNumber, null, loc, "numbers like 12345.12"));
+ s.addParser(Parser.createParser(Parser.STYLE_ISODATE, tDate, null, loc, "ISO reader for date and date/time"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "M/d", loc, "completes date with current year"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "M/d/y", loc, "parses 4/21/11 or 4/21/2011"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "M/d/y H:m", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "M/d/y H:m:s", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "H:m", loc, "parses time, sets date to today"));
+ return s;
+ }
+
+ private Scanner createScanner_de() {
+ final Scanner s = new Scanner(new String[] { "de" }, false);
+ s.setFirstChars("+-0123456789,.");
+ final String tNumber = IFormattedObject.TYPE_NUMBER;
+ final String tDate = IFormattedObject.TYPE_DATETIME;
+ final Locale loc = new Locale("de");
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M", loc, "completes date with current year"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y", loc, "parses 21.4.11 or 21.4.2011"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y H:m", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y H:m:s", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "H:m", loc, "parses time, sets date to today"));
+ s.addParser(Parser.createParser(Parser.STYLE_DECIMAL, tNumber, null, loc,
+ "uses comma as decimal separator: 1.234,12"));
+ s.addParser(Parser.createParser(Parser.STYLE_ISODATE, tDate, null, loc, "ISO reader for date and date/time"));
+ s.addParser(Parser.createParser(Parser.STYLE_NUMBERLITERAL, tNumber, null, loc,
+ "support dot as decimal separator (if nothing else matches)"));
+ return s;
+ }
+
+ private Scanner createScanner_hr() {
+ final Scanner s = new Scanner(new String[] { "hr" }, false);
+ s.setFirstChars("+-0123456789,.");
+ final String tNumber = IFormattedObject.TYPE_NUMBER;
+ final String tDate = IFormattedObject.TYPE_DATETIME;
+ final Locale loc = new Locale("hr");
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M", loc, "completes date with current year"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y", loc, "parses 21.4.11 or 21.4.2011"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y.", loc, "parses 21.4.11. or 21.4.2011."));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y. H:m.", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "d.M.y. H:m:s", loc, "parses datetime"));
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, "H:m", loc, "parses time, sets date to today"));
+ s.addParser(Parser.createParser(Parser.STYLE_DECIMAL, tNumber, null, loc,
+ "uses comma as decimal separator: 1.234,12"));
+ s.addParser(Parser.createParser(Parser.STYLE_ISODATE, tDate, null, loc, "ISO reader for date and date/time"));
+ s.addParser(Parser.createParser(Parser.STYLE_NUMBERLITERAL, tNumber, null, loc,
+ "support dot as decimal separator (if nothing else matches)"));
+ return s;
+ }
+
+ private Scanner createScanner(Locale loc) {
+ final Scanner s = new Scanner(new String[] { loc.toString() }, false);
+ s.setFirstChars("+-0123456789,.");
+ final String tNumber = IFormattedObject.TYPE_NUMBER;
+ final String tDate = IFormattedObject.TYPE_DATETIME;
+ final DateFormat shortDateTimeFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT,
+ loc);
+ if (shortDateTimeFormat instanceof SimpleDateFormat) {
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate,
+ ((SimpleDateFormat) shortDateTimeFormat).toPattern(), loc, "short datetime format"));
+ }
+ final DateFormat shortDateFormat = SimpleDateFormat.getDateInstance(DateFormat.SHORT, loc);
+ if (shortDateFormat instanceof SimpleDateFormat) {
+ s.addParser(Parser.createParser(Parser.STYLE_DATE, tDate, ((SimpleDateFormat) shortDateFormat).toPattern(),
+ loc, "short date format"));
+ }
+ s.addParser(Parser.createParser(Parser.STYLE_DECIMAL, tNumber, null, loc, "number format"));
+ s.addParser(Parser.createParser(Parser.STYLE_ISODATE, tDate, null, loc, "ISO reader for date and date/time"));
+ s.addParser(Parser.createParser(Parser.STYLE_NUMBERLITERAL, tNumber, null, loc,
+ "support dot as decimal separator (if nothing else matches)"));
+ return s;
+ }
+
+ void loadScanners() throws Exception {
+ final File configXml = new File(pathToFile);
+ if (!configXml.exists()) {
+ LogUtils.info(pathToFile + " does not exist yet");
+ return;
+ }
+ try {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ final IXMLReader reader = new StdXMLReader(new BufferedInputStream(new FileInputStream(configXml)));
+ parser.setReader(reader);
+ final XMLElement loader = (XMLElement) parser.parse();
+ final Vector<XMLElement> scannerElements = loader.getChildren();
+ for (XMLElement elem : scannerElements) {
+ scanners.add(parseScanner(elem));
+ }
+ boolean haveDefault = false;
+ for (Scanner scanner : scanners) {
+ if (scanner.isDefault()) {
+ if (haveDefault)
+ LogUtils.warn(configXml + ": multiple scanners are marked as default - fix that!");
+ else
+ haveDefault = true;
+ }
+ }
+ if (!haveDefault)
+ LogUtils.warn(configXml + ": no scanner is marked as default - fix that!");
+ }
+ catch (final IOException e) {
+ LogUtils.warn("error parsing " + configXml, e);
+ }
+ }
+
+ private Scanner parseScanner(XMLElement elem) {
+ final String locales = elem.getAttribute("locale", "");
+ final String isDefault = elem.getAttribute("default", "false");
+ if (StringUtils.isEmpty(locales)) {
+ throw new RuntimeException("wrong scanner in " + pathToFile
+ + ": none of the following must be empty: locales=" + locales + ".");
+ }
+ final Scanner scanner = new Scanner(locales.trim().split(","), Boolean.parseBoolean(isDefault));
+ final Locale locale = new Locale(scanner.getLocales().get(0));
+ for (XMLElement child : elem.getChildren()) {
+ if (child.getName().equals("checkfirstchar")) {
+ final String chars = elem.getAttribute("chars", "");
+ final boolean disabled = Boolean.parseBoolean(elem.getAttribute("disabled", "false"));
+ if (!disabled)
+ scanner.setFirstChars(chars);
+ }
+ else if (child.getName().equals("parser")) {
+ scanner.addParser(parseParser(child, locale));
+ }
+ }
+ return scanner;
+ }
+
+ private Parser parseParser(XMLElement elem, Locale locale) {
+ final String type = elem.getAttribute("type", null);
+ final String style = elem.getAttribute("style", null);
+ final String format = elem.getAttribute("format", null);
+ final String comment = elem.getAttribute("comment", null);
+ return Parser.createParser(style, type, format, locale, comment);
+ }
+
+ private void saveScannersNoThrow() {
+ try {
+ saveScanners(scanners);
+ }
+ catch (final NoClassDefFoundError e) {
+ }
+ catch (final Exception e) {
+ LogUtils.warn("cannot save create " + pathToFile, e);
+ }
+ }
+
+ private void saveScanners(final List<Scanner> scanners) throws IOException {
+ final XMLElement saver = new XMLElement();
+ saver.setName(ROOT_ELEMENT);
+ final String sep = System.getProperty("line.separator");
+ final String description = commentLines("Description:" //
+ , "" //
+ , "<scanner> Scanners are locale dependent. If there is no scanner for" //
+ , "the selected locale the scanner marked with default=\"true\" is choosen." //
+ , " 'locales': A comma-separated list of locale names." //
+ , " The locale is selected via Preferences -> Environment -> Language" //
+ , " It's a pattern like 'en' (generic English) or 'en_US'" //
+ , " (English/USA). Use the more general two-letter form if appropriate." //
+ , " 'default': Set to \"true\" for only one locale. The standard is 'en'." //
+ , "" //
+ , "<checkfirstchar> allows to enable a fast check for the first input" //
+ , "character. If the first input character is not contained in the string" //
+ , "given in attribute 'chars' no further attempts are made to parse the" //
+ , "input as a number or date." //
+ , "Do not use this option if you have have scanner formats that can" //
+ , "recognize arbitrary text at the beginning of the pattern. To disable" //
+ , "this check omit <checkfirstchar> or add the attribute disabled=\"true\"." //
+ , " 'chars': A string of characters that may start data." //
+ , "" //
+ , "<type> selects the kind of data the scanner should recognize." //
+ , " 'style' selects the formatter implementation:" //
+ , " - \"isodate\": flexible ISO date reader for strings like 2011-04-29 22:31:21" //
+ , " Only creates datetimes if time part is given, so no differentiation" //
+ , " between date and date/time is necessary." //
+ , " - \"date\": a special format for dates; needs attribute 'format'. See" //
+ , " http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html" //
+ , " - \"numberliteral\": parses Java float or integral number literals only, with" //
+ , " a dot as decimal separator and no thousands separator. See" //
+ , " http://en.wikibooks.org/wiki/Java_Programming/Literals/Numeric_Literals/Floating_Point_Literals" //
+ , " - \"decimal\": a special format for numbers; needs attribute 'format'. See" //
+ , " http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html" //
+ , " 'format': The format code of a \"date\" or \"decimal\" scanner." //
+ , " 'comment': Inline comment, not used by the application.");
+ final String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + sep + description;
+ for (Scanner scanner : scanners) {
+ saver.addChild(scanner.toXml());
+ }
+ final Writer writer = new FileWriter(pathToFile);
+ final XMLWriter xmlWriter = new XMLWriter(writer);
+ xmlWriter.addRawContent(header);
+ xmlWriter.write(saver, true);
+ writer.close();
+ }
+
+ private String commentLines(String... comments) {
+ StringBuilder builder = new StringBuilder(comments.length * 100);
+ for (String comment : comments) {
+ builder.append(String.format("<!-- %-71s -->%n", comment));
+ }
+ return builder.toString();
+ }
+
+ public void propertyChanged(String propertyName, String newValue, String oldValue) {
+ if (FormatUtils.equalsFormatLocaleName(propertyName)) {
+ selectScanner(FormatUtils.getFormatLocaleFromResources());
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/StandardPatternFormat.java b/freeplane/src/org/freeplane/features/format/StandardPatternFormat.java
new file mode 100644
index 0000000..5f1b4eb
--- /dev/null
+++ b/freeplane/src/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);
+ }
+}
\ 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
new file mode 100644
index 0000000..6856da2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/AboutAction.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.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;
+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(Controller.getCurrentController().getViewController().getViewport(), 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
new file mode 100644
index 0000000..72a55b7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/DocumentationAction.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.features.help;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+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.ConfigurationUtils;
+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 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);
+ 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
new file mode 100644
index 0000000..2caee85
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/FilePropertiesAction.java
@@ -0,0 +1,350 @@
+/*
+ * 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.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(Controller.getCurrentController().getViewController().getViewport(), 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
new file mode 100644
index 0000000..cd21bc7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/HelpController.java
@@ -0,0 +1,68 @@
+/*
+ * 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
new file mode 100644
index 0000000..71f338a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/HotKeyInfoAction.java
@@ -0,0 +1,140 @@
+/*
+ * 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.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.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.showMessageDialog((Component) e.getSource(), scrollPane, title, JOptionPane.INFORMATION_MESSAGE);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java b/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java
new file mode 100644
index 0000000..983b409
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java
@@ -0,0 +1,69 @@
+/*
+ * 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/help/OpenSourceForgeURLAction.java b/freeplane/src/org/freeplane/features/help/OpenSourceForgeURLAction.java
new file mode 100644
index 0000000..a03fc3c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/OpenSourceForgeURLAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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.help;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+
+/**
+ * @author Dimitry Polivaev
+ * 18.05.2009
+ */
+public class OpenSourceForgeURLAction extends OpenURLAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ OpenSourceForgeURLAction(final String key, final String url) {
+ super(key, url);
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ final int showResult = OptionalDontShowMeAgainDialog.show("sf_login_required", "confirmation",
+ "open_source_forge_url", OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
+ if (showResult != JOptionPane.OK_OPTION) {
+ return;
+ }
+ super.actionPerformed(e);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/help/OpenURLAction.java b/freeplane/src/org/freeplane/features/help/OpenURLAction.java
new file mode 100644
index 0000000..fc9aae3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/help/OpenURLAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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 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.mode.Controller;
+
+class OpenURLAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private String url;
+
+ OpenURLAction(final String key, final String url) {
+ super(key);
+ this.url = url;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ try {
+ Controller.getCurrentController().getViewController().openDocument(new URL(url));
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.getText("url_error") + "\n" + ex);
+ LogUtils.warn(ex);
+ }
+ catch (final Exception ex) {
+ UITools.errorMessage(ex);
+ LogUtils.warn(ex);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/AccumulatedIcons.java b/freeplane/src/org/freeplane/features/icon/AccumulatedIcons.java
new file mode 100644
index 0000000..5a37892
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/AccumulatedIcons.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.icon;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.TreeSet;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.icon.HierarchicalIcons.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 10, 2011
+ */
+class AccumulatedIcons implements IExtension{
+ private final TreeSet<UIIcon> childIcons ;
+ private final Collection<? extends UIIcon> ownIcons;
+
+ AccumulatedIcons(Collection<? extends UIIcon> ownIcons) {
+ this.ownIcons = ownIcons;
+ this.childIcons = new TreeSet<UIIcon>();
+ }
+
+ public Collection<UIIcon> getAccumulatedIcons() {
+ return childIcons;
+ }
+
+ /**
+ */
+ private void addAccumulatedIconsToTreeSet(final NodeModel child) {
+ final IconController iconController = IconController.getController();
+ childIcons.addAll(iconController.getIcons(child));
+ final AccumulatedIcons icons = (AccumulatedIcons) child.getExtension(AccumulatedIcons.class);
+ if (icons == null) {
+ return;
+ }
+ childIcons.addAll((Collection<UIIcon>) icons.childIcons);
+ }
+
+ static public boolean setStyleCheckForChange(final NodeModel node, Mode mode) {
+ final Collection<MindIcon> ownIcons = IconController.getController().getIcons(node);
+ final AccumulatedIcons iconSet = new AccumulatedIcons(ownIcons);
+ boolean first = true;
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ if(first || mode.equals(Mode.OR)){
+ iconSet.addAccumulatedIconsToTreeSet(child);
+ }
+ else{
+ @SuppressWarnings("unchecked")
+ final AccumulatedIcons iconSet2 = new AccumulatedIcons(Collections.EMPTY_SET);
+ iconSet2.addAccumulatedIconsToTreeSet(child);
+ iconSet.childIcons.retainAll((Collection<UIIcon>) iconSet2.childIcons);
+ if(iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty())
+ break;
+ }
+ first = false;
+ }
+ iconSet.childIcons.removeAll(ownIcons);
+
+ final AccumulatedIcons oldSet;
+ if (! (iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty())) {
+ oldSet = (AccumulatedIcons)node.putExtension(iconSet);
+ }
+ else {
+ oldSet = node.removeExtension(AccumulatedIcons.class);
+ }
+ if(iconSet.equals(oldSet) || iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty() && oldSet == null)
+ return false;
+ Controller.getCurrentModeController().getMapController().delayedNodeRefresh(node, HierarchicalIcons.ICONS, null, null);
+ return true;
+ }
+ @Override
+ public int hashCode() {
+ return childIcons.hashCode() + ownIcons.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this == obj)
+ return true;
+ if(obj instanceof AccumulatedIcons){
+ AccumulatedIcons ai = (AccumulatedIcons) obj;
+ return ownIcons.equals(ai.ownIcons) && childIcons.equals(ai.childIcons);
+ }
+ return false;
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/icon/HierarchicalIcons.java b/freeplane/src/org/freeplane/features/icon/HierarchicalIcons.java
new file mode 100644
index 0000000..5a62e33
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..3fef679
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IIconInformation.java
@@ -0,0 +1,33 @@
+/*
+ * 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/IStateIconProvider.java b/freeplane/src/org/freeplane/features/icon/IStateIconProvider.java
new file mode 100644
index 0000000..f7de5b1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IStateIconProvider.java
@@ -0,0 +1,30 @@
+/*
+ * 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.icon;
+
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 10, 2011
+ */
+public interface IStateIconProvider {
+ UIIcon getStateIcon(NodeModel node);
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconBuilder.java b/freeplane/src/org/freeplane/features/icon/IconBuilder.java
new file mode 100644
index 0000000..edc7c08
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconBuilder.java
@@ -0,0 +1,93 @@
+/*
+ * 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
new file mode 100644
index 0000000..d2cb162
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconConditionController.java
@@ -0,0 +1,125 @@
+/*
+ * 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);
+ }
+ 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("");
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconContainedCondition.java b/freeplane/src/org/freeplane/features/icon/IconContainedCondition.java
new file mode 100644
index 0000000..19a6d46
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconContainedCondition.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.features.icon;
+
+import java.awt.Color;
+import java.util.Collection;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.JCondition;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class IconContainedCondition extends ASelectableCondition {
+ private static final IconStore STORE = IconStoreFactory.create();
+ static final String ICON = "ICON";
+ static final String NAME = "icon_contained_condition";
+
+ static private int iconFirstIndex(final NodeModel node, final String iconName) {
+ final Collection<MindIcon> icons = IconController.getController().getIcons(node);
+ int i = 0;
+ for (MindIcon nextIcon : icons) {
+ if (iconName.equals(nextIcon.getName())) {
+ return i;
+ }
+ i++;
+ }
+ return -1;
+ }
+
+ private static boolean isStateIconContained(final NodeModel node, final String iconName) {
+ final Collection<UIIcon> stateIcons = IconController.getController().getStateIcons(node);
+ for (final UIIcon stateIcon : stateIcons) {
+ if (iconName.equals(stateIcon.getName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new IconContainedCondition(element.getAttribute(IconContainedCondition.ICON, null));
+ }
+
+ final private String iconName;
+
+ public IconContainedCondition(final String iconName) {
+ this.iconName = iconName;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ return IconContainedCondition.iconFirstIndex(node, iconName) != -1
+ || IconContainedCondition.isStateIconContained(node, iconName);
+ }
+
+ private String getIconName() {
+ return iconName;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing
+ * .JList, java.lang.Object, int, boolean, boolean)
+ */
+ public JComponent createRendererComponent() {
+ final JCondition component = new JCondition();
+ final String text = TextUtils.getText("filter_icon") + ' ' + TextUtils.getText("filter_contains") + ' ';
+ component.add(new JLabel(text));
+ JLabel icon = new JLabel(STORE.getUIIcon(getIconName()).getIcon());
+ component.add(icon);
+ icon.setBackground(Color.WHITE);
+ icon.setOpaque(true);
+ return component;
+ }
+
+ public void fillXML(final XMLElement child) {
+ child.setAttribute(IconContainedCondition.ICON, iconName);
+ }
+
+ @Override
+ protected String createDescription() {
+ return TextUtils.getText("filter_icon") + " \"" + getIconName() + "\"";
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconController.java b/freeplane/src/org/freeplane/features/icon/IconController.java
new file mode 100644
index 0000000..0acce2e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconController.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 Dimitry Polivaev in 2008.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received 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/IconExistsCondition.java b/freeplane/src/org/freeplane/features/icon/IconExistsCondition.java
new file mode 100644
index 0000000..49afed1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconExistsCondition.java
@@ -0,0 +1,53 @@
+/*
+ * 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 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 IconExistsCondition extends ASelectableCondition {
+ static final String NAME = "icon_exists_condition";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new IconExistsCondition();
+ }
+
+ public IconExistsCondition() {
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ return IconController.getController().getIcons(node).size() > 0;
+ }
+
+
+ @Override
+ protected String createDescription() {
+ return ConditionFactory.createDescription(TextUtils.getText("filter_icon"), TextUtils.getText(ConditionFactory.FILTER_EXIST),
+ null, false, false);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconGroup.java b/freeplane/src/org/freeplane/features/icon/IconGroup.java
new file mode 100644
index 0000000..76420ac
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconGroup.java
@@ -0,0 +1,133 @@
+/*
+ * 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.Collections;
+import java.util.List;
+
+import org.freeplane.core.util.TextUtils;
+
+/**
+ *
+ * Stores all kinds of icons used in Freeplane.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class IconGroup {
+ private String name;
+ private List<MindIcon> icons;
+ private UIIcon groupIcon;
+ private String description;
+
+ public IconGroup(final String name, final UIIcon groupIcon) {
+ this.name = name;
+ this.groupIcon = groupIcon;
+ }
+
+ public IconGroup(final String name, final UIIcon groupIcon, final String description) {
+ this.name = name;
+ this.groupIcon = groupIcon;
+ this.description = description;
+ }
+
+ public IconGroup(final String name, final UIIcon groupIcon, final String description, final List<MindIcon> icons) {
+ this.name = name;
+ this.groupIcon = groupIcon;
+ this.description = description;
+ this.icons = new ArrayList<MindIcon>(icons);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public List<MindIcon> getIcons() {
+ return Collections.unmodifiableList(icons);
+ }
+
+ public void setIcons(final List<MindIcon> icons) {
+ this.icons = new ArrayList<MindIcon>(icons);
+ }
+
+ public UIIcon getGroupIcon() {
+ return groupIcon;
+ }
+
+ public void setGroupIcon(final UIIcon groupIcon) {
+ this.groupIcon = groupIcon;
+ }
+
+ public String getDescription() {
+ if (description == null) {
+ description = TextUtils.getText("IconGroupPopupAction." + name.toLowerCase() + ".text");
+ }
+ return description;
+ }
+
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ public void addIcon(final MindIcon icon) {
+ icons.add(icon);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final IconGroup other = (IconGroup) obj;
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ }
+ else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("icon group [%s]", name);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconNotFound.java b/freeplane/src/org/freeplane/features/icon/IconNotFound.java
new file mode 100644
index 0000000..a04c731
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconNotFound.java
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..0a86362
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/IconRegistry.java
@@ -0,0 +1,76 @@
+/*
+ * 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
new file mode 100644
index 0000000..e99f479
--- /dev/null
+++ b/freeplane/src/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 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/MindIcon.java b/freeplane/src/org/freeplane/features/icon/MindIcon.java
new file mode 100644
index 0000000..9d94213
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/MindIcon.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+/**
+ * MindIcon class is used in the nodes of MindMaps.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class MindIcon extends UIIcon {
+ private static final String DEFAULT_IMAGE_PATH = "/images/icons";
+ private static final String SHORTCUT_KEY = "IconAction.%s.shortcut";
+
+ public MindIcon(final String name) {
+ this(name, name + ".png", "");
+ }
+
+ public MindIcon(final String name, final String fileName) {
+ this(name, fileName, "");
+ }
+
+ public MindIcon(final String name, final String fileName, final String description) {
+ super(name, fileName, description, String.format(SHORTCUT_KEY, name));
+ }
+
+ @Override
+ public String getImagePath() {
+ return DEFAULT_IMAGE_PATH;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/PriorityCompareCondition.java b/freeplane/src/org/freeplane/features/icon/PriorityCompareCondition.java
new file mode 100644
index 0000000..9628fad
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/PriorityCompareCondition.java
@@ -0,0 +1,116 @@
+/*
+ * 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 java.util.Collection;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.CompareConditionAdapter;
+import org.freeplane.features.filter.condition.JCondition;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class PriorityCompareCondition extends CompareConditionAdapter {
+ static final String COMPARATION_RESULT = "COMPARATION_RESULT";
+ static final String NAME = "priority_compare_condition";
+ static final String SUCCEED = "SUCCEED";
+ static final String VALUE = "VALUE";
+ private static final IconStore STORE = IconStoreFactory.create();
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new PriorityCompareCondition(element.getAttribute(PriorityCompareCondition.VALUE, null), Integer
+ .parseInt(element.getAttribute(PriorityCompareCondition.COMPARATION_RESULT, null)), TreeXmlReader
+ .xmlToBoolean(element.getAttribute(PriorityCompareCondition.SUCCEED, null)));
+ }
+
+ final private int comparationResult;
+ final private boolean succeed;
+
+ PriorityCompareCondition(final String value, final int comparationResult, final boolean succeed) {
+ super(value, false, false);
+ this.comparationResult = comparationResult;
+ this.succeed = succeed;
+ }
+
+ public boolean isEqualityCondition()
+ {
+ return comparationResult == 0;
+ }
+
+ @Override
+ protected JComponent createRendererComponent() {
+ final JCondition renderer = new JCondition();
+ final String string = toString();
+ final JLabel label = new JLabel(string.substring(0, string.length() - 3));
+ label.setIcon(STORE.getMindIcon(getIconName()).getIcon());
+ label.setHorizontalTextPosition(SwingConstants.LEFT);
+ renderer.add(label);
+ return renderer;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Collection<MindIcon> icons = IconController.getController().getIcons(node);
+ for (final MindIcon icon : icons) {
+ final String iconName = icon.getFileName();
+ if (iconName.length() != 10) {
+ continue;
+ }
+ if (!iconName.startsWith("full-")) {
+ continue;
+ }
+ if (iconName.charAt(5) < '0' || iconName.charAt(5) > '9') {
+ continue;
+ }
+ final String prio = iconName.substring(5, 6);
+ compareTo(prio);
+ return isComparisonOK() && succeed == (getComparisonResult() == comparationResult);
+ }
+ return false;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String priorityCondition = TextUtils.getText(PriorityConditionController.FILTER_PRIORITY);
+ return super.createDescription(priorityCondition, comparationResult, succeed);
+ }
+
+ private String getIconName() {
+ return "full-" + getConditionValue().toString();
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(PriorityCompareCondition.COMPARATION_RESULT, Integer.toString(comparationResult));
+ child.setAttribute(PriorityCompareCondition.SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/PriorityConditionController.java b/freeplane/src/org/freeplane/features/icon/PriorityConditionController.java
new file mode 100644
index 0000000..45683b0
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..b08cf6d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/UIIcon.java
@@ -0,0 +1,191 @@
+/*
+ * 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
new file mode 100644
index 0000000..e5fb64b
--- /dev/null
+++ b/freeplane/src/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<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
new file mode 100644
index 0000000..f537725
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/UserIcon.java
@@ -0,0 +1,65 @@
+/*
+ * 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
new file mode 100644
index 0000000..5845b5c
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..97c8380
--- /dev/null
+++ b/freeplane/src/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) : 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/ImageIconFactory.java b/freeplane/src/org/freeplane/features/icon/factory/ImageIconFactory.java
new file mode 100644
index 0000000..8dbe24e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/factory/ImageIconFactory.java
@@ -0,0 +1,65 @@
+/*
+ * 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.net.URL;
+import java.util.WeakHashMap;
+
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.icon.UIIcon;
+
+/**
+ *
+ * Factory for swing icons used in the GUI.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public final class ImageIconFactory {
+ private static final ImageIconFactory FACTORY = new ImageIconFactory();
+ private static final String DEFAULT_IMAGE_PATH = "/images/";
+ private static final ImageIcon ICON_NOT_FOUND = new ImageIcon(ResourceController.getResourceController()
+ .getResource(DEFAULT_IMAGE_PATH + "IconNotFound.png"));
+ private final WeakHashMap<URL, ImageIcon> ICON_CACHE = new WeakHashMap<URL, ImageIcon>();
+
+ public static ImageIconFactory getInstance() {
+ return FACTORY;
+ }
+
+ public ImageIcon getImageIcon(final UIIcon uiIcon) {
+ return getImageIcon(uiIcon.getUrl());
+ }
+
+ public ImageIcon getImageIcon(final URL url) {
+ ImageIcon result = ICON_NOT_FOUND;
+ if (url != null) {
+ if (ICON_CACHE.containsKey(url)) {
+ result = ICON_CACHE.get(url);
+ }
+ else {
+ result = new ImageIcon(url);
+ ICON_CACHE.put(url, result);
+ }
+ }
+ return result;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java b/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java
new file mode 100644
index 0000000..b62d5a6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java
@@ -0,0 +1,46 @@
+/*
+ * 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
new file mode 100644
index 0000000..b900cc7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/mindmapmode/IconAction.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.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
new file mode 100644
index 0000000..b524312
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java
@@ -0,0 +1,86 @@
+/*
+ * 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 MapModel map = Controller.getCurrentController().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.getCurrentController().getViewController();
+ final IconSelectionPopupDialog selectionDialog = new IconSelectionPopupDialog(viewController.getJFrame(),
+ actions);
+ final NodeModel selected = Controller.getCurrentController().getSelection().getSelected();
+ viewController.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
new file mode 100644
index 0000000..a6a3e12
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/icon/mindmapmode/MIconController.java
@@ -0,0 +1,410 @@
+/*
+ * 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.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) {
+ menu.add(myAction);
+ 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
new file mode 100644
index 0000000..a1a1122
--- /dev/null
+++ b/freeplane/src/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, 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
new file mode 100644
index 0000000..62d2730
--- /dev/null
+++ b/freeplane/src/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, 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/ArrowType.java b/freeplane/src/org/freeplane/features/link/ArrowType.java
new file mode 100644
index 0000000..c0e7cb2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ArrowType.java
@@ -0,0 +1,5 @@
+package org.freeplane.features.link;
+
+public enum ArrowType {
+ DEFAULT, NONE;
+}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorExistsCondition.java b/freeplane/src/org/freeplane/features/link/ConnectorExistsCondition.java
new file mode 100644
index 0000000..c90feeb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ConnectorExistsCondition.java
@@ -0,0 +1,57 @@
+/*
+ * 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 org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class ConnectorExistsCondition extends ConnectorLabelCondition {
+ public static final String NAME = "connector_exists";
+
+ public ConnectorExistsCondition() {
+ super(null, true, false);
+ }
+
+ @Override
+ protected boolean checkLink(final ConnectorModel connector) {
+ return true;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.CONNECTOR);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_EXIST);
+ return ConditionFactory.createDescription(condition, simpleCondition, getText(), matchCase(), matchApproximately());
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ @Override
+ protected void fillXML(XMLElement element) {
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java b/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java
new file mode 100644
index 0000000..70784dc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java
@@ -0,0 +1,116 @@
+/*
+ * 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/ConnectorLabelContainsCondition.java b/freeplane/src/org/freeplane/features/link/ConnectorLabelContainsCondition.java
new file mode 100644
index 0000000..c9fdba5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ConnectorLabelContainsCondition.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class ConnectorLabelContainsCondition extends ConnectorLabelCondition {
+ public static final String NAME = "connector_label_contains";
+
+
+ public ConnectorLabelContainsCondition(final String text, final boolean matchCase,
+ final boolean matchApproximately) {
+ super(text, matchCase, matchApproximately);
+ }
+
+ @Override
+ protected boolean checkLink(final ConnectorModel connector) {
+ final String middleLabel = connector.getMiddleLabel();
+ if (contains(middleLabel)) {
+ return true;
+ }
+ final String sourceLabel = connector.getSourceLabel();
+ if (contains(sourceLabel)) {
+ return true;
+ }
+ final String targetLabel = connector.getTargetLabel();
+ if (contains(targetLabel)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean contains(final String middleLabel) {
+ if (middleLabel == null) {
+ return false;
+ }
+ return getStringMatchingStrategy().matches(getText(), middleLabel, true, matchCase());
+
+// if (matchCase()) {
+// return middleLabel.contains(getText());
+// }
+// return middleLabel.toLowerCase().contains(getText());
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.CONNECTOR_LABEL);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(condition, simpleCondition, getText(), matchCase(), matchApproximately());
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorLabelEqualsCondition.java b/freeplane/src/org/freeplane/features/link/ConnectorLabelEqualsCondition.java
new file mode 100644
index 0000000..4678dd0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ConnectorLabelEqualsCondition.java
@@ -0,0 +1,77 @@
+/*
+ * 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 org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class ConnectorLabelEqualsCondition extends ConnectorLabelCondition {
+ public static final String NAME = "connector_label_equals";
+
+ public ConnectorLabelEqualsCondition(final String text, final boolean matchCase,
+ final boolean matchApproximately) {
+ super(text, matchCase, matchApproximately);
+ }
+
+ @Override
+ protected boolean checkLink(final ConnectorModel connector) {
+ final String middleLabel = connector.getMiddleLabel();
+ if (equals(middleLabel)) {
+ return true;
+ }
+ final String sourceLabel = connector.getSourceLabel();
+ if (equals(sourceLabel)) {
+ return true;
+ }
+ final String targetLabel = connector.getTargetLabel();
+ if (equals(targetLabel)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean equals(final String middleLabel) {
+ if (middleLabel == null) {
+ return false;
+ }
+ return getStringMatchingStrategy().matches(getText(), middleLabel, false, matchCase());
+
+// if (matchCase()) {
+// return middleLabel.equals(getText());
+// }
+// return middleLabel.toLowerCase().equals(getText());
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.CONNECTOR_LABEL);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_IS_EQUAL_TO);
+ return ConditionFactory.createDescription(condition, simpleCondition, getText(), matchCase(), matchApproximately());
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorModel.java b/freeplane/src/org/freeplane/features/link/ConnectorModel.java
new file mode 100644
index 0000000..dd56690
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/ConnectorModel.java
@@ -0,0 +1,223 @@
+/*
+ * 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/EvaluationDependencies.java b/freeplane/src/org/freeplane/features/link/EvaluationDependencies.java
new file mode 100644
index 0000000..0f801f1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/EvaluationDependencies.java
@@ -0,0 +1,87 @@
+package org.freeplane.features.link;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+
+class EvaluationDependencies implements IExtension{
+ 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 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]);
+ }
+ return dependencies;
+ }
+
+ public static void accessNode(NodeModel accessingNode, NodeModel accessedNode) {
+ getEvaluationDependencies(accessingNode.getMap()).accessNodeImpl(accessingNode, accessedNode);
+ }
+
+ private HashMap<NodeModel, HashSet<NodeModel>> onNodeDependencies = new HashMap<NodeModel, HashSet<NodeModel>>();
+
+ public Set<NodeModel> getDependencies(Set<NodeModel> result, final NodeModel node) {
+ final HashSet<NodeModel> onNode = onNodeDependencies.get(node);
+ if (onNode != null)
+ addRecursively(result, onNode);
+ return result;
+ }
+
+ private void addRecursively(Set<NodeModel> dependentNodes, final HashSet<NodeModel> nodesToAdd) {
+ for (NodeModel node : nodesToAdd) {
+ // avoid loops
+ if (dependentNodes.add(node))
+ dependentNodes.addAll(getDependencies(dependentNodes, node));
+ }
+ }
+
+ /** accessedNode was accessed when formulaNode was evaluated. */
+ private void accessNodeImpl(NodeModel formulaNode, NodeModel accessedNode) {
+ // FIXME: check if accessedNode is already covered by other accessModes
+ getDependencySet(accessedNode, onNodeDependencies).add(formulaNode);
+// System.out.println(formulaNode + " accesses " + accessedNode + ". current dependencies:\n" + this);
+ }
+
+ private HashSet<NodeModel> getDependencySet(final NodeModel accessedNode,
+ final HashMap<NodeModel, HashSet<NodeModel>> dependenciesMap) {
+ HashSet<NodeModel> set = dependenciesMap.get(accessedNode);
+ if (set == null) {
+ set = new HashSet<NodeModel>();
+ dependenciesMap.put(accessedNode, set);
+ }
+ return set;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for (Entry<NodeModel, HashSet<NodeModel>> entry : onNodeDependencies.entrySet()) {
+ builder.append("onNode (" + entry.getKey().getText() + "):\n");
+ for (NodeModel nodeModel : entry.getValue()) {
+ builder.append(" " + nodeModel + "\n");
+ }
+ }
+ return builder.toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/FollowLinkAction.java b/freeplane/src/org/freeplane/features/link/FollowLinkAction.java
new file mode 100644
index 0000000..32c775d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/FollowLinkAction.java
@@ -0,0 +1,88 @@
+/*
+ * 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.JMenuItem;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class FollowLinkAction extends AFreeplaneAction implements PopupMenuListener {
+ 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);
+ }
+ }
+
+ private boolean isLinkEnabled() {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ for (final NodeModel selNode : mapController.getSelectedNodes()) {
+ if (NodeLinks.getValidLink(selNode) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.event.PopupMenuListener#popupMenuCanceled(javax.swing
+ * .event.PopupMenuEvent)
+ */
+ public void popupMenuCanceled(final PopupMenuEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeInvisible(
+ * javax.swing.event.PopupMenuEvent)
+ */
+ public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax
+ * .swing.event.PopupMenuEvent)
+ */
+ public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
+ final JMenuItem item = (JMenuItem) e.getSource();
+ item.setEnabled(isLinkEnabled());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java b/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java
new file mode 100644
index 0000000..802778d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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/HyperLinkCondition.java b/freeplane/src/org/freeplane/features/link/HyperLinkCondition.java
new file mode 100644
index 0000000..e1d20ab
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/HyperLinkCondition.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.link;
+
+import java.net.URI;
+
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+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 HyperLinkCondition extends ASelectableCondition {
+ static final String TEXT = "TEXT";
+ final private String hyperlink;
+ public HyperLinkCondition(final String hyperlink) {
+ super();
+ this.hyperlink = hyperlink;
+ }
+
+ abstract protected boolean checkLink(final URI nodeLink);
+
+ public boolean checkNode(final NodeModel node) {
+ final URI nodeLink = NodeLinks.getValidLink(node);
+ if (nodeLink != null && checkLink(nodeLink))
+ return true;
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ if(attributes == null){
+ return false;
+ }
+ final int rowCount = attributes.getRowCount();
+ for(int i = 0; i < rowCount; i++){
+ final Attribute attribute = attributes.getAttribute(i);
+ final Object value = attribute.getValue();
+ if (value instanceof URI && checkLink((URI)value))
+ return true;
+ }
+ return false;
+ }
+
+ public String getHyperlink() {
+ return hyperlink;
+ }
+
+ protected void fillXML(XMLElement element){
+ element.setAttribute(TEXT, hyperlink);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.java b/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.java
new file mode 100644
index 0000000..d13fa39
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.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.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
new file mode 100644
index 0000000..6c9201b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/HyperLinkEqualsCondition.java
@@ -0,0 +1,76 @@
+/*
+ * 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/HyperLinkExistsCondition.java b/freeplane/src/org/freeplane/features/link/HyperLinkExistsCondition.java
new file mode 100644
index 0000000..63dc6f8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/HyperLinkExistsCondition.java
@@ -0,0 +1,61 @@
+/*
+ * 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.condition.ConditionFactory;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class HyperLinkExistsCondition extends HyperLinkCondition {
+ public static final String NAME = "hyper_link_exists";
+
+ public HyperLinkExistsCondition() {
+ super(null);
+ }
+
+ @Override
+ protected boolean checkLink(final URI nodeLink) {
+ return true;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.FILTER_LINK);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_EXIST);
+ return ConditionFactory.createDescription(condition, simpleCondition, getHyperlink(), false, false);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ @Override
+ protected void fillXML(XMLElement element) {
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.java b/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.java
new file mode 100644
index 0000000..9203889
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.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.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
new file mode 100644
index 0000000..96b1d22
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/LinkBuilder.java
@@ -0,0 +1,349 @@
+/*
+ * 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.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.n3.nanoxml.XMLElement;
+
+class LinkBuilder implements IElementDOMHandler, IReadCompletionListener, IExtensionElementWriter,
+ IExtensionAttributeWriter {
+ 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()));
+ }
+ });
+ 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()));
+ }
+ });
+ 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());
+ }
+ }
+
+
+ /**
+ */
+ 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
new file mode 100644
index 0000000..3cb5291
--- /dev/null
+++ b/freeplane/src/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.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("");
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/LinkController.java b/freeplane/src/org/freeplane/features/link/LinkController.java
new file mode 100644
index 0000000..f1dd625
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/LinkController.java
@@ -0,0 +1,721 @@
+/*
+ * 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 (LinkController) 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);
+ 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);
+ }
+
+ 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;
+ 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);
+ }
+
+ 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 addAction(final JComponent arrowLinkPopup, Action action) {
+ JButton comp = new JButton(action);
+ comp.setHorizontalAlignment(JButton.LEFT);
+ comp.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ SwingUtilities.getWindowAncestor(arrowLinkPopup).setVisible(false);
+ }
+ });
+ addPopupComponent (arrowLinkPopup, null, 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 = (MapLinks) 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) {
+ final URI link = NodeLinks.getValidLink(selectedNode);
+ 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();
+ action.actionPerformed(e);
+ }
+ else {
+ loadURI(link);
+ }
+ onSelect(modeController.getController().getSelection().getSelected());
+ }
+ }
+
+ 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
new file mode 100644
index 0000000..8de2a6e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/LinkModel.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000..2446d8c
--- /dev/null
+++ b/freeplane/src/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.ViewController;
+
+/**
+ * @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 = ViewController.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
new file mode 100644
index 0000000..6f25086
--- /dev/null
+++ b/freeplane/src/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<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
new file mode 100644
index 0000000..8895840
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/NodeLinkModel.java
@@ -0,0 +1,43 @@
+/*
+ * 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());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/NodeLinks.java b/freeplane/src/org/freeplane/features/link/NodeLinks.java
new file mode 100644
index 0000000..eae5f44
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/NodeLinks.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.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 {
+ /**
+ * @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;
+
+ 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
new file mode 100644
index 0000000..e33c55f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/NodeUpdateChangeListener.java
@@ -0,0 +1,66 @@
+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/AddConnectorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/AddConnectorAction.java
new file mode 100644
index 0000000..4d7e099
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/AddConnectorAction.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.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+class AddConnectorAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public AddConnectorAction() {
+ super("AddConnectorAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final List<NodeModel> selecteds = selection.getOrderedSelection();
+ final int size = selecteds.size();
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ final NodeModel target = selecteds.get(size-1);
+ if (selecteds.size() < 2) {
+ linkController.addConnector(target, target);
+ return;
+ }
+ for (NodeModel node : selecteds) {
+ if(node != target)
+ linkController.addConnector(node, target);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java
new file mode 100644
index 0000000..91c8b62
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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.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.link.LinkController;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+class AddLocalLinkAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public AddLocalLinkAction() {
+ super("AddLocalLinkAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final List<NodeModel> selecteds = selection.getOrderedSelection();
+ final int size = selecteds.size();
+ if (size < 2) {
+ Controller.getCurrentController();
+ UITools.errorMessage(TextUtils.getText("less_than_two_selected_nodes"));
+ return;
+ }
+ final NodeModel target = selecteds.get(size-1);
+ final String targetId = (target).createID();
+ for (NodeModel source : selecteds) {
+ if(source != target)
+ ((MLinkController) LinkController.getController()).setLink(source, ("#" + targetId), false);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java
new file mode 100644
index 0000000..2d9b7b1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java
@@ -0,0 +1,46 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.MenuUtils.MenuEntry;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class AddMenuItemLinkAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public AddMenuItemLinkAction() {
+ super(AddMenuItemLinkAction.class.getSimpleName());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel selectedNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final SelectMenuItemDialog dialog = new SelectMenuItemDialog(selectedNode);
+ final MenuEntry menuItem = dialog.getMenuItem();
+ if (menuItem != null) {
+ ((MLinkController) LinkController.getController()).setLink(selectedNode,
+ LinkController.createMenuItemLink(menuItem.getKey()), false);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java
new file mode 100644
index 0000000..ba80898
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java
@@ -0,0 +1,54 @@
+/*
+ * 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.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.link.ArrowType;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+
+class ChangeConnectorArrowsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ ConnectorModel arrowLink;
+ ArrowType endArrow;
+ ArrowType startArrow;
+
+ public ChangeConnectorArrowsAction(final MLinkController linkController, final String key,
+ final ConnectorModel arrowLink, final ArrowType startArrow,
+ final ArrowType endArrow) {
+ super("ChangeConnectorArrowsAction." + key);
+ this.arrowLink = arrowLink;
+ this.startArrow = startArrow;
+ this.endArrow = endArrow;
+ final boolean selected = arrowLink.getStartArrow().equals(startArrow)
+ && arrowLink.getEndArrow().equals(endArrow);
+ setSelected(selected);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ linkController.changeArrowsOfArrowLink(arrowLink, startArrow, endArrow);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java
new file mode 100644
index 0000000..961dfa9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.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.features.link.mindmapmode;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+import java.awt.event.ActionEvent;
+import java.util.Arrays;
+
+import javax.swing.Icon;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+
+class ChangeConnectorDashAction extends AFreeplaneAction {
+ private static final int ICON_HEIGHT = 6;
+ private static final int ICON_WIDTH = 60;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ConnectorModel arrowLink;
+ private final int[] dash;
+
+ public ChangeConnectorDashAction(final MLinkController linkController,
+ final ConnectorModel arrowLink, final int[] dash) {
+ super("ChangeConnectorDashAction", "", createIcon(dash));
+ this.arrowLink = arrowLink;
+ this.dash = dash;
+ final int[] dash2 = arrowLink.getDash();
+ final boolean selected = dash2 == dash || dash != null && Arrays.equals(dash, dash2);
+ setSelected(selected);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ linkController.setConnectorDash(arrowLink, dash);
+ }
+
+ private static Icon createIcon(final int[] dash){
+ final BasicStroke stroke = UITools.createStroke(2, dash);
+ return new Icon() {
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setColor(Color.BLACK);
+ Stroke oldStroke = g2.getStroke();
+ g2.setStroke(stroke);
+ g2.drawLine(x, y+ICON_HEIGHT / 2, x+ICON_WIDTH, y+ICON_HEIGHT / 2);
+ g2.setStroke(oldStroke);
+ }
+
+ public int getIconWidth() {
+ return ICON_WIDTH;
+ }
+
+ public int getIconHeight() {
+ return ICON_HEIGHT;
+ }
+ };
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java
new file mode 100644
index 0000000..11b9038
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.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.features.link.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.ConnectorModel.Shape;
+
+class ChangeConnectorShapeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ ConnectorModel arrowLink;
+ final private Shape shape;
+
+ public ChangeConnectorShapeAction(final MLinkController linkController, final ConnectorModel arrowLink, final Shape shape) {
+ super("ChangeConnectorShapeAction." + shape.toString());
+ this.arrowLink = arrowLink;
+ this.shape = shape;
+ final boolean selected = shape.equals(arrowLink.getShape());
+ setSelected(selected);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ linkController.setShape(arrowLink, shape);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java
new file mode 100644
index 0000000..37065dd
--- /dev/null
+++ b/freeplane/src/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
+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/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java
new file mode 100644
index 0000000..b8f69ea
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java
@@ -0,0 +1,55 @@
+/*
+ * 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.Color;
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.mode.Controller;
+
+class ConnectorColorAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ ConnectorModel arrowLink;
+
+ public ConnectorColorAction(final MLinkController linkController, final ConnectorModel arrowLink) {
+ super("ConnectorColorAction");
+ this.arrowLink = arrowLink;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ final Color selectedColor = linkController.getColor(arrowLink);
+ final Color color = ColorTracker.showCommonJColorChooserDialog(controller.getSelection()
+ .getSelected(), (String) this.getValue(Action.NAME), selectedColor, linkController.getStandardConnectorColor());
+ if(color != null){
+ linkController.setConnectorColor(arrowLink, color);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java
new file mode 100644
index 0000000..6c6ade2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java
@@ -0,0 +1,53 @@
+/*
+ * 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.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 20, 2009
+ */
+public class ExtractLinkFromTextAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public ExtractLinkFromTextAction() {
+ super("ExtractLinkFromTextAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MLinkController controller = (MLinkController) LinkController.getController();
+ final String link = LinkController.findLink(node.getText());
+ if (link != null) {
+ controller.setLink(node, link, false);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java b/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java
new file mode 100644
index 0000000..f994624
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java
@@ -0,0 +1,1143 @@
+/*
+ * 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.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.link.ConnectorModel.Shape;
+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 = (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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(source);
+ }
+
+ public String getDescription() {
+ return "addLink";
+ }
+
+ public void undo() {
+ final NodeLinks nodeLinks = (NodeLinks) source.getExtension(NodeLinks.class);
+ nodeLinks.removeArrowlink(arrowLink);
+ Controller.getCurrentModeController().getMapController().nodeChanged(source);
+ }
+ }
+
+ 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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+
+ public String getDescription() {
+ return "setTargetLabel";
+ }
+
+ public void undo() {
+ model.setTargetLabel(oldLabel);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+ }
+
+ 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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+
+ public String getDescription() {
+ return "setSourceLabel";
+ }
+
+ public void undo() {
+ model.setSourceLabel(oldLabel);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+ }
+
+ 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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+
+ public String getDescription() {
+ return "setMiddleLabel";
+ }
+
+ public void undo() {
+ model.setMiddleLabel(oldLabel);
+ Controller.getCurrentModeController().getMapController().nodeChanged(model.getSource());
+ }
+ }
+
+ /**
+ * @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 = (MapLinks) 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 ModeController modeController;
+
+ public MLinkController() {
+ super();
+ modeController = Controller.getCurrentModeController();
+ createActions();
+ anchorID = null;
+ 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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(link.getSource());
+ }
+
+ public String getDescription() {
+ return "changeArrowsOfArrowLink";
+ }
+
+ public void undo() {
+ link.setStartArrow(oldStartArrow);
+ link.setEndArrow(oldEndArrow);
+ Controller.getCurrentModeController().getMapController().nodeChanged(link.getSource());
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ 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()); // new by Nnamdi Kohn
+ modeController.addAction(new MakeLinkToAnchorAction()); // new by Nnamdi Kohn
+ modeController.addAction(new MakeLinkFromAnchorAction()); // new by Nnamdi Kohn
+ modeController.addAction(new ClearLinkAnchorAction()); // new by Nnamdi Kohn
+ }
+
+ @Override
+ protected void createArrowLinkPopup(final ConnectorModel link, final JComponent arrowLinkPopup) {
+ super.createArrowLinkPopup(link, arrowLinkPopup);
+ addAction(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());
+ if(twoNodesConnector){
+ AFreeplaneAction[] 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)
+ };
+ 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) {
+ if(arrowLinkPopup.isVisible())
+ arrowLinkPopup.setVisible(false);
+ 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;
+ if(twoNodesConnector){
+ sourceLabelEditor = new JTextArea(link.getSourceLabel());
+ addTextEditor(arrowLinkPopup, "edit_source_label", sourceLabelEditor);
+ }
+ else
+ sourceLabelEditor = null;
+
+ final JTextArea middleLabelEditor = new JTextArea(link.getMiddleLabel());
+ addTextEditor(arrowLinkPopup, twoNodesConnector ? "edit_middle_label" : "edit_end_label", middleLabelEditor);
+
+ final JTextArea targetLabelEditor ;
+ if(twoNodesConnector){
+ targetLabelEditor = new JTextArea(link.getTargetLabel());
+ }
+ else{
+ targetLabelEditor = new JTextArea(link.getSourceLabel());
+ }
+ 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;
+ if(twoNodesConnector){
+ setSourceLabel(link, sourceLabelEditor.getText());
+ setTargetLabel(link, targetLabelEditor.getText());
+ }
+ else{
+ setSourceLabel(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() {
+ 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));
+ SwingUtilities.getWindowAncestor(box).setVisible(false);
+ }
+ });
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorColor";
+ }
+
+ public void undo() {
+ arrowLink.setColor(oldColor);
+ final NodeModel node = arrowLink.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorDash";
+ }
+
+ public void undo() {
+ arrowLink.setDash(oldDash);
+ final NodeModel node = arrowLink.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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);
+ Controller.getCurrentModeController().getMapController().nodeChanged(link.getSource());
+ }
+
+ public String getDescription() {
+ return "setArrowLinkEndPoints";
+ }
+
+ public void undo() {
+ link.setStartInclination(oldStartPoint);
+ link.setEndInclination(oldEndPoint);
+ Controller.getCurrentModeController().getMapController().nodeChanged(link.getSource());
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
+ }
+
+ public void setLink(final NodeModel node, final String link, final boolean makeRelative) {
+ if (link != null && !"".equals(link)) {
+ try {
+ final URI uri = new URI(link);
+ setLink(node, uri, makeRelative);
+ }
+ catch (final URISyntaxException e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+ setLink(node, (URI) null, false);
+ }
+
+ private URI relativeLink(final URI argUri, final NodeModel node, final boolean makeRelative) {
+ if (makeRelative && "file".equals(argUri.getScheme())) {
+ try {
+ final File mapFile = node.getMap().getFile();
+ return LinkController.toRelativeURI(mapFile, new File(argUri));
+ }
+ catch (Exception e) {
+ }
+ }
+ return argUri;
+ }
+
+ public void setLink(final NodeModel node, final URI argUri, final boolean makeRelative) {
+ final URI uri = relativeLink(argUri, node, makeRelative);
+ 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));
+ }
+ links.setHyperLink(uri);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setLink";
+ }
+
+ public void undo() {
+ final NodeLinks links = NodeLinks.getLinkExtension(node);
+ links.setLocalHyperlink(node, oldTargetID);
+ links.setHyperLink(oldlink);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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 NodeLinkModel arrowLink) {
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeModel source = arrowLink.getSource();
+ final NodeLinks nodeLinks = (NodeLinks) source.getExtension(NodeLinks.class);
+ nodeLinks.removeArrowlink(arrowLink);
+ Controller.getCurrentModeController().getMapController().nodeChanged(source);
+ }
+
+ public String getDescription() {
+ return "removeArrowLink";
+ }
+
+ public void undo() {
+ final NodeModel source = arrowLink.getSource();
+ NodeLinks nodeLinks = (NodeLinks) source.getExtension(NodeLinks.class);
+ if (nodeLinks == null) {
+ nodeLinks = new NodeLinks();
+ source.addExtension(nodeLinks);
+ }
+ nodeLinks.addArrowlink(arrowLink);
+ Controller.getCurrentModeController().getMapController().nodeChanged(source);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorShape";
+ }
+
+ public void undo() {
+ connector.setShape(oldShape);
+ final NodeModel node = connector.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setWidth(oldWidth);
+ final NodeModel node = connector.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setLabelFontSize(oldWidth);
+ final NodeModel node = connector.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setLabelFontFamily(oldFamily);
+ final NodeModel node = connector.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ 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();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setConnectorAlpha";
+ }
+
+ public void undo() {
+ connector.setAlpha(oldAlpha);
+ final NodeModel node = connector.getSource();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void loadURI(URI uri) {
+ UrlManager.getController().loadURL(uri);
+ }
+
+ @Override
+ protected void loadURL(final NodeModel node, final ActionEvent e) {
+ ModeController modeController = Controller.getCurrentModeController();
+ // 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;
+ }
+
+ public String getAnchorIDforNode(final NodeModel node) {
+ String targetID = getAnchorID();
+ final String link;
+ // check if anchorID is valid, then set link in current node
+ if (targetID != null && ! 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 ModeController modeController = Controller.getCurrentModeController();
+ 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());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java
new file mode 100644
index 0000000..f12cdfd
--- /dev/null
+++ b/freeplane/src/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
+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("#")), false);
+
+ } 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, false);
+ }
+ 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
new file mode 100644
index 0000000..418a095
--- /dev/null
+++ b/freeplane/src/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
+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, false);
+ }
+
+ @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/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.java
new file mode 100644
index 0000000..ea18843
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.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.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinkModel;
+
+class RemoveConnectorAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private NodeLinkModel mArrowLink;
+
+ /**
+ * can be null can be null.
+ */
+ public RemoveConnectorAction(final MLinkController linkController, final NodeLinkModel arrowLink) {
+ super("RemoveConnectorAction");
+ setArrowLink(arrowLink);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ linkController.removeArrowLink(mArrowLink);
+ }
+
+ /**
+ * @return Returns the arrowLink.
+ */
+ public NodeLinkModel getArrowLink() {
+ return mArrowLink;
+ }
+
+ /**
+ * The arrowLink to set.
+ */
+ public void setArrowLink(final NodeLinkModel arrowLink) {
+ mArrowLink = arrowLink;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
new file mode 100644
index 0000000..3aa60cc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
@@ -0,0 +1,183 @@
+/*
+ * 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().getViewController().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/SetLinkAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java
new file mode 100644
index 0000000..778b105
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java
@@ -0,0 +1,76 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction
+public class SetLinkAnchorAction extends AFreeplaneAction {
+ public SetLinkAnchorAction() {
+ super("SetLinkAnchorAction");
+ }
+
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+
+ /**
+ * @TODO
+ *
+ * -# implement GUID as reliable nodeID
+ * -# correct tickmark handling in menu (BUG)
+ * -# set tooltip for mouse-over SetLinkAnchorAction in menu
+ *
+ */
+
+ // get reference to selected node
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel node = controller.getSelection().getSelected();
+
+ // get file path of selected node
+ File mindmapFile = node.getMap().getFile();
+ if(mindmapFile == null) {
+ UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
+ return;
+ }
+
+ // set idString variable according to file and node info
+ final String idString = mindmapFile.toURI().toString() + '#' + node.createID();
+
+ // save idString in LinkController
+ ((MLinkController)(LinkController.getController())).setAnchorID( idString );
+ }
+
+ @Override
+ public void setSelected() {
+ final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
+ setSelected( isAnchored );
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java
new file mode 100644
index 0000000..6ea32ca
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java
@@ -0,0 +1,53 @@
+/*
+ * 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.event.ActionEvent;
+import java.net.URI;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+class SetLinkByFileChooserAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SetLinkByFileChooserAction() {
+ super("SetLinkByFileChooserAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ setLinkByFileChooser();
+ }
+
+ public void setLinkByFileChooser() {
+ final URI relative = ((MFileManager) UrlManager.getController())
+ .getLinkByFileChooser(Controller.getCurrentController().getMap());
+ if (relative != null) {
+ ((MLinkController) LinkController.getController()).setLink(Controller.getCurrentModeController()
+ .getMapController().getSelectedNode(), relative, false);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java
new file mode 100644
index 0000000..1cafe7e
--- /dev/null
+++ b/freeplane/src/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.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, false);
+ return;
+ }
+ try {
+ final URI link = LinkController.createURI(inputValue.trim());
+ linkController.setLink(selectedNode, link, false);
+ }
+ 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
new file mode 100644
index 0000000..e524b62
--- /dev/null
+++ b/freeplane/src/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(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
new file mode 100644
index 0000000..88976bb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/AlwaysUnfoldedNode.java
@@ -0,0 +1,55 @@
+/*
+ * 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
new file mode 100644
index 0000000..3c13800
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..f97816e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/FirstGroupNode.java
@@ -0,0 +1,38 @@
+/*
+ * 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
new file mode 100644
index 0000000..5f91de9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/FoldingController.java
@@ -0,0 +1,330 @@
+/*
+ * 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.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();
+ modeController.getUserInputListenerFactory().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();
+ for (NodeModel child : modeController.childrenUnfolded(node)) {
+ foldAll(child);
+ }
+ setFolded(node, true);
+ }
+
+ /**
+ * 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 (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.hasChildren(node) && (mapController.isFolded(node) != state)) {
+ 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
new file mode 100644
index 0000000..d89df5a
--- /dev/null
+++ b/freeplane/src/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, -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/GotoNodeAction.java b/freeplane/src/org/freeplane/features/map/GotoNodeAction.java
new file mode 100644
index 0000000..2a077fe
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/GotoNodeAction.java
@@ -0,0 +1,59 @@
+/*
+ * 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 java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Jun 5, 2011
+ */
+public class GotoNodeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public GotoNodeAction() {
+ super("GotoNodeAction");
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final IMapSelection selection = controller.getSelection();
+ final NodeModel node = selection.getSelected();
+ final String id = UITools.showInputDialog(node, TextUtils.getText("enter_node_id"), (String)getValue(Action.NAME), JOptionPane.QUESTION_MESSAGE);
+ if(id == null || "".equals(id))
+ return;
+ final NodeModel nodeForID = controller.getMap().getNodeForID(id);
+ if(nodeForID == null)
+ return;
+ controller.getModeController().getMapController().displayNode(nodeForID);
+ selection.selectAsTheOnlyOneSelected(nodeForID);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/HideChildSubtree.java b/freeplane/src/org/freeplane/features/map/HideChildSubtree.java
new file mode 100644
index 0000000..d194005
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/HideChildSubtree.java
@@ -0,0 +1,31 @@
+/*
+ * 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 org.freeplane.core.extension.IExtension;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.04.2012
+ */
+public class HideChildSubtree implements IExtension {
+
+ final public static HideChildSubtree instance = new HideChildSubtree();
+}
diff --git a/freeplane/src/org/freeplane/features/map/HistoryInformationModel.java b/freeplane/src/org/freeplane/features/map/HistoryInformationModel.java
new file mode 100644
index 0000000..fcf46ed
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/HistoryInformationModel.java
@@ -0,0 +1,64 @@
+/*
+ * 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.Date;
+
+/**
+ * Here, the creation and modification times of objects (by now, only for nodes)
+ * are stored. The storage as longs is preferred as they are normally inlined by
+ * the Java compiler.
+ *
+ * @author foltin
+ */
+public class HistoryInformationModel {
+ long createdAt = 0l;
+ long lastModifiedAt = 0l;
+
+ /**
+ * Initializes to today.
+ */
+ public HistoryInformationModel() {
+ final long now = System.currentTimeMillis();
+ createdAt = now;
+ lastModifiedAt = now;
+ }
+
+ public HistoryInformationModel(final Date createdAt, final Date lastModifiedAt) {
+ this.createdAt = createdAt.getTime();
+ this.lastModifiedAt = lastModifiedAt.getTime();
+ }
+
+ public Date getCreatedAt() {
+ return new Date(createdAt);
+ }
+
+ public Date getLastModifiedAt() {
+ return new Date(lastModifiedAt);
+ }
+
+ public void setCreatedAt(final Date createdAt) {
+ this.createdAt = createdAt.getTime();
+ }
+
+ public void setLastModifiedAt(final Date lastModifiedAt) {
+ this.lastModifiedAt = lastModifiedAt.getTime();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/IEncrypter.java b/freeplane/src/org/freeplane/features/map/IEncrypter.java
new file mode 100644
index 0000000..5ab2675
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/IEncrypter.java
@@ -0,0 +1,30 @@
+/*
+ * 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
+ * 02.01.2009
+ */
+public interface IEncrypter {
+ public String decrypt(String str);
+
+ public String encrypt(final String str);
+}
diff --git a/freeplane/src/org/freeplane/features/map/IExtensionCopier.java b/freeplane/src/org/freeplane/features/map/IExtensionCopier.java
new file mode 100644
index 0000000..361e41f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/IExtensionCopier.java
@@ -0,0 +1,14 @@
+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
new file mode 100644
index 0000000..939b848
--- /dev/null
+++ b/freeplane/src/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(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/IMapLifeCycleListener.java b/freeplane/src/org/freeplane/features/map/IMapLifeCycleListener.java
new file mode 100644
index 0000000..d8c48e5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/IMapLifeCycleListener.java
@@ -0,0 +1,30 @@
+/*
+ * 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 IMapLifeCycleListener {
+ public void onCreate(MapModel map);
+
+ public void onRemove(MapModel map);
+}
diff --git a/freeplane/src/org/freeplane/features/map/IMapSelection.java b/freeplane/src/org/freeplane/features/map/IMapSelection.java
new file mode 100644
index 0000000..da81bac
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/IMapSelection.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.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/IMapSelectionListener.java b/freeplane/src/org/freeplane/features/map/IMapSelectionListener.java
new file mode 100644
index 0000000..08d17dc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/IMapSelectionListener.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.features.map;
+
+
+public interface IMapSelectionListener {
+ void afterMapChange(MapModel oldMap, MapModel newMap);
+
+ void beforeMapChange(MapModel oldMap, MapModel newMap);
+}
diff --git a/freeplane/src/org/freeplane/features/map/INodeChangeListener.java b/freeplane/src/org/freeplane/features/map/INodeChangeListener.java
new file mode 100644
index 0000000..c58f771
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/INodeChangeListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+public interface INodeChangeListener {
+ public void nodeChanged(NodeChangeEvent event);
+}
diff --git a/freeplane/src/org/freeplane/features/map/INodeSelectionListener.java b/freeplane/src/org/freeplane/features/map/INodeSelectionListener.java
new file mode 100644
index 0000000..5baf5c6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/INodeSelectionListener.java
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+
+/** */
+public interface INodeSelectionListener {
+ /**
+ * Is sent when a node is deselected.
+ */
+ void onDeselect(NodeModel node);
+
+ /**
+ * Is sent when a node is selected.
+ */
+ void onSelect(NodeModel node);
+}
diff --git a/freeplane/src/org/freeplane/features/map/INodeView.java b/freeplane/src/org/freeplane/features/map/INodeView.java
new file mode 100644
index 0000000..078a0f4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/INodeView.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.features.map;
+
+/**
+ * @author Dimitry Polivaev
+ * 10.01.2009
+ */
+public interface INodeView extends INodeChangeListener, IMapChangeListener {
+}
diff --git a/freeplane/src/org/freeplane/features/map/ITooltipProvider.java b/freeplane/src/org/freeplane/features/map/ITooltipProvider.java
new file mode 100644
index 0000000..5e07b6d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/ITooltipProvider.java
@@ -0,0 +1,32 @@
+/*
+ * 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.map;
+
+import java.awt.Component;
+
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.06.2009
+ */
+public interface ITooltipProvider {
+ String getTooltip(ModeController modeController, NodeModel node, Component view);
+}
diff --git a/freeplane/src/org/freeplane/features/map/LeafCondition.java b/freeplane/src/org/freeplane/features/map/LeafCondition.java
new file mode 100644
index 0000000..239bcf4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/LeafCondition.java
@@ -0,0 +1,26 @@
+package org.freeplane.features.map;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class LeafCondition extends ASelectableCondition {
+ public static final String NAME = "node_leaf_condition";
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public boolean checkNode(NodeModel node) {
+ return node.isLeaf();
+ }
+
+ public static ASelectableCondition load(XMLElement element) {
+ return new LeafCondition();
+ }
+
+ @Override
+ protected String createDescription() {
+ return TextUtils.getText(NodeLevelConditionController.FILTER_LEAF);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/MapChangeEvent.java b/freeplane/src/org/freeplane/features/map/MapChangeEvent.java
new file mode 100644
index 0000000..ff29ff5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapChangeEvent.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 MapChangeEvent extends AWTEvent {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private MapModel map;
+ final private Object newValue;
+ final private Object oldValue;
+ final private Object property;
+
+ public MapChangeEvent(final Object source, final MapModel map, final Object property, final Object oldValue,
+ final Object newValue) {
+ super(source, 0);
+ this.map = map;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ this.property = property;
+ }
+
+ public MapChangeEvent(final Object source, final Object property, final Object oldValue, final Object newValue) {
+ this(source, null, property, oldValue, newValue);
+ }
+
+ public MapModel getMap() {
+ return map;
+ }
+
+ public Object getNewValue() {
+ return newValue;
+ }
+
+ public Object getOldValue() {
+ return oldValue;
+ }
+
+ public Object getProperty() {
+ return property;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/MapController.java b/freeplane/src/org/freeplane/features/map/MapController.java
new file mode 100644
index 0000000..7694db8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapController.java
@@ -0,0 +1,949 @@
+/*
+ * 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.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 boolean force) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ 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 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
new file mode 100644
index 0000000..dfc2483
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapModel.java
@@ -0,0 +1,296 @@
+/*
+ * 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/MapNavigationUtils.java b/freeplane/src/org/freeplane/features/map/MapNavigationUtils.java
new file mode 100644
index 0000000..ba4ae9a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapNavigationUtils.java
@@ -0,0 +1,79 @@
+package org.freeplane.features.map;
+
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.mode.Controller;
+
+public class MapNavigationUtils {
+
+ public static NodeModel findNext(final Direction direction, NodeModel current, final NodeModel end) {
+ if (current.getChildCount() != 0) {
+ final NodeModel next = (NodeModel) current.getChildAt(0);
+ if (atEnd(next, end)) {
+ return null;
+ }
+ return next;
+ }
+ for (;;) {
+ final NodeModel parentNode = current.getParentNode();
+ if (parentNode == null) {
+ return current;
+ }
+ final int index = parentNode.getIndex(current) + 1;
+ final int childCount = parentNode.getChildCount();
+ if (index < childCount) {
+ if (direction == Direction.FORWARD_N_FOLD) {
+ Controller.getCurrentModeController().getMapController().setFolded(current, true);
+ }
+ final NodeModel next = (NodeModel) parentNode.getChildAt(index);
+ if (atEnd(next, end)) {
+ return null;
+ }
+ return next;
+ }
+ current = parentNode;
+ if (atEnd(current, end)) {
+ return null;
+ }
+ }
+ }
+
+ private static boolean atEnd(NodeModel current, final NodeModel end) {
+ return end != null && current.equals(end);
+ }
+
+ public static NodeModel findPrevious(final Direction direction, NodeModel current, final NodeModel end) {
+ for (;;) {
+ final NodeModel parentNode = current.getParentNode();
+ if (parentNode == null) {
+ break;
+ }
+ if (direction == Direction.BACK_N_FOLD) {
+ Controller.getCurrentModeController().getMapController().setFolded(current, true);
+ }
+ final int index = parentNode.getIndex(current) - 1;
+ if (index < 0) {
+ if (direction == Direction.BACK_N_FOLD) {
+ Controller.getCurrentModeController().getMapController().setFolded(parentNode, true);
+ }
+ if (atEnd(parentNode, end)) {
+ return null;
+ }
+ return parentNode;
+ }
+ current = (NodeModel) parentNode.getChildAt(index);
+ if (atEnd(current, end)) {
+ return null;
+ }
+ break;
+ }
+ for (;;) {
+ if (current.getChildCount() == 0) {
+ if (atEnd(current, end)) {
+ return null;
+ }
+ return current;
+ }
+ current = (NodeModel) current.getChildAt(current.getChildCount() - 1);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/MapReader.java b/freeplane/src/org/freeplane/features/map/MapReader.java
new file mode 100644
index 0000000..0d87b13
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapReader.java
@@ -0,0 +1,183 @@
+/*
+ * 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
new file mode 100644
index 0000000..c3b3f3b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/MapWriter.java
@@ -0,0 +1,145 @@
+/*
+ * 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
new file mode 100644
index 0000000..bea01e2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeBuilder.java
@@ -0,0 +1,235 @@
+/*
+ * 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
new file mode 100644
index 0000000..73c5a5d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeChangeEvent.java
@@ -0,0 +1,61 @@
+/*
+ * 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/NodeIconSetModel.java b/freeplane/src/org/freeplane/features/map/NodeIconSetModel.java
new file mode 100644
index 0000000..00ee287
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeIconSetModel.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.map;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.freeplane.features.icon.MindIcon;
+
+/**
+ * @author Dimitry Polivaev 20.11.2008
+ */
+class NodeIconSetModel {
+ /** stores the icons associated with this node. */
+ protected List<MindIcon> icons;
+
+ void addIcon(final MindIcon icon) {
+ createIcons();
+ icons.add(icon);
+ }
+
+ void addIcon(final MindIcon icon, final int position) {
+ createIcons();
+ if (position > -1) {
+ icons.add(position, icon);
+ }
+ else {
+ icons.add(icon);
+ }
+ }
+
+ private void createIcons() {
+ if (icons == null) {
+ icons = new ArrayList<MindIcon>();
+ }
+ }
+
+ public MindIcon getIcon(final int position) {
+ return getIcons().get(position);
+ }
+
+ List<MindIcon> getIcons() {
+ if (icons == null) {
+ return Collections.emptyList();
+ }
+ return icons;
+ }
+
+ /**
+ * removes the last icon
+ *
+ * @return returns the number of remaining icons.
+ */
+ int removeIcon() {
+ createIcons();
+ if (!icons.isEmpty()) {
+ icons.remove(icons.size() - 1);
+ }
+ return icons.size();
+ }
+
+ /**
+ * @param position of icon to remove
+ *
+ * @return returns the number of remaining icons.
+ */
+ int removeIcon(int position) {
+ createIcons();
+ if (position == icons.size()) {
+ position = icons.size() - 1;
+ }
+ icons.remove(position);
+ return icons.size();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/NodeLevelCompareCondition.java b/freeplane/src/org/freeplane/features/map/NodeLevelCompareCondition.java
new file mode 100644
index 0000000..3a3d710
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeLevelCompareCondition.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.map;
+
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.TextUtils;
+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;
+
+class NodeLevelCompareCondition extends CompareConditionAdapter {
+ static final String COMPARATION_RESULT = "COMPARATION_RESULT";
+ static final String NAME = "node_level_condition";
+ static final String SUCCEED = "SUCCEED";
+ static final String VALUE = "VALUE";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new NodeLevelCompareCondition(element.getAttribute(NodeLevelCompareCondition.VALUE, null), TreeXmlReader
+ .xmlToBoolean(element.getAttribute(CompareConditionAdapter.MATCH_CASE, null)), Integer.parseInt(element
+ .getAttribute(NodeLevelCompareCondition.COMPARATION_RESULT, null)), TreeXmlReader.xmlToBoolean(element
+ .getAttribute(NodeLevelCompareCondition.SUCCEED, null)));
+ }
+
+ final private int comparationResult;
+ final private boolean succeed;
+
+ NodeLevelCompareCondition(final String value, final boolean matchCase, final int comparationResult,
+ final boolean succeed) {
+ super(Long.valueOf(value));
+ this.comparationResult = comparationResult;
+ this.succeed = succeed;
+ }
+
+ public boolean isEqualityCondition()
+ {
+ return comparationResult == 0;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final long level = node.getNodeLevel(true);
+ return succeed == (compareTo(level) == comparationResult);
+ }
+
+ @SuppressWarnings("unused")
+ private boolean checkLevel(final long level) {
+ return succeed == (compareTo(level) == comparationResult);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String nodeCondition = TextUtils.getText(NodeLevelConditionController.FILTER_LEVEL);
+ return super.createDescription(nodeCondition, comparationResult, succeed);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(NodeLevelCompareCondition.COMPARATION_RESULT, Integer.toString(comparationResult));
+ child.setAttribute(NodeLevelCompareCondition.SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/NodeLevelConditionController.java b/freeplane/src/org/freeplane/features/map/NodeLevelConditionController.java
new file mode 100644
index 0000000..efb36b3
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..4a14e71
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeModel.java
@@ -0,0 +1,560 @@
+/*
+ * 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.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";
+ protected 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());
+ setUserObject(userObject);
+ setHistoryInformation(new HistoryInformationModel());
+ this.map = map;
+ icons = new NodeIconSetModel();
+ }
+
+ 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();
+ }
+
+ public Enumeration<NodeModel> children() {
+ final Iterator<NodeModel> i = children.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 children.get(childIndex);
+ }
+
+ public int getChildCount() {
+ if (children == null) {
+ return 0;
+ }
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
+ return encryptionModel == null || encryptionModel.isAccessible() ? children.size() : 0;
+ }
+
+ public int getChildPosition(final NodeModel childNode) {
+ int position = 0;
+ for (final ListIterator<NodeModel> i = children.listIterator(); i.hasNext(); ++position) {
+ if ((i.next()) == childNode) {
+ return position;
+ }
+ }
+ return -1;
+ }
+
+ public List<NodeModel> getChildren() {
+ List<NodeModel> childrenList;
+ if (children != null) {
+ childrenList = children;
+ }
+ 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 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 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();
+ children.add(index, (NodeModel) child);
+ }
+ else {
+ children.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 = children.get(index);
+ remove(node);
+ }
+
+ public void remove(final MutableTreeNode node) {
+ if (node == preferredChild) {
+ final int index = children.indexOf(node);
+ if (children.size() > index + 1) {
+ preferredChild = (children.get(index + 1));
+ }
+ else {
+ preferredChild = (index > 0) ? (NodeModel) (children.get(index - 1)) : null;
+ }
+ }
+ final int index = getIndex(node);
+ node.setParent(null);
+ children.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 : children) {
+ 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
new file mode 100644
index 0000000..2574560
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NodeWriter.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.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/NumberComboBoxEditor.java b/freeplane/src/org/freeplane/features/map/NumberComboBoxEditor.java
new file mode 100644
index 0000000..06e128f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/NumberComboBoxEditor.java
@@ -0,0 +1,58 @@
+package org.freeplane.features.map;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.JSpinner;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+public class NumberComboBoxEditor implements ComboBoxEditor{
+ final private List<ActionListener> actionListeners;
+ final private JSpinner editor;
+ public NumberComboBoxEditor(){
+ actionListeners = new LinkedList<ActionListener>();
+ editor = new JSpinner();
+ editor.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent e) {
+ if(actionListeners.isEmpty()){
+ return;
+ }
+ final ActionEvent actionEvent = new ActionEvent(e.getSource(), 0, null);
+ for(ActionListener l : actionListeners){
+ l.actionPerformed(actionEvent);
+ }
+ }
+ });
+ }
+ public void addActionListener(ActionListener l) {
+ actionListeners.add(l);
+ }
+
+ public Component getEditorComponent() {
+ return editor;
+ }
+
+ public Object getItem() {
+ return editor.getValue().toString();
+ }
+
+ public void removeActionListener(ActionListener l) {
+ actionListeners.remove(l);
+ }
+
+ public void selectAll() {
+ }
+
+ public void setItem(Object anObject) {
+ if(anObject != null){
+ editor.setValue(Integer.valueOf(anObject.toString()));
+ return;
+ }
+ editor.setValue(0);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/PeriodicLevelCondition.java b/freeplane/src/org/freeplane/features/map/PeriodicLevelCondition.java
new file mode 100644
index 0000000..f0550e5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/PeriodicLevelCondition.java
@@ -0,0 +1,56 @@
+package org.freeplane.features.map;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class PeriodicLevelCondition extends ASelectableCondition {
+ public static final String NAME = "node_periodic_level_condition";
+ private final int period;
+ private final int remainder;
+
+
+ public PeriodicLevelCondition(int period, int remainder) {
+ super();
+ this.period = period;
+ this.remainder = remainder;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public boolean checkNode(NodeModel node) {
+ final int nodeLevel = node.getNodeLevel(true);
+ return nodeLevel > 0 && nodeLevel % period == remainder;
+ }
+
+ public static ASelectableCondition load(XMLElement element) {
+ int period = Integer.valueOf(element.getAttribute("PERIOD", null));
+ int remainder = Integer.valueOf(element.getAttribute("REMAINDER", null));
+ return new PeriodicLevelCondition(period, remainder);
+ }
+
+
+
+ @Override
+ protected void fillXML(XMLElement element) {
+ element.setAttribute("PERIOD", Integer.toString(period));
+ element.setAttribute("REMAINDER", Integer.toString(remainder));
+ }
+
+ @Override
+ protected String createDescription() {
+ return TextUtils.format("periodic_formula", period, remainder);
+ }
+
+ public static PeriodicLevelCondition[] createConditions(int n) {
+ PeriodicLevelCondition[] conditions = new PeriodicLevelCondition[n * (n + 1) / 2 - 1];
+ int k = 0;
+ for(int i = 2; i <= n; i++)
+ for(int j = 0; j < i; j++)
+ conditions[k++] = new PeriodicLevelCondition(i, j);
+ return conditions;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/RootCondition.java b/freeplane/src/org/freeplane/features/map/RootCondition.java
new file mode 100644
index 0000000..7336a7b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/RootCondition.java
@@ -0,0 +1,26 @@
+package org.freeplane.features.map;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class RootCondition extends ASelectableCondition {
+ public static final String NAME = "node_root_condition";
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ public boolean checkNode(NodeModel node) {
+ return node.isRoot();
+ }
+
+ public static ASelectableCondition load(XMLElement element) {
+ return new RootCondition();
+ }
+
+ @Override
+ protected String createDescription() {
+ return TextUtils.getText(NodeLevelConditionController.FILTER_ROOT);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java b/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java
new file mode 100644
index 0000000..64bae03
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java
@@ -0,0 +1,55 @@
+/*
+ * 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
new file mode 100644
index 0000000..00d44d5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/SummaryNode.java
@@ -0,0 +1,72 @@
+/*
+ * 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/ToggleChildrenFoldedAction.java b/freeplane/src/org/freeplane/features/map/ToggleChildrenFoldedAction.java
new file mode 100644
index 0000000..149e353
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/ToggleChildrenFoldedAction.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.map;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+class ToggleChildrenFoldedAction extends AFreeplaneAction {
+ static final String NAME = "toggleChildrenFolded";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ public ToggleChildrenFoldedAction() {
+ super("ToggleChildrenFoldedAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final IMapSelection mapSelection = controller.getSelection();
+ final NodeModel model = mapSelection.getSelected();
+ MapController mapController = Controller.getCurrentModeController().getMapController();
+ mapController.toggleFolded(mapController.childrenUnfolded(model));
+ mapSelection.selectAsTheOnlyOneSelected(model);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.java b/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.java
new file mode 100644
index 0000000..d83c0f1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.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.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/filemode/CenterAction.java b/freeplane/src/org/freeplane/features/map/filemode/CenterAction.java
new file mode 100644
index 0000000..9484112
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/filemode/CenterAction.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.map.filemode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+public class CenterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CenterAction() {
+ super("CenterAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (Controller.getCurrentModeController().getMapController().getSelectedNode() != null) {
+ final File file = ((FNodeModel) Controller.getCurrentModeController().getMapController().getSelectedNode()).getFile();
+ ((FMapController) Controller.getCurrentModeController().getMapController()).newMap(file);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FMapController.java b/freeplane/src/org/freeplane/features/map/filemode/FMapController.java
new file mode 100644
index 0000000..09d4290
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/filemode/FMapController.java
@@ -0,0 +1,60 @@
+/*
+ * 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.filemode;
+
+import java.io.File;
+
+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.filemode.FModeController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class FMapController extends MapController {
+ public FMapController(FModeController modeController) {
+ super(modeController);
+ }
+
+ public FModeController getFModeController() {
+ return (FModeController) Controller.getCurrentModeController();
+ }
+
+ public MapModel newMap(final File file) {
+ final FMapModel fileMapModel = new FMapModel(file);
+ fireMapCreated(fileMapModel);
+ newMapView(fileMapModel);
+ // FIXME: setSaved(true) necessary? (it's removed from newMapView())
+ return fileMapModel;
+ }
+
+ @Override
+ public NodeModel newNode(final Object userObject, final MapModel map) {
+ return new FNodeModel((File) userObject, map);
+ }
+
+ public void toggleFolded(final NodeModel node) {
+ if (hasChildren(node) && !node.isRoot()) {
+ setFolded(node, !isFolded(node));
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FMapModel.java b/freeplane/src/org/freeplane/features/map/filemode/FMapModel.java
new file mode 100644
index 0000000..2988b2a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/filemode/FMapModel.java
@@ -0,0 +1,40 @@
+/*
+ * 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.filemode;
+
+import java.io.File;
+
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.map.MapModel;
+
+class FMapModel extends MapModel {
+ public FMapModel(final File root) {
+ super();
+ // create empty attribute registry
+ AttributeRegistry.getRegistry(this);
+ setRoot(new FNodeModel(root, this));
+ getRootNode().setFolded(false);
+ }
+
+ @Override
+ public String getTitle() {
+ return "File: " + getRootNode().toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FNodeModel.java b/freeplane/src/org/freeplane/features/map/filemode/FNodeModel.java
new file mode 100644
index 0000000..9948e3b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/filemode/FNodeModel.java
@@ -0,0 +1,96 @@
+/*
+ * 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.filemode;
+
+import java.io.File;
+import java.util.List;
+
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * This class represents a single Node of a Tree. It contains direct handles to
+ * its parent and children and to its view.
+ */
+class FNodeModel extends NodeModel {
+ final private File file;
+
+ public FNodeModel(final File file, final MapModel map) {
+ super(map);
+ this.file = file;
+ final String[] children = file.list();
+ setFolded(children != null && children.length > 0);
+ }
+
+ @Override
+ public List<NodeModel> getChildren() {
+ if (!children.isEmpty()) {
+ return super.getChildren();
+ }
+ try {
+ final String[] files = file.list();
+ if (files != null) {
+ final String path = file.getPath();
+ for (int i = 0; i < files.length; i++) {
+ final File childFile = new File(path, files[i]);
+ if (!childFile.isHidden()) {
+ final FNodeModel fileNodeModel = new FNodeModel(childFile, getMap());
+ NodeLinks.createLinkExtension(fileNodeModel).setHyperLink(childFile.toURI());
+ fileNodeModel.setLeft(isNewChildLeft());
+ children.add(getChildCount(), fileNodeModel);
+ fileNodeModel.setParent(this);
+ }
+ }
+ }
+ }
+ catch (final SecurityException se) {
+ }
+ return super.getChildren();
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ @Override
+ public Object getUserObject() {
+ String name = file.getName();
+ if (name.equals("")) {
+ name = "Root";
+ }
+ return name;
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return !file.isFile() && !getChildren().isEmpty();
+ }
+
+ @Override
+ public boolean isLeaf() {
+ return file.isFile();
+ }
+
+ @Override
+ public String toString() {
+ return getText();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/filemode/OpenPathAction.java b/freeplane/src/org/freeplane/features/map/filemode/OpenPathAction.java
new file mode 100644
index 0000000..6f3345d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/filemode/OpenPathAction.java
@@ -0,0 +1,53 @@
+/*
+ * 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.filemode;
+
+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.features.mode.Controller;
+
+public class OpenPathAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public OpenPathAction() {
+ super("OpenPathAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
+ final int result = fileChooser.showOpenDialog((Component) e.getSource());
+ if(result == JFileChooser.APPROVE_OPTION){
+ final File newCenter = fileChooser.getSelectedFile();
+ if (newCenter.exists()) {
+ ((FMapController) Controller.getCurrentModeController().getMapController())
+ .newMap(newCenter);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java b/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
new file mode 100644
index 0000000..283d3ce
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
@@ -0,0 +1,193 @@
+/*
+ * 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
new file mode 100644
index 0000000..4d24b25
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/DeleteAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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/DocuMapAttribute.java b/freeplane/src/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java
new file mode 100644
index 0000000..2f04c56
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java
@@ -0,0 +1,30 @@
+/*
+ * 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.mindmapmode;
+
+import org.freeplane.core.extension.IExtension;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 10, 2011
+ */
+public class DocuMapAttribute implements IExtension {
+ public static final IExtension instance = new DocuMapAttribute();
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java b/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java
new file mode 100644
index 0000000..132824a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java
@@ -0,0 +1,779 @@
+/*
+ * 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.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().getViewController().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 = (SummaryNode) modeController.getExtension(SummaryNode.class);
+ summary.undoableActivateHook(newNode, summary);
+ final FirstGroupNode firstGroup = (FirstGroupNode) 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 boolean force) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ 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(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 = ((FreeNode)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--;
+ }
+ ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(node);
+ moveNode(node, newParent, newIndex, isLeft, changeSide);
+ }
+
+ public void moveNodes(final NodeModel selected, final Collection<NodeModel> selecteds, final int direction) {
+ final IActor actor = new IActor() {
+ public void act() {
+ _moveNodes(selected, selecteds, direction);
+ }
+
+ public String getDescription() {
+ return "moveNodes";
+ }
+
+ public void undo() {
+ _moveNodes(selected, selecteds, -direction);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, selected.getMap());
+ }
+ private void _moveNodes(final NodeModel selected, final Collection<NodeModel> selecteds, 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;
+ }
+ };
+ final NodeModel parent = selected.getParentNode();
+ if (parent != null) {
+ final Vector<NodeModel> sortedChildren = getSortedSiblings(parent);
+ final TreeSet<Integer> range = new TreeSet<Integer>(comparator);
+ for (final NodeModel node : selecteds) {
+ 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 (final Integer position : range) {
+ final NodeModel node = sortedChildren.get(position.intValue());
+ selection.makeTheSelected(node);
+ }
+ }
+ }
+ 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 = (NodeModel) 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;
+ }
+
+
+ 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.getViewController().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().getViewController().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){
+ 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
new file mode 100644
index 0000000..bed77bc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/MMapModel.java
@@ -0,0 +1,139 @@
+/*
+ * 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)
+ return file.getName();
+ 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/NewChildAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewChildAction.java
new file mode 100644
index 0000000..a49eb7e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewChildAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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 NewChildAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NewChildAction() {
+ super("NewChildAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ mapController.addNewNode(MMapController.NEW_CHILD);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java
new file mode 100644
index 0000000..90a4e82
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.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.features.map.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Point;
+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.ui.ViewController;
+
+public class NewFreeNodeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NewFreeNodeAction() {
+ super("NewFreeNodeAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ final Controller controller = Controller.getCurrentController();
+ final ViewController viewController = controller.getViewController();
+ final float zoom = viewController.getZoom();
+ final Component component = viewController.getComponent(mapController.getRootNode());
+ int x = (int)(component.getWidth() / zoom);
+ mapController.addFreeNode(new Point(x, 0), false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewMapViewAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewMapViewAction.java
new file mode 100644
index 0000000..cef4144
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewMapViewAction.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.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+class NewMapViewAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public NewMapViewAction() {
+ super("NewMapViewAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ Controller.getCurrentModeController().getMapController().newMapView(map);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java
new file mode 100644
index 0000000..94289d3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java
@@ -0,0 +1,112 @@
+/*
+ * 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/NewPreviousSiblingAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java
new file mode 100644
index 0000000..acb9802
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java
@@ -0,0 +1,40 @@
+/*
+ * 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 NewPreviousSiblingAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NewPreviousSiblingAction() {
+ super("NewPreviousSiblingAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(MMapController.NEW_SIBLING_BEFORE);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewSiblingAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewSiblingAction.java
new file mode 100644
index 0000000..d6ae918
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewSiblingAction.java
@@ -0,0 +1,40 @@
+/*
+ * 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 NewSiblingAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NewSiblingAction() {
+ super("NewSiblingAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(MMapController.NEW_SIBLING_BEHIND);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
new file mode 100644
index 0000000..5323217
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
@@ -0,0 +1,109 @@
+/*
+ * 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
new file mode 100644
index 0000000..c2b33db
--- /dev/null
+++ b/freeplane/src/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()).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
new file mode 100644
index 0000000..8678625
--- /dev/null
+++ b/freeplane/src/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.moveNodes(mapController.getSelectedNode(), mapController.getSelectedNodes(), -1);
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/mapio/MapIO.java b/freeplane/src/org/freeplane/features/mapio/MapIO.java
new file mode 100644
index 0000000..40fdf87
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mapio/MapIO.java
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 14, 2012
+ */
+ at SuppressWarnings("deprecation")
+public class MapIO implements IExtension{
+ final private UrlManager urlManager;
+ final private MapController mapController;
+ protected MapIO(UrlManager urlManager, MapController mapController) {
+ super();
+ this.urlManager = urlManager;
+ this.mapController = mapController;
+ }
+ public static void install(ModeController modeController){
+ UrlManager urlManager = modeController.getExtension(UrlManager.class);
+ MapController mapController = modeController.getMapController();
+ final MapIO mapIO = new MapIO(urlManager, mapController);
+ modeController.addExtension(MapIO.class, mapIO);
+ }
+ public boolean loadCatchExceptions(URL url, MapModel map){
+ return urlManager.loadCatchExceptions(url, map);
+ }
+
+ public void load(URL url, MapModel map) throws FileNotFoundException, IOException, XMLException, XMLParseException,
+ URISyntaxException {
+ urlManager.load(url, map);
+ }
+ public boolean newMap(URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException {
+ return mapController.newMap(url);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mapio/mindmapmode/MMapIO.java b/freeplane/src/org/freeplane/features/mapio/mindmapmode/MMapIO.java
new file mode 100644
index 0000000..c739251
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..447f1d7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/AController.java
@@ -0,0 +1,78 @@
+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/CenterSelectedNodeAction.java b/freeplane/src/org/freeplane/features/mode/CenterSelectedNodeAction.java
new file mode 100644
index 0000000..66c586b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/CenterSelectedNodeAction.java
@@ -0,0 +1,54 @@
+/*
+ * 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.event.ActionEvent;
+
+import javax.swing.JRootPane;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.IMapSelection;
+
+/**
+ * @author foltin
+ */
+class CenterSelectedNodeAction extends AFreeplaneAction {
+ static final String NAME = "center_selected";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CenterSelectedNodeAction() {
+ super("CenterSelectedNodeAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final Component mapView = Controller.getCurrentController().getViewController().getMapView();
+ final JRootPane rootPane = SwingUtilities.getRootPane(mapView);
+ if (!rootPane.isValid()) {
+ rootPane.revalidate();
+ }
+ selection.centerNode(selection.getSelected());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/CombinedPropertyChain.java b/freeplane/src/org/freeplane/features/mode/CombinedPropertyChain.java
new file mode 100644
index 0000000..5ac9599
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/CombinedPropertyChain.java
@@ -0,0 +1,54 @@
+/*
+ * 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.util.Iterator;
+import java.util.TreeMap;
+
+public class CombinedPropertyChain<V, T> {
+ final private boolean reversed;
+ public CombinedPropertyChain(boolean reversed) {
+ super();
+ this.reversed = reversed;
+ }
+
+ final private TreeMap<Integer, IPropertyHandler<V, T>> handlers = new TreeMap<Integer, IPropertyHandler<V, T>>();
+
+ public IPropertyHandler<V, T> addGetter(final Integer key, final IPropertyHandler<V, T> getter) {
+ return handlers.put(key(key), getter);
+ }
+
+ private int key(final int key) {
+ return reversed ? -key : key;
+ }
+
+ public V getProperty(final T node, V property) {
+ final Iterator<IPropertyHandler<V, T>> iterator = handlers.values().iterator();
+ while (iterator.hasNext()) {
+ final IPropertyHandler<V, T> getter = iterator.next();
+ property = getter.getProperty(node, property);
+ }
+ return property;
+ }
+
+ public IPropertyHandler<V, T> removeGetter(final Integer key) {
+ return handlers.remove(key(key));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/Controller.java b/freeplane/src/org/freeplane/features/mode/Controller.java
new file mode 100644
index 0000000..baae5b8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/Controller.java
@@ -0,0 +1,222 @@
+/*
+ * 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.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.IExtension;
+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>();
+
+ public Controller(ResourceController resourceController) {
+ super();
+ if(currentController == null){
+ currentController = this;
+ }
+ this.resourceController = resourceController;
+ 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 IExtension getExtension(final Class<? extends IExtension> clazz) {
+ return extensionContainer.getExtension(clazz);
+ }
+
+ /**
+ * @return
+ */
+ public MapModel getMap() {
+ return getViewController().getMap();
+ }
+
+ public IMapViewManager getMapViewManager() {
+ return getViewController().getMapViewManager();
+ }
+
+ /** @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 getViewController().getSelection();
+ }
+
+ /**
+ * @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 Process exec(final String string) throws IOException {
+ LogUtils.info("execute " + string);
+ return Runtime.getRuntime().exec(string);
+ }
+
+ public static Process exec(final String[] command) throws IOException {
+ LogUtils.info("execute " + Arrays.toString(command));
+ return Runtime.getRuntime().exec(command);
+ }
+
+ 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/ExclusivePropertyChain.java b/freeplane/src/org/freeplane/features/mode/ExclusivePropertyChain.java
new file mode 100644
index 0000000..7bc698e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/ExclusivePropertyChain.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.mode;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class ExclusivePropertyChain<V, T> {
+ final private Map<Integer, IPropertyHandler<V, T>> map = new TreeMap<Integer, IPropertyHandler<V, T>>();
+
+ public IPropertyHandler<V, T> addGetter(final Integer key, final IPropertyHandler<V, T> getter) {
+ return map.put(key, getter);
+ }
+
+ public V getProperty(final T node) {
+ final Iterator<IPropertyHandler<V, T>> iterator = map.values().iterator();
+ while (iterator.hasNext()) {
+ IPropertyHandler<V, T> handler = iterator.next();
+ final V property = handler.getProperty(node, null);
+ if (property != null) {
+ return property;
+ }
+ }
+ return null;
+ }
+
+ public IPropertyHandler<V, T> removeGetter(final Integer key) {
+ return map.remove(key);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/IPropertyHandler.java b/freeplane/src/org/freeplane/features/mode/IPropertyHandler.java
new file mode 100644
index 0000000..2ed27b8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/IPropertyHandler.java
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+public interface IPropertyHandler<V, M> {
+ final static public Integer DEFAULT = 1 << 9;
+ final static public Integer DEFAULT_STYLE = 1 << 8;
+ final static public Integer STYLE = 1 << 7;
+ final static public Integer AUTO = 1 << 6;
+ final static public Integer NODE = 1 << 5;
+ final static public Integer MODIFICATION = 1 << 4;
+
+ V getProperty(M model, V currentValue);
+}
diff --git a/freeplane/src/org/freeplane/features/mode/ModeController.java b/freeplane/src/org/freeplane/features/mode/ModeController.java
new file mode 100644
index 0000000..fb7cca0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/ModeController.java
@@ -0,0 +1,430 @@
+/*
+ * 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<DocuMapAttribute> 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
new file mode 100644
index 0000000..b3cb579
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/MoveToRootAction.java
@@ -0,0 +1,40 @@
+/*
+ * 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/NodeHookDescriptor.java b/freeplane/src/org/freeplane/features/mode/NodeHookDescriptor.java
new file mode 100644
index 0000000..cc12629
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/NodeHookDescriptor.java
@@ -0,0 +1,33 @@
+/*
+ * 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.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * @author Dimitry Polivaev 29.11.2008
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface NodeHookDescriptor {
+ String hookName();
+
+ boolean onceForMap() default true;
+}
diff --git a/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java b/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java
new file mode 100644
index 0000000..fed91f9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java
@@ -0,0 +1,421 @@
+/*
+ * 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/QuitAction.java b/freeplane/src/org/freeplane/features/mode/QuitAction.java
new file mode 100644
index 0000000..dabe729
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/QuitAction.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 org.freeplane.core.ui.AFreeplaneAction;
+
+/**
+ * Manages the history of visited maps. Maybe explicitly closed maps should be
+ * removed from History too?
+ */
+public class QuitAction extends AFreeplaneAction {
+ public static final String NAME = "quit";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param resourceController
+ */
+ public QuitAction() {
+ super("QuitAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ Controller.getCurrentController().quit();
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/SelectionController.java b/freeplane/src/org/freeplane/features/mode/SelectionController.java
new file mode 100644
index 0000000..c028e3c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/SelectionController.java
@@ -0,0 +1,70 @@
+/*
+ * 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/browsemode/BModeController.java b/freeplane/src/org/freeplane/features/mode/browsemode/BModeController.java
new file mode 100644
index 0000000..3acec08
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/browsemode/BModeController.java
@@ -0,0 +1,36 @@
+/*
+ * 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.browsemode;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+public class BModeController extends ModeController {
+ static public final String MODENAME = "Browse";
+
+ public BModeController(final Controller controller) {
+ super(controller);
+ }
+
+ @Override
+ public String getModeName() {
+ return BModeController.MODENAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/filemode/FModeController.java b/freeplane/src/org/freeplane/features/mode/filemode/FModeController.java
new file mode 100644
index 0000000..a87a6a4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/filemode/FModeController.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.features.mode.filemode;
+
+import java.io.File;
+
+import org.freeplane.features.map.filemode.FMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+public class FModeController extends ModeController {
+ static public final String MODENAME = "File";
+
+ public FModeController(final Controller controller) {
+ super(controller);
+ }
+
+ @Override
+ public String getModeName() {
+ return FModeController.MODENAME;
+ }
+
+ @Override
+ public void startup() {
+ final Controller controller = getController();
+ controller.getMapViewManager().changeToMode(MODENAME);
+ if (controller.getMap() == null) {
+ ((FMapController) getMapController()).newMap(new File(File.separator));
+ }
+ super.startup();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
new file mode 100644
index 0000000..76cbc41
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
@@ -0,0 +1,125 @@
+/*
+ * 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
new file mode 100644
index 0000000..718d561
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/MModeController.java
@@ -0,0 +1,213 @@
+/*
+ * 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.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 {
+ 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 = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.addActor(actor);
+ }
+
+ public void deactivateUndo(final MMapModel map) {
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.deactivate();
+ }
+
+ @Override
+ public void commit() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.commit();
+ }
+
+ public void delayedCommit() {
+ final MMapModel map = (MMapModel) getController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.delayedCommit();
+ }
+
+ public void delayedRollback() {
+ final MMapModel map = (MMapModel) getController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) 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();
+ optionPanelBuilder.load(resourceController.getResource("/xml/preferences.xml"));
+ 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());
+ }
+ optionPanelBuilder.addComboProperty("Appearance/look_and_feel/lookandfeel", "lookandfeel", lafNames,
+ translatedLafNames, IndexedTree.AS_CHILD);
+ return new PropertyAction(optionPanelBuilder.getRoot());
+ }
+
+ @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 ((IUndoHandler) ((MMapModel) model).getExtension(IUndoHandler.class)).isUndoActionRunning();
+ }
+
+ @Override
+ public void rollback() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) 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 = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.startTransaction();
+ }
+
+ @Override
+ public void forceNewTransaction() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) 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
new file mode 100644
index 0000000..8c841bb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/RedoAction.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.features.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+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) {
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) 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 = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.resetRedo();
+ setEnabled(false);
+ }
+
+ public void setUndo(final Action undo) {
+ this.undo = undo;
+ }
+ 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
new file mode 100644
index 0000000..1e4fb7a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java
@@ -0,0 +1,101 @@
+/*
+ * 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/SelectAllAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectAllAction.java
new file mode 100644
index 0000000..efd72f6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectAllAction.java
@@ -0,0 +1,47 @@
+/*
+ * 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.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/** */
+class SelectAllAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public SelectAllAction() {
+ super("SelectAllAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final NodeModel root = Controller.getCurrentController().getMap().getRootNode();
+ Controller.getCurrentController().getSelection().selectBranch(root, true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java
new file mode 100644
index 0000000..bb250dc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectBranchAction.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.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+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 SelectBranchAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public SelectBranchAction() {
+ super("SelectBranchAction");
+ }
+
+ @Override
+ protected void actionPerformed(ActionEvent e, NodeModel node) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.selectBranch(node, true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java
new file mode 100644
index 0000000..3cb2495
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java
@@ -0,0 +1,119 @@
+/*
+ * 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.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 = (IUndoHandler) 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) {
+
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) 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 = (IUndoHandler) oldMap.getExtension(IUndoHandler.class);
+ undoHandler.removeChangeListener(changeListener);
+ }
+ if (newMap == null) {
+ setEnabled(false);
+ redo.setEnabled(false);
+ return;
+ }
+ final IUndoHandler undoHandler = (IUndoHandler) (newMap.getExtension(IUndoHandler.class));
+ if (undoHandler != null) {
+ setEnabled(undoHandler.canUndo());
+ redo.setEnabled(undoHandler.canRedo());
+ undoHandler.addChangeListener(changeListener);
+ }
+ }
+ 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
new file mode 100644
index 0000000..e6009e7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodelocation/LocationBuilder.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.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
new file mode 100644
index 0000000..02c0d3a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodelocation/LocationController.java
@@ -0,0 +1,60 @@
+/*
+ * 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.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 (LocationController) 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);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java b/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java
new file mode 100644
index 0000000..41d25ad
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java
@@ -0,0 +1,95 @@
+/*
+ * 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/MLocationController.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
new file mode 100644
index 0000000..b987bd8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
@@ -0,0 +1,90 @@
+/*
+ * 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 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;
+import org.freeplane.features.nodelocation.LocationModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MLocationController extends LocationController {
+ private final class ChangeNodePositionActor implements IActor {
+ private final int gap;
+ private final NodeModel node;
+ private final int oldHgap;
+ private final int oldParentVgap;
+ private final int oldShiftY;
+ private final int parentVGap;
+ private final int shiftY;
+
+ private ChangeNodePositionActor(final NodeModel node, final int parentVGap, final int gap, final int shiftY) {
+ this.node = node;
+ this.gap = gap;
+ this.shiftY = shiftY;
+ this.parentVGap = parentVGap;
+ final LocationModel locationModel = LocationModel.getModel(node);
+ oldHgap = locationModel.getHGap();
+ oldShiftY = locationModel.getShiftY();
+ oldParentVgap = !node.isRoot() ? LocationModel.getModel(node.getParentNode()).getVGap() : 0;
+ }
+
+ public void act() {
+ moveNodePosition(node, parentVGap, gap, shiftY);
+ }
+
+ public String getDescription() {
+ return "moveNodePosition";
+ }
+
+ private void moveNodePosition(final NodeModel node, final int parentVGap, final int hGap, final int shiftY) {
+ final LocationModel locationModel = LocationModel.createLocationModel(node);
+ locationModel.setHGap(hGap);
+ locationModel.setShiftY(shiftY);
+ if (!node.isRoot() && this.parentVGap >= 0) {
+ LocationModel.createLocationModel(node.getParentNode()).setVGap(parentVGap);
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public void undo() {
+ moveNodePosition(node, oldParentVgap, oldHgap, oldShiftY);
+ }
+ }
+
+ 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) {
+ final IActor actor = new ChangeNodePositionActor(node, parentVGap, hGap, shiftY);
+ 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
new file mode 100644
index 0000000..9edd7ca
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java
@@ -0,0 +1,49 @@
+/*
+ * 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
new file mode 100644
index 0000000..2060fd7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/NodeSizeModel.java
@@ -0,0 +1,83 @@
+/*
+ * 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
new file mode 100644
index 0000000..e7180ee
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleBuilder.java
@@ -0,0 +1,311 @@
+/*
+ * 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
new file mode 100644
index 0000000..546fe10
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleController.java
@@ -0,0 +1,408 @@
+/*
+ * 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
new file mode 100644
index 0000000..5a07fd7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleModel.java
@@ -0,0 +1,238 @@
+/*
+ * 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/filemode/FNodeStyleController.java b/freeplane/src/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java
new file mode 100644
index 0000000..8b669fe
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java
@@ -0,0 +1,42 @@
+/*
+ * 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.nodestyle.filemode;
+
+import java.awt.Color;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.01.2009
+ */
+class FNodeStyleController extends NodeStyleController {
+ public FNodeStyleController(final ModeController modeController) {
+ super(modeController);
+ addColorGetter(IPropertyHandler.DEFAULT - 1, new IPropertyHandler<Color, NodeModel>() {
+ public Color getProperty(final NodeModel node, final Color currentValue) {
+ return node.isLeaf() ? Color.BLACK : Color.GRAY;
+ }
+ });
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java
new file mode 100644
index 0000000..119cd16
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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;
+
+ at SelectableAction(checkOnNodeChange = true)
+class BoldAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean bold;
+
+ /**
+ */
+ public BoldAction() {
+ super("BoldAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ bold = !isBold();
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel selected) {
+ ((MNodeStyleController) NodeStyleController.getController()).setBold(selected, bold);
+ }
+
+ boolean isBold() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ return NodeStyleController.getController().isBold(node);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isBold());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
new file mode 100644
index 0000000..8731102
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
@@ -0,0 +1,92 @@
+/*
+ * 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.ui.EnabledAction;
+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/FontFamilyAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java
new file mode 100644
index 0000000..8f69201
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+/**
+ * @author foltin
+ */
+class FontFamilyAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String actionFont;
+
+ /**
+ */
+ public FontFamilyAction() {
+ super("FontFamilyAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MNodeStyleController) NodeStyleController.getController()).setFontFamily(node, actionFont);
+ }
+
+ public void actionPerformed(final String font) {
+ actionFont = font;
+ super.actionPerformed((ActionEvent) null);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java
new file mode 100644
index 0000000..c4cdd97
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.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.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;
+
+/**
+ * @author foltin
+ */
+class FontSizeAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /** This action is used for all FONT_SIZES, which have to be set first. */
+ private int actionSize;
+
+ /**
+ */
+ public FontSizeAction() {
+ super("FontSizeAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.MindMapNode)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MNodeStyleController) NodeStyleController.getController()).setFontSize(node, actionSize);
+ }
+
+ public void actionPerformed(final String size) {
+ actionSize = Integer.parseInt(size);
+ super.actionPerformed((ActionEvent) null);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java
new file mode 100644
index 0000000..d4f192f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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;
+
+ at SelectableAction(checkOnNodeChange = true)
+class ItalicAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean italic;
+
+ /**
+ */
+ public ItalicAction() {
+ super("ItalicAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ italic = !isItalic();
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel selected) {
+ ((MNodeStyleController) NodeStyleController.getController()).setItalic(selected, italic);
+ }
+
+ boolean isItalic() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ return NodeStyleController.getController().isItalic(node);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isItalic());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
new file mode 100644
index 0000000..3a03e1a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
@@ -0,0 +1,605 @@
+/*
+ * 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/NodeBackgroundColorAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java
new file mode 100644
index 0000000..90a4bc3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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.Color;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+
+class NodeBackgroundColorAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Color actionBackgroundColor;
+
+ public NodeBackgroundColorAction() {
+ super("NodeBackgroundColorAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ actionBackgroundColor = ColorTracker.showCommonJColorChooserDialog(Controller.getCurrentController()
+ .getSelection().getSelected(), TextUtils.getText("choose_node_background_color"), NodeStyleModel
+ .getBackgroundColor(Controller.getCurrentModeController().getMapController().getSelectedNode()), null);
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MNodeStyleController) NodeStyleController.getController()).setBackgroundColor(node,
+ actionBackgroundColor);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java
new file mode 100644
index 0000000..b66f47e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java
@@ -0,0 +1,58 @@
+/*
+ * 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.Color;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+
+class NodeColorAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Color actionColor;
+
+ public NodeColorAction() {
+ super("NodeColorAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ actionColor = ColorTracker.showCommonJColorChooserDialog(Controller.getCurrentController().getSelection()
+ .getSelected(),
+ TextUtils.getText("choose_node_color"),
+ NodeStyleModel.getColor(Controller.getCurrentModeController().getMapController().getSelectedNode()),
+ NodeStyleController.standardNodeTextColor);
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MNodeStyleController) NodeStyleController.getController()).setColor(node, actionColor);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java
new file mode 100644
index 0000000..1e07b45
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java
@@ -0,0 +1,69 @@
+/*
+ * 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.Color;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * @author foltin
+ */
+class NodeColorBlendAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public NodeColorBlendAction() {
+ super("NodeColorBlendAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.mindmapmode.actions.MultipleNodeAction#actionPerformed
+ * (freeplane.modes.NodeModel)
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ final Component mapView = viewController.getMapView();
+ final Color mapColor = mapView.getBackground();
+ Color nodeColor = NodeStyleModel.getColor(node);
+ final MNodeStyleController mNodeStyleController = (MNodeStyleController) NodeStyleController
+ .getController();
+ if (nodeColor == null) {
+ nodeColor = viewController.getBackgroundColor(node);
+ }
+ mNodeStyleController.setColor(node, new Color((3 * mapColor.getRed() + nodeColor.getRed()) / 4, (3 * mapColor
+ .getGreen() + nodeColor.getGreen()) / 4, (3 * mapColor.getBlue() + nodeColor.getBlue()) / 4));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java
new file mode 100644
index 0000000..ef629c7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.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.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
new file mode 100644
index 0000000..13ce5b8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeSizeDialog.java
@@ -0,0 +1,200 @@
+/*
+ * 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
new file mode 100644
index 0000000..4690b98
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeWidthAction.java
@@ -0,0 +1,44 @@
+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/nodestyle/mindmapmode/RemoveFormatAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java
new file mode 100644
index 0000000..342c9f8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java
@@ -0,0 +1,24 @@
+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.mode.Controller;
+import org.freeplane.features.styles.LogicalStyleKeys;
+
+class RemoveFormatAction extends AMultipleNodeAction {
+ public RemoveFormatAction() {
+ super("RemoveFormatAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ Controller.getCurrentModeController().undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, node);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java
new file mode 100644
index 0000000..3349448
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java
@@ -0,0 +1,75 @@
+/*
+ * 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.Color;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.NodeChangeEvent;
+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.mode.mindmapmode.MModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author foltin
+ */
+ at NodeHookDescriptor(hookName = "accessories/plugins/RevisionPlugin.properties")
+public class RevisionPlugin extends PersistentNodeHook implements INodeChangeListener, IExtension {
+ public RevisionPlugin() {
+ super();
+ Controller.getCurrentModeController().getMapController().addNodeChangeListener(this);
+ }
+
+ @Override
+ protected void add(final NodeModel node, final IExtension extension) {
+ super.add(node, extension);
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ return this;
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ if (!isActive(node)) {
+ return;
+ }
+ if (event.getProperty().equals(NodeModel.NODE_TEXT) && !((MModeController) Controller.getCurrentModeController()).isUndoAction()) {
+ final MNodeStyleController nodeStyleController = (MNodeStyleController) NodeStyleController
+ .getController();
+ final String colorProperty = ResourceController.getResourceController().getProperty("revision_color");
+ final Color color = ColorUtils.stringToColor(colorProperty);
+ nodeStyleController.setBackgroundColor(event.getNode(), color);
+ }
+ }
+
+ @Override
+ protected void remove(final NodeModel node, final IExtension extension) {
+ super.remove(node, extension);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/NoteBuilder.java b/freeplane/src/org/freeplane/features/note/NoteBuilder.java
new file mode 100644
index 0000000..9cd03dc
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/NoteBuilder.java
@@ -0,0 +1,62 @@
+/*
+ * 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 org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IElementContentHandler;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.NodeTextBuilder;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class NoteBuilder implements IElementContentHandler {
+ final private NoteController noteController;
+
+ public NoteBuilder(final NoteController noteController) {
+ super();
+ this.noteController = noteController;
+ }
+
+ 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_NOTE.equals(typeAttribute)) {
+ return null;
+ }
+ return parent;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object node, final XMLElement attributes,
+ final String content) {
+ if (tag.equals("richcontent")) {
+ final String xmlText = content.trim();
+ final Object typeAttribute = attributes.getAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, null);
+ if (NodeTextBuilder.XML_NODE_XHTML_TYPE_NOTE.equals(typeAttribute)) {
+ final NoteModel note = new NoteModel();
+ note.setXml(xmlText);
+ ((NodeModel) node).addExtension((IExtension) note);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/NoteController.java b/freeplane/src/org/freeplane/features/note/NoteController.java
new file mode 100644
index 0000000..81521ae
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/NoteController.java
@@ -0,0 +1,167 @@
+/*
+ * 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 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/NoteModel.java b/freeplane/src/org/freeplane/features/note/NoteModel.java
new file mode 100644
index 0000000..d9d82ce
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/NoteModel.java
@@ -0,0 +1,56 @@
+/*
+ * 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 org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.RichTextModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NoteModel extends RichTextModel implements IExtension {
+ public static final String EDITING_PURPOSE = "Note";
+
+ public static NoteModel createNote(final NodeModel node) {
+ NoteModel note = NoteModel.getNote(node);
+ if (note == null) {
+ note = new NoteModel();
+ node.addExtension(note);
+ }
+ return note;
+ }
+
+ public static NoteModel getNote(final NodeModel node) {
+ final NoteModel extension = (NoteModel) node.getExtension(NoteModel.class);
+ return extension;
+ }
+
+ public static String getNoteText(final NodeModel node) {
+ final NoteModel extension = NoteModel.getNote(node);
+ return extension != null ? extension.getHtml() : null;
+ }
+
+ public static String getXmlNoteText(final NodeModel node) {
+ final NoteModel extension = NoteModel.getNote(node);
+ return extension != null ? extension.getXml() : null;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/note/NoteWriter.java b/freeplane/src/org/freeplane/features/note/NoteWriter.java
new file mode 100644
index 0000000..30f0ca5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/NoteWriter.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.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
new file mode 100644
index 0000000..3a6c6b5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java
@@ -0,0 +1,119 @@
+/*
+ * 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.ViewController;
+
+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 ViewController viewController = controller.getViewController();
+ 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.getViewController().getMapView());
+ 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
new file mode 100644
index 0000000..931e778
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/MNoteController.java
@@ -0,0 +1,404 @@
+/*
+ * 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 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 = (NodeStyleController) 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.getViewController().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()) {
+ SwingUtilities.invokeLater(new Runnable() {
+ int count = 10;
+ public void run() {
+ if(count == 0){
+ showNotesPanel(false);
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if(selection != null){
+ final NodeModel selected = selection.getSelected();
+ if(selected != null){
+ selection.centerNode(selected);
+ }
+ }
+ }
+ else{
+ count--;
+ SwingUtilities.invokeLater(this);
+ }
+ }
+ });
+ }
+ 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
new file mode 100644
index 0000000..2f1916b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/NoteManager.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 Dimitry Polivaev in 2008.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received 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/RemoveNoteAction.java b/freeplane/src/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java
new file mode 100644
index 0000000..215a61b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java
@@ -0,0 +1,116 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.Iterator;
+
+import javax.swing.JOptionPane;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+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.note.NoteModel;
+
+class RemoveNoteAction extends AFreeplaneAction implements PopupMenuListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ final private MNoteController noteController;
+
+ public RemoveNoteAction(final MNoteController noteController) {
+ super("RemoveNoteAction");
+ this.noteController = noteController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final int showResult = OptionalDontShowMeAgainDialog.show("really_remove_notes", "confirmation",
+ MNoteController.RESOURCES_REMOVE_NOTES_WITHOUT_QUESTION,
+ OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
+ if (showResult != JOptionPane.OK_OPTION) {
+ return;
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ for (final Iterator<NodeModel> iterator = modeController.getMapController().getSelectedNodes().iterator(); iterator
+ .hasNext();) {
+ final NodeModel node = iterator.next();
+ if (NoteModel.getNoteText(node) != null) {
+ removeNote(node);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.PopupMenuListener#popupMenuCanceled(javax.swing.event
+ * .PopupMenuEvent)
+ */
+ public void popupMenuCanceled(final PopupMenuEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.PopupMenuListener#popupMenuWillBecomeInvisible(javax
+ * .swing.event.PopupMenuEvent)
+ */
+ public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax.
+ * swing.event.PopupMenuEvent)
+ */
+ public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
+ setEnabled();
+ }
+
+ private void removeNote(final NodeModel node) {
+ noteController.setNoteText(node, null);
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean foundNote = false;
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null) {
+ setEnabled(false);
+ return;
+ }
+ for (final NodeModel node : modeController.getMapController().getSelectedNodes()) {
+ if (NoteModel.getNoteText(node) != null) {
+ foundNote = true;
+ break;
+ }
+ }
+ setEnabled(foundNote);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/SelectNoteAction.java b/freeplane/src/org/freeplane/features/note/mindmapmode/SelectNoteAction.java
new file mode 100644
index 0000000..923b133
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/SelectNoteAction.java
@@ -0,0 +1,74 @@
+/*
+ * 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.EventQueue;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JEditorPane;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import com.lightdev.app.shtm.SHTMLPanel;
+
+class SelectNoteAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ final private MNoteController noteController;
+
+ public SelectNoteAction(final MNoteController noteController) {
+ super("SelectNoteAction");
+ this.noteController = noteController;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ if (noteController.isEditing()) {
+ noteController.setFocusToMap();
+ return;
+ }
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final SHTMLPanel htmlEditorPanel = noteController.getHtmlEditorPanel();
+ if (! noteController.isNoteEditorShowing()) {
+ noteController.showNotesPanel(true);
+ }
+ else {
+ htmlEditorPanel.getMostRecentFocusOwner().requestFocusInWindow();
+ if (ResourceController.getResourceController().getBooleanProperty("goto_note_end_on_edit")) {
+ final JEditorPane editorPane = htmlEditorPanel.getEditorPane();
+ editorPane.setCaretPosition(editorPane.getDocument().getLength());
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java b/freeplane/src/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java
new file mode 100644
index 0000000..06b76d9
--- /dev/null
+++ b/freeplane/src/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)
+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/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.java
new file mode 100644
index 0000000..a3b664a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.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.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;
+
+ at SelectableAction(checkOnPropertyChange = "use_split_pane")
+class ShowHideNoteAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ final private MNoteController noteController;
+
+ public ShowHideNoteAction(final MNoteController noteController) {
+ super("ShowHideNoteAction");
+ this.noteController = noteController;
+ setSelected(ResourceController.getResourceController().getBooleanProperty(
+ MNoteController.RESOURCES_USE_SPLIT_PANE));
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (! noteController.isNoteEditorShowing()) {
+ noteController.showNotesPanel(true);
+ }
+ else {
+ (noteController).hideNotesPanel();
+ }
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(noteController.isNoteEditorShowing());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/AbstractPrintAction.java b/freeplane/src/org/freeplane/features/print/AbstractPrintAction.java
new file mode 100644
index 0000000..eb7636e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/AbstractPrintAction.java
@@ -0,0 +1,46 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+
+abstract class AbstractPrintAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private PrintController printController;
+
+ public AbstractPrintAction(final String key, final PrintController controller) {
+ super(key);
+ printController = controller;
+ }
+
+ public PrintController getPrintController() {
+ return printController;
+ }
+
+ @Override
+ public void setEnabled(final boolean newValue) {
+ if (printController.isEnabled()) {
+ super.setEnabled(newValue);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/BrowseAction.java b/freeplane/src/org/freeplane/features/print/BrowseAction.java
new file mode 100644
index 0000000..5ab2944
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/BrowseAction.java
@@ -0,0 +1,60 @@
+/*
+ * 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.EventQueue;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.JLabel;
+
+class BrowseAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Runnable pageIndexPainter;
+ final private JLabel pageNumber;
+ protected int pageStep;
+ protected Preview preview;
+
+ public BrowseAction(final Preview preview, final JLabel pageNumber, final int pageStep) {
+ super();
+ this.preview = preview;
+ this.pageStep = pageStep;
+ this.pageNumber = pageNumber;
+ pageIndexPainter = new Runnable() {
+ public void run() {
+ paintPageIndex();
+ }
+ };
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ preview.moveIndex(pageStep);
+ paintPageIndex();
+ preview.repaint();
+ EventQueue.invokeLater(pageIndexPainter);
+ }
+
+ private String getPageIndexText() {
+ return "- " + String.valueOf(1 + preview.getPageIndex()) + " -";
+ }
+
+ private void paintPageIndex() {
+ pageNumber.setText(getPageIndexText());
+ pageNumber.paintImmediately(0, 0, pageNumber.getWidth(), pageNumber.getHeight());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/FitMap.java b/freeplane/src/org/freeplane/features/print/FitMap.java
new file mode 100644
index 0000000..7e67ebb
--- /dev/null
+++ b/freeplane/src/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;
+ 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
new file mode 100644
index 0000000..1996401
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PageAction.java
@@ -0,0 +1,188 @@
+/*
+ * 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
new file mode 100644
index 0000000..b00c913
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/Preview.java
@@ -0,0 +1,127 @@
+/*
+ * 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/org/freeplane/features/print/PreviewDialog.java
new file mode 100644
index 0000000..c83135c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PreviewDialog.java
@@ -0,0 +1,112 @@
+/*
+ * Preview Dialog - A Preview Dialog for your Swing Applications Copyright (C)
+ * 2003 Jens Kaiser. Created by Dimitry Polivaev. 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.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.print.Printable;
+import java.net.URL;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.UITools;
+
+class PreviewDialog extends JDialog implements ActionListener {
+ final private static double DEFAULT_ZOOM_FACTOR_STEP = Math.sqrt(2);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JLabel pageNumber;
+ protected Printable view;
+
+ public PreviewDialog(final PrintController printController, final String title, final Component c) {
+ super(JOptionPane.getFrameForComponent(c), title, true);
+ view = (Printable) c;
+ final Rectangle desktopBounds = UITools.getDesktopBounds(c);
+ Dimension previewSize = new Dimension(desktopBounds.width * 3/4, desktopBounds.height * 3/4);
+ final Preview preview = new Preview(printController, view, previewSize );
+ final JScrollPane scrollPane = new JScrollPane(preview, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+ UITools.setScrollbarIncrement(scrollPane);
+ getContentPane().add(scrollPane, "Center");
+ final JToolBar toolbar = new FreeplaneToolBar("preview_toolbar", SwingConstants.HORIZONTAL);
+ getContentPane().add(toolbar, "North");
+ pageNumber = new JLabel("- 9999 -");
+ final JButton button = getButton("Back24.gif", new BrowseAction(preview, pageNumber, -1));
+ toolbar.add(button);
+ pageNumber.setPreferredSize(new Dimension(pageNumber.getPreferredSize().width, button.getPreferredSize().height));
+ pageNumber.setText("- 1 -");
+ pageNumber.setHorizontalAlignment(SwingConstants.CENTER);
+ toolbar.add(pageNumber);
+ toolbar.add(getButton("Forward24.gif", new BrowseAction(preview, pageNumber, 1)));
+ toolbar.add(new JToolBar.Separator());
+ toolbar.add(getButton("ZoomIn24.png", new ZoomAction(preview, PreviewDialog.DEFAULT_ZOOM_FACTOR_STEP)));
+ toolbar.add(getButton("ZoomOut24.png", new ZoomAction(preview, 1.0/PreviewDialog.DEFAULT_ZOOM_FACTOR_STEP)));
+ toolbar.add(new JToolBar.Separator());
+ final JPanel buttons = new JPanel();
+ buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ final JButton ok = new JButton("OK");
+ ok.addActionListener(this);
+ buttons.add(ok);
+ getContentPane().add(buttons, "South");
+ UITools.addEscapeActionToDialog(this);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ dispose();
+ }
+
+ private JButton getButton(final String iconName, final AbstractAction action) {
+ return getButton(null, iconName, action);
+ }
+
+ private JButton getButton(final String name, final String iconName, final AbstractAction action) {
+ JButton result = null;
+ ImageIcon icon = null;
+ final URL imageURL = ResourceController.getResourceController().getResource("/images/" + iconName);
+ if (imageURL != null) {
+ icon = new ImageIcon(imageURL);
+ }
+ if (action != null) {
+ if (icon != null) {
+ action.putValue(Action.SMALL_ICON, new ImageIcon(imageURL));
+ }
+ if (name != null) {
+ action.putValue(Action.NAME, name);
+ }
+ result = new JButton(action);
+ }
+ else {
+ result = new JButton(name, icon);
+ }
+ return result;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/PrintAction.java b/freeplane/src/org/freeplane/features/print/PrintAction.java
new file mode 100644
index 0000000..f2a30a9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PrintAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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.event.ActionEvent;
+import java.awt.print.Printable;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+
+class PrintAction extends AbstractPrintAction {
+ static final String NAME = "print";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+ final private boolean isDlg;
+
+ PrintAction( final PrintController printController, final boolean isDlg) {
+ this("PrintAction", printController, isDlg);
+ }
+
+ public PrintAction(final String key, final PrintController printController,
+ final boolean isDlg) {
+ super(key, printController);
+// this.controller = controller;
+ this.isDlg = isDlg;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final PrintController printController = getPrintController();
+ try {
+ printController.print((Printable) Controller.getCurrentController().getViewController().getMapView(), isDlg);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/PrintController.java b/freeplane/src/org/freeplane/features/print/PrintController.java
new file mode 100644
index 0000000..c13b3bd
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PrintController.java
@@ -0,0 +1,182 @@
+/*
+ * 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.print;
+
+import java.awt.Component;
+import java.awt.print.PageFormat;
+import java.awt.print.Paper;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MapView;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class PrintController implements IExtension {
+ public static PrintController getController() {
+ Controller controller = Controller.getCurrentController();
+ return (PrintController) controller.getExtension(PrintController.class);
+ }
+
+ public static void install() {
+ Controller controller = Controller.getCurrentController();
+ controller.addExtension(PrintController.class, new PrintController());
+ }
+
+// // final private Controller controller;
+ final private PageAction pageAction;
+ private PageFormat pageFormat = null;
+ final private PrintAction printAction;
+ final private PrintDirectAction printDirectAction;
+ private PrinterJob printerJob = null;
+ private boolean printingAllowed;
+ final private PrintPreviewAction printPreviewAction;
+
+ public PrintController() {
+ super();
+ Controller controller = Controller.getCurrentController();
+// this.controller = controller;
+ printAction = new PrintAction(this, true);
+ printDirectAction = new PrintDirectAction(this);
+ printPreviewAction = new PrintPreviewAction(this);
+ pageAction = new PageAction(this);
+ controller.addAction(printAction);
+ controller.addAction(printDirectAction);
+ controller.addAction(printPreviewAction);
+ controller.addAction(pageAction);
+ printingAllowed = true;
+ }
+
+ boolean acquirePrinterJobAndPageFormat(boolean showDlg) {
+ if (printerJob == null || showDlg && Compat.isWindowsOS()) {
+ try {
+ printerJob = PrinterJob.getPrinterJob();
+ }
+ catch (final SecurityException ex) {
+ printAction.setEnabled(false);
+ printDirectAction.setEnabled(false);
+ printPreviewAction.setEnabled(false);
+ pageAction.setEnabled(false);
+ printingAllowed = false;
+ return false;
+ }
+ }
+ return true;
+ }
+
+ PageFormat getPageFormat() {
+ if (pageFormat == null) {
+ pageFormat = printerJob.defaultPage();
+ String pageSettings = ResourceController.getResourceController().getProperty("pageSettings", null);
+ if(pageSettings == null){
+ return pageFormat;
+ }
+ ParsePosition pos = new ParsePosition(0);
+ NumberFormat parser = DecimalFormat.getInstance(Locale.US);
+ Number pageFormatX = parser.parse(pageSettings, pos);
+ if(pos.getErrorIndex() != -1 || pageFormatX == null)
+ return pageFormat;
+ pos.setIndex(pos.getIndex()+1);
+ Number pageFormatY = parser.parse(pageSettings, pos);
+ if(pos.getErrorIndex() != -1|| pageFormatY == null)
+ return pageFormat;
+ pos.setIndex(pos.getIndex()+1);
+ Number pageFormatWidth = parser.parse(pageSettings, pos);
+ if(pos.getErrorIndex() != -1 || pageFormatWidth == null)
+ return pageFormat;
+ pos.setIndex(pos.getIndex()+1);
+ Number pageFormatHeight = parser.parse(pageSettings, pos);
+ if(pos.getErrorIndex() != -1 || pageFormatHeight == null)
+ return pageFormat;
+ pos.setIndex(pos.getIndex()+1);
+ Number pageFormatOrientation = parser.parse(pageSettings, pos);
+ if(pos.getErrorIndex() != -1 || pageFormatOrientation == null)
+ return pageFormat;
+ Paper paper = (Paper) pageFormat.getPaper().clone();
+ paper.setImageableArea(pageFormatX.doubleValue(), pageFormatY.doubleValue(), pageFormatWidth.doubleValue(), pageFormatHeight.doubleValue());
+ pageFormat.setOrientation(pageFormatOrientation.intValue());
+ pageFormat.setPaper(paper);
+ }
+ return pageFormat;
+ }
+
+ private PrinterJob getPrinterJob() {
+ return printerJob;
+ }
+
+ public boolean isEnabled() {
+ return printingAllowed;
+ }
+
+ public void pageDialog() {
+ this.pageFormat = getPrinterJob().pageDialog(getPageFormat());
+ Paper paper = pageFormat.getPaper();
+ StringBuilder sb = new StringBuilder();
+ NumberFormat format = DecimalFormat.getInstance(Locale.US);
+ double pageFormatX = paper.getImageableX(); sb.append(format.format(pageFormatX));sb.append(' ');
+ double pageFormatY = paper.getImageableY(); sb.append(format.format(pageFormatY));sb.append(' ');
+ double pageFormatWidth = paper.getImageableWidth(); sb.append(format.format(pageFormatWidth));sb.append(' ');
+ double pageFormatHeight = paper.getImageableHeight(); sb.append(format.format(pageFormatHeight));sb.append(' ');
+ int pageFormatOrientation = pageFormat.getOrientation(); sb.append(format.format(pageFormatOrientation));
+ ResourceController.getResourceController().setProperty("pageSettings", sb.toString());
+ }
+
+ public boolean printDialog() {
+ return getPrinterJob().printDialog();
+ }
+
+ public void print(Printable mapView, boolean showDlg) throws PrinterException {
+ if (!acquirePrinterJobAndPageFormat(showDlg)) {
+ return;
+ }
+ getPrinterJob().setPrintable(mapView, getPageFormat());
+ if(! showDlg || printDialog()){
+ if(mapView instanceof MapView)
+ ((MapView)mapView).preparePrinting();
+ try{
+ final PrinterJob printerJob = getPrinterJob();
+ if (mapView instanceof Component){
+ final String name = ((Component)mapView).getName();
+ if(name != null)
+ printerJob.setJobName(name);
+ }
+ printerJob.print();
+ }
+ catch(PrinterException ex){
+ LogUtils.warn(ex);
+ }
+ finally{
+ if(mapView instanceof MapView)
+ ((MapView)mapView).endPrinting();
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/PrintDirectAction.java b/freeplane/src/org/freeplane/features/print/PrintDirectAction.java
new file mode 100644
index 0000000..33aa870
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PrintDirectAction.java
@@ -0,0 +1,12 @@
+package org.freeplane.features.print;
+
+class PrintDirectAction extends PrintAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ PrintDirectAction( final PrintController printController) {
+ super("PrintDirectAction", printController, false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/PrintPreviewAction.java b/freeplane/src/org/freeplane/features/print/PrintPreviewAction.java
new file mode 100644
index 0000000..b834bfe
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/PrintPreviewAction.java
@@ -0,0 +1,54 @@
+/*
+ * 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.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+class PrintPreviewAction extends AbstractPrintAction {
+ static final String NAME = "printPreview";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+
+ PrintPreviewAction( final PrintController printController) {
+ super("PrintPreviewAction", printController);
+// this.controller = controller;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (!getPrintController().acquirePrinterJobAndPageFormat(false)) {
+ return;
+ }
+ final Component mapView = Controller.getCurrentController().getViewController().getMapView();
+ final PreviewDialog previewDialog = new PreviewDialog(getPrintController(), TextUtils
+ .getText("print_preview_title"), mapView);
+ previewDialog.pack();
+ previewDialog.setLocationRelativeTo(JOptionPane.getFrameForComponent(mapView));
+ previewDialog.setVisible(true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/ZoomAction.java b/freeplane/src/org/freeplane/features/print/ZoomAction.java
new file mode 100644
index 0000000..32594f7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/print/ZoomAction.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.print;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+class ZoomAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ protected Preview preview;
+ protected double zoomStep;
+
+ public ZoomAction(final Preview preview, final double zoomStep) {
+ super();
+ this.preview = preview;
+ this.zoomStep = zoomStep;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ preview.changeZoom(zoomStep);
+ preview.repaint();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/script/IScriptEditorStarter.java b/freeplane/src/org/freeplane/features/script/IScriptEditorStarter.java
new file mode 100644
index 0000000..efbb8e7
--- /dev/null
+++ b/freeplane/src/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);
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/script/IScriptStarter.java b/freeplane/src/org/freeplane/features/script/IScriptStarter.java
new file mode 100644
index 0000000..801e679
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/script/IScriptStarter.java
@@ -0,0 +1,31 @@
+/*
+ * 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 org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 31, 2011
+ */
+public interface IScriptStarter extends IExtension{
+ void executeScript(final NodeModel node, final String script);
+}
diff --git a/freeplane/src/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java b/freeplane/src/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java
new file mode 100644
index 0000000..989588c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java
@@ -0,0 +1,179 @@
+/*
+ * 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.spellchecker.mindmapmode;
+
+import java.awt.EventQueue;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.net.MalformedURLException;
+import java.util.Locale;
+
+import javax.swing.JPopupMenu;
+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.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+import com.inet.jortho.FileUserDictionary;
+import com.inet.jortho.LanguageChangeEvent;
+import com.inet.jortho.LanguageChangeListener;
+import com.inet.jortho.SpellChecker;
+import com.inet.jortho.SpellCheckerOptions;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 8, 2009
+ */
+public class SpellCheckerController implements IExtension {
+ private static final String SPELLING_LANGUAGE = "spelling_language";
+
+ public static SpellCheckerController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return (SpellCheckerController) modeController.getExtension(SpellCheckerController.class);
+ }
+
+ public static void install(final ModeController modeController) {
+ modeController.addExtension(SpellCheckerController.class, new SpellCheckerController());
+ }
+
+ private boolean spellCheckerEnabled = false;
+ private boolean spellCheckerInitialized = false;
+ private LanguageChangeListener languageChangeListener;
+
+ private SpellCheckerController() {
+ }
+
+ public void addSpellCheckerMenu(final JPopupMenu popupMenu) {
+ if (!isSpellCheckerActive()) {
+ return;
+ }
+ popupMenu.add(SpellChecker.createCheckerMenu());
+ popupMenu.add(SpellChecker.createLanguagesMenu());
+ }
+
+ public void enableAutoSpell(final JTextComponent editorPane, final boolean enable) {
+ if (!isSpellCheckerActive()) {
+ return;
+ }
+ SpellChecker.enableAutoSpell(editorPane, enable);
+ }
+
+ public void enableShortKey(final JTextComponent editorPane, final boolean enable) {
+ if (!isSpellCheckerActive()) {
+ return;
+ }
+ SpellChecker.enableShortKey(editorPane, enable);
+ }
+
+ private void init() {
+ if (spellCheckerInitialized == true) {
+ return;
+ }
+ spellCheckerInitialized = true;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final File orthoDir = new File(resourceController.getResourceBaseDir() + File.separatorChar + "ortho");
+ registerDictionaries(orthoDir);
+ final File userOrthoDir = new File(resourceController.getFreeplaneUserDirectory() + File.separatorChar + "ortho");
+ registerDictionaries(userOrthoDir);
+ if (!spellCheckerEnabled) {
+ return;
+ }
+ setSpellCheckOptions(resourceController);
+ resourceController.addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.startsWith("spelling_opt")) {
+ setSpellCheckOptions(resourceController);
+ }
+ }
+ });
+ String spellingLanguage = resourceController.getProperty(SPELLING_LANGUAGE, null);
+ if (spellingLanguage == null) {
+ spellingLanguage = resourceController.getLanguageCode();
+ }
+ if (!spellingLanguage.equals("disabled")) {
+ SpellChecker.setLanguage(spellingLanguage);
+ }
+ languageChangeListener = new LanguageChangeListener() {
+ public void languageChanged(final LanguageChangeEvent ev) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final Locale currentLocale = ev.getCurrentLocale();
+ if (currentLocale == null) {
+ resourceController.setProperty(SPELLING_LANGUAGE, "disabled");
+ return;
+ }
+ resourceController.setProperty(SPELLING_LANGUAGE, currentLocale.getLanguage());
+ }
+ });
+ }
+ };
+ SpellChecker.addLanguageChangeLister(languageChangeListener);
+ }
+
+ private void registerDictionaries(final File orthoDir) {
+ if(! orthoDir.isDirectory())
+ return;
+ final String[] dictionaryList = orthoDir.list(new FilenameFilter() {
+ public boolean accept(final File dir, final String name) {
+ return name.length() == "dictionary_XX.ortho".length() && name.startsWith("dictionary_")
+ && name.endsWith(".ortho");
+ }
+ });
+ if (dictionaryList.length == 0) {
+ return;
+ }
+ final ResourceController resourceController = ResourceController.getResourceController();
+ SpellChecker.setUserDictionaryProvider(new FileUserDictionary(resourceController.getFreeplaneUserDirectory()));
+ final StringBuilder availableLocales = new StringBuilder();
+ for (int i = 0; i < dictionaryList.length; i++) {
+ final String language = dictionaryList[i].substring("dictionary_".length(), "dictionary_".length() + 2);
+ availableLocales.append(language);
+ availableLocales.append(",");
+ }
+ try {
+ SpellChecker.registerDictionaries(orthoDir.toURL(), availableLocales.toString(), null, ".ortho");
+ spellCheckerEnabled = true;
+ }
+ catch (final MalformedURLException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ private void setSpellCheckOptions(final ResourceController resourceController) {
+ final SpellCheckerOptions options = SpellChecker.getOptions();
+ options.setCaseSensitive(resourceController.getBooleanProperty("spelling_opt_case_sensitive"));
+ options.setIgnoreAllCapsWords(resourceController.getBooleanProperty("spelling_opt_ignore_all_caps_words"));
+ options.setIgnoreCapitalization(resourceController.getBooleanProperty("spelling_opt_ignore_capitalization"));
+ options.setIgnoreWordsWithNumbers(resourceController
+ .getBooleanProperty("spelling_opt_ignore_words_with_numbers"));
+ options.setSuggestionsLimitDialog(resourceController
+ .getIntProperty("spelling_opt_suggestions_limit_dialog", 15));
+ options.setSuggestionsLimitMenu(resourceController.getIntProperty("spelling_opt_suggestions_limit_menu", 15));
+ }
+
+ public boolean isSpellCheckerActive() {
+ init();
+ return spellCheckerEnabled;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java b/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java
new file mode 100644
index 0000000..034656a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java
@@ -0,0 +1,7 @@
+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
new file mode 100644
index 0000000..3ef974d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/AutomaticLayoutController.java
@@ -0,0 +1,92 @@
+/*
+ * 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
new file mode 100644
index 0000000..f89fe41
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/ConditionalStyleModel.java
@@ -0,0 +1,258 @@
+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/IStyle.java b/freeplane/src/org/freeplane/features/styles/IStyle.java
new file mode 100644
index 0000000..6d9a4c5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/IStyle.java
@@ -0,0 +1,4 @@
+package org.freeplane.features.styles;
+
+public interface IStyle {
+}
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java b/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java
new file mode 100644
index 0000000..9fb326f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java
@@ -0,0 +1,391 @@
+/*
+ * 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
new file mode 100644
index 0000000..3062478
--- /dev/null
+++ b/freeplane/src/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.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/LogicalStyleKeys.java b/freeplane/src/org/freeplane/features/styles/LogicalStyleKeys.java
new file mode 100644
index 0000000..4a0742a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/LogicalStyleKeys.java
@@ -0,0 +1,5 @@
+package org.freeplane.features.styles;
+
+public enum LogicalStyleKeys {
+ NODE_STYLE, LOGICAL_STYLE;
+}
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleModel.java b/freeplane/src/org/freeplane/features/styles/LogicalStyleModel.java
new file mode 100644
index 0000000..c5be300
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/LogicalStyleModel.java
@@ -0,0 +1,61 @@
+/*
+ * 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 org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 28.09.2009
+ */
+public class LogicalStyleModel implements IExtension {
+ private IStyle style;
+
+ public IStyle getStyle() {
+ return style;
+ }
+
+ public void setStyle(final IStyle style) {
+ this.style = style;
+ }
+
+ static public LogicalStyleModel getExtension(final NodeModel node) {
+ return (LogicalStyleModel) node.getExtension(LogicalStyleModel.class);
+ }
+
+ static public IStyle getStyle(final NodeModel node) {
+ final LogicalStyleModel extension = LogicalStyleModel.getExtension(node);
+ if (extension == null) {
+ return null;
+ }
+ final IStyle style = extension.getStyle();
+ return style;
+ }
+
+ static public LogicalStyleModel createExtension(final NodeModel node) {
+ LogicalStyleModel extension = (LogicalStyleModel) node.getExtension(LogicalStyleModel.class);
+ if (extension == null) {
+ extension = new LogicalStyleModel();
+ node.addExtension(extension);
+ }
+ return extension;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/MapStyle.java b/freeplane/src/org/freeplane/features/styles/MapStyle.java
new file mode 100644
index 0000000..228d22f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/MapStyle.java
@@ -0,0 +1,544 @@
+/*
+ * 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.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);
+ condition = conditionFactory.loadCondition(conditionElement);
+ }
+ 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/MapStyleModel.java b/freeplane/src/org/freeplane/features/styles/MapStyleModel.java
new file mode 100644
index 0000000..a67e850
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/MapStyleModel.java
@@ -0,0 +1,310 @@
+/*
+ * 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/MapViewLayout.java b/freeplane/src/org/freeplane/features/styles/MapViewLayout.java
new file mode 100644
index 0000000..60e78bb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/MapViewLayout.java
@@ -0,0 +1,8 @@
+/**
+ *
+ */
+package org.freeplane.features.styles;
+
+public enum MapViewLayout {
+ MAP, OUTLINE
+}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleCondition.java b/freeplane/src/org/freeplane/features/styles/StyleCondition.java
new file mode 100644
index 0000000..813760e
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..8e55ebe
--- /dev/null
+++ b/freeplane/src/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 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
new file mode 100644
index 0000000..e9fb7d3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/StyleFactory.java
@@ -0,0 +1,13 @@
+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
new file mode 100644
index 0000000..12a5db4
--- /dev/null
+++ b/freeplane/src/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);
+ }
+}
\ 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
new file mode 100644
index 0000000..39ebeec
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/StyleNamedObject.java
@@ -0,0 +1,56 @@
+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/StyleNode.java b/freeplane/src/org/freeplane/features/styles/StyleNode.java
new file mode 100644
index 0000000..5f21b42
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/StyleNode.java
@@ -0,0 +1,23 @@
+package org.freeplane.features.styles;
+
+import org.freeplane.features.map.NodeModel;
+
+public class StyleNode implements IStyle {
+ final private NodeModel node;
+
+ public NodeModel getNode() {
+ return node;
+ }
+
+ public StyleNode(NodeModel node) {
+ super();
+ this.node = node;
+ }
+
+ @Override
+ public String toString() {
+ return node.toString();
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleString.java b/freeplane/src/org/freeplane/features/styles/StyleString.java
new file mode 100644
index 0000000..b6d9f2e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/StyleString.java
@@ -0,0 +1,38 @@
+package org.freeplane.features.styles;
+
+public class StyleString implements IStyle {
+ final private String string;
+
+ public StyleString(String string) {
+ super();
+ if(string == null)
+ throw new IllegalArgumentException("null");
+ this.string = 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 string.equals(((StyleString)obj).string);
+ }
+
+ @Override
+ public int hashCode() {
+ return string.hashCode() + 37 * StyleString.class.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return string;
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
new file mode 100644
index 0000000..9a11b90
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
@@ -0,0 +1,144 @@
+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
new file mode 100644
index 0000000..e49a817
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..2596c3d
--- /dev/null
+++ b/freeplane/src/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;
+ }
+}
\ 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
new file mode 100644
index 0000000..06670a9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java
@@ -0,0 +1,126 @@
+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"));
+ 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/CopyMapStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java
new file mode 100644
index 0000000..717e1fe
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java
@@ -0,0 +1,72 @@
+/*
+ * 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.event.ActionEvent;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.JFileChooser;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 12, 2009
+ */
+ at SuppressWarnings("serial")
+class CopyMapStylesAction extends AFreeplaneAction {
+ CopyMapStylesAction() {
+ super("CopyMapStylesAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final ModeController modeController = controller.getModeController();
+ final MFileManager fileManager = MFileManager.getController(modeController);
+ final JFileChooser fileChooser = fileManager.getFileChooser(true);
+ fileChooser.setMultiSelectionEnabled(false);
+ final int returnVal = fileChooser.showOpenDialog(controller.getViewController().getMapView());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ File file = fileChooser.getSelectedFile();
+ if(! file.exists()){
+ return;
+ }
+ try {
+ final URL url = Compat.fileToUrl(file);
+ final MapModel map = controller.getMap();
+ MapStyle mapStyleController = MapStyle.getController(modeController);
+ mapStyleController.copyStyle(url, map, true);
+ }
+ catch (MalformedURLException e1) {
+ e1.printStackTrace();
+ }
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java
new file mode 100644
index 0000000..338c039
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java
@@ -0,0 +1,48 @@
+/*
+ * 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.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.styles.IStyle;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 22, 2011
+ */
+public class CopyStyleExtensionsAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CopyStyleExtensionsAction() {
+ super("CopyStyleExtensionsAction");
+ }
+
+ @Override
+ protected void actionPerformed(ActionEvent e, NodeModel node) {
+ final MLogicalStyleController controller = MLogicalStyleController.getController();
+ final IStyle firstStyle = controller.getFirstStyle(node);
+ controller.copyStyleExtensions(firstStyle, node);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java
new file mode 100644
index 0000000..aa7fc31
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java
@@ -0,0 +1,24 @@
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellRenderer;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.MapStyleModel;
+
+public class DefaultStyleRenderer implements TableCellRenderer {
+ private TableCellRenderer renderer = new DefaultTableCellRenderer();
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+ int row, int column) {
+ final MapStyleModel styles = ((ConditionalStyleTable)table).getStyles();
+ final NodeModel styleNode = styles.getStyleNode((IStyle)value);
+ if (styleNode == null){
+ value = MapStyleModel.DEFAULT_STYLE;
+ }
+ return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java
new file mode 100644
index 0000000..aa7736a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java
@@ -0,0 +1,28 @@
+package org.freeplane.features.styles.mindmapmode;
+
+import java.util.List;
+
+import org.freeplane.core.resources.components.EditableComboProperty;
+import org.freeplane.features.format.PatternFormat;
+
+public class EditablePatternComboProperty extends EditableComboProperty<PatternFormat> {
+ private PatternFormat defaultPattern;
+
+ public EditablePatternComboProperty(final String name, PatternFormat defaultPattern, List<PatternFormat> values) {
+ super(name, values);
+ this.defaultPattern = defaultPattern;
+ }
+
+ @Override
+ public PatternFormat toValueObject(Object value) {
+ if (value instanceof PatternFormat)
+ return (PatternFormat) value;
+ final PatternFormat patternFormat = PatternFormat.guessPatternFormat(value.toString());
+ return (patternFormat == null) ? defaultPattern : patternFormat;
+ }
+
+ public String getSelectedPattern() {
+ final PatternFormat selected = getSelected();
+ return selected == null ? null : selected.getPattern();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java
new file mode 100644
index 0000000..51d4f4a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java
@@ -0,0 +1,62 @@
+package org.freeplane.features.styles.mindmapmode;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.DefaultComboBoxModel;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.AFilterComposerDialog;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+
+ at SuppressWarnings("serial")
+class FilterComposerDialog extends AFilterComposerDialog{
+
+ public FilterComposerDialog() {
+ super(TextUtils.getText("filter_dialog"), true);
+ conditions = new LinkedList<ASelectableCondition>();
+ }
+
+ protected DefaultComboBoxModel createModel() {
+ conditions.clear();
+ initializeModel();
+ return model;
+ }
+
+ protected void initializeModel() {
+ if(model == null){
+ model = new DefaultComboBoxModel();
+ }
+ }
+
+ protected boolean applyModel(DefaultComboBoxModel model, int[] selectedIndices) {
+ if(selectedIndices.length != 1 && ! acceptMultipleConditions){
+ return false;
+ }
+ conditions.clear();
+ this.model = model;
+ for(int i : selectedIndices){
+ conditions.add((ASelectableCondition) model.getElementAt(i));
+ }
+ return true;
+ }
+
+ final private List<ASelectableCondition> conditions ;
+ private DefaultComboBoxModel model;
+ private boolean acceptMultipleConditions;
+
+ public List<ASelectableCondition> getConditions() {
+ return conditions;
+ }
+
+ public void acceptMultipleConditions(boolean acceptMultipleConditions) {
+ this.acceptMultipleConditions = acceptMultipleConditions;
+ }
+
+ public void addCondition(ASelectableCondition value) {
+ initializeModel();
+ if (model.getIndexOf(value) == -1){
+ model.addElement(value);
+ }
+ setSelectedItem(value);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
new file mode 100644
index 0000000..6d1b954
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
@@ -0,0 +1,509 @@
+/*
+ * 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.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());
+ }
+ final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().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
new file mode 100644
index 0000000..2b7d820
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/MUIFactory.java
@@ -0,0 +1,247 @@
+/*
+ * 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/ManageMapConditionalStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java
new file mode 100644
index 0000000..71b3bde
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java
@@ -0,0 +1,81 @@
+/*
+ * 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.mode.Controller;
+import org.freeplane.features.styles.ConditionalStyleModel;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 21, 2011
+ */
+public class ManageMapConditionalStylesAction extends AManageConditionalStylesAction{
+
+ public static final String NAME = "ManageConditionalStylesAction";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ManageMapConditionalStylesAction() {
+ 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);
+ Controller.getCurrentModeController().startTransaction();
+ try{
+ final int confirmed = JOptionPane.showConfirmDialog(controller.getViewController().getMapView(), pane, TextUtils.getText(TextUtils.removeMnemonic("ManageConditionalStylesAction.text")), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
+ if(JOptionPane.OK_OPTION == confirmed){
+ LogicalStyleController.getController().refreshMap(map);
+ Controller.getCurrentModeController().commit();
+ }
+ else{
+ Controller.getCurrentModeController().rollback();
+
+ }
+ }
+ catch(RuntimeException ex){
+ ex.printStackTrace();
+ Controller.getCurrentModeController().rollback();
+ }
+ }
+
+ @Override
+ public ConditionalStyleModel getConditionalStyleModel() {
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ final ConditionalStyleModel conditionalStyleModel = styleModel.getConditionalStyleModel();
+ return conditionalStyleModel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
new file mode 100644
index 0000000..842865a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
@@ -0,0 +1,85 @@
+/*
+ * 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.getViewController().getMapView(), 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
new file mode 100644
index 0000000..7373d88
--- /dev/null
+++ b/freeplane/src/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();
+ 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
new file mode 100644
index 0000000..a0c8a2f
--- /dev/null
+++ b/freeplane/src/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.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/PatternProperty.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/PatternProperty.java
new file mode 100644
index 0000000..ba738d7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/PatternProperty.java
@@ -0,0 +1,26 @@
+package org.freeplane.features.styles.mindmapmode;
+
+public class PatternProperty implements Cloneable {
+ protected String value;
+
+ public PatternProperty() {
+ }
+
+ public PatternProperty(final String value) {
+ super();
+ this.value = value;
+ }
+
+ @Override
+ protected Object clone() {
+ return new PatternProperty(value);
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(final String value) {
+ this.value = value;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java
new file mode 100644
index 0000000..d0a1548
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java
@@ -0,0 +1,31 @@
+package org.freeplane.features.styles.mindmapmode;
+
+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.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.styles.MapStyleModel;
+
+public class RedefineStyleAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public RedefineStyleAction() {
+ super("RedefineStyleAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentController().getSelection().getSelected();
+ final IStyle style = LogicalStyleController.getController().getFirstStyle(node);
+ final MapStyleModel extension = MapStyleModel.getExtension(node.getMap());
+ final NodeModel styleNode = extension.getStyleNode(style);
+ if(styleNode == null)
+ return;
+ Controller.getCurrentModeController().undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, node, styleNode);
+ Controller.getCurrentModeController().undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, node);
+ LogicalStyleController.getController().refreshMap(node.getMap());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java
new file mode 100644
index 0000000..ee27d7f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java
@@ -0,0 +1,71 @@
+/*
+ * 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/ShowFormatPanelAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java
new file mode 100644
index 0000000..2439259
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java
@@ -0,0 +1,35 @@
+/*
+ * 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.styles.mindmapmode;
+
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.ui.ToggleToolbarAction;
+
+ at SelectableAction(checkOnPopup = true)
+public class ShowFormatPanelAction extends ToggleToolbarAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public ShowFormatPanelAction() {
+ super("ShowFormatPanel", "/format");
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
new file mode 100644
index 0000000..1b029c3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
@@ -0,0 +1,1067 @@
+/*
+ * 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.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;
+ 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() {
+ 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/AbstractContentTransformer.java b/freeplane/src/org/freeplane/features/text/AbstractContentTransformer.java
new file mode 100644
index 0000000..b77568f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/AbstractContentTransformer.java
@@ -0,0 +1,23 @@
+package org.freeplane.features.text;
+
+public abstract class AbstractContentTransformer implements IContentTransformer {
+ private int priority;
+
+ public AbstractContentTransformer(int priority) {
+ this.priority = priority;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+
+ public int compareTo(IContentTransformer that) {
+ int thatPriority = that.getPriority();
+ return (this.priority < thatPriority ? -1 : (this.priority == thatPriority ? 0 : 1));
+ }
+
+ public boolean markTransformation() {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/DetailTextModel.java b/freeplane/src/org/freeplane/features/text/DetailTextModel.java
new file mode 100644
index 0000000..3194a10
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/DetailTextModel.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.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
new file mode 100644
index 0000000..21ab7f5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/FormatContentTransformer.java
@@ -0,0 +1,99 @@
+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.equals(node))
+ break;
+ if(textController.getNodeNumbering(child))
+ counter++;
+ }
+ builder.append(counter);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/HighlightedTransformedObject.java b/freeplane/src/org/freeplane/features/text/HighlightedTransformedObject.java
new file mode 100644
index 0000000..fab89cd
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/HighlightedTransformedObject.java
@@ -0,0 +1,43 @@
+/*
+ * 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.text;
+
+/**
+ * @author Dimitry Polivaev
+ * 04.05.2012
+ */
+public class HighlightedTransformedObject {
+
+ final private Object object;
+ public Object getObject() {
+ return object;
+ }
+
+ public HighlightedTransformedObject(Object object) {
+ this.object = object;
+ }
+
+ @Override
+ public String toString() {
+ return object.toString();
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/IContentTransformer.java b/freeplane/src/org/freeplane/features/text/IContentTransformer.java
new file mode 100644
index 0000000..4a029be
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/IContentTransformer.java
@@ -0,0 +1,15 @@
+package org.freeplane.features.text;
+
+import org.freeplane.features.map.NodeModel;
+
+public interface IContentTransformer extends Comparable<IContentTransformer> {
+
+ Object transformContent(TextController textController, Object content, NodeModel node, Object transformedExtension) throws TransformationException;
+
+ /** used for determining the transformer sequence when more than one transformer is present.
+ * Transformers are sorted by priority numerically, that is the transformer with the least priority value
+ * comes first. */
+ int getPriority();
+
+ boolean markTransformation();
+}
diff --git a/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.java b/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.java
new file mode 100644
index 0000000..b5df9bb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.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.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
new file mode 100644
index 0000000..7e29f4d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/MatchCaseNoteContainsCondition.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.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
new file mode 100644
index 0000000..66776f6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/NodeContainsCondition.java
@@ -0,0 +1,95 @@
+/*
+ * 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/NodeMatchesRegexpCondition.java b/freeplane/src/org/freeplane/features/text/NodeMatchesRegexpCondition.java
new file mode 100644
index 0000000..62496e0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/NodeMatchesRegexpCondition.java
@@ -0,0 +1,100 @@
+/*
+ * 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.text;
+
+import java.util.regex.Pattern;
+
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.CompareConditionAdapter;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeMatchesRegexpCondition extends ASelectableCondition {
+ static final String NAME = "node_matches_regexp";
+ static final String SEARCH_PATTERN = "SEARCH_PATTERN";
+
+ static ASelectableCondition load(final XMLElement element) {
+ final Boolean matchCase = Boolean.valueOf(element.getAttribute(NodeTextCompareCondition.MATCH_CASE, "false"));
+ final String searchPattern = element.getAttribute(SEARCH_PATTERN, null);
+ final String nodeItem = element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE);
+ return new NodeMatchesRegexpCondition(nodeItem, searchPattern, matchCase);
+ }
+
+ private final Pattern searchPattern;
+ final private String nodeItem;
+
+ public NodeMatchesRegexpCondition(String nodeItem, final String searchPattern) {
+ this(nodeItem, searchPattern, false);
+ }
+
+ public NodeMatchesRegexpCondition(String nodeItem, final String searchPattern, final boolean matchCase) {
+ super();
+ int flags = Pattern.DOTALL;
+ if (!matchCase) {
+ flags |= Pattern.CASE_INSENSITIVE;
+ }
+ this.searchPattern = Pattern.compile(searchPattern, flags);
+ this.nodeItem=nodeItem;
+ }
+
+ 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 String text) {
+ return searchPattern.matcher(text).find();
+ }
+
+ @Override
+ protected String createDescription() {
+ final String nodeCondition = TextUtils.getText(nodeItem);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_REGEXP);
+ return ConditionFactory.createDescription(nodeCondition, simpleCondition, searchPattern.pattern(),
+ isMatchCase(), false);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(SEARCH_PATTERN, searchPattern.pattern());
+ child.setAttribute(CompareConditionAdapter.MATCH_CASE, TreeXmlWriter.BooleanToXml(isMatchCase()));
+ child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
+ }
+
+ private boolean isMatchCase() {
+ return (searchPattern.flags() & Pattern.CASE_INSENSITIVE) == 0;
+ }
+
+ @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
new file mode 100644
index 0000000..5c13ce6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/NodeTextBuilder.java
@@ -0,0 +1,237 @@
+/*
+ * 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
new file mode 100644
index 0000000..9d70a9c
--- /dev/null
+++ b/freeplane/src/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 && 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
new file mode 100644
index 0000000..fe47175
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/NodeTextConditionController.java
@@ -0,0 +1,219 @@
+/*
+ * 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.ViewController;
+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 ViewController.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/NoteContainsCondition.java b/freeplane/src/org/freeplane/features/text/NoteContainsCondition.java
new file mode 100644
index 0000000..c28fd1a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/NoteContainsCondition.java
@@ -0,0 +1,56 @@
+/*
+ * 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.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NoteContainsCondition extends MatchCaseNoteContainsCondition {
+ static final String NAME = "note_contains_condition";
+ static final String VALUE = "VALUE";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new NoteContainsCondition(element.getAttribute(NoteContainsCondition.VALUE, null),
+ Boolean.valueOf(element.getAttribute(MatchCaseNoteContainsCondition.MATCH_APPROXIMATELY, null)));
+ }
+
+ protected boolean matchCase()
+ {
+ return false;
+ }
+
+ NoteContainsCondition(final String value, final boolean matchApproximately) {
+ super(value.toLowerCase(), matchApproximately);
+ }
+
+ @Override
+ protected String createDescription() {
+ return createDescription(false);
+ }
+
+ @Override
+ protected String getText(final NodeModel node) {
+ final String noteText = NoteModel.getNoteText(node);
+ return noteText == null ? null : HtmlUtils.htmlToPlain(noteText).toLowerCase();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/RichTextModel.java b/freeplane/src/org/freeplane/features/text/RichTextModel.java
new file mode 100644
index 0000000..9208b32
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/RichTextModel.java
@@ -0,0 +1,41 @@
+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
new file mode 100644
index 0000000..ea5383b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/SetShortenerStateAction.java
@@ -0,0 +1,70 @@
+/*
+ * 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.5f, 0.5f);
+ 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/org/freeplane/features/text/ShortenedTextModel.java
new file mode 100644
index 0000000..a153455
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/ShortenedTextModel.java
@@ -0,0 +1,54 @@
+/*
+ * 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 ShortenedTextModel implements IExtension {
+ public static final String SHORTENER = "SHORTENER";
+
+ public ShortenedTextModel() {
+ }
+
+ public static ShortenedTextModel createShortenedTextModel(final NodeModel node) {
+ ShortenedTextModel model = ShortenedTextModel.getShortenedTextModel(node);
+ if (model == null) {
+ model = new ShortenedTextModel();
+ node.addExtension(model);
+ }
+ return model;
+ }
+
+ public static ShortenedTextModel getShortenedTextModel(final NodeModel node) {
+ final ShortenedTextModel extension = (ShortenedTextModel) node.getExtension(ShortenedTextModel.class);
+ return extension;
+ }
+
+ public static boolean isShortened(final NodeModel node){
+ final ShortenedTextModel shortened = getShortenedTextModel(node);
+ return shortened != null ? true : false;
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/TextController.java b/freeplane/src/org/freeplane/features/text/TextController.java
new file mode 100644
index 0000000..7c81966
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/TextController.java
@@ -0,0 +1,357 @@
+/*
+ * 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 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 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 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.java b/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.java
new file mode 100644
index 0000000..9673003
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.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.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.5f, 0.5f);
+ 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/TransformationException.java b/freeplane/src/org/freeplane/features/text/TransformationException.java
new file mode 100644
index 0000000..2668c72
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/TransformationException.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Oct 2, 2011
+ */
+public class TransformationException extends Exception {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 2215371752714779025L;
+
+ public TransformationException() {
+ }
+
+ public TransformationException(String message) {
+ super(message);
+ }
+
+ public TransformationException(Throwable cause) {
+ super(cause);
+ }
+
+ public TransformationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
new file mode 100644
index 0000000..e6423c0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
@@ -0,0 +1,64 @@
+/*
+ * 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/EditAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditAction.java
new file mode 100644
index 0000000..e5f6fff
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditAction.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.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.features.text.TextController;
+
+class EditAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public EditAction() {
+ super("EditAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.actions.ActorXml#act(freeplane.controller.actions.
+ * generated.instance.XmlAction)
+ */
+ public void actionPerformed(final ActionEvent arg0) {
+ ((MTextController) TextController.getController()).edit(FirstAction.EDIT_CURRENT, false);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.java
new file mode 100644
index 0000000..8795e31
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.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.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.ViewController;
+
+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 ViewController viewController = controller.getViewController();
+ 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/EditLongAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditLongAction.java
new file mode 100644
index 0000000..0dd61d8
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditLongAction.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.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.features.text.TextController;
+
+class EditLongAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public EditLongAction() {
+ super("EditLongAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MTextController) TextController.getController()).edit(FirstAction.EDIT_CURRENT, true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java
new file mode 100644
index 0000000..13b83fb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java
@@ -0,0 +1,333 @@
+/*
+ * 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 static final long serialVersionUID = 1L;
+ 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:
+ textComponent.setCaretPosition(textComponent.viewToModel(new Point(0, 0)));
+ // 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
new file mode 100644
index 0000000..f7d6650
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeDialog.java
@@ -0,0 +1,346 @@
+/*
+ * 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.ViewController;
+
+/**
+ * @author foltin
+ */
+public class EditNodeDialog extends EditNodeBase {
+ private JTextComponent textComponent;
+ private final boolean enableSplit;
+
+ private class LongNodeDialog extends EditDialog {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public LongNodeDialog(final RootPaneContainer frame, final String title, final Color background) {
+ super(EditNodeDialog.this, title, frame);
+ final ViewController viewController = Controller.getCurrentModeController().getController()
+ .getViewController();
+ 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().getViewController().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
new file mode 100644
index 0000000..f53f4e9
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java
@@ -0,0 +1,324 @@
+/*
+ * 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 static final long serialVersionUID = 1L;
+ 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
new file mode 100644
index 0000000..6fabf12
--- /dev/null
+++ b/freeplane/src/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;
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java b/freeplane/src/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java
new file mode 100644
index 0000000..dced6eb
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java
@@ -0,0 +1,29 @@
+package org.freeplane.features.text.mindmapmode;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+
+import com.lightdev.app.shtm.SHTMLPrefsChangeListener;
+
+/**
+ * This class forwards changes in Freeplane pref properties that are relevant to simplyhtml
+ * ("simplyhtml.*") to a SHTMLPrefsChangeListener.
+ * @author Felix Natter
+ *
+ */
+public class FreeplaneToSHTMLPropertyChangeAdapter implements IFreeplanePropertyListener
+{
+ private final SHTMLPrefsChangeListener shtmlPrefsChangedListener;
+ public FreeplaneToSHTMLPropertyChangeAdapter(final SHTMLPrefsChangeListener shtmlPrefsChangeListener)
+ {
+ this.shtmlPrefsChangedListener = shtmlPrefsChangeListener;
+ }
+
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.startsWith("simplyhtml."))
+ {
+ final String shtmlProp = propertyName.substring("simplyhtml.".length());
+ shtmlPrefsChangedListener.shtmlPrefChanged(shtmlProp, newValue, oldValue);
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java b/freeplane/src/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java
new file mode 100644
index 0000000..1cb49df
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java
@@ -0,0 +1,10 @@
+package org.freeplane.features.text.mindmapmode;
+
+
+import org.freeplane.features.map.NodeModel;
+
+
+public interface IEditBaseCreator{
+ public EditNodeBase createEditor(final NodeModel nodeModel, final EditNodeBase.IEditControl editControl,
+ String text, final boolean editLong);
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java b/freeplane/src/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java
new file mode 100644
index 0000000..5a536a5
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java
@@ -0,0 +1,30 @@
+/*
+ * 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.text.mindmapmode;
+
+import javax.swing.JEditorPane;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 18, 2010
+ */
+public interface IEditorPaneListener {
+ void editorPaneCreated(JEditorPane editor, Object purpose);
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
new file mode 100644
index 0000000..66ec3f7
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
@@ -0,0 +1,47 @@
+/*
+ * 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
new file mode 100644
index 0000000..487f61d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/MTextController.java
@@ -0,0 +1,954 @@
+/*
+ * 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.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;
+ 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, false);
+ 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();
+ 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;
+ }
+ 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);
+ if(uri == null || ! "http".equals(uri.getScheme())){
+ UITools.errorMessage(TextUtils.format("file_not_found", input.toString()));
+ return;
+ }
+ }
+ else if (useRelativeUri) {
+ uri = LinkController.toRelativeURI(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.getViewController().getMapView());
+ 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 ViewController viewController = controller.getViewController();
+ final Component map = viewController.getMapView();
+ 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/SHTMLEditLinkAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java
new file mode 100644
index 0000000..3d4446b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java
@@ -0,0 +1,92 @@
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.Element;
+import javax.swing.text.html.HTML;
+
+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.mode.Controller;
+import com.lightdev.app.shtm.SHTMLEditorPane;
+import com.lightdev.app.shtm.SHTMLPanelImpl;
+import com.lightdev.app.shtm.SHTMLAction;
+
+
+public class SHTMLEditLinkAction extends AFreeplaneAction implements SHTMLAction {
+ /**
+ *
+ */
+ private final SHTMLPanelImpl panel;
+
+ public SHTMLEditLinkAction(final SHTMLPanelImpl panel) {
+ super("SetLinkByTextFieldAction");
+ this.panel = panel;
+ }
+
+ public void actionPerformed(final ActionEvent ae) {
+ SHTMLEditorPane editorPane = panel.getSHTMLEditorPane();
+ final Element linkElement = editorPane.getCurrentLinkElement();
+ final boolean foundLink = (linkElement != null);
+ final String linkAsString;
+ if (foundLink) {
+ final AttributeSet elemAttrs = linkElement.getAttributes();
+ final Object linkAttr = elemAttrs.getAttribute(HTML.Tag.A);
+ final Object href = ((AttributeSet) linkAttr).getAttribute(HTML.Attribute.HREF);
+ if (href != null) {
+ linkAsString = href.toString();
+ }
+ else
+ linkAsString = "http://";
+ }
+ else {
+ linkAsString = "http://";
+ }
+ final String inputValue = UITools.showInputDialog(
+ Controller.getCurrentController().getSelection().getSelected(), TextUtils.getText("edit_link_manually"), linkAsString);
+ if (inputValue != null && ! inputValue.matches("\\w+://")) {
+ SHTMLEditorPane editor = panel.getSHTMLEditorPane();
+ if (inputValue.equals("")) {
+ editor.setLink(null, null, null);
+ return;
+ }
+ try {
+ final URI link = LinkController.createURI(inputValue.trim());
+ editor.setLink(null, link.toString(), null);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ UITools.errorMessage(TextUtils.format("invalid_uri", inputValue));
+ return;
+ }
+ }
+ panel.updateActions();
+ }
+
+ public void update() {
+ if (panel.isHtmlEditorActive()) {
+ this.setEnabled(false);
+ return;
+ }
+ if (panel.getSHTMLEditorPane() != null) {
+ if ((panel.getSHTMLEditorPane().getSelectionEnd() > panel.getSHTMLEditorPane().getSelectionStart())
+ || (panel.getSHTMLEditorPane().getCurrentLinkElement() != null)) {
+ this.setEnabled(true);
+ }
+ else {
+ this.setEnabled(false);
+ }
+ }
+ else {
+ this.setEnabled(false);
+ }
+ }
+
+ public void getProperties() {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java
new file mode 100644
index 0000000..7373e3e
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java
@@ -0,0 +1,82 @@
+/*
+ * 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.net.URI;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+import com.lightdev.app.shtm.SHTMLAction;
+import com.lightdev.app.shtm.SHTMLEditorPane;
+import com.lightdev.app.shtm.SHTMLPanelImpl;
+
+class SHTMLSetLinkByFileChooserAction extends AFreeplaneAction implements SHTMLAction {
+ /**
+ *
+ */
+ private final SHTMLPanelImpl panel;
+ private static final long serialVersionUID = 1L;
+
+ public SHTMLSetLinkByFileChooserAction(final SHTMLPanelImpl panel) {
+ super("SetLinkByFileChooserAction");
+ this.panel = panel;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ setLinkByFileChooser();
+ }
+
+ public void setLinkByFileChooser() {
+ final URI relative = ((MFileManager) UrlManager.getController())
+ .getLinkByFileChooser(Controller.getCurrentController().getMap());
+ if (relative != null) {
+ SHTMLEditorPane editor = panel.getSHTMLEditorPane();
+ editor.setLink(null, relative.toString(), null);
+ }
+ }
+
+ public void update() {
+ if (panel.isHtmlEditorActive()) {
+ this.setEnabled(false);
+ return;
+ }
+ if (panel.getSHTMLEditorPane() != null) {
+ if ((panel.getSHTMLEditorPane().getSelectionEnd() > panel.getSHTMLEditorPane().getSelectionStart())
+ || (panel.getSHTMLEditorPane().getCurrentLinkElement() != null)) {
+ this.setEnabled(true);
+ }
+ else {
+ this.setEnabled(false);
+ }
+ }
+ else {
+ this.setEnabled(false);
+ }
+ }
+
+ public void getProperties() {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java
new file mode 100644
index 0000000..172e389
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+
+class SetImageByFileChooserAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SetImageByFileChooserAction() {
+ super("SetImageByFileChooserAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MTextController) TextController.getController()).setImageByFileChooser();
+ Controller.getCurrentController().getViewController().obtainFocusForSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SortNodes.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SortNodes.java
new file mode 100644
index 0000000..5c45ff8
--- /dev/null
+++ b/freeplane/src/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, node, i++);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java
new file mode 100644
index 0000000..139f6e1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java
@@ -0,0 +1,160 @@
+/*
+ * 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/text/mindmapmode/UsePlainTextAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java
new file mode 100644
index 0000000..a56c5ff
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java
@@ -0,0 +1,47 @@
+/*
+ * 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 org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+
+class UsePlainTextAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public UsePlainTextAction() {
+ super("UsePlainTextAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final String nodeText = node.getText();
+ if (HtmlUtils.isHtmlNode(nodeText)) {
+ ((MTextController) TextController.getController()).setNodeText(node, HtmlUtils
+ .htmlToPlain(nodeText));
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/CreationModificationPlugin.java b/freeplane/src/org/freeplane/features/time/CreationModificationPlugin.java
new file mode 100644
index 0000000..1d1ae58
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/CreationModificationPlugin.java
@@ -0,0 +1,73 @@
+/*
+ * 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.time;
+
+import java.awt.Component;
+import java.text.MessageFormat;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.ITooltipProvider;
+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.n3.nanoxml.XMLElement;
+
+/**
+ * @author foltin
+ */
+ at NodeHookDescriptor(hookName = "accessories/plugins/CreationModificationPlugin.properties")
+public class CreationModificationPlugin extends PersistentNodeHook implements IExtension {
+ private static final Integer CREATION_TOOLTIP = 14;
+ private String tooltipFormat = null;
+
+ public CreationModificationPlugin() {
+ super();
+ Controller.getCurrentModeController().addToolTipProvider(CREATION_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ if (! isActive(node))
+ return null;
+ final Object[] messageArguments = { node.getHistoryInformation().getCreatedAt(),
+ node.getHistoryInformation().getLastModifiedAt() };
+ if (tooltipFormat == null) {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("<html>");
+ sb.append(TextUtils.getText("plugins/TimeList.xml_Created"));
+ sb.append(": {0,date} {0,time}<br>");
+ sb.append(TextUtils.getText("plugins/TimeList.xml_Modified"));
+ sb.append(": {1,date} {1,time}</html>");
+ tooltipFormat = sb.toString();
+ }
+ final MessageFormat formatter = new MessageFormat(tooltipFormat);
+ final String message = formatter.format(messageArguments);
+ return message;
+ }
+ });
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ return this;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeComboBoxEditor.java b/freeplane/src/org/freeplane/features/time/TimeComboBoxEditor.java
new file mode 100644
index 0000000..10da254
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeComboBoxEditor.java
@@ -0,0 +1,132 @@
+/*
+ * 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 java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.JButton;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+import org.freeplane.core.ui.components.calendar.JCalendar;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.IFormattedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class TimeComboBoxEditor implements ComboBoxEditor {
+ private class ShowCalendarAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ if(showEditorBtn.isShowing())
+ calendarPopupMenu.show(showEditorBtn, 0, showEditorBtn.getHeight());
+ }
+ }
+
+ final private List<ActionListener> actionListeners;
+ final private JPopupMenu calendarPopupMenu;
+ final private JCalendar calenderComponent;
+ private FormattedDate date;
+ final private JButton showEditorBtn;
+
+ public TimeComboBoxEditor(boolean timeVisible) {
+ showEditorBtn = new JButton();
+ showEditorBtn.addActionListener(new ShowCalendarAction());
+ calenderComponent = new JCalendar(new Date(), Locale.getDefault(), true, true, timeVisible);
+ calenderComponent.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ calendarPopupMenu.setVisible(false);
+ }
+ });
+ calendarPopupMenu = calenderComponent.createPopupMenu();
+ calendarPopupMenu.addPopupMenuListener(new PopupMenuListener() {
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ calenderComponent.setDate(date);
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ updateDate();
+ }
+
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ }
+ });
+ actionListeners = new LinkedList<ActionListener>();
+ }
+
+ public void addActionListener(final ActionListener l) {
+ actionListeners.add(l);
+ }
+
+ public Component getEditorComponent() {
+ return showEditorBtn;
+ }
+
+ public Object getItem() {
+ return date;
+ }
+
+ public void removeActionListener(final ActionListener l) {
+ actionListeners.remove(l);
+ }
+
+ public void selectAll() {
+ }
+
+ public void setItem(final Object date) {
+ if(! (date instanceof FormattedDate))
+ return;
+ this.date = (FormattedDate) date;
+ showEditorBtn.setText(date == null ? "" : date.toString());
+ }
+
+ private void updateDate() {
+ final FormattedDate newDate = new FormattedDate(calenderComponent.getDate(),
+ calenderComponent.isTimeVisible() ? "yyyy-MM-dd HH:mm" : "yyyy-MM-dd");
+ final String type = newDate.containsTime() ? IFormattedObject.TYPE_DATETIME : IFormattedObject.TYPE_DATE;
+ date = FormattedDate.createDefaultFormattedDate(newDate.getTime(), type);
+
+ if (actionListeners.size() == 0) {
+ return;
+ }
+ final ActionEvent actionEvent = new ActionEvent(this, 0, null);
+ for (final ActionListener l : actionListeners) {
+ l.actionPerformed(actionEvent);
+ }
+ }
+
+ public void setItem() {
+ updateDate();
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeCondition.java b/freeplane/src/org/freeplane/features/time/TimeCondition.java
new file mode 100644
index 0000000..90ff7fd
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..b42a107
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeConditionController.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.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/TimeConditionCreatedAfter.java b/freeplane/src/org/freeplane/features/time/TimeConditionCreatedAfter.java
new file mode 100644
index 0000000..ffd43b4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeConditionCreatedAfter.java
@@ -0,0 +1,56 @@
+/*
+ * 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.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class TimeConditionCreatedAfter extends TimeConditionCreatedBefore {
+ static final String NAME = "time_condition_created_after";
+
+ public TimeConditionCreatedAfter(final FormattedDate date) {
+ super(date);
+ }
+
+ @Override
+ public boolean checkNode(final NodeModel node) {
+ return !super.checkNode(node);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(TimeConditionController.FILTER_TIME);
+ final String dateAsString = getDate().toString();
+ final String before = TextUtils.getText(FILTER_CREATED_AFTER);
+ return ConditionFactory.createDescription(filterTime, before, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionCreatedBefore.java b/freeplane/src/org/freeplane/features/time/TimeConditionCreatedBefore.java
new file mode 100644
index 0000000..17ef477
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeConditionCreatedBefore.java
@@ -0,0 +1,60 @@
+/*
+ * 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 java.util.Date;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 6, 2009
+ */
+public class TimeConditionCreatedBefore extends TimeCondition {
+ static final String NAME = "time_condition_created_before";
+
+ public TimeConditionCreatedBefore(final FormattedDate date) {
+ super(date);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Date createdAt = node.getHistoryInformation().getCreatedAt();
+ final Date filterDate = getDate();
+ final boolean before = createdAt.getTime() < filterDate.getTime();
+ return before;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(TimeConditionController.FILTER_TIME);
+ final String dateAsString = getDate().toString();
+ final String before = TextUtils.getText(FILTER_CREATED_BEFORE);
+ return ConditionFactory.createDescription(filterTime, before, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionModifiedAfter.java b/freeplane/src/org/freeplane/features/time/TimeConditionModifiedAfter.java
new file mode 100644
index 0000000..b0ff19f
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeConditionModifiedAfter.java
@@ -0,0 +1,56 @@
+/*
+ * 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.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class TimeConditionModifiedAfter extends TimeConditionModifiedBefore{
+ static final String NAME = "time_condition_modified_after";
+
+ public TimeConditionModifiedAfter(final FormattedDate date) {
+ super(date);
+ }
+
+ @Override
+ public boolean checkNode(final NodeModel node) {
+ return !super.checkNode(node);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(TimeConditionController.FILTER_TIME);
+ final String dateAsString = getDate().toString();
+ final String after = TextUtils.getText(FILTER_MODIFIED_AFTER);
+ return ConditionFactory.createDescription(filterTime, after, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionModifiedBefore.java b/freeplane/src/org/freeplane/features/time/TimeConditionModifiedBefore.java
new file mode 100644
index 0000000..aa12932
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/time/TimeConditionModifiedBefore.java
@@ -0,0 +1,60 @@
+/*
+ * 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 java.util.Date;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 6, 2009
+ */
+public class TimeConditionModifiedBefore extends TimeCondition {
+ static final String NAME = "time_condition_modified_before";
+
+ public TimeConditionModifiedBefore(final FormattedDate date) {
+ super(date);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Date lastModifiedAt = node.getHistoryInformation().getLastModifiedAt();
+ final Date filterDate = getDate();
+ final boolean before = lastModifiedAt.getTime() < filterDate.getTime();
+ return before;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(TimeConditionController.FILTER_TIME);
+ final String dateAsString = getDate().toString();
+ final String before = TextUtils.getText(FILTER_MODIFIED_BEFORE);
+ return ConditionFactory.createDescription(filterTime, before, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeController.java b/freeplane/src/org/freeplane/features/time/TimeController.java
new file mode 100644
index 0000000..2c0f878
--- /dev/null
+++ b/freeplane/src/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(4,
+ new TimeConditionController());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/CloseAction.java b/freeplane/src/org/freeplane/features/ui/CloseAction.java
new file mode 100644
index 0000000..6fca786
--- /dev/null
+++ b/freeplane/src/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 */
+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/IMapViewChangeListener.java b/freeplane/src/org/freeplane/features/ui/IMapViewChangeListener.java
new file mode 100644
index 0000000..279c85b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/IMapViewChangeListener.java
@@ -0,0 +1,32 @@
+/*
+ * 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.Component;
+
+public interface IMapViewChangeListener {
+ void afterViewChange(Component oldView, Component newView);
+
+ void afterViewClose(Component oldView);
+
+ void afterViewCreated(Component mapView);
+
+ void beforeViewChange(Component oldView, Component newView);
+}
diff --git a/freeplane/src/org/freeplane/features/ui/IMapViewManager.java b/freeplane/src/org/freeplane/features/ui/IMapViewManager.java
new file mode 100644
index 0000000..a445445
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/IMapViewManager.java
@@ -0,0 +1,138 @@
+/*
+ * 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.image.RenderedImage;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+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 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 String createHtmlMap();
+
+ public RenderedImage createImage();
+
+ 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 int getViewNumber();
+
+ 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);
+}
diff --git a/freeplane/src/org/freeplane/features/ui/INodeViewLifeCycleListener.java b/freeplane/src/org/freeplane/features/ui/INodeViewLifeCycleListener.java
new file mode 100644
index 0000000..a1b7615
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/INodeViewLifeCycleListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.Container;
+
+public interface INodeViewLifeCycleListener {
+ public void onViewCreated(Container nodeView);
+
+ public void onViewRemoved(Container nodeView);
+}
diff --git a/freeplane/src/org/freeplane/features/ui/INodeViewVisitor.java b/freeplane/src/org/freeplane/features/ui/INodeViewVisitor.java
new file mode 100644
index 0000000..4829224
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/INodeViewVisitor.java
@@ -0,0 +1,26 @@
+/*
+ * 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 org.freeplane.features.map.INodeView;
+
+public interface INodeViewVisitor {
+ void visit(INodeView view);
+}
diff --git a/freeplane/src/org/freeplane/features/ui/MapViewScrollPane.java b/freeplane/src/org/freeplane/features/ui/MapViewScrollPane.java
new file mode 100644
index 0000000..f1f1b7c
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/MapViewScrollPane.java
@@ -0,0 +1,111 @@
+/*
+ * 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.Component;
+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.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+
+/**
+ * @author Dimitry Polivaev
+ * 10.01.2009
+ */
+class MapViewScrollPane extends JScrollPane {
+ @SuppressWarnings("serial")
+ static class MapViewPort extends JViewport{
+
+ 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);
+ }
+
+ 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());
+ UITools.setScrollbarIncrement(this);
+ UITools.addScrollbarIncrementPropertyListener(this);
+ }
+
+ @Override
+ protected void validateTree() {
+ final Component view = getViewport().getView();
+ if (view != null) {
+ view.validate();
+ }
+ super.validateTree();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/NodeDragListener.java b/freeplane/src/org/freeplane/features/ui/NodeDragListener.java
new file mode 100644
index 0000000..3f96e97
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/NodeDragListener.java
@@ -0,0 +1,2 @@
+package org.freeplane.features.ui;
+
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleFullScreenAction.java b/freeplane/src/org/freeplane/features/ui/ToggleFullScreenAction.java
new file mode 100644
index 0000000..4e3aec1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ToggleFullScreenAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 14.08.2009
+ */
+ at SelectableAction(checkOnPopup = true)
+public class ToggleFullScreenAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ToggleFullScreenAction(final ViewController viewController) {
+ super("ToggleFullScreenAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ viewController.setFullScreen(!viewController.isFullScreenEnabled());
+ }
+
+ @Override
+ public void setSelected() {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ setSelected(viewController.isFullScreenEnabled());
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleMenubarAction.java b/freeplane/src/org/freeplane/features/ui/ToggleMenubarAction.java
new file mode 100644
index 0000000..b493553
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ToggleMenubarAction.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.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+ at SelectableAction(checkOnPopup = true)
+class ToggleMenubarAction extends AFreeplaneAction {
+ static final String NAME = "toggleMenubar";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private ViewController controller;
+
+ ToggleMenubarAction( final ViewController viewController) {
+ super("ToggleMenubarAction");
+ this.controller = viewController;
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ controller.setMenubarVisible(!controller.isMenubarVisible());
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(controller.isMenubarVisible());
+ }
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java b/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java
new file mode 100644
index 0000000..6415f5a
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java
@@ -0,0 +1,82 @@
+/*
+ * 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 = 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
new file mode 100644
index 0000000..12f88bd
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ViewController.java
@@ -0,0 +1,975 @@
+/*
+ * 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.Container;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics2D;
+import java.awt.KeyboardFocusManager;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ComboBoxEditor;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+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.JScrollPane;
+import javax.swing.JSpinner;
+import javax.swing.RootPaneContainer;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+import javax.swing.plaf.metal.MetalFileChooserUI;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+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.MenuBuilder;
+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.core.util.TextUtils;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.ScannerController;
+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.StyleNamedObject;
+import org.freeplane.features.time.TimeComboBoxEditor;
+
+/**
+ * @author Dimitry Polivaev
+ */
+abstract public class ViewController implements IMapViewChangeListener, IFreeplanePropertyListener {
+ public static final String STANDARD_STATUS_INFO_KEY = "standard";
+
+ 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();
+ }
+ });
+ }
+ }
+ }
+
+ public static final String VISIBLE_PROPERTY_KEY = "VISIBLE_PROPERTY_KEY";
+ public static final int TOP = 0, LEFT = 1, RIGHT = 2, BOTTOM = 3;
+ public static final String RESOURCE_ANTIALIAS = "antialias";
+ private static final String[] zooms = { "25%", "50%", "75%", "100%", "150%", "200%", "300%", "400%" };
+ private boolean antialiasAll = false;
+ private boolean antialiasEdges = false;
+// // final private Controller controller;
+ private final IMapViewManager mapViewManager;
+ final private JScrollPane scrollPane;
+ final private JLabel status;
+ final private Map<String, Component> statusInfos;
+ final private JPanel statusPanel;
+ final private JComponent toolbarPanel[];
+ final private String userDefinedZoom;
+ final private ZoomInAction zoomIn;
+ private final DefaultComboBoxModel zoomModel;
+ final private ZoomOutAction zoomOut;
+ private Rectangle frameSize;
+
+ public Rectangle getFrameSize() {
+ return frameSize;
+ }
+
+ public void setFrameSize(final Rectangle frameSize) {
+ this.frameSize = frameSize;
+ }
+
+ private int winState;
+ final private String propertyKeyPrefix;
+ private boolean setZoomComboBoxRun;
+ public static final String SLOW_SCROLLING = "slowScrolling";
+ 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 ViewController(Controller controller, final IMapViewManager mapViewManager,
+ final String propertyKeyPrefix) {
+ super();
+ final ResourceController resourceController = ResourceController.getResourceController();
+ if(textIcon == null){
+ ViewController.textIcon = new ImageIcon(resourceController.getResource("/images/text.png"));
+ ViewController.numberIcon = new ImageIcon(resourceController.getResource("/images/number.png"));
+ ViewController.dateIcon = new ImageIcon(resourceController.getResource("/images/calendar_red.png"));
+ ViewController.dateTimeIcon = new ImageIcon(resourceController.getResource("/images/calendar_clock_red.png"));
+ ViewController.linkIcon = new ImageIcon(resourceController.getResource("/images/" + resourceController.getProperty("link_icon")));
+ ViewController.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);
+ this.mapViewManager = mapViewManager;
+ mapViewManager.addMapViewChangeListener(this);
+ controller.addAction(new CloseAction());
+ zoomIn = new ZoomInAction(this);
+ controller.addAction(zoomIn);
+ zoomOut = new ZoomOutAction(this);
+ controller.addAction(zoomOut);
+ controller.addAction(new ToggleFullScreenAction(this));
+ userDefinedZoom = TextUtils.getText("user_defined_zoom");
+ zoomModel = new DefaultComboBoxModel(getZooms());
+ zoomModel.addElement(userDefinedZoom);
+ final String mapViewZoom = resourceController.getProperty(getPropertyKeyPrefix() + "map_view_zoom", "1.0");
+ try {
+ setZoom(Float.parseFloat(mapViewZoom));
+ }
+ catch (final Exception e) {
+ zoomModel.setSelectedItem("100%");
+ LogUtils.severe(e);
+ }
+ 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());
+ }
+ });
+ }
+ }
+ }) ;
+
+ controller.addAction(new ToggleMenubarAction(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.createVerticalBox();
+ toolbarPanel[RIGHT] = Box.createVerticalBox();
+ scrollPane = new MapViewScrollPane();
+ resourceController.addPropertyChangeListener(this);
+ final String antialiasProperty = resourceController.getProperty(ViewController.RESOURCE_ANTIALIAS);
+ changeAntialias(antialiasProperty);
+ }
+
+ public void afterMapClose(final MapModel pOldMapView) {
+ }
+
+ public void afterViewChange(final Component oldMap, final Component pNewMap) {
+ Controller controller = Controller.getCurrentController();
+ final ModeController oldModeController = controller.getModeController();
+ ModeController newModeController = oldModeController;
+ if (pNewMap != null) {
+ setViewportView(pNewMap);
+ final IMapSelection mapSelection = mapViewManager.getMapSelection();
+ final NodeModel selected = mapSelection.getSelected();
+ mapSelection.scrollNodeToVisible(selected);
+ setZoomComboBox(mapViewManager.getZoom());
+ obtainFocusForSelected();
+ newModeController = mapViewManager.getModeController(pNewMap);
+ if (newModeController != oldModeController) {
+ controller.selectMode(newModeController);
+ }
+ }
+ else {
+ setViewportView(null);
+ }
+ setTitle();
+ viewNumberChanged(mapViewManager.getViewNumber());
+ newModeController.getUserInputListenerFactory().updateMapList();
+ if (pNewMap != null) {
+ newModeController.setVisible(true);
+ }
+ }
+
+ public void afterViewClose(final Component oldView) {
+ }
+
+ 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 changeAntialias(final String command) {
+ if (command == null) {
+ return;
+ }
+ final Controller controller = getController();
+ 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 = controller.getViewController().getMapView();
+ if (mapView != null) {
+ mapView.repaint();
+ }
+ }
+
+ public void changeNoteWindowLocation() {
+ }
+
+ public void err(final String msg) {
+ status.setText(msg);
+ }
+
+ private boolean getAntialiasAll() {
+ return antialiasAll;
+ }
+
+ private boolean getAntialiasEdges() {
+ return antialiasEdges;
+ }
+
+ public Color getBackgroundColor(final NodeModel node) {
+ return mapViewManager.getBackgroundColor(node);
+ }
+
+ public Component getComponent(final NodeModel node) {
+ return mapViewManager.getComponent(node);
+ }
+
+ /**
+ * @return
+ */
+ abstract public RootPaneContainer getRootPaneContainer();
+
+ public Container getContentPane(){
+ return getRootPaneContainer().getContentPane();
+ }
+
+ protected Controller getController() {
+ return Controller.getCurrentController();
+ }
+
+ private float getCurrentZoomIndex() {
+ final int selectedIndex = zoomModel.getIndexOf(zoomModel.getSelectedItem());
+ final int itemCount = zoomModel.getSize();
+ if (selectedIndex != - 1) {
+ return selectedIndex;
+ }
+ final float userZoom = mapViewManager.getZoom();
+ for (int i = 0; i < itemCount - 1; i++) {
+ if (userZoom < getZoomValue(zoomModel.getElementAt(i))) {
+ return i - 0.5f;
+ }
+ }
+ return itemCount - 1.5f;
+ }
+
+ public Font getFont(final NodeModel node) {
+ return mapViewManager.getFont(node);
+ }
+
+ public Frame getFrame() {
+ return JOptionPane.getFrameForComponent(getContentPane());
+ }
+
+ abstract public FreeplaneMenuBar getFreeplaneMenuBar();
+
+ public String getItemForZoom(final float f) {
+ return (int) (f * 100F) + "%";
+ }
+
+ /**
+ * @return
+ */
+ abstract public JFrame getJFrame();
+
+ /**
+ */
+ public MapModel getMap() {
+ return mapViewManager.getModel();
+ }
+
+ public Component getMapView() {
+ return getMapViewManager().getMapViewComponent();
+ }
+
+ public IMapViewManager getMapViewManager() {
+ return mapViewManager;
+ }
+
+ public JScrollPane getScrollPane() {
+ return scrollPane;
+ }
+
+ public Component getSelectedComponent() {
+ return mapViewManager.getSelectedComponent();
+ }
+
+ public IMapSelection getSelection() {
+ return mapViewManager.getMapSelection();
+ }
+
+ public JComponent getStatusBar() {
+ return statusPanel;
+ }
+
+ public Color getTextColor(final NodeModel node) {
+ return mapViewManager.getTextColor(node);
+ }
+
+ public Container getViewport() {
+ return scrollPane.getViewport();
+ }
+
+ public float getZoom() {
+ return mapViewManager.getZoom();
+ }
+
+ public String[] getZooms() {
+ return ViewController.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;
+ }
+
+ 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() {
+ final String property;
+ if (isFullScreenEnabled()) {
+ property = "menubarVisible.fullscreen";
+ }
+ else {
+ property = "menubarVisible";
+ }
+ final boolean booleanProperty = ResourceController.getResourceController().getBooleanProperty(
+ getPropertyKeyPrefix() + property);
+ return booleanProperty;
+ }
+
+ public void obtainFocusForSelected() {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (getMapView() != null) {
+ final Component selectedComponent = getSelectedComponent();
+ if(selectedComponent != null){
+ selectedComponent.requestFocus();
+ }
+ }
+ else {
+ getFreeplaneMenuBar().requestFocus();
+ }
+ }
+ });
+ }
+
+ 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);
+ }
+
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.equals(ViewController.RESOURCE_ANTIALIAS)) {
+ changeAntialias(newValue);
+ }
+ }
+
+ public boolean quit() {
+ while (getMapViewManager().getMapViewVector().size() > 0) {
+ if (getMapView() != null) {
+ final boolean closingNotCancelled = getMapViewManager().close(false);
+ if (!closingNotCancelled) {
+ return false;
+ }
+ }
+ else {
+ getMapViewManager().nextMapView();
+ }
+ }
+ ResourceController.getResourceController().setProperty("antialiasEdges", (antialiasEdges ? "true" : "false"));
+ ResourceController.getResourceController().setProperty("antialiasAll", (antialiasAll ? "true" : "false"));
+ return true;
+ }
+
+ /**
+ *
+ */
+ abstract public void removeSplitPane();
+
+ public void saveProperties() {
+ }
+
+ public void scrollNodeToVisible(final NodeModel node) {
+ mapViewManager.scrollNodeToVisible(node);
+ }
+
+ 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());
+ getFreeplaneMenuBar().setVisible(isMenubarVisible());
+ }
+
+ 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;
+ }
+
+ abstract protected void setFreeplaneMenuBar(FreeplaneMenuBar menuBar);
+
+ public void setMenubarVisible(final boolean visible) {
+ final String property;
+ if (isFullScreenEnabled()) {
+ property = "menubarVisible.fullscreen";
+ }
+ else {
+ property = "menubarVisible";
+ }
+ ResourceController.getResourceController().setProperty(getPropertyKeyPrefix() + property, visible);
+ getFreeplaneMenuBar().setVisible(visible);
+ }
+
+ 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);
+ }
+ }
+
+ /**
+ * Set the Frame title with mode and file if exist
+ */
+ public void setTitle() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null) {
+ setTitle("");
+ return;
+ }
+ final Object[] messageArguments = { TextUtils.getText(("mode_" + modeController.getModeName())) };
+ final MessageFormat formatter = new MessageFormat(TextUtils.getText("mode_title"));
+ String title = formatter.format(messageArguments);
+ String rawTitle = "";
+ final MapModel model = mapViewManager.getModel();
+ if (model != null) {
+ rawTitle = mapViewManager.getMapViewComponent().getName();
+ title = rawTitle + (model.isSaved() ? "" : "*") + " - " + title
+ + (model.isReadOnly() ? " (" + TextUtils.getText("read_only") + ")" : "");
+ final File file = model.getFile();
+ if (file != null) {
+ title += " " + file.getAbsolutePath();
+ }
+ }
+ setTitle(title);
+ modeController.getUserInputListenerFactory().updateMapList();
+ }
+
+ abstract public void setTitle(String title);
+
+ private void setViewportView(final Component view) {
+ scrollPane.setViewportView(view);
+ }
+
+ /**
+ * @param b
+ */
+ abstract public void setWaitingCursor(boolean b);
+
+ public void setZoom(final float zoom) {
+ mapViewManager.setZoom(zoom);
+ setZoomComboBox(zoom);
+ final Object[] messageArguments = { String.valueOf(zoom * 100f) };
+ final String stringResult = TextUtils.format("user_defined_zoom_status_bar", messageArguments);
+ out(stringResult);
+ }
+
+ private void setZoomByItem(final Object item) {
+ final float zoomValue;
+ if (((String) item).equals(userDefinedZoom)) {
+ final float zoom = mapViewManager.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(scrollPane, 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);
+ }
+
+ private void setZoomComboBox(final float f) {
+ setZoomComboBoxRun = true;
+ try {
+ final String toBeFound = getItemForZoom(f);
+ zoomModel.setSelectedItem(toBeFound);
+ }
+ finally {
+ setZoomComboBoxRun = false;
+ }
+ }
+
+ 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));
+ }
+ }
+
+ protected void viewNumberChanged(final int number) {
+ }
+
+ 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)));
+ }
+ }
+
+ void setFullScreen(final boolean fullScreen) {
+ final Frame frame = getFrame();
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if (fullScreen == isFullScreenEnabled()) {
+ return;
+ }
+ 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);
+ getFreeplaneMenuBar().setVisible(isMenubarVisible());
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> toolBars = getController().getModeController().getUserInputListenerFactory()
+ .getToolBars(j);
+ for (final JComponent toolBar : toolBars) {
+ toolBar.setVisible(isToolbarVisible(toolBar));
+ }
+ }
+ frame.setVisible(true);
+ }
+ else {
+ frame.dispose();
+ frame.setUndecorated(false);
+ frame.setResizable(true);
+ frame.setBounds(frameSize);
+ frame.setExtendedState(winState);
+ getFreeplaneMenuBar().setVisible(isMenubarVisible());
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> toolBars = getController().getModeController().getUserInputListenerFactory()
+ .getToolBars(j);
+ for (final JComponent toolBar : toolBars) {
+ toolBar.setVisible(isToolbarVisible(toolBar));
+ }
+ }
+ frame.setVisible(true);
+ }
+ if(focusOwner != null)
+ focusOwner.requestFocus();
+ }
+
+ 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;
+ }
+
+ protected 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 {
+ UIManager.setLookAndFeel(lookAndFeel);
+ }
+ }
+ 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, ViewController.textIcon);
+ }
+ else if (value instanceof FormattedDate) {
+ final FormattedDate fd = (FormattedDate) value;
+ if (fd.containsTime()) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, ViewController.dateTimeIcon);
+ }
+ else {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, ViewController.dateIcon);
+ }
+ }
+ else if (value instanceof Number) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, ViewController.numberIcon);
+ }
+ else if (value instanceof URI) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, ViewController.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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/ZoomInAction.java b/freeplane/src/org/freeplane/features/ui/ZoomInAction.java
new file mode 100644
index 0000000..514239d
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ZoomInAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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;
+
+class ZoomInAction extends AFreeplaneAction {
+ static final String NAME = "zoomIn";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private ViewController controller;
+
+ public ZoomInAction(final ViewController controller) {
+ super("ZoomInAction");
+ this.controller = controller;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ controller.zoomIn();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/ZoomOutAction.java b/freeplane/src/org/freeplane/features/ui/ZoomOutAction.java
new file mode 100644
index 0000000..7ff1818
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/ui/ZoomOutAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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;
+
+class ZoomOutAction extends AFreeplaneAction {
+ static final String NAME = "zoomOut";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private ViewController viewController;
+
+ public ZoomOutAction(final ViewController viewController) {
+ super("ZoomOutAction");
+ this.viewController = viewController;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ viewController.zoomOut();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/CleaningInputStream.java b/freeplane/src/org/freeplane/features/url/CleaningInputStream.java
new file mode 100644
index 0000000..0d6ad45
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/CleaningInputStream.java
@@ -0,0 +1,111 @@
+/*
+ * 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.url;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+
+/**
+ * @author Dimitry Polivaev
+ * 27.08.2009
+ */
+public class CleaningInputStream extends InputStream {
+ private static final int MAX_PUSHED_BACK = 4;
+ private final PushbackInputStream in;
+ private int pushedBack = 0;
+ private boolean isUtf8 = false;
+ public CleaningInputStream(final InputStream pIn) {
+ super();
+ this.in = new PushbackInputStream(pIn, MAX_PUSHED_BACK);
+ try {
+ final byte[] bytes = new byte[3];
+ int i = 0;
+ int b;
+ b = in.read();
+ bytes[i++] = (byte)b;
+ if(b == 0xef){
+ b = in.read();
+ bytes[i++] = (byte)b;
+ if(b == 0xbb){
+ b = in.read();
+ bytes[i++] = (byte)b;
+ if(b == 0xbf){
+ isUtf8 = true;
+ return;
+ }
+ }
+ }
+ this.in.unread(bytes, 0, i);
+ pushedBack = i;
+
+ }
+ catch (IOException e) {
+ }
+ }
+
+ public boolean isUtf8() {
+ return isUtf8;
+ }
+
+ @Override
+ public int read() throws IOException {
+ byte b = (byte) in.read();
+ if (pushedBack > 0) {
+ pushedBack--;
+ return b;
+ }
+ if (b == '&') {
+ final byte[] bytes = new byte[MAX_PUSHED_BACK];
+ int i = 0;
+ bytes[i++] = b = (byte) in.read();
+ if (b == '#') {
+ bytes[i++] = b = (byte) in.read();
+ if (b == 'x' || b >= '0' || b <= '3') {
+ bytes[i++] = (byte) in.read();
+ bytes[i++] = (byte) in.read();
+ }
+ }
+ if (isValidInput(i, bytes)) {
+ pushedBack = i;
+ in.unread(bytes, 0, i);
+ return '&';
+ }
+ else {
+ return ' ';
+ }
+ }
+ return b;
+ }
+
+ private boolean isValidInput(final int i, final byte[] bytes) {
+ if (i != MAX_PUSHED_BACK || bytes[i - 1] != ';') {
+ return true;
+ }
+ final int c;
+ if (bytes[1] == 'x') {
+ c = Character.digit(bytes[2], 16);
+ }
+ else {
+ c = Character.digit(bytes[1], 10) * 10 + Character.digit(bytes[2], 10);
+ }
+ return c >= ' ' || c == '\t' || c == '\r' || c == '\n';
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/UrlManager.java b/freeplane/src/org/freeplane/features/url/UrlManager.java
new file mode 100644
index 0000000..0250397
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/UrlManager.java
@@ -0,0 +1,426 @@
+/*
+ * 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 java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+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.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.Charset;
+
+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 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.extension.IExtension;
+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.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapWriter.Mode;
+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 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";
+
+ /**
+ * Creates a default reader that just reads the given file.
+ *
+ * @throws FileNotFoundException
+ */
+ protected static Reader getActualReader(final InputStream file) throws FileNotFoundException {
+ return new InputStreamReader(file, FileUtils.defaultCharset());
+ }
+
+ public static UrlManager getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return (UrlManager) modeController.getExtension(UrlManager.class);
+ }
+
+ /**
+ * Creates a reader that pipes the input file through a XSLT-Script that
+ * updates the version to the current.
+ *
+ * @throws IOException
+ */
+ public static Reader getUpdateReader(final File file, final String xsltScript) throws FileNotFoundException,
+ IOException {
+ try {
+ final URL updaterUrl = ResourceController.getResourceController().getResource(xsltScript);
+ if (updaterUrl == null) {
+ throw new IllegalArgumentException(xsltScript + " not found.");
+ }
+ final StringWriter writer = new StringWriter();
+ final Result result = new StreamResult(writer);
+ class TransformerRunnable implements Runnable {
+ private Throwable thrownException = null;
+
+ 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 CleaningInputStream cleanedInput = new CleaningInputStream(input);
+ final Reader reader = new InputStreamReader(cleanedInput, cleanedInput.isUtf8() ? Charset.forName("UTF-8") : FileUtils.defaultCharset());
+ final Transformer trans = transFact.newTransformer(xsltSource);
+ trans.transform(new StreamSource(reader), result);
+ }
+ catch (final Exception ex) {
+ LogUtils.warn(ex);
+ thrownException = ex;
+ }
+ finally {
+ FileUtils.silentlyClose(input, xsltInputStream);
+ }
+ }
+
+ public Throwable thrownException() {
+ return thrownException;
+ }
+ }
+ final TransformerRunnable transformer = new TransformerRunnable();
+ final Thread transformerThread = new Thread(transformer, "XSLT");
+ transformerThread.start();
+ transformerThread.join();
+ final Throwable thrownException = transformer.thrownException();
+ if (thrownException != null) {
+ throw new TransformerException(thrownException);
+ }
+ return new StringReader(writer.getBuffer().toString());
+ }
+ 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 UrlManager.getActualReader(input);
+ }
+ }
+
+ public static void install( final UrlManager urlManager) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(UrlManager.class, urlManager);
+ }
+
+// // final private Controller controller;
+// final private ModeController modeController;
+
+ public UrlManager() {
+ super();
+// this.modeController = modeController;
+// controller = modeController.getController();
+ createActions();
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ }
+
+ /**
+ * Creates a file chooser with the last selected directory as default.
+ * @param useDirectorySelector
+ */
+ @SuppressWarnings("serial")
+ public JFileChooser getFileChooser(final FileFilter filter, boolean useDirectorySelector) {
+ 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 (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().getViewController().getMapView(),
+ 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);
+ urlStreamReader = new InputStreamReader(url.openStream());
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().getMapReader().createNodeTreeFromXml(map, urlStreamReader, Mode.FILE);
+ return urlStreamReader;
+ }
+
+ /**@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 = getAbsoluteUri(uri);
+ if(uri == null){
+ UITools.errorMessage(TextUtils.getText("map_not_saved"));
+ return;
+ }
+ }
+ try {
+ if ((extension != null)
+ && extension.equals(UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
+ final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
+ 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, final URI uri) throws MalformedURLException {
+ if (uri.isAbsolute()) {
+ return uri;
+ }
+ final String path = uri.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.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()) {
+ 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 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
new file mode 100644
index 0000000..c8444d1
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java
@@ -0,0 +1,125 @@
+/*
+ * 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();
+ EventQueue.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 InterruptedException e) {
+ LogUtils.severe(e);
+ }
+ catch (final InvocationTargetException e) {
+ LogUtils.severe(e);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/DummyLockManager.java b/freeplane/src/org/freeplane/features/url/mindmapmode/DummyLockManager.java
new file mode 100644
index 0000000..54dfbe0
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/DummyLockManager.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+public class DummyLockManager extends LockManager {
+ @Override
+ public synchronized String popLockingUserOfOldLock() {
+ return null;
+ }
+
+ @Override
+ public synchronized void releaseLock() {
+ }
+
+ @Override
+ public synchronized void releaseTimer() {
+ }
+
+ @Override
+ public synchronized void run() {
+ }
+
+ @Override
+ public synchronized String tryToLock(final File file) throws Exception {
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
new file mode 100644
index 0000000..b0920d6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
@@ -0,0 +1,186 @@
+/*
+ * 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.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.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.getViewController().getMapView(),
+ 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 boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
+ "relative");
+ final URI newUri = useRelativeUri ? LinkController.toRelativeURI(oldFile, chosenFile) : chosenFile.toURI();
+ final URI oldUri = useRelativeUri ? LinkController.toRelativeURI(chosenFile, file) : file.toURI();
+ ((MLinkController) LinkController.getController()).setLink(existingNode,
+ oldUri, false);
+ 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,
+ false);
+ 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
new file mode 100644
index 0000000..6e619ac
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/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.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
new file mode 100644
index 0000000..e442d54
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java
@@ -0,0 +1,320 @@
+/*
+ * 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
new file mode 100644
index 0000000..11a6665
--- /dev/null
+++ b/freeplane/src/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().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
new file mode 100644
index 0000000..5cf2064
--- /dev/null
+++ b/freeplane/src/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().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), false);
+ 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
new file mode 100644
index 0000000..a78082f
--- /dev/null
+++ b/freeplane/src/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.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, false);
+ 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
new file mode 100644
index 0000000..77ec542
--- /dev/null
+++ b/freeplane/src/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.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 ViewController viewController = Controller.getCurrentController().getViewController();
+ if (selected == null || NodeLinks.getLink(selected) == null) {
+ JOptionPane.showMessageDialog((viewController.getMapView()), 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, false);
+ ((MLinkController) LinkController.getController()).setLink(node, (URI) null, false);
+ }
+ 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/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.java
new file mode 100644
index 0000000..d9bbba6
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.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.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+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.url.UrlManager;
+
+/**
+ * This is exactly the opposite of exportBranch.
+ */
+class ImportLinkedBranchWithoutRootAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportLinkedBranchWithoutRootAction() {
+ super("ImportLinkedBranchWithoutRootAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selected = modeController.getMapController().getSelectedNode();
+ if (selected == null || NodeLinks.getLink(selected) == null) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getMapView(), TextUtils
+ .getText("import_linked_branch_no_link"));
+ return;
+ }
+ try {
+ final URI uri = NodeLinks.getLink(selected);
+ final URL url = map.getURL();
+ final File file = uri.isAbsolute() && !uri.isOpaque() ? new File(uri) : new File(new URL(url, uri
+ .getPath()).getFile());
+ final NodeModel node = ((MFileManager) UrlManager.getController()).loadTree(map, file);
+ map.setURL(url);
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ ((MMapController) modeController.getMapController()).insertNode(child, selected);
+ }
+ ((MLinkController) LinkController.getController()).setLink(selected, (URI) null, false);
+ }
+ catch (final Exception ex) {
+ UrlManager.getController().handleLoadingException(ex);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/LockManager.java b/freeplane/src/org/freeplane/features/url/mindmapmode/LockManager.java
new file mode 100644
index 0000000..69d2db2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/LockManager.java
@@ -0,0 +1,170 @@
+/*
+ * 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.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.nio.channels.FileLock;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.SysUtils;
+
+public class LockManager extends TimerTask {
+ static final String LOCK_EXPIRATION_TIME = "lock_expiration_time_in_minutes";
+ private File lockedSemaphoreFile;
+ private String lockingUserOfOldLock;
+ private final long lockSafetyPeriod;
+ private Timer lockTimer;
+ private final long lockUpdatePeriod;
+
+
+ public LockManager() {
+ super();
+ lockedSemaphoreFile = null;
+ lockingUserOfOldLock = null;
+ lockTimer = null;
+ lockSafetyPeriod = ResourceController.getResourceController().getIntProperty(LOCK_EXPIRATION_TIME) * 60 * 1000;
+ lockUpdatePeriod = Math.round(lockSafetyPeriod * 0.8);
+ }
+
+ private File getSemaphoreFile(final File mapFile) {
+ return new File(mapFile.getParent() + System.getProperty("file.separator") + "$~" + mapFile.getName() + "~");
+ }
+
+ public synchronized String popLockingUserOfOldLock() {
+ final String toReturn = lockingUserOfOldLock;
+ lockingUserOfOldLock = null;
+ return toReturn;
+ }
+
+ public synchronized void releaseLock() {
+ if (lockedSemaphoreFile != null) {
+ lockedSemaphoreFile.delete();
+ lockedSemaphoreFile = null;
+ }
+ }
+
+ public synchronized void releaseTimer() {
+ if (lockTimer != null) {
+ lockTimer.cancel();
+ lockTimer = null;
+ }
+ }
+
+ @Override
+ public synchronized void run() {
+ if (lockedSemaphoreFile == null) {
+ LogUtils.severe("unexpected: lockedSemaphoreFile is null upon lock update");
+ return;
+ }
+ try {
+ FileUtils.setHidden(lockedSemaphoreFile, false, /* synchro= */true);
+ writeSemaphoreFile(lockedSemaphoreFile);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ public synchronized String tryToLock(final File file) throws Exception {
+ final File semaphoreFile = getSemaphoreFile(file);
+ if (semaphoreFile.equals(lockedSemaphoreFile)) {
+ return null;
+ }
+ BufferedReader semaphoreReader = null;
+ try {
+ semaphoreReader = new BufferedReader(new FileReader(semaphoreFile));
+ final String lockingUser = semaphoreReader.readLine();
+ final String lockTime = semaphoreReader.readLine();
+ if (isLockExpired(lockTime)) {
+ lockingUserOfOldLock = lockingUser;
+ semaphoreFile.delete();
+ }
+ else {
+ return lockingUser;
+ }
+ }
+ catch (final FileNotFoundException e) {
+ }
+ catch (final NumberFormatException e) {
+ }
+ finally {
+ if (semaphoreReader != null) {
+ semaphoreReader.close();
+ }
+ }
+ writeSemaphoreFile(semaphoreFile);
+ if (lockTimer == null && lockUpdatePeriod > 0) {
+ lockTimer = SysUtils.createTimer(getClass().getSimpleName());
+ lockTimer.schedule(this, lockUpdatePeriod, lockUpdatePeriod);
+ }
+ releaseLock();
+ lockedSemaphoreFile = semaphoreFile;
+ return null;
+ }
+
+ private boolean isLockExpired(final String lockTimeString) {
+ final long lockTime = new Long(lockTimeString).longValue();
+ final long timeDifference = System.currentTimeMillis() - lockTime;
+ return lockTimeString == null || lockSafetyPeriod > 0 && timeDifference > lockSafetyPeriod;
+ }
+
+ private void writeSemaphoreFile(final File inSemaphoreFile) throws Exception {
+ FileOutputStream semaphoreOutputStream;
+ try {
+ semaphoreOutputStream = new FileOutputStream(inSemaphoreFile);
+ }
+ catch (final FileNotFoundException e) {
+ if (lockTimer != null) {
+ lockTimer.cancel();
+ }
+ return;
+ }
+ FileLock lock = null;
+ try {
+ lock = semaphoreOutputStream.getChannel().tryLock();
+ if (lock == null) {
+ semaphoreOutputStream.close();
+ LogUtils.severe("Locking failed.");
+ throw new Exception();
+ }
+ }
+ catch (final UnsatisfiedLinkError eUle) {
+ }
+ catch (final NoClassDefFoundError eDcdf) {
+ }
+ semaphoreOutputStream.write(System.getProperty("user.name").getBytes());
+ semaphoreOutputStream.write('\n');
+ semaphoreOutputStream.write(String.valueOf(System.currentTimeMillis()).getBytes());
+ FileUtils.setHidden(inSemaphoreFile, true, /* synchro= */false);
+ if (lock != null) {
+ lock.release();
+ }
+ semaphoreOutputStream.close();
+ semaphoreOutputStream = null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java b/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java
new file mode 100644
index 0000000..70b3eb4
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java
@@ -0,0 +1,857 @@
+/*
+ * 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.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.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();
+ 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;
+ };
+
+ 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();
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links")
+ .equals("relative");
+ if (file == null && useRelativeUri) {
+ 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());
+ if (useRelativeUri) {
+ return LinkController.toRelativeURI(file, input);
+ }
+ return input.toURI();
+ }
+
+ /**@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) {
+ NodeModel root = loadTree(map, file);
+ assert(map.getRootNode() == root);
+ setFile(map, file);
+ }
+ 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 {
+ 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);
+ 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);
+ if (showResult != JOptionPane.OK_OPTION) {
+ reader = UrlManager.getActualReader(sequencedInput);
+ }
+ else {
+ sequencedInput.close();
+ reader = UrlManager.getUpdateReader(f, FREEPLANE_VERSION_UPDATER_XSLT);
+ }
+ }
+ else
+ reader = UrlManager.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().getViewController().getMapView());
+ 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().getViewController().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;
+ }
+
+ 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().getViewController()
+ .getMapView());
+ 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().getViewController().getMapView());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ File file = chooser.getSelectedFile();
+ if (file.exists()) {
+ final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
+ .getViewController().getMapView(), 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().getViewController().getMapView());
+ 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()
+ .getViewController().getMapView(), 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);
+ final FileLock lock = out.getChannel().tryLock();
+ if (lock == null) {
+ throw new IOException("can not obtain file lock for " + file);
+ }
+ try {
+ final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(out));
+ Controller.getCurrentModeController().getMapController().getMapWriter()
+ .writeMapAsXml(map, fileout, Mode.FILE, true, false);
+ }
+ finally {
+ if (lock.isValid()) {
+ lock.release();
+ }
+ }
+ }
+
+ 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/MapVersionInterpreter.java b/freeplane/src/org/freeplane/features/url/mindmapmode/MapVersionInterpreter.java
new file mode 100644
index 0000000..f293412
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/MapVersionInterpreter.java
@@ -0,0 +1,93 @@
+package org.freeplane.features.url.mindmapmode;
+
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class MapVersionInterpreter{
+/*
+ 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 MapVersionInterpreter DEFAULT = new MapVersionInterpreter("", false, true, null, null);
+ final public String mapBegin;
+ final public boolean needsConversion;
+ final public boolean anotherDialect;
+ final public String appName;
+ final public String url;
+ MapVersionInterpreter(String versionBegin, boolean needsConversion, boolean anotherDialect,
+ String appName, String url) {
+ this.mapBegin = "<map version=\"" + versionBegin;
+ this.needsConversion = needsConversion;
+ this.anotherDialect = anotherDialect;
+ this.appName = appName;
+ this.url = url;
+ }
+
+ 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 appName = dialectElement.getAttribute("appName");
+ String url = dialectElement.getAttribute("url");
+ values[i] = new MapVersionInterpreter(versionBegin, needsConversion, anotherDialect, appName, url);
+ }
+ resource.close();
+ } catch (Exception e) {
+ LogUtils.severe(e);
+ values = new MapVersionInterpreter[]{};
+ }
+ }
+ return values;
+ }
+
+ private boolean knows(String mapBegin) {
+ return mapBegin.startsWith(this.mapBegin);
+ }
+
+ String getDialectInfo(String path){
+ final String appInfo;
+ if(appName != null)
+ 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapAction.java
new file mode 100644
index 0000000..c58ede3
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapAction.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.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 NewMapAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param files
+ *
+ */
+ public NewMapAction() {
+ super("NewMapAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentController().getModeController(MModeController.MODENAME);
+ MFileManager.getController(modeController).newMapFromDefaultTemplate();
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java
new file mode 100644
index 0000000..efe7834
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java
@@ -0,0 +1,47 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.url.UrlManager;
+
+class NewMapFromTemplateAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private File startFile;
+
+ public NewMapFromTemplateAction(String key, File file) {
+ super(key);
+ this.startFile = file;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MFileManager) UrlManager.getController()).newMapFromTemplate(startFile);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenAction.java
new file mode 100644
index 0000000..b3cbf30
--- /dev/null
+++ b/freeplane/src/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;
+
+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().getViewController().setTitle();
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java
new file mode 100644
index 0000000..42b820b
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenURLMapAction.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.url.mindmapmode;
+
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+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.map.MapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+class OpenURLMapAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public OpenURLMapAction() {
+ super("OpenURLMapAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ Controller.getCurrentController().selectMode(MModeController.MODENAME);
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ String urlText = JOptionPane.showInputDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(),
+ TextUtils.getText("enter_map_url"), "http://");
+ if(urlText != null){
+ URL url;
+ try {
+ url = new URL(urlText);
+ mapController.newMap(url);
+ }
+ catch (Exception ex) {
+ UITools.errorMessage(TextUtils.format("url_open_error", urlText));
+ LogUtils.warn("can not load " + urlText, ex);
+ }
+ }
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java
new file mode 100644
index 0000000..b01a152
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenUserDirAction.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.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.url.UrlManager;
+
+class OpenUserDirAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public OpenUserDirAction() {
+ super("OpenUserDirAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ getURLManager().loadURL(
+ new File(ResourceController.getResourceController().getFreeplaneUserDirectory()).toURI());
+ }
+
+ private UrlManager getURLManager() {
+ ModeController modeController = Controller.getCurrentModeController();
+ return (UrlManager) modeController.getExtension(UrlManager.class);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/RevertAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/RevertAction.java
new file mode 100644
index 0000000..3802da2
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/RevertAction.java
@@ -0,0 +1,66 @@
+/*
+ * 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.util.LogUtils;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Reverts the map to the saved version. In Xml, the old map is stored as xml
+ * and as an undo action, the new map is stored, too. Moreover, the filename of
+ * the doAction is set to the appropriate map file's name. The undo action has
+ * no file name associated. The action goes like this: close the actual map and
+ * open the given Xml/File. If only a Xml string is given, a temporary file name
+ * is created, the xml stored into and this map is opened instead of the actual.
+ *
+ * @author foltin
+ */
+class RevertAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ public RevertAction() {
+ super("RevertAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(final ActionEvent ev) {
+ Controller controller =Controller.getCurrentController();
+ final MMapController mapController = (MMapController) controller.getModeController().getMapController();
+ try {
+ mapController.restoreCurrentMap();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.java
new file mode 100644
index 0000000..c1c2c09
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.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.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.getViewController().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/SaveAll.java b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAll.java
new file mode 100644
index 0000000..1b2f143
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAll.java
@@ -0,0 +1,71 @@
+/*
+ * 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.url.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+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;
+
+/**
+ * @author foltin
+ */
+public class SaveAll extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public SaveAll() {
+ super("SaveAll");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final Component initialMapView = controller.getViewController().getMapView();
+ final Map<String, MapModel> mapViews = getMapViews();
+ final Iterator<Entry<String, MapModel>> iterator = mapViews.entrySet().iterator();
+ while (iterator.hasNext()) {
+ final Entry<String, MapModel> entry = iterator.next();
+ controller.getMapViewManager().changeToMapView(entry.getKey());
+ final ModeController modeController = controller.getModeController();
+ if (modeController instanceof MModeController) {
+ ((MModeController) modeController).save();
+ }
+ }
+ if (initialMapView != null) {
+ controller.getMapViewManager().changeToMapView(initialMapView);
+ }
+ }
+
+ /**
+ */
+ private Map<String, MapModel> getMapViews() {
+ return Controller.getCurrentController().getMapViewManager().getMaps();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java
new file mode 100644
index 0000000..6da9b49
--- /dev/null
+++ b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java
@@ -0,0 +1,42 @@
+/*
+ * 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().getViewController().setTitle();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/addons/AddOnInstaller.java b/freeplane/src/org/freeplane/main/addons/AddOnInstaller.java
new file mode 100644
index 0000000..8b79669
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/addons/AddOnInstaller.java
@@ -0,0 +1,9 @@
+package org.freeplane.main.addons;
+
+import java.net.URL;
+
+import org.freeplane.core.extension.IExtension;
+
+public interface AddOnInstaller extends IExtension {
+ void install(URL url);
+}
diff --git a/freeplane/src/org/freeplane/main/addons/AddOnProperties.java b/freeplane/src/org/freeplane/main/addons/AddOnProperties.java
new file mode 100644
index 0000000..d43a319
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/addons/AddOnProperties.java
@@ -0,0 +1,423 @@
+package org.freeplane.main.addons;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+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.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;
+ private String version;
+ private FreeplaneVersion freeplaneVersionFrom;
+ private FreeplaneVersion freeplaneVersionTo;
+ private URL homepage;
+ 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.setFreeplaneVersionFrom(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionFrom",
+ null)));
+ this.setFreeplaneVersionTo(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionTo", null)));
+ this.setHomepage(parseHomepage(addOnElement.getAttribute("homepage", 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(parseImages(addOnElement.getChildrenNamed("images")));
+ this.setDeinstallationRules(parseDeinstallationRules(addOnElement.getChildrenNamed("deinstall")));
+ validate();
+ }
+
+ private URL parseHomepage(String homepage) {
+ try {
+ return new URL(homepage);
+ }
+ 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;
+ }
+
+ private List<String> parseImages(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 void setVersion(String version) {
+ this.version = version;
+ }
+
+ 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;
+ }
+
+ public void setHomepage(URL homepage) {
+ this.homepage = homepage;
+ }
+
+ 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("freeplaneVersionFrom", freeplaneVersionFrom.toString());
+ if (freeplaneVersionTo != null)
+ addonElement.setAttribute("freeplaneVersionTo", freeplaneVersionTo.toString());
+ if (homepage != null)
+ addonElement.setAttribute("homepage", homepage.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(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
new file mode 100644
index 0000000..6124cc2
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/addons/AddOnsController.java
@@ -0,0 +1,217 @@
+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.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 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(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) {
+ 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/AppletResourceController.java b/freeplane/src/org/freeplane/main/applet/AppletResourceController.java
new file mode 100644
index 0000000..a06585a
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/applet/AppletResourceController.java
@@ -0,0 +1,117 @@
+/*
+ * 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.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import javax.swing.JApplet;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AppletResourceController extends ResourceController {
+ private static final String APPLET_PROPERTIES = "/special_applet.properties";
+ private Properties userProps;
+
+ public AppletResourceController(final FreeplaneApplet freeplaneApplet) {
+ super();
+ final URL defaultPropsURL = getResource(ResourceController.FREEPLANE_PROPERTIES);
+ userProps = new Properties();
+ loadProperties(userProps, defaultPropsURL);
+ final URL appletPropsURL = getResource(APPLET_PROPERTIES);
+ loadProperties(userProps, appletPropsURL);
+ final Enumeration<?> allKeys = userProps.propertyNames();
+ while (allKeys.hasMoreElements()) {
+ final String key = (String) allKeys.nextElement();
+ setPropertyByParameter(freeplaneApplet, key);
+ }
+ }
+
+ @Override
+ public String getFreeplaneUserDirectory() {
+ return null;
+ }
+
+ @Override
+ public int getIntProperty(final String key, final int defaultValue) {
+ try {
+ return Integer.parseInt(getProperty(key));
+ }
+ catch (final NumberFormatException nfe) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ public Properties getProperties() {
+ return userProps;
+ }
+
+ @Override
+ public String getProperty(final String key) {
+ return userProps.getProperty(key);
+ };
+
+ @Override
+ public URL getResource(final String name) {
+ final URL resourceURL = super.getResource(name);
+ if (resourceURL == null || !resourceURL.getProtocol().equals("jar")
+ && System.getProperty("freeplane.debug", null) == null) {
+ return null;
+ }
+ return resourceURL;
+ }
+
+ @Override
+ public void init() {
+ super.init();
+ }
+
+ @Override
+ public void saveProperties() {
+ }
+
+ @Override
+ public void setDefaultProperty(final String key, final String value) {
+ // FIXME: shouldn't this be if (!userProps.contains(key)) ??
+ userProps.setProperty(key, value);
+ }
+
+ @Override
+ public void setProperty(final String key, final String value) {
+ userProps.setProperty(key, value);
+ }
+
+ void setPropertyByParameter(JApplet applet, final String key) {
+ final String val = applet.getParameter(key);
+ if (val != null && val != "") {
+ userProps.setProperty(key, val);
+ }
+ }
+
+ @Override
+ public boolean isApplet() {
+ return true;
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/applet/AppletViewController.java b/freeplane/src/org/freeplane/main/applet/AppletViewController.java
new file mode 100644
index 0000000..a9c5767
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/applet/AppletViewController.java
@@ -0,0 +1,220 @@
+/*
+ * 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.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.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.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AppletViewController extends ViewController {
+ final private FreeplaneApplet applet;
+ private JComponent mComponentInSplitPane;
+ private JComponent mapContentBox;
+
+ public AppletViewController( final FreeplaneApplet applet, Controller controller,
+ final IMapViewManager mapViewController) {
+ super(controller, mapViewController, "");
+ this.applet = applet;
+ }
+
+ /*
+ * (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());
+ mapContentBox.add(getScrollPane(), 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(".")) {
+ /* new handling for relative urls. fc, 29.10.2003. */
+ try {
+ URI uri = applet.getDocumentBase().toURI().resolve(new URI(null, null, initialMapName, null));
+ URL documentBase = new URL(uri.getScheme(), uri.getHost(), 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 title) {
+ }
+
+ @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);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java b/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java
new file mode 100644
index 0000000..c61284c
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java
@@ -0,0 +1,226 @@
+/*
+ * 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.ViewController;
+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());
+ appletViewController = new AppletViewController(this, controller, new 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");
+ ViewController.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
new file mode 100644
index 0000000..7ad0aaf
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/ApplicationResourceController.java
@@ -0,0 +1,304 @@
+/*
+ * 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 FreeplaneStarter.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
new file mode 100644
index 0000000..d673a73
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/ApplicationViewController.java
@@ -0,0 +1,479 @@
+/*
+ * 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.dnd.DropTarget;
+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.URL;
+import java.text.MessageFormat;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLayeredPane;
+import javax.swing.JScrollPane;
+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.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.mindmapmode.FileOpener;
+import org.freeplane.view.swing.ui.DefaultMapMouseListener;
+
+class ApplicationViewController extends ViewController {
+ public static final String RESOURCES_USE_TABBED_PANE = "use_tabbed_pane";
+ 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;
+
+ @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");
+ if (ResourceController.getResourceController().getBooleanProperty("no_scrollbar")) {
+ getScrollPane().setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
+ getScrollPane().setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ }
+ else {
+ getScrollPane().setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+ getScrollPane().setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+ }
+ // disable all hotkeys for JSplitPane
+ mSplitPane = new JSplitPane(){
+ @Override
+ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed){
+ return false;
+ }
+ };
+ setSplitPaneLayoutManager();
+ final JScrollPane contentComponent = getScrollPane();
+ mSplitPane.setLeftComponent(contentComponent);
+ mSplitPane.setRightComponent(null);
+ final boolean shouldUseTabbedPane = ResourceController.getResourceController().getBooleanProperty(
+ ApplicationViewController.RESOURCES_USE_TABBED_PANE);
+ if (shouldUseTabbedPane) {
+ new MapViewTabs(this, mSplitPane);
+ }
+ else {
+ getContentPane().add(mSplitPane, BorderLayout.CENTER);
+ final FileOpener fileOpener = new FileOpener();
+ new DropTarget(mSplitPane, fileOpener);
+ mSplitPane.addMouseListener(new DefaultMapMouseListener());
+ }
+ 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;
+ final JScrollPane scrollPane = getScrollPane();
+ scrollPane.setVisible(true);
+ mSplitPane.setLeftComponent(null);
+ mSplitPane.setRightComponent(null);
+ if ("right".equals(mLocationPreferenceValue)) {
+ mSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
+ mSplitPane.setLeftComponent(scrollPane);
+ 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(scrollPane);
+ 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(scrollPane);
+ 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(scrollPane);
+ 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 {
+ final URI 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();
+ final JScrollPane scrollPane = getScrollPane();
+ mMindMapComponent = null;
+ mSplitPane.setLeftComponent(null);
+ mSplitPane.setRightComponent(null);
+ mSplitPane.setLeftComponent(scrollPane);
+ 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.getViewController().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();
+ resourceController.setProperty("map_view_zoom", Float.toString(getZoom()));
+ 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));
+ }
+ }
+
+ 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 title) {
+ frame.setTitle(title);
+ }
+
+ @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
+ protected 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_32x32.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);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/main/application/CommandLineParser.java b/freeplane/src/org/freeplane/main/application/CommandLineParser.java
new file mode 100644
index 0000000..6940af2
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/CommandLineParser.java
@@ -0,0 +1,156 @@
+package org.freeplane.main.application;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+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 -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) {
+ 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("-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/FreeplaneMain.java b/freeplane/src/org/freeplane/main/application/FreeplaneMain.java
new file mode 100644
index 0000000..a657dbe
--- /dev/null
+++ b/freeplane/src/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 FreeplaneStarter();
+ starter.run(args);
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java b/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java
new file mode 100644
index 0000000..a596f73
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java
@@ -0,0 +1,321 @@
+/*
+ * 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 mFinalSecurityManager = null;
+
+ public FreeplaneSecurityManager() {
+ }
+
+ @Override
+ public void checkAccept(final String pHost, final int pPort) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkAccept(pHost, pPort);
+ }
+
+ @Override
+ public void checkAccess(final Thread pT) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkAccess(pT);
+ }
+
+ @Override
+ public void checkAccess(final ThreadGroup pG) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkAccess(pG);
+ }
+
+ @Override
+ public void checkAwtEventQueueAccess() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkAwtEventQueueAccess();
+ }
+
+ @Override
+ public void checkConnect(final String pHost, final int pPort) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkConnect(pHost, pPort);
+ }
+
+ @Override
+ public void checkConnect(final String pHost, final int pPort, final Object pContext) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkConnect(pHost, pPort, pContext);
+ }
+
+ @Override
+ public void checkCreateClassLoader() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkCreateClassLoader();
+ }
+
+ @Override
+ public void checkDelete(final String pFile) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkDelete(pFile);
+ }
+
+ @Override
+ public void checkExec(final String pCmd) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkExec(pCmd);
+ }
+
+ @Override
+ public void checkExit(final int pStatus) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkExit(pStatus);
+ }
+
+ @Override
+ public void checkLink(final String pLib) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkLink(pLib);
+ }
+
+ @Override
+ public void checkListen(final int pPort) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkListen(pPort);
+ }
+
+ @Override
+ public void checkMemberAccess(final Class<?> clazz, final int which) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkMemberAccess(clazz, which);
+ }
+
+ @Override
+ public void checkMulticast(final InetAddress pMaddr) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.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 (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkMulticast(pMaddr, pTtl);
+ }
+
+ @Override
+ public void checkPackageAccess(final String pPkg) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPackageAccess(pPkg);
+ }
+
+ @Override
+ public void checkPackageDefinition(final String pPkg) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPackageDefinition(pPkg);
+ }
+
+ @Override
+ public void checkPermission(final Permission pPerm) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPermission(pPerm);
+ }
+
+ @Override
+ public void checkPermission(final Permission pPerm, final Object pContext) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPermission(pPerm, pContext);
+ }
+
+ @Override
+ public void checkPrintJobAccess() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPrintJobAccess();
+ }
+
+ @Override
+ public void checkPropertiesAccess() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPropertiesAccess();
+ }
+
+ @Override
+ public void checkPropertyAccess(final String pKey) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkPropertyAccess(pKey);
+ }
+
+ @Override
+ public void checkRead(final FileDescriptor pFd) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkRead(pFd);
+ }
+
+ @Override
+ public void checkRead(final String pFile) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkRead(pFile);
+ }
+
+ @Override
+ public void checkRead(final String pFile, final Object pContext) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkRead(pFile, pContext);
+ }
+
+ @Override
+ public void checkSecurityAccess(final String pTarget) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkSecurityAccess(pTarget);
+ }
+
+ @Override
+ public void checkSetFactory() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkSetFactory();
+ }
+
+ @Override
+ public void checkSystemClipboardAccess() {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkSystemClipboardAccess();
+ }
+
+ @Override
+ public boolean checkTopLevelWindow(final Object pWindow) {
+ if (mFinalSecurityManager == null) {
+ return true;
+ }
+ return mFinalSecurityManager.checkTopLevelWindow(pWindow);
+ }
+
+ @Override
+ public void checkWrite(final FileDescriptor pFd) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkWrite(pFd);
+ }
+
+ @Override
+ public void checkWrite(final String pFile) {
+ if (mFinalSecurityManager == null) {
+ return;
+ }
+ mFinalSecurityManager.checkWrite(pFile);
+ }
+
+ @Override
+ public Object getSecurityContext() {
+ if (mFinalSecurityManager == null) {
+ return super.getSecurityContext();
+ }
+ return mFinalSecurityManager.getSecurityContext();
+ }
+
+ public void setFinalSecurityManager(final SecurityManager finalSecurityManager) {
+ if (mFinalSecurityManager != null) {
+ throw new SecurityException("There is a SecurityManager installed already.");
+ }
+ mFinalSecurityManager = finalSecurityManager;
+ }
+
+ public void removeFinalSecurityManager(final SecurityManager finalSecurityManager) {
+ if (finalSecurityManager == mFinalSecurityManager) {
+ mFinalSecurityManager = null;
+ return;
+ }
+ 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 needsFinalSecurityManager() {
+ return mFinalSecurityManager == null
+ && ! 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
new file mode 100644
index 0000000..9516dd0
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/FreeplaneSplashModern.java
@@ -0,0 +1,150 @@
+/*
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.JFrame;
+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;
+ private final String description = ResourceController.getResourceController().getProperty("freeplane_description");
+ private final String copyright = ResourceController.getResourceController().getProperty("freeplane_copyright");
+
+ public FreeplaneSplashModern(final JFrame frame) {
+ super(frame);
+ splashResource = ResourceController.getResourceController().getResource("/images/Freeplane_splash.png");
+ splashImage = new ImageIcon(splashResource);
+ getRootPane().setOpaque(false);
+ 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);
+ }
+
+ private void createVersionTextFont() {
+ if(versionTextFont != null){
+ return;
+ }
+ InputStream fontInputStream = null;
+ try {
+ fontInputStream = ResourceController.getResourceController().getResource("/fonts/BPreplay.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 Integer mWidth3;
+ private URL splashResource;
+
+ @Override
+ public void paint(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 freeplaneNumber = version.numberToString();
+ final String status = version.getType().toUpperCase();
+ {
+ g2.setColor(Color.WHITE);
+ final int xCoordinate = 260;
+ final int yCoordinate = 212;
+ createVersionTextFont();
+ final float versionFontSize;
+ if(! status.equals(""))
+ versionFontSize = 18;
+ else
+ versionFontSize = 24;
+ g2.setFont(versionTextFont.deriveFont(versionFontSize));
+ g2.drawString(freeplaneNumber + " " + status, xCoordinate, yCoordinate);
+ }
+ g2.setFont(versionTextFont.deriveFont(10f));
+ g2.setColor(Color.WHITE);
+ int xCoordinate = 10;
+ final int yCoordinate = getSize().height - 10;
+ g2.drawString(description, xCoordinate, yCoordinate);
+ if (mWidth3 == null) {
+ mWidth3 = new Integer(g2.getFontMetrics().stringWidth(copyright));
+ }
+ xCoordinate = getSize().width - mWidth3.intValue() - 10;
+ g2.drawString(copyright, xCoordinate, yCoordinate);
+ }
+
+ @Override
+ public void setVisible(final boolean b) {
+ super.setVisible(b);
+ if (b) {
+ 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
new file mode 100644
index 0000000..cb4ddf5
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/FreeplaneStarter.java
@@ -0,0 +1,373 @@
+/*
+ * 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.EventQueue;
+import java.awt.Frame;
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+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.ViewController;
+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.ViewLayoutTypeAction;
+import org.freeplane.view.swing.map.mindmapmode.MMapViewController;
+
+public class FreeplaneStarter {
+ 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 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;
+ public static final String DEFAULT_ORG_FREEPLANE_GLOBALRESOURCEDIR = "resources";
+ public static final String ORG_FREEPLANE_GLOBALRESOURCEDIR = "org.freeplane.globalresourcedir";
+
+ public FreeplaneStarter() {
+ 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();
+ FreeplaneStarter.showSysInfo();
+ final String lookandfeel = System.getProperty("lookandfeel", applicationResourceController
+ .getProperty("lookandfeel"));
+ ViewController.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();
+ 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();
+ controller.getModeController(MModeController.MODENAME).getMapController().addMapChangeListener(
+ applicationResourceController.getLastOpenedList());
+ 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);
+ loadMaps(options.getFilesToOpenAsArray());
+ viewController.init(Controller.getCurrentController());
+ splash.toBack();
+ final Frame frame = viewController.getFrame();
+ final int extendedState = frame.getExtendedState();
+ frame.setVisible(true);
+ if (extendedState != frame.getExtendedState()) {
+ frame.setExtendedState(extendedState);
+ }
+ splash.dispose();
+ splash = null;
+ 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 loadMaps( final String[] args) {
+ final Controller controller = Controller.getCurrentController();
+ final boolean alwaysLoadLastMaps = ResourceController.getResourceController().getBooleanProperty(
+ "always_load_last_maps");
+ if (alwaysLoadLastMaps && !dontLoadLastMaps) {
+ applicationResourceController.getLastOpenedList().openMapsOnStart();
+ }
+ if (loadMaps(controller, args)) {
+ return;
+ }
+ if (!alwaysLoadLastMaps && !dontLoadLastMaps) {
+ final AddOnsController addonsController = AddOnsController.getController();
+ addonsController.setAutoInstallEnabled(false);
+ applicationResourceController.getLastOpenedList().openMapsOnStart();
+ addonsController.setAutoInstallEnabled(true);
+ }
+ if(firstRun && ! dontLoadLastMaps){
+ final File baseDir = new File(FreeplaneStarter.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();
+ }
+
+ 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 boolean loadMaps(final Controller controller, final String[] args) {
+ boolean fileLoaded = false;
+ for (int i = 0; i < args.length; i++) {
+ String fileArgument = args[i];
+ if (fileArgument.toLowerCase().endsWith(
+ org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION)) {
+ try {
+ final URL url;
+ if(fileArgument.startsWith("http://")){
+ url = new URL(fileArgument);
+ }
+ else{
+ if (!FileUtils.isAbsolutePath(fileArgument)) {
+ fileArgument = System.getProperty("user.dir") + System.getProperty("file.separator") + fileArgument;
+ }
+ url = Compat.fileToUrl(new File(fileArgument));
+ }
+ if (!fileLoaded) {
+ controller.selectMode(MModeController.MODENAME);
+ }
+ final MModeController modeController = (MModeController) controller.getModeController();
+ modeController.getMapController().newMap(url);
+ fileLoaded = true;
+ }
+ catch (final Exception ex) {
+ System.err.println("File " + fileArgument + " not loaded");
+ }
+ }
+ }
+ return fileLoaded;
+ }
+
+ /**
+ */
+ 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/HttpVersionClient.java b/freeplane/src/org/freeplane/main/application/HttpVersionClient.java
new file mode 100644
index 0000000..16051fb
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/HttpVersionClient.java
@@ -0,0 +1,108 @@
+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 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;
+
+ 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;
+ BufferedReader in = null;
+ try {
+ 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) {
+ return;
+ }
+ final StringBuilder historyBuffer = new StringBuilder();
+ historyBuffer.append(line);
+ historyBuffer.append('\n');
+ for (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();
+ }
+ catch (final NullPointerException e) {
+ return;
+ }
+ catch (final IOException e) {
+ LogUtils.warn("Could not read update url - check your internet connection.");
+ return;
+ }
+ catch (final IllegalArgumentException e) {
+ LogUtils.warn("Could not read version.");
+ return;
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ }
+ catch (final IOException e) {
+ LogUtils.warn("Couldn't close buffered reader.");
+ return;
+ }
+ }
+ }
+ }
+
+ public String getHistory() {
+ return history;
+ }
+
+ public FreeplaneVersion getRemoteVersion() {
+ return remoteVersion;
+ }
+
+ 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
new file mode 100644
index 0000000..7c34616
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/LastOpenedList.java
@@ -0,0 +1,340 @@
+/*
+ * 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 OPENED_NOW = "openedNow_1.0.20";
+ private static final String LAST_OPENED = "lastOpened_1.0.20";
+ public static final String LOAD_LAST_MAP = "load_last_map";
+ public static final String LOAD_LAST_MAPS = "load_last_maps";
+// // 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);
+ final private List<String> currenlyOpenedList = new LinkedList<String>();
+ /**
+ * 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>();
+
+ LastOpenedList() {
+// this.controller = controller;
+ restoreList(LAST_OPENED, lastOpenedList);
+ }
+
+ 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) {
+ final String restoreable = getRestoreable(oldView);
+ if (restoreable == null) {
+ return;
+ }
+ currenlyOpenedList.remove(restoreable);
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ final String restoreable = getRestoreable(mapView);
+ if (restoreable == null) {
+ return;
+ }
+ currenlyOpenedList.add(restoreable);
+ }
+
+ 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);
+ }
+
+ private String getRestoreable(final Component mapView) {
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final MapModel map = mapViewManager.getModel(mapView);
+ final String restoreString = getRestoreable(map);
+ return restoreString;
+ }
+
+ 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 before = (URL) event.getOldValue();
+ if (before != null) {
+ final String fileBefore = before.getFile();
+ if (fileBefore != null) {
+ final String restorable = getRestorable(new File(fileBefore));
+ currenlyOpenedList.remove(restorable);
+ }
+ }
+ final URL after = (URL) event.getNewValue();
+ if (after != null) {
+ final String fileAfter = after.getFile();
+ if (fileAfter != null) {
+ final String restorable = getRestorable(new File(fileAfter));
+ currenlyOpenedList.add(restorable);
+ 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 {
+ final boolean changedToMapView = tryToChangeToMapView(restoreable);
+ if ((restoreable != null) && !(changedToMapView)) {
+ final StringTokenizer token = new StringTokenizer(restoreable, ":");
+ if (token.hasMoreTokens()) {
+ final String mode = token.nextToken();
+ Controller.getCurrentController().selectMode(mode);
+ String fileName = token.nextToken("").substring(1);
+ if (PORTABLE_APP && fileName.startsWith(":") && USER_DRIVE.endsWith(":")) {
+ fileName = USER_DRIVE + fileName.substring(1);
+ }
+ Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(new File(fileName)));
+ }
+ }
+ }
+
+ public void openMapsOnStart() {
+ final boolean loadLastMap = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAP);
+ final String lastMap;
+ if (loadLastMap && !lastOpenedList.isEmpty()) {
+ lastMap = lastOpenedList.get(0);
+ }
+ else {
+ lastMap = null;
+ }
+ final boolean loadLastMaps = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAPS);
+ if (loadLastMaps) {
+ final List<String> startList = new LinkedList<String>();
+ restoreList(OPENED_NOW, startList);
+ safeOpen(startList);
+ if (!lastOpenedList.isEmpty()) {
+ tryToChangeToMapView(lastMap);
+ }
+ return;
+ }
+ if (loadLastMap && !lastOpenedList.isEmpty()) {
+ safeOpen(lastMap);
+ }
+ }
+
+ private void remove(final String restoreable) {
+ lastOpenedList.remove(restoreable);
+ updateMenus();
+ }
+
+ private void restoreList(final String key, final List<String> list) {
+ final String restored = ResourceController.getResourceController().getProperty(key, null);
+ if (restored != null && !restored.equals("")) {
+ list.addAll(ConfigurationUtils.decodeListValue(restored, true));
+ }
+ }
+
+ 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));
+ ResourceController.getResourceController().setProperty(OPENED_NOW,
+ ConfigurationUtils.encodeListValue(currenlyOpenedList, 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);
+ String text = createOpenMapItemName(key);
+ item.setText(createOpenMapItemName(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);
+ return TextUtils.getText("open_as" + key, key) + restorable.substring(separatorIndex);
+
+ }
+
+ 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/MapViewTabs.java b/freeplane/src/org/freeplane/main/application/MapViewTabs.java
new file mode 100644
index 0000000..bcf9b02
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/MapViewTabs.java
@@ -0,0 +1,208 @@
+/*
+ * 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.BorderLayout;
+import java.awt.Component;
+import java.awt.Insets;
+import java.awt.dnd.DropTarget;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Vector;
+
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.KeyStroke;
+import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.plaf.TabbedPaneUI;
+import javax.swing.plaf.basic.BasicTabbedPaneUI;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.mindmapmode.FileOpener;
+import org.freeplane.view.swing.ui.DefaultMapMouseListener;
+
+class MapViewTabs implements IMapViewChangeListener {
+// // final private Controller controller;
+ private Component mContentComponent;
+ private JTabbedPane mTabbedPane = null;
+ final private Vector<Component> mTabbedPaneMapViews;
+ private boolean mTabbedPaneSelectionUpdate = true;
+ private TabbedPaneUI tabbedPaneUI;
+
+ public MapViewTabs( final ViewController fm, final JComponent contentComponent) {
+// this.controller = controller;
+ mContentComponent = contentComponent;
+ InputMap map;
+ map = (InputMap) UIManager.get("TabbedPane.ancestorInputMap");
+ final KeyStroke keyStrokeCtrlUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.CTRL_DOWN_MASK);
+ map.remove(keyStrokeCtrlUp);
+ mTabbedPane = new JTabbedPane();
+ mTabbedPane.setFocusable(false);
+ mTabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
+ mTabbedPaneMapViews = new Vector<Component>();
+ mTabbedPane.addChangeListener(new ChangeListener() {
+ public synchronized void stateChanged(final ChangeEvent pE) {
+ tabSelectionChanged();
+ }
+ });
+ final FileOpener fileOpener = new FileOpener();
+ new DropTarget(mTabbedPane, fileOpener);
+ mTabbedPane.addMouseListener(new DefaultMapMouseListener());
+
+ final Controller controller = Controller.getCurrentController();
+ controller.getMapViewManager().addMapViewChangeListener(this);
+ fm.getContentPane().add(mTabbedPane, BorderLayout.CENTER);
+ }
+
+ public void afterViewChange(final Component pOldMap, final Component pNewMap) {
+ final int selectedIndex = mTabbedPane.getSelectedIndex();
+ if (pNewMap == null) {
+ return;
+ }
+ for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
+ if (mTabbedPaneMapViews.get(i) == pNewMap) {
+ if (selectedIndex != i) {
+ mTabbedPane.setSelectedIndex(i);
+ }
+ return;
+ }
+ }
+ mTabbedPaneMapViews.add(pNewMap);
+ final String title1 = pNewMap.getName();
+ final String title = title1;
+ mTabbedPane.addTab(title, new JPanel());
+ mTabbedPane.setSelectedIndex(mTabbedPane.getTabCount() - 1);
+ setTabsVisible();
+ }
+
+ public void afterViewClose(final Component pOldMapView) {
+ for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
+ if (mTabbedPaneMapViews.get(i) == pOldMapView) {
+ mTabbedPaneSelectionUpdate = false;
+ mTabbedPane.removeTabAt(i);
+ mTabbedPaneMapViews.remove(i);
+ mTabbedPaneSelectionUpdate = true;
+ tabSelectionChanged();
+ setTabsVisible();
+ return;
+ }
+ }
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ mapView.addPropertyChangeListener("name", new PropertyChangeListener() {
+ public void propertyChange(final PropertyChangeEvent evt) {
+ final Component pMapView = (Component) evt.getSource();
+ for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
+ if (mTabbedPaneMapViews.get(i) == pMapView) {
+ mTabbedPane.setTitleAt(i, pMapView.getName());
+ }
+ }
+ }
+ });
+ }
+
+ public void beforeViewChange(final Component pOldMapView, final Component pNewMapView) {
+ }
+
+ public void removeContentComponent() {
+ mContentComponent = null;
+ if (mTabbedPane.getSelectedIndex() >= 0) {
+ mTabbedPane.setComponentAt(mTabbedPane.getSelectedIndex(), new JPanel());
+ }
+ }
+
+ public void setContentComponent(final Component mContentComponent) {
+ this.mContentComponent = mContentComponent;
+ if (mTabbedPane.getSelectedIndex() >= 0) {
+ mTabbedPane.setComponentAt(mTabbedPane.getSelectedIndex(), mContentComponent);
+ }
+ }
+
+ private void tabSelectionChanged() {
+ if (!mTabbedPaneSelectionUpdate) {
+ return;
+ }
+ final int selectedIndex = mTabbedPane.getSelectedIndex();
+ for (int j = 0; j < mTabbedPane.getTabCount(); j++) {
+ if (j != selectedIndex) {
+ mTabbedPane.setComponentAt(j, new JPanel());
+ }
+ }
+ if (selectedIndex < 0) {
+ return;
+ }
+ final Component mapView = mTabbedPaneMapViews.get(selectedIndex);
+ Controller controller = Controller.getCurrentController();
+ if (mapView != controller.getViewController().getMapView()) {
+ controller.getMapViewManager().changeToMapView(mapView.getName());
+ }
+ if (mContentComponent != null) {
+ mContentComponent.setVisible(true);
+ mTabbedPane.setComponentAt(selectedIndex, mContentComponent);
+ }
+ }
+
+ private void setTabsVisible() {
+ final boolean visible = mTabbedPane.getTabCount() > 1;
+ if (visible == areTabsVisible()) {
+ return;
+ }
+ if (tabbedPaneUI == null) {
+ tabbedPaneUI = mTabbedPane.getUI();
+ }
+ if (visible) {
+ mTabbedPane.setUI(tabbedPaneUI);
+ }
+ else {
+ mTabbedPane.setUI(new BasicTabbedPaneUI() {
+ @Override
+ protected int calculateTabAreaHeight(final int tabPlacement, final int horizRunCount,
+ final int maxTabHeight) {
+ return 0;
+ }
+
+ @Override
+ protected Insets getContentBorderInsets(final int tabPlacement) {
+ return new Insets(0, 0, 0, 0);
+ }
+
+ @Override
+ protected MouseListener createMouseListener() {
+ return null;
+ }
+ });
+ }
+ mTabbedPane.revalidate();
+ }
+
+ private boolean areTabsVisible() {
+ return tabbedPaneUI == null || tabbedPaneUI == mTabbedPane.getUI();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/application/NavigationNextMapAction.java b/freeplane/src/org/freeplane/main/application/NavigationNextMapAction.java
new file mode 100644
index 0000000..57c5326
--- /dev/null
+++ b/freeplane/src/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().getMapViewManager().nextMapView();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/application/NavigationPreviousMapAction.java b/freeplane/src/org/freeplane/main/application/NavigationPreviousMapAction.java
new file mode 100644
index 0000000..b627460
--- /dev/null
+++ b/freeplane/src/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().getMapViewManager().previousMapView();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java b/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java
new file mode 100644
index 0000000..3cf97b5
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java
@@ -0,0 +1,46 @@
+/*
+ * 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
new file mode 100644
index 0000000..fc41b03
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/SingleInstanceManager.java
@@ -0,0 +1,207 @@
+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.InetAddress;
+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(InetAddress.getLocalHost(), 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(InetAddress.getLocalHost(), 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, InetAddress.getLocalHost());
+ 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
new file mode 100644
index 0000000..d2941d9
--- /dev/null
+++ b/freeplane/src/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);
+ }
+}
\ 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
new file mode 100644
index 0000000..983506b
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/UpdateCheckAction.java
@@ -0,0 +1,290 @@
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.event.ActionEvent;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.Timer;
+
+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.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewChangeListener;
+
+/**
+ * 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;
+ }
+ EventQueue.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 connectSuccesfull;
+ 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();
+ connectSuccesfull = defaultVersionClient.isSuccessful();
+ }
+ else {
+ lastVersion = lastTranslatedVersion;
+ history = translatedVersionClient.getHistory();
+ connectSuccesfull = translatedVersionClient.isSuccessful();
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ addUpdateButton(lastVersion);
+ if (autoRun) {
+ return;
+ }
+ showUpdateDialog(connectSuccesfull, localVersion, lastVersion, history);
+ }
+ });
+ }
+
+ 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) {
+ final int choice;
+ if (connectSuccesfull == false) {
+ choice = showUpdateDialog("can_not_connect_to_info_server", "", "");
+ }
+ else if (localVersion.compareTo(newVersion) < 0) {
+ choice = showUpdateDialog("new_version_available", newVersion.toString(), history);
+ }
+ else {
+ showUpdateDialog("version_up_to_date", null, null);
+ choice = -1;
+ }
+ if (0 != choice) {
+ return;
+ }
+ // go to download page
+ try {
+ Controller.getCurrentController().getViewController().openDocument(
+ new URL(ResourceController.getResourceController().getProperty(WEB_DOWNLOAD_LOCATION_KEY)));
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.getText("url_error") + "\n" + ex);
+ }
+ catch (final Exception ex) {
+ UITools.errorMessage(ex);
+ }
+ }
+
+ private int showUpdateDialog(final String info, final String newVersion, final String history) {
+ final Box messagePane = Box.createVerticalBox();
+ final JLabel messageLabel;
+ if (newVersion != null) {
+ messageLabel = new JLabel(TextUtils.format(info, newVersion.toString()));
+ }
+ else {
+ messageLabel = new JLabel(TextUtils.getText(info));
+ }
+ messageLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(messageLabel);
+ final JTextArea historyArea = new JTextArea(history);
+ historyArea.setEditable(false);
+ final JScrollPane historyPane = new JScrollPane(historyArea);
+ historyPane.setPreferredSize(new Dimension(500, 300));
+ historyPane.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(historyPane);
+ 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;
+ if (newVersion != null) {
+ options = new Object[] { TextUtils.getText("download"),
+ TextUtils.getText("cancel") };
+ }
+ else {
+ 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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java b/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java
new file mode 100644
index 0000000..e4644d3
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java
@@ -0,0 +1,215 @@
+/*
+ * 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.Collections;
+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.FileUtils;
+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 {
+ void importOldProperties(){
+ final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
+ if(userPreferencesFile.exists()){
+ return;
+ }
+ final File oldUserPreferencesFile =new File(System.getProperty("user.home"), ".freeplane/auto.properties");
+ if(! oldUserPreferencesFile.exists()){
+ return;
+ }
+ importOldPreferences(userPreferencesFile, oldUserPreferencesFile);
+ importOldIcons();
+ }
+
+ private void importOldPreferences(final File userPreferencesFile,
+ final File oldUserPreferencesFile) {
+ Properties userProp = new Properties();
+ FileInputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(oldUserPreferencesFile);
+ userProp.load(inputStream);
+ 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");
+ userProp.store(new FileOutputStream(userPreferencesFile), null);
+ }
+ catch (IOException e) {
+ }
+ finally {
+ FileUtils.silentlyClose(inputStream);
+ }
+ }
+
+ 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) 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
new file mode 100644
index 0000000..91de77f
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/application/protocols/freeplaneresource/Handler.java
@@ -0,0 +1,40 @@
+/*
+ * 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
new file mode 100644
index 0000000..bb28d44
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/browsemode/BModeControllerFactory.java
@@ -0,0 +1,108 @@
+/*
+ * 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
new file mode 100644
index 0000000..b549927
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/browsemode/BToolbarContributor.java
@@ -0,0 +1,93 @@
+/*
+ * 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
new file mode 100644
index 0000000..7f290cb
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/filemode/FModeControllerFactory.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.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/mindmapmode/MModeControllerFactory.java b/freeplane/src/org/freeplane/main/mindmapmode/MModeControllerFactory.java
new file mode 100644
index 0000000..a3c8b5b
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/MModeControllerFactory.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.main.mindmapmode;
+
+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;
+import org.freeplane.core.ui.components.JResizer.Direction;
+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.FreeNode;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.FoldingController;
+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());
+ 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();
+ resisableTabs.add(new JResizer(Direction.RIGHT));
+ resisableTabs.add(tabs);
+ 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
new file mode 100644
index 0000000..4e7968b
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/MToolbarContributor.java
@@ -0,0 +1,63 @@
+/*
+ * 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
new file mode 100644
index 0000000..ee3ecc9
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/AEditStylesAction.java
@@ -0,0 +1,83 @@
+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
new file mode 100644
index 0000000..660a34e
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java
@@ -0,0 +1,86 @@
+/*
+ * 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
new file mode 100644
index 0000000..af6ee86
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..572f772
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DialogController.java
@@ -0,0 +1,145 @@
+/*
+ * 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.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.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.ViewController;
+
+class DialogController extends ViewController {
+ final private JDialog dialog;
+
+ public JDialog getDialog() {
+ return dialog;
+ }
+
+ private JComponent mContentComponent = 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());
+ mContentComponent = getScrollPane();
+ getContentPane().add(mContentComponent, 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 title) {
+ dialog.setTitle(title);
+ }
+
+ @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();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
new file mode 100644
index 0000000..6a40ebe
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
@@ -0,0 +1,70 @@
+/*
+ * 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.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();
+ getModeController().getMapController().newMapView(styleMap);
+ 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
new file mode 100644
index 0000000..ba258af
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java
@@ -0,0 +1,79 @@
+/*
+ * 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
new file mode 100644
index 0000000..8962dd3
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..10971b7
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeController.java
@@ -0,0 +1,115 @@
+/*
+ * 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
new file mode 100644
index 0000000..09aeabb
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.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.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();
+ 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());
+ 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/Activator.java b/freeplane/src/org/freeplane/main/osgi/Activator.java
new file mode 100644
index 0000000..81b37b2
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/osgi/Activator.java
@@ -0,0 +1,42 @@
+/*
+ * 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 org.freeplane.main.application.FreeplaneMain;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Dimitry Polivaev
+ * 05.01.2009
+ */
+public class Activator implements BundleActivator {
+ private BundleActivator activatorImpl;
+
+ public void start(final BundleContext context) throws Exception {
+ FreeplaneMain.checkJavaVersion();
+ activatorImpl = new ActivatorImpl();
+ activatorImpl.start(context);
+ }
+
+ public void stop(final BundleContext context) throws Exception {
+ activatorImpl.stop(context);
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.java b/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.java
new file mode 100644
index 0000000..593eae7
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.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.main.osgi;
+
+import java.awt.EventQueue;
+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.FreeplaneStarter;
+import org.freeplane.main.application.SingleInstanceManager;
+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 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 = FreeplaneStarter.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(FreeplaneStarter.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 = new FreeplaneStarter();
+ 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))) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ }
+ catch (final InterruptedException e) {
+ }
+ System.exit(0);
+ }
+ });
+ return;
+ }
+ EventQueue.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());
+ }
+ });
+ }
+
+ 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/org/freeplane/main/osgi/IControllerExtensionProvider.java
new file mode 100644
index 0000000..2922e96
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/osgi/IControllerExtensionProvider.java
@@ -0,0 +1,30 @@
+/*
+ * 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.main.osgi;
+
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 22, 2009
+ */
+public interface IControllerExtensionProvider {
+ void installExtension(Controller controller);
+}
diff --git a/freeplane/src/org/freeplane/main/osgi/IModeControllerExtensionProvider.java b/freeplane/src/org/freeplane/main/osgi/IModeControllerExtensionProvider.java
new file mode 100644
index 0000000..8555c76
--- /dev/null
+++ b/freeplane/src/org/freeplane/main/osgi/IModeControllerExtensionProvider.java
@@ -0,0 +1,30 @@
+/*
+ * 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.main.osgi;
+
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 22, 2009
+ */
+public interface IModeControllerExtensionProvider {
+ void installExtension(ModeController modeController);
+}
diff --git a/freeplane/src/org/freeplane/main/osgi/ResourcesUrlHandler.java b/freeplane/src/org/freeplane/main/osgi/ResourcesUrlHandler.java
new file mode 100644
index 0000000..d0b46a5
--- /dev/null
+++ b/freeplane/src/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.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/CDATAReader.java b/freeplane/src/org/freeplane/n3/nanoxml/CDATAReader.java
new file mode 100644
index 0000000..29405d9
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/CDATAReader.java
@@ -0,0 +1,151 @@
+/*
+ * CDATAReader.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;
+
+/**
+ * This reader reads data from another reader until the end of a CDATA section
+ * (]]>) has been encountered.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+class CDATAReader extends Reader {
+ /**
+ * True if the end of the stream has been reached.
+ */
+ private boolean atEndOfData;
+ /**
+ * The encapsulated reader.
+ */
+ private IXMLReader reader;
+ /**
+ * Saved char.
+ */
+ private char savedChar;
+
+ /**
+ * Creates the reader.
+ *
+ * @param reader
+ * the encapsulated reader
+ */
+ CDATAReader(final IXMLReader reader) {
+ this.reader = reader;
+ savedChar = 0;
+ atEndOfData = false;
+ }
+
+ /**
+ * Skips remaining data and closes the stream.
+ *
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public void close() throws IOException {
+ while (!atEndOfData) {
+ char ch = savedChar;
+ if (ch == 0) {
+ ch = reader.read();
+ }
+ else {
+ savedChar = 0;
+ }
+ if (ch == ']') {
+ final char ch2 = reader.read();
+ if (ch2 == ']') {
+ final char ch3 = reader.read();
+ if (ch3 == '>') {
+ break;
+ }
+ savedChar = ch2;
+ reader.unread(ch3);
+ }
+ else {
+ reader.unread(ch2);
+ }
+ }
+ }
+ atEndOfData = true;
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ reader = null;
+ super.finalize();
+ }
+
+ /**
+ * Reads a block of data.
+ *
+ * @param buffer
+ * where to put the read data
+ * @param offset
+ * first position in buffer to put the data
+ * @param size
+ * maximum number of chars to read
+ * @return the number of chars read, or -1 if at EOF
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public int read(final char[] buffer, final int offset, int size) throws IOException {
+ int charsRead = 0;
+ if (atEndOfData) {
+ return -1;
+ }
+ if ((offset + size) > buffer.length) {
+ size = buffer.length - offset;
+ }
+ while (charsRead < size) {
+ char ch = savedChar;
+ if (ch == 0) {
+ ch = reader.read();
+ }
+ else {
+ savedChar = 0;
+ }
+ if (ch == ']') {
+ final char ch2 = reader.read();
+ if (ch2 == ']') {
+ final char ch3 = reader.read();
+ if (ch3 == '>') {
+ atEndOfData = true;
+ break;
+ }
+ savedChar = ch2;
+ reader.unread(ch3);
+ }
+ else {
+ reader.unread(ch2);
+ }
+ }
+ buffer[charsRead] = ch;
+ charsRead++;
+ }
+ if (charsRead == 0) {
+ charsRead = -1;
+ }
+ return charsRead;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java b/freeplane/src/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java
new file mode 100644
index 0000000..c1b7e95
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java
@@ -0,0 +1,30 @@
+package org.freeplane.n3.nanoxml;
+
+import java.io.OutputStream;
+import java.io.Writer;
+
+/**
+ * An RawXMLWriter writes XML data to a stream. In contrast to RawXMLWriter the RawXMLWriter uses CDATA sections to protect
+ * the content of a node.
+ *
+ * @see org.freeplane.n3.nanoxml.XMLWriter
+ */
+public class CdataContentXmlWriter extends XMLWriter {
+ public CdataContentXmlWriter(OutputStream stream) {
+ super(stream);
+ }
+
+ public CdataContentXmlWriter(final Writer writer) {
+ super(writer);
+ }
+
+ /**
+ * Writes a string encoding reserved characters.
+ *
+ * @param str
+ * the string to write.
+ */
+ protected void writeEncodedContent(final String str) {
+ getWriter().print("<![CDATA[" + str + "]]>");
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/ContentReader.java b/freeplane/src/org/freeplane/n3/nanoxml/ContentReader.java
new file mode 100644
index 0000000..eadf33c
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/ContentReader.java
@@ -0,0 +1,173 @@
+/*
+ * ContentReader.java NanoXML/Java $Revision: 1.4 $ $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;
+
+/**
+ * This reader reads data from another reader until a new element has been
+ * encountered.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+class ContentReader extends Reader {
+ /**
+ * Buffer.
+ */
+ private String buffer;
+ /**
+ * Pointer into the buffer.
+ */
+ private int bufferIndex;
+ /**
+ * The encapsulated reader.
+ */
+ private IXMLReader reader;
+ /**
+ * The entity resolver.
+ */
+ private IXMLEntityResolver resolver;
+
+ /**
+ * Creates the reader.
+ *
+ * @param reader
+ * the encapsulated reader
+ * @param resolver
+ * the entity resolver
+ * @param buffer
+ * data that has already been read from <code>reader</code>
+ */
+ ContentReader(final IXMLReader reader, final IXMLEntityResolver resolver, final String buffer) {
+ this.reader = reader;
+ this.resolver = resolver;
+ this.buffer = buffer;
+ bufferIndex = 0;
+ }
+
+ /**
+ * Skips remaining data and closes the stream.
+ *
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public void close() throws IOException {
+ try {
+ final int bufferLength = buffer.length();
+ for (;;) {
+ String str = "";
+ char ch;
+ if (bufferIndex >= bufferLength) {
+ str = XMLUtil.read(reader, '&');
+ ch = str.charAt(0);
+ }
+ else {
+ ch = buffer.charAt(bufferIndex);
+ bufferIndex++;
+ continue;
+ }
+ if (ch == '<') {
+ reader.unread(ch);
+ break;
+ }
+ if ((ch == '&') && (str.length() > 1)) {
+ if (str.charAt(1) != '#') {
+ XMLUtil.processEntity(str, reader, resolver);
+ }
+ }
+ }
+ }
+ catch (final XMLParseException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ reader = null;
+ resolver = null;
+ buffer = null;
+ super.finalize();
+ }
+
+ /**
+ * Reads a block of data.
+ *
+ * @param outputBuffer
+ * where to put the read data
+ * @param offset
+ * first position in buffer to put the data
+ * @param size
+ * maximum number of chars to read
+ * @return the number of chars read, or -1 if at EOF
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public int read(final char[] outputBuffer, final int offset, int size) throws IOException {
+ try {
+ int charsRead = 0;
+ final int bufferLength = buffer.length();
+ if ((offset + size) > outputBuffer.length) {
+ size = outputBuffer.length - offset;
+ }
+ while (charsRead < size) {
+ String str = "";
+ char ch;
+ if (bufferIndex >= bufferLength) {
+ str = XMLUtil.read(reader, '&');
+ ch = str.charAt(0);
+ }
+ else {
+ ch = buffer.charAt(bufferIndex);
+ bufferIndex++;
+ outputBuffer[charsRead] = ch;
+ charsRead++;
+ continue;
+ }
+ if (ch == '<') {
+ reader.unread(ch);
+ break;
+ }
+ if ((ch == '&') && (str.length() > 1)) {
+ if (str.charAt(1) == '#') {
+ ch = XMLUtil.processCharLiteral(str);
+ }
+ else {
+ XMLUtil.processEntity(str, reader, resolver);
+ continue;
+ }
+ }
+ outputBuffer[charsRead] = ch;
+ charsRead++;
+ }
+ if (charsRead == 0) {
+ charsRead = -1;
+ }
+ return charsRead;
+ }
+ catch (final XMLParseException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLBuilder.java b/freeplane/src/org/freeplane/n3/nanoxml/IXMLBuilder.java
new file mode 100644
index 0000000..c1de65d
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/IXMLBuilder.java
@@ -0,0 +1,176 @@
+/*
+ * IXMLBuilder.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.Reader;
+
+/**
+ * NanoXML uses IXMLBuilder to construct the XML data structure it retrieved
+ * from its data source. You can supply your own builder or you can use the
+ * default builder of NanoXML.
+ * <P>
+ * If a method of the builder throws an exception, the parsing is aborted and
+ * {@link org.freeplane.n3.nanoxml.IXMLParser#parse} throws an
+ * {@link org.freeplane.n3.nanoxml.XMLException} which encasulates the
+ * original exception.
+ *
+ * @see org.freeplane.n3.nanoxml.IXMLParser
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+public interface IXMLBuilder {
+ /**
+ * 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(String key, String nsPrefix, String nsURI, String value, String type) throws Exception;
+
+ /**
+ * 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 method can retrieve the data from this reader. You may
+ * close the reader before reading all its data and you cannot
+ * read too much data.
+ * @param systemID
+ * the system ID of the XML data source.
+ * @param lineNr
+ * the line in the source where the element starts.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void addPCData(Reader reader, String systemID, int lineNr) throws Exception;
+
+ /**
+ * 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.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void elementAttributesProcessed(String name, String nsPrefix, String nsURI) throws Exception;
+
+ /**
+ * 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.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void endElement(String name, String nsPrefix, String nsURI) throws Exception;
+
+ /**
+ * 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.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public Object getResult() throws Exception;
+
+ /**
+ * This method is called when a processing instruction is encountered. A PI
+ * with a reserved target ("xml" with any case) is never reported.
+ *
+ * @param target
+ * the processing instruction target.
+ * @param reader
+ * the method can retrieve the parameter of the PI from this
+ * reader. You may close the reader before reading all its data
+ * and you cannot read too much data.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void newProcessingInstruction(String target, Reader reader) throws Exception;
+
+ /**
+ * 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.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void startBuilding(String systemID, int lineNr) throws Exception;
+
+ /**
+ * 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.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void startElement(String name, String nsPrefix, String nsURI, String systemID, int lineNr) throws Exception;
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLEntityResolver.java b/freeplane/src/org/freeplane/n3/nanoxml/IXMLEntityResolver.java
new file mode 100644
index 0000000..aa7b74b
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/IXMLEntityResolver.java
@@ -0,0 +1,70 @@
+/*
+ * IXMLEntityResolver.java NanoXML/Java $Revision: 1.4 $ $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.Reader;
+
+/**
+ * An IXMLEntityResolver resolves entities.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+public interface IXMLEntityResolver {
+ /**
+ * Adds an external entity.
+ *
+ * @param name
+ * the name of the entity.
+ * @param publicID
+ * the public ID of the entity, which may be null.
+ * @param systemID
+ * the system ID of the entity.
+ */
+ public void addExternalEntity(String name, String publicID, String systemID);
+
+ /**
+ * Adds an internal entity.
+ *
+ * @param name
+ * the name of the entity.
+ * @param value
+ * the value of the entity.
+ */
+ public void addInternalEntity(String name, String value);
+
+ /**
+ * Returns a Java reader containing the value of an entity.
+ *
+ * @param xmlReader
+ * the current NanoXML reader.
+ * @param name
+ * the name of the entity.
+ * @return the reader, or null if the entity could not be resolved.
+ * @throws org.freeplane.n3.nanoxml.XMLParseException
+ * If an exception occurred while resolving the entity.
+ */
+ public Reader getEntity(IXMLReader xmlReader, String name) throws XMLParseException;
+
+ /**
+ * Returns true if an entity is external.
+ *
+ * @param name
+ * the name of the entity.
+ */
+ public boolean isExternalEntity(String name);
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLParser.java b/freeplane/src/org/freeplane/n3/nanoxml/IXMLParser.java
new file mode 100644
index 0000000..3e541a9
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/IXMLParser.java
@@ -0,0 +1,98 @@
+/*
+ * IXMLParser.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;
+
+/**
+ * IXMLParser is the core parser of NanoXML.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+public interface IXMLParser {
+ /**
+ * Returns the builder which creates the logical structure of the XML data.
+ *
+ * @return the builder.
+ */
+ public IXMLBuilder getBuilder();
+
+ /**
+ * Returns the reader from which the parser retrieves its data.
+ *
+ * @return the reader.
+ */
+ public IXMLReader getReader();
+
+ /**
+ * Returns the entity resolver.
+ *
+ * @return the non-null resolver.
+ */
+ public IXMLEntityResolver getResolver();
+
+ /**
+ * Returns the validator that validates the XML data.
+ *
+ * @return the validator.
+ */
+ public IXMLValidator getValidator();
+
+ /**
+ * Parses the data and lets the builder create the logical data structure.
+ * The method returns the result of <I>getResult</I> of the builder. if an
+ * error occurred while reading or parsing the data, the method may throw an
+ * XMLException.
+ *
+ * @see org.freeplane.n3.nanoxml.IXMLBuilder#getResult
+ * @return the logical structure built by the builder.
+ * @throws org.freeplane.n3.nanoxml.XMLException
+ * if an error occurred reading or parsing the data
+ */
+ public Object parse() throws XMLException;
+
+ /**
+ * Sets the builder which creates the logical structure of the XML data.
+ *
+ * @param builder
+ * the builder.
+ */
+ public void setBuilder(IXMLBuilder builder);
+
+ /**
+ * Sets the reader from which the parser retrieves its data.
+ *
+ * @param reader
+ * the reader.
+ */
+ public void setReader(IXMLReader reader);
+
+ /**
+ * Sets the entity resolver.
+ *
+ * @param resolver
+ * the non-null resolver.
+ */
+ public void setResolver(IXMLEntityResolver resolver);
+
+ /**
+ * Sets the validator that validates the XML data.
+ *
+ * @param validator
+ * the validator.
+ */
+ public void setValidator(IXMLValidator validator);
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLReader.java b/freeplane/src/org/freeplane/n3/nanoxml/IXMLReader.java
new file mode 100644
index 0000000..5d873d2
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/IXMLReader.java
@@ -0,0 +1,143 @@
+/*
+ * IXMLReader.java NanoXML/Java $Revision: 1.4 $ $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.FileNotFoundException;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.MalformedURLException;
+
+/**
+ * IXMLReader reads the data to be parsed.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+public interface IXMLReader {
+ /**
+ * Returns true if there are no more characters left to be read.
+ *
+ * @throws java.io.IOException
+ * If an I/O error occurred.
+ */
+ public boolean atEOF() throws IOException;
+
+ /**
+ * Returns true if the current stream has no more characters left to be
+ * read.
+ *
+ * @throws java.io.IOException
+ * If an I/O error occurred.
+ */
+ public boolean atEOFOfCurrentStream() throws IOException;
+
+ /**
+ * Returns the line number of the data in the current stream.
+ */
+ public int getLineNr();
+
+ /**
+ * Returns the current public ID.
+ */
+ public String getPublicID();
+
+ /**
+ * Returns the current "level" of the stream on the stack of streams.
+ */
+ public int getStreamLevel();
+
+ /**
+ * Returns the current system ID.
+ */
+ public String getSystemID();
+
+ /**
+ * Opens a stream from a public and system ID.
+ *
+ * @param publicID
+ * the public ID, which may be null.
+ * @param systemID
+ * the system ID, which is never null.
+ * @throws java.net.MalformedURLException
+ * If the system ID does not contain a valid URL.
+ * @throws java.io.FileNotFoundException
+ * If the system ID refers to a local file which does not exist.
+ * @throws java.io.IOException
+ * If an error occurred opening the stream.
+ */
+ public Reader openStream(String publicID, String systemID) throws MalformedURLException, FileNotFoundException,
+ IOException;
+
+ /**
+ * Reads a character.
+ *
+ * @return the character
+ * @throws java.io.IOException
+ * If no character could be read.
+ */
+ public char read() throws IOException;
+
+ /**
+ * Sets the public ID of the current stream.
+ *
+ * @param publicID
+ * the public ID.
+ */
+ public void setPublicID(String publicID);
+
+ /**
+ * Sets the system ID of the current stream.
+ *
+ * @param systemID
+ * the system ID.
+ * @throws java.net.MalformedURLException
+ * If the system ID does not contain a valid URL.
+ */
+ public void setSystemID(String systemID) throws MalformedURLException;
+
+ /**
+ * Starts a new stream from a Java reader. The new stream is used temporary
+ * to read data from. If that stream is exhausted, control returns to the
+ * "parent" stream.
+ *
+ * @param reader
+ * the reader to read the new data from.
+ */
+ public void startNewStream(Reader reader);
+
+ /**
+ * Starts a new stream from a Java reader. The new stream is used temporary
+ * to read data from. If that stream is exhausted, control returns to the
+ * parent stream.
+ *
+ * @param reader
+ * the non-null reader to read the new data from
+ * @param isInternalEntity
+ * true if the reader is produced by resolving an internal entity
+ */
+ public void startNewStream(Reader reader, boolean isInternalEntity);
+
+ /**
+ * Pushes the last character read back to the stream.
+ *
+ * @param ch
+ * the character to push back.
+ * @throws java.io.IOException
+ * If an I/O error occurred.
+ */
+ public void unread(char ch) throws IOException;
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLValidator.java b/freeplane/src/org/freeplane/n3/nanoxml/IXMLValidator.java
new file mode 100644
index 0000000..ec42e49
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/IXMLValidator.java
@@ -0,0 +1,135 @@
+/*
+ * IXMLValidator.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.util.Properties;
+
+/**
+ * IXMLValidator processes the DTD and handles entity references.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+public interface IXMLValidator {
+ /**
+ * Indicates that an attribute has been added to the current element.
+ *
+ * @param key
+ * the name of the attribute.
+ * @param value
+ * the value of the attribute.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * If the attribute could not be validated.
+ */
+ public void attributeAdded(String key, String value, String systemId, int lineNr) throws Exception;
+
+ /**
+ * This method is called when the attributes of an XML element have been
+ * processed. If there are attributes with a default value which have not
+ * been specified yet, they have to be put into <I>extraAttributes</I>.
+ *
+ * @param name
+ * the name of the element.
+ * @param extraAttributes
+ * where to put extra attributes.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void elementAttributesProcessed(String name, Properties extraAttributes, String systemId, int lineNr)
+ throws Exception;
+
+ /**
+ * Indicates that the current element has ended.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * If the element could not be validated.
+ */
+ public void elementEnded(String name, String systemId, int lineNr) throws Exception;
+
+ /**
+ * Indicates that an element has been started.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * If the element could not be validated.
+ */
+ public void elementStarted(String name, String systemId, int lineNr) throws Exception;
+
+ /**
+ * Returns the parameter entity resolver.
+ *
+ * @return the entity resolver.
+ */
+ public IXMLEntityResolver getParameterEntityResolver();
+
+ /**
+ * Parses the DTD. The validator object is responsible for reading the full
+ * DTD.
+ *
+ * @param publicID
+ * the public ID, which may be null.
+ * @param reader
+ * the reader to read the DTD from.
+ * @param entityResolver
+ * the entity resolver.
+ * @param external
+ * true if the DTD is external.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ public void parseDTD(String publicID, IXMLReader reader, IXMLEntityResolver entityResolver, boolean external)
+ throws Exception;
+
+ /**
+ * Indicates that a new #PCDATA element has been encountered.
+ *
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void PCDataAdded(String systemId, int lineNr) throws Exception;
+
+ /**
+ * Sets the parameter entity resolver.
+ *
+ * @param resolver
+ * the entity resolver.
+ */
+ public void setParameterEntityResolver(IXMLEntityResolver resolver);
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/NonValidator.java b/freeplane/src/org/freeplane/n3/nanoxml/NonValidator.java
new file mode 100644
index 0000000..45392ae
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/NonValidator.java
@@ -0,0 +1,511 @@
+/*
+ * NonValidator.java NanoXML/Java $Revision: 1.4 $ $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.Reader;
+import java.io.StringReader;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.Stack;
+
+/**
+ * NonValidator is a concrete implementation of IXMLValidator which processes
+ * the DTD and handles entity definitions. It does not do any validation itself.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+public class NonValidator implements IXMLValidator {
+ /**
+ * Contains the default values for attributes for the different element
+ * types.
+ */
+ protected Hashtable<String, Properties> attributeDefaultValues;
+ /**
+ * The stack of elements to be processed.
+ */
+ protected Stack<Properties> currentElements;
+ /**
+ * The parameter entity resolver.
+ */
+ protected IXMLEntityResolver parameterEntityResolver;
+
+ /**
+ * Creates the "validator".
+ */
+ public NonValidator() {
+ attributeDefaultValues = new Hashtable<String, Properties>();
+ currentElements = new Stack<Properties>();
+ parameterEntityResolver = new XMLEntityResolver();
+ }
+
+ /**
+ * Indicates that an attribute has been added to the current element.
+ *
+ * @param key
+ * the name of the attribute.
+ * @param value
+ * the value of the attribute.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ */
+ public void attributeAdded(final String key, final String value, final String systemId, final int lineNr) {
+ final Properties props = currentElements.peek();
+ if (props.containsKey(key)) {
+ props.remove(key);
+ }
+ }
+
+ /**
+ * This method is called when the attributes of an XML element have been
+ * processed. If there are attributes with a default value which have not
+ * been specified yet, they have to be put into <I>extraAttributes</I>.
+ *
+ * @param name
+ * the name of the element.
+ * @param extraAttributes
+ * where to put extra attributes.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ */
+ public void elementAttributesProcessed(final String name, final Properties extraAttributes, final String systemId,
+ final int lineNr) {
+ final Properties props = (Properties) currentElements.pop();
+ final Enumeration<Object> enumeration = props.keys();
+ while (enumeration.hasMoreElements()) {
+ final String key = (String) enumeration.nextElement();
+ extraAttributes.put(key, props.get(key));
+ }
+ }
+
+ /**
+ * Indicates that the current element has ended.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ */
+ public void elementEnded(final String name, final String systemId, final int lineNr) {
+ }
+
+ /**
+ * Indicates that an element has been started.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ */
+ public void elementStarted(final String name, final String systemId, final int lineNr) {
+ Properties attribs = (Properties) attributeDefaultValues.get(name);
+ if (attribs == null) {
+ attribs = new Properties();
+ }
+ else {
+ attribs = (Properties) attribs.clone();
+ }
+ currentElements.push(attribs);
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ parameterEntityResolver = null;
+ attributeDefaultValues.clear();
+ attributeDefaultValues = null;
+ currentElements.clear();
+ currentElements = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns the parameter entity resolver.
+ *
+ * @return the entity resolver.
+ */
+ public IXMLEntityResolver getParameterEntityResolver() {
+ return parameterEntityResolver;
+ }
+
+ /**
+ * Parses the DTD. The validator object is responsible for reading the full
+ * DTD.
+ *
+ * @param publicID
+ * the public ID, which may be null.
+ * @param reader
+ * the reader to read the DTD from.
+ * @param entityResolver
+ * the entity resolver.
+ * @param external
+ * true if the DTD is external.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ public void parseDTD(final String publicID, final IXMLReader reader, final IXMLEntityResolver entityResolver,
+ final boolean external) throws Exception {
+ XMLUtil.skipWhitespace(reader, null);
+ final int origLevel = reader.getStreamLevel();
+ for (;;) {
+ final String str = XMLUtil.read(reader, '%');
+ char ch = str.charAt(0);
+ if (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ continue;
+ }
+ else if (ch == '<') {
+ this.processElement(reader, entityResolver);
+ }
+ else if (ch == ']') {
+ return;
+ }
+ else {
+ XMLUtil.errorInvalidInput(reader.getSystemID(), reader.getLineNr(), str);
+ }
+ do {
+ ch = reader.read();
+ if (external && (reader.getStreamLevel() < origLevel)) {
+ reader.unread(ch);
+ return;
+ }
+ } while ((ch == ' ') || (ch == '\t') || (ch == '\n') || (ch == '\r'));
+ reader.unread(ch);
+ }
+ }
+
+ /**
+ * Indicates that a new #PCDATA element has been encountered.
+ *
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ */
+ public void PCDataAdded(final String systemId, final int lineNr) {
+ }
+
+ /**
+ * Processes an ATTLIST element.
+ *
+ * @param reader
+ * the reader to read data from.
+ * @param entityResolver
+ * the entity resolver.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ protected void processAttList(final IXMLReader reader, final IXMLEntityResolver entityResolver) throws Exception {
+ if (!XMLUtil.checkLiteral(reader, "TTLIST")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ String str = XMLUtil.read(reader, '%');
+ char ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ reader.unread(ch);
+ final String elementName = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ final Properties props = new Properties();
+ while (ch != '>') {
+ reader.unread(ch);
+ final String attName = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ if (ch == '(') {
+ while (ch != ')') {
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ }
+ }
+ else {
+ reader.unread(ch);
+ XMLUtil.scanIdentifier(reader);
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ if (ch == '#') {
+ str = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ if (!str.equals("FIXED")) {
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ continue;
+ }
+ }
+ else {
+ reader.unread(ch);
+ }
+ final String value = XMLUtil.scanString(reader, '%', parameterEntityResolver);
+ props.put(attName, value);
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ while (ch == '%') {
+ XMLUtil.processEntity(str, reader, parameterEntityResolver);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ }
+ }
+ if (!props.isEmpty()) {
+ attributeDefaultValues.put(elementName, props);
+ }
+ }
+
+ /**
+ * Processes a conditional section.
+ *
+ * @param reader
+ * the reader to read data from.
+ * @param entityResolver
+ * the entity resolver.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ protected void processConditionalSection(final IXMLReader reader, final IXMLEntityResolver entityResolver)
+ throws Exception {
+ XMLUtil.skipWhitespace(reader, null);
+ String str = XMLUtil.read(reader, '%');
+ char ch = str.charAt(0);
+ if (ch != 'I') {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ switch (ch) {
+ case 'G':
+ this.processIgnoreSection(reader, entityResolver);
+ return;
+ case 'N':
+ break;
+ default:
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ if (!XMLUtil.checkLiteral(reader, "CLUDE")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ if (ch != '[') {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ final Reader subreader = new CDATAReader(reader);
+ final StringBuilder buf = new StringBuilder(1024);
+ for (;;) {
+ final int ch2 = subreader.read();
+ if (ch2 < 0) {
+ break;
+ }
+ buf.append((char) ch2);
+ }
+ subreader.close();
+ reader.startNewStream(new StringReader(buf.toString()));
+ }
+
+ /**
+ * Processes an element in the DTD.
+ *
+ * @param reader
+ * the reader to read data from.
+ * @param entityResolver
+ * the entity resolver.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ protected void processElement(final IXMLReader reader, final IXMLEntityResolver entityResolver) throws Exception {
+ String str = XMLUtil.read(reader, '%');
+ char ch = str.charAt(0);
+ if (ch != '!') {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ str = XMLUtil.read(reader, '%');
+ ch = str.charAt(0);
+ switch (ch) {
+ case '-':
+ XMLUtil.skipComment(reader);
+ break;
+ case '[':
+ this.processConditionalSection(reader, entityResolver);
+ break;
+ case 'E':
+ this.processEntity(reader, entityResolver);
+ break;
+ case 'A':
+ this.processAttList(reader, entityResolver);
+ break;
+ default:
+ XMLUtil.skipTag(reader);
+ }
+ }
+
+ /**
+ * Processes an ENTITY element.
+ *
+ * @param reader
+ * the reader to read data from.
+ * @param entityResolver
+ * the entity resolver.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ protected void processEntity(final IXMLReader reader, IXMLEntityResolver entityResolver) throws Exception {
+ if (!XMLUtil.checkLiteral(reader, "NTITY")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ char ch = XMLUtil.readChar(reader, '\0');
+ if (ch == '%') {
+ XMLUtil.skipWhitespace(reader, null);
+ entityResolver = parameterEntityResolver;
+ }
+ else {
+ reader.unread(ch);
+ }
+ final String key = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ ch = XMLUtil.readChar(reader, '%');
+ String systemID = null;
+ String publicID = null;
+ switch (ch) {
+ case 'P':
+ if (!XMLUtil.checkLiteral(reader, "UBLIC")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ publicID = XMLUtil.scanString(reader, '%', parameterEntityResolver);
+ XMLUtil.skipWhitespace(reader, null);
+ systemID = XMLUtil.scanString(reader, '%', parameterEntityResolver);
+ XMLUtil.skipWhitespace(reader, null);
+ XMLUtil.readChar(reader, '%');
+ break;
+ case 'S':
+ if (!XMLUtil.checkLiteral(reader, "YSTEM")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ systemID = XMLUtil.scanString(reader, '%', parameterEntityResolver);
+ XMLUtil.skipWhitespace(reader, null);
+ XMLUtil.readChar(reader, '%');
+ break;
+ case '"':
+ case '\'':
+ reader.unread(ch);
+ final String value = XMLUtil.scanString(reader, '%', parameterEntityResolver);
+ entityResolver.addInternalEntity(key, value);
+ XMLUtil.skipWhitespace(reader, null);
+ XMLUtil.readChar(reader, '%');
+ break;
+ default:
+ XMLUtil.skipTag(reader);
+ }
+ if (systemID != null) {
+ entityResolver.addExternalEntity(key, publicID, systemID);
+ }
+ }
+
+ /**
+ * Processes an ignore section.
+ *
+ * @param reader
+ * the reader to read data from.
+ * @param entityResolver
+ * the entity resolver.
+ * @throws java.lang.Exception
+ * If something went wrong.
+ */
+ protected void processIgnoreSection(final IXMLReader reader, final IXMLEntityResolver entityResolver)
+ throws Exception {
+ if (!XMLUtil.checkLiteral(reader, "NORE")) {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ final String str = XMLUtil.read(reader, '%');
+ final char ch = str.charAt(0);
+ if (ch != '[') {
+ XMLUtil.skipTag(reader);
+ return;
+ }
+ final Reader subreader = new CDATAReader(reader);
+ subreader.close();
+ }
+
+ /**
+ * Sets the parameter entity resolver.
+ *
+ * @param resolver
+ * the entity resolver.
+ */
+ public void setParameterEntityResolver(final IXMLEntityResolver resolver) {
+ parameterEntityResolver = resolver;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/PIReader.java b/freeplane/src/org/freeplane/n3/nanoxml/PIReader.java
new file mode 100644
index 0000000..3df78b7
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/PIReader.java
@@ -0,0 +1,118 @@
+/*
+ * PIReader.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;
+
+/**
+ * This reader reads data from another reader until the end of a processing
+ * instruction (?>) has been encountered.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+class PIReader extends Reader {
+ /**
+ * True if the end of the stream has been reached.
+ */
+ private boolean atEndOfData;
+ /**
+ * The encapsulated reader.
+ */
+ private IXMLReader reader;
+
+ /**
+ * Creates the reader.
+ *
+ * @param reader
+ * the encapsulated reader
+ */
+ PIReader(final IXMLReader reader) {
+ this.reader = reader;
+ atEndOfData = false;
+ }
+
+ /**
+ * Skips remaining data and closes the stream.
+ *
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public void close() throws IOException {
+ while (!atEndOfData) {
+ final char ch = reader.read();
+ if (ch == '?') {
+ final char ch2 = reader.read();
+ if (ch2 == '>') {
+ atEndOfData = true;
+ }
+ }
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ reader = null;
+ super.finalize();
+ }
+
+ /**
+ * Reads a block of data.
+ *
+ * @param buffer
+ * where to put the read data
+ * @param offset
+ * first position in buffer to put the data
+ * @param size
+ * maximum number of chars to read
+ * @return the number of chars read, or -1 if at EOF
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ @Override
+ public int read(final char[] buffer, final int offset, int size) throws IOException {
+ if (atEndOfData) {
+ return -1;
+ }
+ int charsRead = 0;
+ if ((offset + size) > buffer.length) {
+ size = buffer.length - offset;
+ }
+ while (charsRead < size) {
+ final char ch = reader.read();
+ if (ch == '?') {
+ final char ch2 = reader.read();
+ if (ch2 == '>') {
+ atEndOfData = true;
+ break;
+ }
+ reader.unread(ch2);
+ }
+ buffer[charsRead] = ch;
+ charsRead++;
+ }
+ if (charsRead == 0) {
+ charsRead = -1;
+ }
+ return charsRead;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java
new file mode 100644
index 0000000..4e627d2
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java
@@ -0,0 +1,274 @@
+/*
+ * 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) {
+ 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) {
+ 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/StdXMLParser.java b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLParser.java
new file mode 100644
index 0000000..9edfcda
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLParser.java
@@ -0,0 +1,526 @@
+/*
+ * StdXMLParser.java NanoXML/Java $Revision: 1.5 $ $Date: 2002/03/24 11:37:00 $
+ * $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.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+
+/**
+ * StdXMLParser is the core parser of NanoXML.
+ *
+ * @author Marc De Scheemaecker re-factored by Dimitry Polivaev : method
+ * processElementContent() extracted
+ */
+public class StdXMLParser implements IXMLParser {
+ /**
+ * The builder which creates the logical structure of the XML data.
+ */
+ private IXMLBuilder builder;
+ /**
+ * The entity resolver.
+ */
+ private IXMLEntityResolver entityResolver;
+ /**
+ * The reader from which the parser retrieves its data.
+ */
+ private IXMLReader reader;
+ /**
+ * The validator that will process entity references and validate the XML
+ * data.
+ */
+ private IXMLValidator validator;
+
+ /**
+ * Creates a new parser.
+ */
+ public StdXMLParser() {
+ builder = null;
+ validator = null;
+ reader = null;
+ entityResolver = new XMLEntityResolver();
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ builder = null;
+ reader = null;
+ entityResolver = null;
+ validator = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns the builder which creates the logical structure of the XML data.
+ *
+ * @return the builder
+ */
+ public IXMLBuilder getBuilder() {
+ return builder;
+ }
+
+ /**
+ * Returns the reader from which the parser retrieves its data.
+ *
+ * @return the reader
+ */
+ public IXMLReader getReader() {
+ return reader;
+ }
+
+ /**
+ * Returns the entity resolver.
+ *
+ * @return the non-null resolver
+ */
+ public IXMLEntityResolver getResolver() {
+ return entityResolver;
+ }
+
+ /**
+ * Returns the validator that validates the XML data.
+ *
+ * @return the validator
+ */
+ public IXMLValidator getValidator() {
+ return validator;
+ }
+
+ /**
+ * Parses the data and lets the builder create the logical data structure.
+ *
+ * @return the logical structure built by the builder
+ * @throws org.freeplane.n3.nanoxml.XMLException
+ * if an error occurred reading or parsing the data
+ */
+ public Object parse() throws XMLException {
+ try {
+ builder.startBuilding(reader.getSystemID(), reader.getLineNr());
+ this.scanData();
+ return builder.getResult();
+ }
+ catch (final XMLException e) {
+ throw e;
+ }
+ catch (final Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Processes an attribute of an element.
+ *
+ * @param attrNames
+ * contains the names of the attributes.
+ * @param attrValues
+ * contains the values of the attributes.
+ * @param attrTypes
+ * contains the types of the attributes.
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void processAttribute(final Vector<String> attrNames, final Vector<String> attrValues,
+ final Vector<String> attrTypes) throws Exception {
+ final String key = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ if (!XMLUtil.read(reader, '&').equals("=")) {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "`='");
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ final String value = XMLUtil.scanString(reader, '&', entityResolver);
+ attrNames.addElement(key);
+ attrValues.addElement(value);
+ attrTypes.addElement("CDATA");
+ validator.attributeAdded(key, value, reader.getSystemID(), reader.getLineNr());
+ }
+
+ /**
+ * Processes a CDATA section.
+ *
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void processCDATA() throws Exception {
+ if (!XMLUtil.checkLiteral(reader, "CDATA[")) {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "<![[CDATA[");
+ }
+ validator.PCDataAdded(reader.getSystemID(), reader.getLineNr());
+ final Reader reader = new CDATAReader(this.reader);
+ builder.addPCData(reader, this.reader.getSystemID(), this.reader.getLineNr());
+ reader.close();
+ }
+
+ /**
+ * Processes a document type declaration.
+ *
+ * @throws java.lang.Exception
+ * if an error occurred reading or parsing the data
+ */
+ protected void processDocType() throws Exception {
+ if (!XMLUtil.checkLiteral(reader, "OCTYPE")) {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "<!DOCTYPE");
+ return;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ String systemID = null;
+ final StringBuilder publicID = new StringBuilder();
+ XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ char ch = reader.read();
+ if (ch == 'P') {
+ systemID = XMLUtil.scanPublicID(publicID, reader);
+ XMLUtil.skipWhitespace(reader, null);
+ ch = reader.read();
+ }
+ else if (ch == 'S') {
+ systemID = XMLUtil.scanSystemID(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ ch = reader.read();
+ }
+ if (ch == '[') {
+ validator.parseDTD(publicID.toString(), reader, entityResolver, false);
+ XMLUtil.skipWhitespace(reader, null);
+ ch = reader.read();
+ }
+ if (ch != '>') {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "`>'");
+ }
+ if (systemID != null) {
+ final Reader reader = this.reader.openStream(publicID.toString(), systemID);
+ this.reader.startNewStream(reader);
+ this.reader.setSystemID(systemID);
+ this.reader.setPublicID(publicID.toString());
+ validator.parseDTD(publicID.toString(), this.reader, entityResolver, true);
+ }
+ }
+
+ /**
+ * Processes a regular element.
+ *
+ * @param defaultNamespace
+ * the default namespace URI (or null)
+ * @param namespaces
+ * list of defined namespaces
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void processElement(String defaultNamespace, final Properties namespaces) throws Exception {
+ final String fullName = XMLUtil.scanIdentifier(reader);
+ String name = fullName;
+ XMLUtil.skipWhitespace(reader, null);
+ String prefix = null;
+ int colonIndex = name.indexOf(':');
+ if (colonIndex > 0) {
+ prefix = name.substring(0, colonIndex);
+ name = name.substring(colonIndex + 1);
+ }
+ final Vector<String> attrNames = new Vector<String>();
+ final Vector<String> attrValues = new Vector<String>();
+ final Vector<String> attrTypes = new Vector<String>();
+ validator.elementStarted(fullName, reader.getSystemID(), reader.getLineNr());
+ char ch;
+ for (;;) {
+ ch = reader.read();
+ if ((ch == '/') || (ch == '>')) {
+ break;
+ }
+ reader.unread(ch);
+ this.processAttribute(attrNames, attrValues, attrTypes);
+ XMLUtil.skipWhitespace(reader, null);
+ }
+ final Properties extraAttributes = new Properties();
+ validator.elementAttributesProcessed(fullName, extraAttributes, reader.getSystemID(), reader.getLineNr());
+ final Enumeration<Object> enumeration = extraAttributes.keys();
+ while (enumeration.hasMoreElements()) {
+ final String key = (String) enumeration.nextElement();
+ final String value = extraAttributes.getProperty(key);
+ attrNames.addElement(key);
+ attrValues.addElement(value);
+ attrTypes.addElement("CDATA");
+ }
+ for (int i = 0; i < attrNames.size(); i++) {
+ final String key = attrNames.elementAt(i);
+ final String value = attrValues.elementAt(i);
+ if (key.equals("xmlns")) {
+ defaultNamespace = value;
+ }
+ else if (key.startsWith("xmlns:")) {
+ namespaces.put(key.substring(6), value);
+ }
+ }
+ if (prefix == null) {
+ builder.startElement(name, prefix, defaultNamespace, reader.getSystemID(), reader.getLineNr());
+ }
+ else {
+ builder
+ .startElement(name, prefix, namespaces.getProperty(prefix), reader.getSystemID(), reader.getLineNr());
+ }
+ for (int i = 0; i < attrNames.size(); i++) {
+ String key = attrNames.elementAt(i);
+ if (key.startsWith("xmlns")) {
+ continue;
+ }
+ final String value = attrValues.elementAt(i);
+ final String type = attrTypes.elementAt(i);
+ colonIndex = key.indexOf(':');
+ if (colonIndex > 0) {
+ final String attPrefix = key.substring(0, colonIndex);
+ key = key.substring(colonIndex + 1);
+ builder.addAttribute(key, attPrefix, namespaces.getProperty(attPrefix), value, type);
+ }
+ else {
+ builder.addAttribute(key, null, null, value, type);
+ }
+ }
+ if (prefix == null) {
+ builder.elementAttributesProcessed(name, prefix, defaultNamespace);
+ }
+ else {
+ builder.elementAttributesProcessed(name, prefix, namespaces.getProperty(prefix));
+ }
+ if (ch == '/') {
+ if (reader.read() != '>') {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "`>'");
+ }
+ validator.elementEnded(name, reader.getSystemID(), reader.getLineNr());
+ if (prefix == null) {
+ builder.endElement(name, prefix, defaultNamespace);
+ }
+ else {
+ builder.endElement(name, prefix, namespaces.getProperty(prefix));
+ }
+ return;
+ }
+ processElementContent(defaultNamespace, namespaces, fullName, name, prefix);
+ XMLUtil.skipWhitespace(reader, null);
+ final String str = XMLUtil.scanIdentifier(reader);
+ if (!str.equals(fullName)) {
+ XMLUtil.errorWrongClosingTag(reader.getSystemID(), reader.getLineNr(), name, str);
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ if (reader.read() != '>') {
+ XMLUtil.errorClosingTagNotEmpty(reader.getSystemID(), reader.getLineNr());
+ }
+ validator.elementEnded(fullName, reader.getSystemID(), reader.getLineNr());
+ if (prefix == null) {
+ builder.endElement(name, prefix, defaultNamespace);
+ }
+ else {
+ builder.endElement(name, prefix, namespaces.getProperty(prefix));
+ }
+ }
+
+ protected void processElementContent(final String defaultNamespace, final Properties namespaces,
+ final String fullName, final String name, final String prefix)
+ throws IOException, XMLParseException, Exception {
+ char ch;
+ final StringBuilder buffer = new StringBuilder(16);
+ for (;;) {
+ buffer.setLength(0);
+ String str;
+ for (;;) {
+ XMLUtil.skipWhitespace(reader, buffer);
+ str = XMLUtil.read(reader, '&');
+ if ((str.charAt(0) == '&') && (str.charAt(1) != '#')) {
+ XMLUtil.processEntity(str, reader, entityResolver);
+ }
+ else {
+ break;
+ }
+ }
+ if (str.charAt(0) == '<') {
+ str = XMLUtil.read(reader, '\0');
+ if (str.charAt(0) == '/') {
+ break;
+ }
+ else {
+ reader.unread(str.charAt(0));
+ this.scanSomeTag(true, defaultNamespace, (Properties) namespaces.clone());
+ }
+ }
+ else {
+ if (str.charAt(0) == '&') {
+ ch = XMLUtil.processCharLiteral(str);
+ buffer.append(ch);
+ }
+ else {
+ reader.unread(str.charAt(0));
+ }
+ validator.PCDataAdded(reader.getSystemID(), reader.getLineNr());
+ final Reader r = new ContentReader(reader, entityResolver, buffer.toString());
+ builder.addPCData(r, reader.getSystemID(), reader.getLineNr());
+ r.close();
+ }
+ }
+ }
+
+ /**
+ * Processes a "processing instruction".
+ *
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void processPI() throws Exception {
+ XMLUtil.skipWhitespace(reader, null);
+ final String target = XMLUtil.scanIdentifier(reader);
+ XMLUtil.skipWhitespace(reader, null);
+ final Reader reader = new PIReader(this.reader);
+ if (!target.equalsIgnoreCase("xml")) {
+ builder.newProcessingInstruction(target, reader);
+ }
+ reader.close();
+ }
+
+ /**
+ * Processes a tag that starts with a bang (<!...>).
+ *
+ * @param allowCDATA
+ * true if CDATA sections are allowed at this point
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void processSpecialTag(final boolean allowCDATA) throws Exception {
+ final String str = XMLUtil.read(reader, '&');
+ final char ch = str.charAt(0);
+ if (ch == '&') {
+ XMLUtil.errorUnexpectedEntity(reader.getSystemID(), reader.getLineNr(), str);
+ }
+ switch (ch) {
+ case '[':
+ if (allowCDATA) {
+ this.processCDATA();
+ }
+ else {
+ XMLUtil.errorUnexpectedCDATA(reader.getSystemID(), reader.getLineNr());
+ }
+ return;
+ case 'D':
+ this.processDocType();
+ return;
+ case '-':
+ XMLUtil.skipComment(reader);
+ return;
+ }
+ }
+
+ /**
+ * Scans the XML data for elements.
+ *
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void scanData() throws Exception {
+ while ((!reader.atEOF()) && (builder.getResult() == null)) {
+ final String str = XMLUtil.read(reader, '&');
+ final char ch = str.charAt(0);
+ if (ch == '&') {
+ XMLUtil.processEntity(str, reader, entityResolver);
+ continue;
+ }
+ switch (ch) {
+ case '<':
+ this.scanSomeTag(false, null, new Properties());
+ break;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ break;
+ default:
+ XMLUtil.errorInvalidInput(reader.getSystemID(), reader.getLineNr(), "`" + ch + "' (0x"
+ + Integer.toHexString(ch) + ')');
+ }
+ }
+ }
+
+ /**
+ * Scans an XML tag.
+ *
+ * @param allowCDATA
+ * true if CDATA sections are allowed at this point
+ * @param defaultNamespace
+ * the default namespace URI (or null)
+ * @param namespaces
+ * list of defined namespaces
+ * @throws java.lang.Exception
+ * if something went wrong
+ */
+ protected void scanSomeTag(final boolean allowCDATA, final String defaultNamespace, final Properties namespaces)
+ throws Exception {
+ final String str = XMLUtil.read(reader, '&');
+ final char ch = str.charAt(0);
+ if (ch == '&') {
+ XMLUtil.errorUnexpectedEntity(reader.getSystemID(), reader.getLineNr(), str);
+ }
+ switch (ch) {
+ case '?':
+ this.processPI();
+ break;
+ case '!':
+ this.processSpecialTag(allowCDATA);
+ break;
+ default:
+ reader.unread(ch);
+ this.processElement(defaultNamespace, namespaces);
+ }
+ }
+
+ /**
+ * Sets the builder which creates the logical structure of the XML data.
+ *
+ * @param builder
+ * the non-null builder
+ */
+ public void setBuilder(final IXMLBuilder builder) {
+ this.builder = builder;
+ }
+
+ /**
+ * Sets the reader from which the parser retrieves its data.
+ *
+ * @param reader
+ * the reader
+ */
+ public void setReader(final IXMLReader reader) {
+ this.reader = reader;
+ }
+
+ /**
+ * Sets the entity resolver.
+ *
+ * @param resolver
+ * the non-null resolver
+ */
+ public void setResolver(final IXMLEntityResolver resolver) {
+ entityResolver = resolver;
+ }
+
+ /**
+ * Sets the validator that validates the XML data.
+ *
+ * @param validator
+ * the non-null validator
+ */
+ public void setValidator(final IXMLValidator validator) {
+ this.validator = validator;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLReader.java b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLReader.java
new file mode 100644
index 0000000..8d6d7e9
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLReader.java
@@ -0,0 +1,511 @@
+/*
+ * StdXMLReader.java NanoXML/Java $Revision: 1.4 $ $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.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.PushbackInputStream;
+import java.io.PushbackReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Stack;
+
+/**
+ * StdXMLReader reads the data to be parsed.
+ *
+ * @author Marc De Scheemaecker
+ * Modified by Dimitry Polivaev (2008)
+ */
+public class StdXMLReader implements IXMLReader {
+ /**
+ * A stacked reader.
+ *
+ * @author Marc De Scheemaecker
+ * Modified by Dimitry Polivaev (2008)
+ */
+ private class StackedReader {
+ LineNumberReader lineReader;
+ Reader pbReader;
+ String publicId;
+ URL systemId;
+ }
+
+ /**
+ * Creates a new reader using a file as input.
+ *
+ * @param filename
+ * the name of the file containing the XML data
+ * @throws java.io.FileNotFoundException
+ * if the file could not be found
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ public static IXMLReader fileReader(final String filename) throws FileNotFoundException, IOException {
+ final StdXMLReader r = new StdXMLReader(new FileInputStream(filename));
+ r.setSystemID(filename);
+ for (int i = 0; i < r.readers.size(); i++) {
+ final StackedReader sr = (StackedReader) r.readers.elementAt(i);
+ sr.systemId = r.currentReader.systemId;
+ }
+ return r;
+ }
+
+ /**
+ * Creates a new reader using a string as input.
+ *
+ * @param str
+ * the string containing the XML data
+ */
+ public static IXMLReader stringReader(final String str) {
+ return new StdXMLReader(new StringReader(str));
+ }
+
+ private char charReadTooMuch;
+ /**
+ * The current push-back reader.
+ */
+ private StackedReader currentReader;
+ /**
+ * The stack of readers.
+ */
+ final private Stack<StackedReader> readers;
+
+ /**
+ * Initializes the XML reader.
+ *
+ * @param stream
+ * the input for the XML data.
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ public StdXMLReader(final InputStream stream) throws IOException {
+ new PushbackInputStream(stream);
+ final StringBuilder charsRead = new StringBuilder();
+ final Reader reader = this.stream2reader(stream, charsRead);
+ currentReader = new StackedReader();
+ readers = new Stack<StackedReader>();
+ currentReader.lineReader = new LineNumberReader(reader);
+ currentReader.pbReader = currentReader.lineReader;
+ currentReader.publicId = "";
+ charReadTooMuch = '\0';
+ try {
+ currentReader.systemId = new URL("file:.");
+ }
+ catch (final MalformedURLException e) {
+ }
+ this.startNewStream(new StringReader(charsRead.toString()));
+ }
+
+ /**
+ * Initializes the XML reader.
+ *
+ * @param reader
+ * the input for the XML data.
+ */
+ public StdXMLReader(final Reader reader) {
+ currentReader = new StackedReader();
+ readers = new Stack<StackedReader>();
+ currentReader.lineReader = new LineNumberReader(reader);
+ currentReader.pbReader = currentReader.lineReader;
+ currentReader.publicId = "";
+ charReadTooMuch = '\0';
+ try {
+ currentReader.systemId = new URL("file:.");
+ }
+ catch (final MalformedURLException e) {
+ }
+ }
+
+ /**
+ * Initializes the reader from a system and public ID.
+ *
+ * @param publicID
+ * the public ID which may be null.
+ * @param systemID
+ * the non-null system ID.
+ * @throws MalformedURLException
+ * if the system ID does not contain a valid URL
+ * @throws FileNotFoundException
+ * if the system ID refers to a local file which does not exist
+ * @throws IOException
+ * if an error occurred opening the stream
+ */
+ public StdXMLReader(final String publicID, String systemID) throws MalformedURLException, FileNotFoundException,
+ IOException {
+ URL systemIDasURL = null;
+ charReadTooMuch = '\0';
+ try {
+ systemIDasURL = new URL(systemID);
+ }
+ catch (final MalformedURLException e) {
+ systemID = "file:" + systemID;
+ try {
+ systemIDasURL = new URL(systemID);
+ }
+ catch (final MalformedURLException e2) {
+ throw e;
+ }
+ }
+ currentReader = new StackedReader();
+ readers = new Stack<StackedReader>();
+ final Reader reader = this.openStream(publicID, systemIDasURL.toString());
+ currentReader.lineReader = new LineNumberReader(reader);
+ currentReader.pbReader = currentReader.lineReader;
+ }
+
+ /**
+ * Returns true if there are no more characters left to be read.
+ *
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ public boolean atEOF() throws IOException {
+ int ch = readImpl();
+ while (ch < 0) {
+ if (readers.empty()) {
+ return true;
+ }
+ currentReader.pbReader.close();
+ currentReader = (StackedReader) readers.pop();
+ ch = readImpl();
+ }
+ unread(ch);
+ return false;
+ }
+
+ /**
+ * Returns true if the current stream has no more characters left to be
+ * read.
+ *
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ public boolean atEOFOfCurrentStream() throws IOException {
+ final int ch = readImpl();
+ if (ch < 0) {
+ return true;
+ }
+ else {
+ unread(ch);
+ return false;
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ currentReader.lineReader = null;
+ currentReader.pbReader = null;
+ currentReader.systemId = null;
+ currentReader.publicId = null;
+ currentReader = null;
+ readers.clear();
+ super.finalize();
+ }
+
+ /**
+ * Scans the encoding from an <?xml...?> tag.
+ *
+ * @param str
+ * the first tag in the XML data.
+ * @return the encoding, or null if no encoding has been specified.
+ */
+ protected String getEncoding(final String str) {
+ if (!str.startsWith("<?xml")) {
+ return null;
+ }
+ int index = 5;
+ while (index < str.length()) {
+ final StringBuilder key = new StringBuilder();
+ while ((index < str.length()) && (str.charAt(index) <= ' ')) {
+ index++;
+ }
+ while ((index < str.length()) && (str.charAt(index) >= 'a') && (str.charAt(index) <= 'z')) {
+ key.append(str.charAt(index));
+ index++;
+ }
+ while ((index < str.length()) && (str.charAt(index) <= ' ')) {
+ index++;
+ }
+ if ((index >= str.length()) || (str.charAt(index) != '=')) {
+ break;
+ }
+ while ((index < str.length()) && (str.charAt(index) != '\'') && (str.charAt(index) != '"')) {
+ index++;
+ }
+ if (index >= str.length()) {
+ break;
+ }
+ final char delimiter = str.charAt(index);
+ index++;
+ final int index2 = str.indexOf(delimiter, index);
+ if (index2 < 0) {
+ break;
+ }
+ if (key.toString().equals("encoding")) {
+ return str.substring(index, index2);
+ }
+ index = index2 + 1;
+ }
+ return null;
+ }
+
+ /**
+ * Returns the line number of the data in the current stream.
+ */
+ public int getLineNr() {
+ if (currentReader.lineReader == null) {
+ final StackedReader sr = (StackedReader) readers.peek();
+ if (sr.lineReader == null) {
+ return 0;
+ }
+ else {
+ return sr.lineReader.getLineNumber() + 1;
+ }
+ }
+ return currentReader.lineReader.getLineNumber() + 1;
+ }
+
+ /**
+ * Returns the current public ID.
+ */
+ public String getPublicID() {
+ return currentReader.publicId;
+ }
+
+ /**
+ * Returns the current "level" of the stream on the stack of streams.
+ */
+ public int getStreamLevel() {
+ return readers.size();
+ }
+
+ /**
+ * Returns the current system ID.
+ */
+ public String getSystemID() {
+ return currentReader.systemId.toString();
+ }
+
+ /**
+ * Opens a stream from a public and system ID.
+ *
+ * @param publicID
+ * the public ID, which may be null
+ * @param systemID
+ * the system ID, which is never null
+ * @throws java.net.MalformedURLException
+ * if the system ID does not contain a valid URL
+ * @throws java.io.FileNotFoundException
+ * if the system ID refers to a local file which does not exist
+ * @throws java.io.IOException
+ * if an error occurred opening the stream
+ */
+ public Reader openStream(final String publicID, final String systemID) throws MalformedURLException,
+ FileNotFoundException, IOException {
+ URL url = new URL(currentReader.systemId, systemID);
+ if (url.getRef() != null) {
+ final String ref = url.getRef();
+ if (url.getFile().length() > 0) {
+ url = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile());
+ url = new URL("jar:" + url + '!' + ref);
+ }
+ else {
+ url = StdXMLReader.class.getResource(ref);
+ }
+ }
+ currentReader.publicId = publicID;
+ currentReader.systemId = url;
+ final StringBuilder charsRead = new StringBuilder();
+ final Reader reader = this.stream2reader(url.openStream(), charsRead);
+ if (charsRead.length() == 0) {
+ return reader;
+ }
+ final String charsReadStr = charsRead.toString();
+ final PushbackReader pbreader = new PushbackReader(reader, charsReadStr.length());
+ for (int i = charsReadStr.length() - 1; i >= 0; i--) {
+ pbreader.unread(charsReadStr.charAt(i));
+ }
+ return pbreader;
+ }
+
+ /**
+ * Reads a character.
+ *
+ * @return the character
+ * @throws java.io.IOException
+ * if no character could be read
+ */
+ public char read() throws IOException {
+ int ch = readImpl();
+ while (ch < 0) {
+ if (readers.empty()) {
+ throw new IOException("Unexpected EOF");
+ }
+ currentReader.pbReader.close();
+ currentReader = (StackedReader) readers.pop();
+ ch = readImpl();
+ }
+ return (char) ch;
+ }
+
+ private int readImpl() throws IOException {
+ if (charReadTooMuch != '\0') {
+ final char ch = charReadTooMuch;
+ charReadTooMuch = '\0';
+ return ch;
+ }
+ final int ch = currentReader.pbReader.read();
+ return ch;
+ }
+
+ /**
+ * Sets the public ID of the current stream.
+ *
+ * @param publicID
+ * the public ID
+ */
+ public void setPublicID(final String publicID) {
+ currentReader.publicId = publicID;
+ }
+
+ /**
+ * Sets the system ID of the current stream.
+ *
+ * @param systemID
+ * the system ID
+ * @throws java.net.MalformedURLException
+ * if the system ID does not contain a valid URL
+ */
+ public void setSystemID(final String systemID) throws MalformedURLException {
+ currentReader.systemId = new URL(currentReader.systemId, systemID);
+ }
+
+ /**
+ * Starts a new stream from a Java reader. The new stream is used temporary
+ * to read data from. If that stream is exhausted, control returns to the
+ * parent stream.
+ *
+ * @param reader
+ * the non-null reader to read the new data from
+ */
+ public void startNewStream(final Reader reader) {
+ this.startNewStream(reader, false);
+ }
+
+ /**
+ * Starts a new stream from a Java reader. The new stream is used temporary
+ * to read data from. If that stream is exhausted, control returns to the
+ * parent stream.
+ *
+ * @param reader
+ * the non-null reader to read the new data from
+ * @param isInternalEntity
+ * true if the reader is produced by resolving an internal entity
+ */
+ public void startNewStream(final Reader reader, final boolean isInternalEntity) {
+ final StackedReader oldReader = currentReader;
+ readers.push(currentReader);
+ currentReader = new StackedReader();
+ if (isInternalEntity) {
+ currentReader.lineReader = null;
+ currentReader.pbReader = reader;
+ }
+ else {
+ currentReader.lineReader = new LineNumberReader(reader);
+ currentReader.pbReader = new PushbackReader(currentReader.lineReader, 2);
+ }
+ currentReader.systemId = oldReader.systemId;
+ currentReader.publicId = oldReader.publicId;
+ }
+
+ /**
+ * Converts a stream to a reader while detecting the encoding.
+ *
+ * @param stream
+ * the input for the XML data.
+ * @param charsRead
+ * buffer where to put characters that have been read
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ protected Reader stream2reader(final InputStream stream, final StringBuilder charsRead) throws IOException {
+ final PushbackInputStream pbstream = new PushbackInputStream(stream);
+ int b = pbstream.read();
+ switch (b) {
+ case 0x00:
+ case 0xFE:
+ case 0xFF:
+ pbstream.unread(b);
+ return new InputStreamReader(pbstream, "UTF-16");
+ case 0xEF:
+ for (int i = 0; i < 2; i++) {
+ pbstream.read();
+ }
+ return new InputStreamReader(pbstream, "UTF-8");
+ case 0x3C:
+ b = pbstream.read();
+ charsRead.append('<');
+ while ((b > 0) && (b != 0x3E)) {
+ charsRead.append((char) b);
+ b = pbstream.read();
+ }
+ if (b > 0) {
+ charsRead.append((char) b);
+ }
+ final String encoding = this.getEncoding(charsRead.toString());
+ if (encoding == null) {
+ return new InputStreamReader(pbstream, "UTF-8");
+ }
+ charsRead.setLength(0);
+ try {
+ return new InputStreamReader(pbstream, encoding);
+ }
+ catch (final UnsupportedEncodingException e) {
+ return new InputStreamReader(pbstream, "UTF-8");
+ }
+ default:
+ charsRead.append((char) b);
+ return new InputStreamReader(pbstream, "UTF-8");
+ }
+ }
+
+ public void unread(final char ch) throws IOException {
+ charReadTooMuch = ch;
+ }
+
+ /**
+ * Pushes the last character read back to the stream.
+ *
+ * @param ch
+ * the character to push back.
+ * @throws java.io.IOException
+ * if an I/O error occurred
+ */
+ public void unread(final int ch) throws IOException {
+ unread((char) ch);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/ValidatorPlugin.java b/freeplane/src/org/freeplane/n3/nanoxml/ValidatorPlugin.java
new file mode 100644
index 0000000..9dbb648
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/ValidatorPlugin.java
@@ -0,0 +1,353 @@
+/*
+ * ValidatorPlugin.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04 21:03:29
+ * $ $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.util.Properties;
+
+/**
+ * ValidatorPlugin allows the application to insert additional validators into
+ * NanoXML.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+class ValidatorPlugin implements IXMLValidator {
+ /**
+ * The delegate.
+ */
+ private IXMLValidator delegate;
+
+ /**
+ * Initializes the plugin.
+ */
+ public ValidatorPlugin() {
+ delegate = null;
+ }
+
+ /**
+ * This method is called when the attributes of an XML element have been
+ * processed. If there are attributes with a default value which have not
+ * been specified yet, they have to be put into <I>extraAttributes</I>.
+ *
+ * @param name
+ * the name of the element.
+ * @param extraAttributes
+ * where to put extra attributes.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void attributeAdded(final String key, final String value, final String systemId, final int lineNr)
+ throws Exception {
+ delegate.attributeAdded(key, value, systemId, lineNr);
+ }
+
+ /**
+ * Indicates that an attribute has been added to the current element.
+ *
+ * @param key
+ * the name of the attribute.
+ * @param value
+ * the value of the attribute.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the attribute could not be validated.
+ */
+ public void elementAttributesProcessed(final String name, final Properties extraAttributes, final String systemId,
+ final int lineNr) throws Exception {
+ delegate.elementAttributesProcessed(name, extraAttributes, systemId, lineNr);
+ }
+
+ /**
+ * Indicates that the current element has ended.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void elementEnded(final String name, final String systemId, final int lineNr) throws Exception {
+ delegate.elementEnded(name, systemId, lineNr);
+ }
+
+ /**
+ * Indicates that an element has been started.
+ *
+ * @param name
+ * the name of the element.
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void elementStarted(final String name, final String systemId, final int lineNr) throws Exception {
+ delegate.elementStarted(name, systemId, lineNr);
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ delegate = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns the delegate.
+ */
+ public IXMLValidator getDelegate() {
+ return delegate;
+ }
+
+ /**
+ * Returns the parameter entity resolver.
+ *
+ * @return the entity resolver.
+ */
+ public IXMLEntityResolver getParameterEntityResolver() {
+ return delegate.getParameterEntityResolver();
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute has an
+ * invalid value.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the attribute
+ * @param attributeValue
+ * the value of the attribute
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void invalidAttributeValue(final String systemID, final int lineNr, final String elementName,
+ final String attributeName, final String attributeValue)
+ throws XMLValidationException {
+ XMLUtil.errorInvalidAttributeValue(systemID, lineNr, elementName, attributeName, attributeValue);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute is
+ * missing.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the missing attribute
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void missingAttribute(final String systemID, final int lineNr, final String elementName,
+ final String attributeName) throws XMLValidationException {
+ XMLUtil.errorMissingAttribute(systemID, lineNr, elementName, attributeName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an element is missing.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param parentElementName
+ * the name of the parent element
+ * @param missingElementName
+ * the name of the missing element
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void missingElement(final String systemID, final int lineNr, final String parentElementName,
+ final String missingElementName) throws XMLValidationException {
+ XMLUtil.errorMissingElement(systemID, lineNr, parentElementName, missingElementName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that a #PCDATA element was
+ * missing.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param parentElementName
+ * the name of the parent element
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void missingPCData(final String systemID, final int lineNr, final String parentElementName)
+ throws XMLValidationException {
+ XMLUtil.errorMissingPCData(systemID, lineNr, parentElementName);
+ }
+
+ /**
+ * Parses the DTD. The validator object is responsible for reading the full
+ * DTD.
+ *
+ * @param publicID
+ * the public ID, which may be null.
+ * @param reader
+ * the reader to read the DTD from.
+ * @param entityResolver
+ * the entity resolver.
+ * @param external
+ * true if the DTD is external.
+ * @throws java.lang.Exception
+ * if something went wrong.
+ */
+ public void parseDTD(final String publicID, final IXMLReader reader, final IXMLEntityResolver entityResolver,
+ final boolean external) throws Exception {
+ delegate.parseDTD(publicID, reader, entityResolver, external);
+ }
+
+ /**
+ * Indicates that a new #PCDATA element has been encountered.
+ *
+ * @param systemId
+ * the system ID of the XML data of the element.
+ * @param lineNr
+ * the line number in the XML data of the element.
+ * @throws java.lang.Exception
+ * if the element could not be validated.
+ */
+ public void PCDataAdded(final String systemId, final int lineNr) throws Exception {
+ delegate.PCDataAdded(systemId, lineNr);
+ }
+
+ /**
+ * Sets the delegate.
+ *
+ * @param delegate
+ * the delegate
+ */
+ public void setDelegate(final IXMLValidator delegate) {
+ this.delegate = delegate;
+ }
+
+ /**
+ * Sets the parameter entity resolver.
+ *
+ * @param resolver
+ * the entity resolver.
+ */
+ public void setParameterEntityResolver(final IXMLEntityResolver resolver) {
+ delegate.setParameterEntityResolver(resolver);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute is
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the unexpected attribute
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void unexpectedAttribute(final String systemID, final int lineNr, final String elementName,
+ final String attributeName) throws XMLValidationException {
+ XMLUtil.errorUnexpectedAttribute(systemID, lineNr, elementName, attributeName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an element is
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param parentElementName
+ * the name of the parent element
+ * @param unexpectedElementName
+ * the name of the missing element
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void unexpectedElement(final String systemID, final int lineNr, final String parentElementName,
+ final String unexpectedElementName) throws XMLValidationException {
+ XMLUtil.errorUnexpectedElement(systemID, lineNr, parentElementName, unexpectedElementName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that a #PCDATA element was
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param parentElementName
+ * the name of the parent element
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void unexpectedPCData(final String systemID, final int lineNr, final String parentElementName)
+ throws XMLValidationException {
+ XMLUtil.errorUnexpectedPCData(systemID, lineNr, parentElementName);
+ }
+
+ /**
+ * Throws an XMLValidationException.
+ *
+ * @param systemID
+ * the system ID of the XML data of the element
+ * @param lineNr
+ * the line number in the XML data of the element
+ * @param message
+ * the error message
+ * @param elementName
+ * the name of the element (may be null)
+ * @param attributeName
+ * the name of the attribute (may be null)
+ * @param attributeValue
+ * the value of the attribute (may be null)
+ * @throws org.freeplane.n3.nanoxml.XMLValidationException
+ * of course :-)
+ */
+ public void validationError(final String systemID, final int lineNr, final String message,
+ final String elementName, final String attributeName, final String attributeValue)
+ throws XMLValidationException {
+ XMLUtil.validationError(systemID, lineNr, message, elementName, attributeName, attributeValue);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLAttribute.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLAttribute.java
new file mode 100644
index 0000000..fdf5b6e
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLAttribute.java
@@ -0,0 +1,117 @@
+/*
+ * XMLAttribute.java NanoXML/Java $Revision: 1.4 $ $Date: 2002/01/04 21:03:29 $
+ * $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;
+
+/**
+ * An attribute in an XML element. This is an internal class.
+ *
+ * @see org.freeplane.n3.nanoxml.XMLElement
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+class XMLAttribute {
+ /**
+ * The full name of the attribute.
+ */
+ final private String fullName;
+ /**
+ * The short name of the attribute.
+ */
+ final private String name;
+ /**
+ * The namespace URI of the attribute.
+ */
+ final private String namespace;
+ /**
+ * The type of the attribute.
+ */
+ final private String type;
+ /**
+ * The value of the attribute.
+ */
+ private String value;
+
+ /**
+ * Creates a new attribute.
+ *
+ * @param fullName
+ * the non-null full name
+ * @param name
+ * the non-null short name
+ * @param namespace
+ * the namespace URI, which may be null
+ * @param value
+ * the value of the attribute
+ * @param type
+ * the type of the attribute
+ */
+ XMLAttribute(final String fullName, final String name, final String namespace, final String value, final String type) {
+ this.fullName = fullName;
+ this.name = name;
+ this.namespace = namespace;
+ this.value = value;
+ this.type = type;
+ }
+
+ /**
+ * Returns the full name of the attribute.
+ */
+ String getFullName() {
+ return fullName;
+ }
+
+ /**
+ * Returns the short name of the attribute.
+ */
+ String getName() {
+ return name;
+ }
+
+ /**
+ * Returns the namespace of the attribute.
+ */
+ String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Returns the type of the attribute.
+ *
+ * @param type
+ * the new type.
+ */
+ String getType() {
+ return type;
+ }
+
+ /**
+ * Returns the value of the attribute.
+ */
+ String getValue() {
+ return value;
+ }
+
+ /**
+ * Sets the value of the attribute.
+ *
+ * @param value
+ * the new value.
+ */
+ void setValue(final String value) {
+ this.value = value;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLElement.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLElement.java
new file mode 100644
index 0000000..f4193de
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLElement.java
@@ -0,0 +1,1001 @@
+/*
+ * XMLElement.java NanoXML/Java $Revision: 1.5 $ $Date: 2002/02/06 18:50:12 $
+ * $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.Serializable;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+
+/**
+ * XMLElement is an XML element. The standard NanoXML builder generates a tree
+ * of such elements.
+ *
+ * @see org.freeplane.n3.nanoxml.StdXMLBuilder
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.5 $
+ */
+public class XMLElement implements Serializable {
+ /**
+ * No line number defined.
+ */
+ public static final int NO_LINE = -1;
+ /**
+ * Necessary for serialization.
+ */
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the full name of the element
+ * @param namespace
+ * the namespace URI.
+ * @param systemID
+ * the system ID of the XML data where the element starts.
+ * @param lineNr
+ * the line in the XML data where the element starts.
+ */
+ public static XMLElement createElement(final String fullName, final String namespace, final String systemID,
+ final int lineNr) {
+ return new XMLElement(fullName, namespace, systemID, lineNr);
+ }
+
+ /**
+ * The attributes of the element.
+ */
+ private Vector<XMLAttribute> attributes;
+ /**
+ * The child elements.
+ */
+ private Vector<XMLElement> children;
+ /**
+ * The content of the element.
+ */
+ private String content;
+ /**
+ * The full name of the element.
+ */
+ private String fullName;
+ /**
+ * The line in the source data where this element starts.
+ */
+ final private int lineNr;
+ /**
+ * The name of the element.
+ */
+ private String name;
+ /**
+ * The namespace URI.
+ */
+ private String namespace;
+ /**
+ * The parent element.
+ */
+ private XMLElement parent;
+ /**
+ * The system ID of the source data where this element is located.
+ */
+ private String systemID;
+
+ /**
+ * Creates an empty element to be used for #PCDATA content.
+ */
+ public XMLElement() {
+ this(null, null, null, XMLElement.NO_LINE);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the name of the element.
+ */
+ public XMLElement(final String fullName) {
+ this(fullName, null, null, XMLElement.NO_LINE);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the full name of the element
+ * @param namespace
+ * the namespace URI.
+ */
+ public XMLElement(final String fullName, final String namespace) {
+ this(fullName, namespace, null, XMLElement.NO_LINE);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the name of the element.
+ * @param systemID
+ * the system ID of the XML data where the element starts.
+ * @param lineNr
+ * the line in the XML data where the element starts.
+ */
+ public XMLElement(final String fullName, final String systemID, final int lineNr) {
+ this(fullName, null, systemID, lineNr);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the full name of the element
+ * @param namespace
+ * the namespace URI.
+ * @param systemID
+ * the system ID of the XML data where the element starts.
+ * @param lineNr
+ * the line in the XML data where the element starts.
+ */
+ public XMLElement(final String fullName, final String namespace, final String systemID, final int lineNr) {
+ attributes = new Vector<XMLAttribute>();
+ children = new Vector<XMLElement>(8);
+ this.fullName = fullName;
+ if (namespace == null) {
+ name = fullName;
+ }
+ else {
+ final int index = fullName.indexOf(':');
+ if (index >= 0) {
+ name = fullName.substring(index + 1);
+ }
+ else {
+ name = fullName;
+ }
+ }
+ this.namespace = namespace;
+ content = null;
+ this.lineNr = lineNr;
+ this.systemID = systemID;
+ parent = null;
+ }
+
+ /**
+ * Adds a child element.
+ *
+ * @param child
+ * the non-null child to add.
+ */
+ public void addChild(final XMLElement child) {
+ if (child == null) {
+ throw new IllegalArgumentException("child must not be null");
+ }
+ if ((child.getName() == null) && (!children.isEmpty())) {
+ final XMLElement lastChild = children.lastElement();
+ if (lastChild.getName() == null) {
+ lastChild.setContent(lastChild.getContent() + child.getContent());
+ return;
+ }
+ }
+ (child).parent = this;
+ children.addElement(child);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the name of the element.
+ */
+ public XMLElement createElement(final String fullName) {
+ return new XMLElement(fullName);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the full name of the element
+ * @param namespace
+ * the namespace URI.
+ */
+ public XMLElement createElement(final String fullName, final String namespace) {
+ return new XMLElement(fullName, namespace);
+ }
+
+ /**
+ * Creates an empty element.
+ *
+ * @param fullName
+ * the name of the element.
+ * @param systemID
+ * the system ID of the XML data where the element starts.
+ * @param lineNr
+ * the line in the XML data where the element starts.
+ */
+ public XMLElement createElement(final String fullName, final String systemID, final int lineNr) {
+ return new XMLElement(fullName, systemID, lineNr);
+ }
+
+ /**
+ * Creates an element to be used for #PCDATA content.
+ */
+ public XMLElement createPCDataElement() {
+ return new XMLElement();
+ }
+
+ /**
+ * Returns an enumeration of all attribute names.
+ *
+ * @return the non-null enumeration.
+ */
+ public Enumeration<String> enumerateAttributeNames() {
+ final Vector<String> result = new Vector<String>();
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ result.addElement(enumeration.nextElement().getFullName());
+ }
+ return result.elements();
+ }
+
+ /**
+ * Returns an enumeration of all child elements.
+ *
+ * @return the non-null enumeration
+ */
+ public Enumeration<XMLElement> enumerateChildren() {
+ return children.elements();
+ }
+
+ /**
+ * Returns true if the element equals another element.
+ *
+ * @param rawElement
+ * the element to compare to
+ */
+ @Override
+ public boolean equals(final Object rawElement) {
+ try {
+ return this.equalsXMLElement((XMLElement) rawElement);
+ }
+ catch (final ClassCastException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Returns true if the element equals another element.
+ *
+ * @param rawElement
+ * the element to compare to
+ */
+ public boolean equalsXMLElement(final XMLElement elt) {
+ if (!name.equals(elt.getName())) {
+ return false;
+ }
+ if (attributes.size() != elt.getAttributeCount()) {
+ return false;
+ }
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLAttribute attr = enumeration.nextElement();
+ if (!elt.hasAttribute(attr.getName(), attr.getNamespace())) {
+ return false;
+ }
+ final String value = elt.getAttribute(attr.getName(), attr.getNamespace(), null);
+ if (!attr.getValue().equals(value)) {
+ return false;
+ }
+ final String type = elt.getAttributeType(attr.getName(), attr.getNamespace());
+ if (!attr.getType().equals(type)) {
+ return false;
+ }
+ }
+ if (children.size() != elt.getChildrenCount()) {
+ return false;
+ }
+ for (int i = 0; i < children.size(); i++) {
+ final XMLElement child1 = this.getChildAtIndex(i);
+ final XMLElement child2 = elt.getChildAtIndex(i);
+ if (!child1.equalsXMLElement(child2)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ attributes.clear();
+ attributes = null;
+ children = null;
+ fullName = null;
+ name = null;
+ namespace = null;
+ content = null;
+ systemID = null;
+ parent = null;
+ super.finalize();
+ }
+
+ /**
+ * Searches an attribute.
+ *
+ * @param fullName
+ * the non-null full name of the attribute.
+ * @return the attribute, or null if the attribute does not exist.
+ */
+ private XMLAttribute findAttribute(final String fullName) {
+ if (fullName == null) {
+ throw new IllegalArgumentException("fullName must not be null");
+ }
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLAttribute attr = enumeration.nextElement();
+ if (attr.getFullName().equals(fullName)) {
+ return attr;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Searches an attribute.
+ *
+ * @param name
+ * the non-null short name of the attribute.
+ * @param namespace
+ * the name space, which may be null.
+ * @return the attribute, or null if the attribute does not exist.
+ */
+ private XMLAttribute findAttribute(final String name, final String namespace) {
+ if (name == null) {
+ throw new IllegalArgumentException("name must not be null");
+ }
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLAttribute attr = enumeration.nextElement();
+ boolean found = attr.getName().equals(name);
+ if (namespace == null) {
+ found &= (attr.getNamespace() == null);
+ }
+ else {
+ found &= namespace.equals(attr.getNamespace());
+ }
+ if (found) {
+ return attr;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @deprecated As of NanoXML/Java 2.1, replaced by
+ * {@link #getAttribute(java.lang.String,java.lang.String)}
+ * Returns the value of an attribute.
+ * @param name
+ * the non-null name of the attribute.
+ * @return the value, or null if the attribute does not exist.
+ */
+ @Deprecated
+ public String getAttribute(final String name) {
+ return this.getAttribute(name, null);
+ }
+
+ /**
+ * Returns the value of an attribute.
+ *
+ * @param name
+ * the non-null full name of the attribute.
+ * @param defaultValue
+ * the default value of the attribute.
+ * @return the value, or defaultValue if the attribute does not exist.
+ */
+ public int getAttribute(final String name, final int defaultValue) {
+ final String value = this.getAttribute(name, Integer.toString(defaultValue));
+ return Integer.parseInt(value);
+ }
+
+ /**
+ * Returns the value of an attribute.
+ *
+ * @param name
+ * the non-null full name of the attribute.
+ * @param defaultValue
+ * the default value of the attribute.
+ * @return the value, or defaultValue if the attribute does not exist.
+ */
+ public String getAttribute(final String name, final String defaultValue) {
+ final XMLAttribute attr = this.findAttribute(name);
+ if (attr == null) {
+ return defaultValue;
+ }
+ else {
+ return attr.getValue();
+ }
+ }
+
+ /**
+ * Returns the value of an attribute.
+ *
+ * @param name
+ * the non-null name of the attribute.
+ * @param namespace
+ * the namespace URI, which may be null.
+ * @param defaultValue
+ * the default value of the attribute.
+ * @return the value, or defaultValue if the attribute does not exist.
+ */
+ public int getAttribute(final String name, final String namespace, final int defaultValue) {
+ final String value = this.getAttribute(name, namespace, Integer.toString(defaultValue));
+ return Integer.parseInt(value);
+ }
+
+ /**
+ * Returns the value of an attribute.
+ *
+ * @param name
+ * the non-null name of the attribute.
+ * @param namespace
+ * the namespace URI, which may be null.
+ * @param defaultValue
+ * the default value of the attribute.
+ * @return the value, or defaultValue if the attribute does not exist.
+ */
+ public String getAttribute(final String name, final String namespace, final String defaultValue) {
+ final XMLAttribute attr = this.findAttribute(name, namespace);
+ if (attr == null) {
+ return defaultValue;
+ }
+ else {
+ return attr.getValue();
+ }
+ }
+
+ /**
+ * Returns the number of attributes.
+ */
+ public int getAttributeCount() {
+ return attributes.size();
+ }
+
+ /**
+ * Returns the namespace of an attribute.
+ *
+ * @param name
+ * the non-null full name of the attribute.
+ * @return the namespace, or null if there is none associated.
+ */
+ public String getAttributeNamespace(final String name) {
+ final XMLAttribute attr = this.findAttribute(name);
+ if (attr == null) {
+ return null;
+ }
+ else {
+ return attr.getNamespace();
+ }
+ }
+
+ /**
+ * Returns all attributes as a Properties object.
+ *
+ * @return the non-null set.
+ */
+ public Properties getAttributes() {
+ final Properties result = new Properties();
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLAttribute attr = enumeration.nextElement();
+ result.put(attr.getFullName(), attr.getValue());
+ }
+ return result;
+ }
+
+ /**
+ * Returns all attributes in a specific namespace as a Properties object.
+ *
+ * @param namespace
+ * the namespace URI of the attributes, which may be null.
+ * @return the non-null set.
+ */
+ public Properties getAttributesInNamespace(final String namespace) {
+ final Properties result = new Properties();
+ final Enumeration<XMLAttribute> enumeration = attributes.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLAttribute attr = enumeration.nextElement();
+ if (namespace == null) {
+ if (attr.getNamespace() == null) {
+ result.put(attr.getName(), attr.getValue());
+ }
+ }
+ else {
+ if (namespace.equals(attr.getNamespace())) {
+ result.put(attr.getName(), attr.getValue());
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns the type of an attribute.
+ *
+ * @param name
+ * the non-null full name of the attribute.
+ * @return the type, or null if the attribute does not exist.
+ */
+ public String getAttributeType(final String name) {
+ final XMLAttribute attr = this.findAttribute(name);
+ if (attr == null) {
+ return null;
+ }
+ else {
+ return attr.getType();
+ }
+ }
+
+ /**
+ * Returns the type of an attribute.
+ *
+ * @param name
+ * the non-null name of the attribute.
+ * @param namespace
+ * the namespace URI, which may be null.
+ * @return the type, or null if the attribute does not exist.
+ */
+ public String getAttributeType(final String name, final String namespace) {
+ final XMLAttribute attr = this.findAttribute(name, namespace);
+ if (attr == null) {
+ return null;
+ }
+ else {
+ return attr.getType();
+ }
+ }
+
+ /**
+ * Returns the child at a specific index.
+ *
+ * @param index
+ * the index of the child
+ * @return the non-null child
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ * if the index is out of bounds.
+ */
+ public XMLElement getChildAtIndex(final int index) throws ArrayIndexOutOfBoundsException {
+ return (XMLElement) children.elementAt(index);
+ }
+
+ /**
+ * Returns a vector containing all the child elements.
+ *
+ * @return the vector.
+ */
+ public Vector<XMLElement> getChildren() {
+ return children;
+ }
+
+ /**
+ * Returns the number of children.
+ *
+ * @return the count.
+ */
+ public int getChildrenCount() {
+ return children.size();
+ }
+
+ /**
+ * Returns a vector of all child elements named <I>name</I>.
+ *
+ * @param name
+ * the full name of the children to search for.
+ * @return the non-null vector of child elements.
+ */
+ public Vector<XMLElement> getChildrenNamed(final String name) {
+ final Vector<XMLElement> result = new Vector<XMLElement>(children.size());
+ final Enumeration<XMLElement> enumeration = children.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLElement child = enumeration.nextElement();
+ final String childName = child.getFullName();
+ if ((childName != null) && childName.equals(name)) {
+ result.addElement(child);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns a vector of all child elements named <I>name</I>.
+ *
+ * @param name
+ * the name of the children to search for.
+ * @param namespace
+ * the namespace, which may be null.
+ * @return the non-null vector of child elements.
+ */
+ public Vector<XMLElement> getChildrenNamed(final String name, final String namespace) {
+ final Vector<XMLElement> result = new Vector<XMLElement>(children.size());
+ final Enumeration<XMLElement> enumeration = children.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLElement child = (XMLElement) enumeration.nextElement();
+ String str = child.getName();
+ boolean found = (str != null) && (str.equals(name));
+ str = child.getNamespace();
+ if (str == null) {
+ found &= (name == null);
+ }
+ else {
+ found &= str.equals(namespace);
+ }
+ if (found) {
+ result.addElement(child);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Return the #PCDATA content of the element. If the element has a
+ * combination of #PCDATA content and child elements, the #PCDATA sections
+ * can be retrieved as unnamed child objects. In this case, this method
+ * returns null.
+ *
+ * @return the content.
+ */
+ public String getContent() {
+ return content;
+ }
+
+ /**
+ * Searches a child element.
+ *
+ * @param name
+ * the full name of the child to search for.
+ * @return the child element, or null if no such child was found.
+ */
+ public XMLElement getFirstChildNamed(final String name) {
+ final Enumeration<XMLElement> enumeration = children.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLElement child = enumeration.nextElement();
+ final String childName = child.getFullName();
+ if ((childName != null) && childName.equals(name)) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Searches a child element.
+ *
+ * @param name
+ * the name of the child to search for.
+ * @param namespace
+ * the namespace, which may be null.
+ * @return the child element, or null if no such child was found.
+ */
+ public XMLElement getFirstChildNamed(final String name, final String namespace) {
+ final Enumeration<XMLElement> enumeration = children.elements();
+ while (enumeration.hasMoreElements()) {
+ final XMLElement child = enumeration.nextElement();
+ String str = child.getName();
+ boolean found = (str != null) && (str.equals(name));
+ str = child.getNamespace();
+ if (str == null) {
+ found &= (name == null);
+ }
+ else {
+ found &= str.equals(namespace);
+ }
+ if (found) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the full name (i.e. the name including an eventual namespace
+ * prefix) of the element.
+ *
+ * @return the name, or null if the element only contains #PCDATA.
+ */
+ public String getFullName() {
+ return fullName;
+ }
+
+ /**
+ * Returns the line number in the data where the element started.
+ *
+ * @return the line number, or NO_LINE if unknown.
+ * @see #NO_LINE
+ * @see #getSystemID
+ */
+ public int getLineNr() {
+ return lineNr;
+ }
+
+ /**
+ * Returns the name of the element.
+ *
+ * @return the name, or null if the element only contains #PCDATA.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns the namespace of the element.
+ *
+ * @return the namespace, or null if no namespace is associated with the
+ * element.
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Returns the parent element. This method returns null for the root
+ * element.
+ */
+ public XMLElement getParent() {
+ return parent;
+ }
+
+ /**
+ * Returns the system ID of the data where the element started.
+ *
+ * @return the system ID, or null if unknown.
+ * @see #getLineNr
+ */
+ public String getSystemID() {
+ return systemID;
+ }
+
+ /**
+ * Returns whether an attribute exists.
+ *
+ * @return true if the attribute exists.
+ */
+ public boolean hasAttribute(final String name) {
+ return this.findAttribute(name) != null;
+ }
+
+ /**
+ * Returns whether an attribute exists.
+ *
+ * @return true if the attribute exists.
+ */
+ public boolean hasAttribute(final String name, final String namespace) {
+ return this.findAttribute(name, namespace) != null;
+ }
+
+ /**
+ * Returns whether the element has children.
+ *
+ * @return true if the element has children.
+ */
+ public boolean hasChildren() {
+ return (!children.isEmpty());
+ }
+
+ /**
+ * Inserts a child element.
+ *
+ * @param child
+ * the non-null child to add.
+ * @param index
+ * where to put the child.
+ */
+ public void insertChild(final XMLElement child, final int index) {
+ if (child == null) {
+ throw new IllegalArgumentException("child must not be null");
+ }
+ if ((child.getName() == null) && (!children.isEmpty())) {
+ final XMLElement lastChild = (XMLElement) children.lastElement();
+ if (lastChild.getName() == null) {
+ lastChild.setContent(lastChild.getContent() + child.getContent());
+ return;
+ }
+ }
+ (child).parent = this;
+ children.insertElementAt(child, index);
+ }
+
+ /**
+ * Returns whether the element is a leaf element.
+ *
+ * @return true if the element has no children.
+ */
+ public boolean isLeaf() {
+ return children.isEmpty();
+ }
+
+ /**
+ * Removes an attribute.
+ *
+ * @param name
+ * the non-null name of the attribute.
+ */
+ public void removeAttribute(final String name) {
+ if (name == null) {
+ throw new IllegalArgumentException("name must not be null");
+ }
+ for (int i = 0; i < attributes.size(); i++) {
+ final XMLAttribute attr = attributes.elementAt(i);
+ if (attr.getFullName().equals(name)) {
+ attributes.removeElementAt(i);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Removes an attribute.
+ *
+ * @param name
+ * the non-null name of the attribute.
+ * @param namespace
+ * the namespace URI of the attribute, which may be null.
+ */
+ public void removeAttribute(final String name, final String namespace) {
+ if (name == null) {
+ throw new IllegalArgumentException("name must not be null");
+ }
+ for (int i = 0; i < attributes.size(); i++) {
+ final XMLAttribute attr = attributes.elementAt(i);
+ boolean found = attr.getName().equals(name);
+ if (namespace == null) {
+ found &= (attr.getNamespace() == null);
+ }
+ else {
+ found &= attr.getNamespace().equals(namespace);
+ }
+ if (found) {
+ attributes.removeElementAt(i);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Removes a child element.
+ *
+ * @param child
+ * the non-null child to remove.
+ */
+ public void removeChild(final XMLElement child) {
+ if (child == null) {
+ throw new IllegalArgumentException("child must not be null");
+ }
+ children.removeElement(child);
+ }
+
+ /**
+ * Removes the child located at a certain index.
+ *
+ * @param index
+ * the index of the child, where the first child has index 0.
+ */
+ public void removeChildAtIndex(final int index) {
+ children.removeElementAt(index);
+ }
+
+ /**
+ * Sets an attribute.
+ *
+ * @param name
+ * the non-null full name of the attribute.
+ * @param value
+ * the non-null value of the attribute.
+ */
+ public void setAttribute(final String name, final String value) {
+ if (value == null) {
+ throw new IllegalArgumentException("value must not be null");
+ }
+ XMLAttribute attr = this.findAttribute(name);
+ if (attr == null) {
+ attr = new XMLAttribute(name, name, null, value, "CDATA");
+ attributes.addElement(attr);
+ }
+ else {
+ attr.setValue(value);
+ }
+ }
+
+ /**
+ * Sets an attribute.
+ *
+ * @param fullName
+ * the non-null full name of the attribute.
+ * @param namespace
+ * the namespace URI of the attribute, which may be null.
+ * @param value
+ * the non-null value of the attribute.
+ */
+ public void setAttribute(final String fullName, final String namespace, final String value) {
+ if (fullName == null) {
+ throw new IllegalArgumentException("fullName must not be null");
+ }
+ if (value == null) {
+ throw new IllegalArgumentException("value must not be null");
+ }
+ final int index = fullName.indexOf(':');
+ final String name = fullName.substring(index + 1);
+ XMLAttribute attr = this.findAttribute(name, namespace);
+ if (attr == null) {
+ attr = new XMLAttribute(fullName, name, namespace, value, "CDATA");
+ attributes.addElement(attr);
+ }
+ else {
+ attr.setValue(value);
+ }
+ }
+
+ /**
+ * Sets the #PCDATA content. It is an error to call this method with a
+ * non-null value if there are child objects.
+ *
+ * @param content
+ * the (possibly null) content.
+ */
+ public void setContent(final String content) {
+ this.content = content;
+ }
+
+ /**
+ * Sets the full name. This method also sets the short name and clears the
+ * namespace URI.
+ *
+ * @param name
+ * the non-null name.
+ */
+ public void setName(final String name) {
+ if (name == null) {
+ throw new IllegalArgumentException("name must not be null");
+ }
+ this.name = name;
+ fullName = name;
+ namespace = null;
+ }
+
+ /**
+ * Sets the name.
+ *
+ * @param fullName
+ * the non-null full name.
+ * @param namespace
+ * the namespace URI, which may be null.
+ */
+ public void setName(final String fullName, final String namespace) {
+ if (fullName == null) {
+ throw new IllegalArgumentException("fullName must not be null");
+ }
+ final int index = fullName.indexOf(':');
+ if ((namespace == null) || (index < 0)) {
+ name = fullName;
+ }
+ else {
+ name = fullName.substring(index + 1);
+ }
+ this.fullName = fullName;
+ this.namespace = namespace;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLEntityResolver.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLEntityResolver.java
new file mode 100644
index 0000000..66dc1e6
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLEntityResolver.java
@@ -0,0 +1,143 @@
+/*
+ * XMLEntityResolver.java NanoXML/Java $Revision: 1.4 $ $Date: 2002/01/04
+ * 21:03:29 $ $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.Reader;
+import java.io.StringReader;
+import java.util.Hashtable;
+
+/**
+ * An XMLEntityResolver resolves entities.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+class XMLEntityResolver implements IXMLEntityResolver {
+ /**
+ * The entities.
+ */
+ private Hashtable<String, Object> entities;
+
+ /**
+ * Initializes the resolver.
+ */
+ public XMLEntityResolver() {
+ entities = new Hashtable<String, Object>();
+ entities.put("amp", "&");
+ entities.put("quot", """);
+ entities.put("apos", "'");
+ entities.put("lt", "<");
+ entities.put("gt", ">");
+ }
+
+ /**
+ * Adds an external entity.
+ *
+ * @param name
+ * the name of the entity.
+ * @param publicID
+ * the public ID of the entity, which may be null.
+ * @param systemID
+ * the system ID of the entity.
+ */
+ public void addExternalEntity(final String name, final String publicID, final String systemID) {
+ if (!entities.containsKey(name)) {
+ entities.put(name, new String[] { publicID, systemID });
+ }
+ }
+
+ /**
+ * Adds an internal entity.
+ *
+ * @param name
+ * the name of the entity.
+ * @param value
+ * the value of the entity.
+ */
+ public void addInternalEntity(final String name, final String value) {
+ if (!entities.containsKey(name)) {
+ entities.put(name, value);
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ entities.clear();
+ entities = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns a Java reader containing the value of an entity.
+ *
+ * @param xmlReader
+ * the current XML reader
+ * @param name
+ * the name of the entity.
+ * @return the reader, or null if the entity could not be resolved.
+ */
+ public Reader getEntity(final IXMLReader xmlReader, final String name) throws XMLParseException {
+ final Object obj = entities.get(name);
+ if (obj == null) {
+ return null;
+ }
+ else if (obj instanceof java.lang.String) {
+ return new StringReader((String) obj);
+ }
+ else {
+ final String[] id = (String[]) obj;
+ return this.openExternalEntity(xmlReader, id[0], id[1]);
+ }
+ }
+
+ /**
+ * Returns true if an entity is external.
+ *
+ * @param name
+ * the name of the entity.
+ */
+ public boolean isExternalEntity(final String name) {
+ final Object obj = entities.get(name);
+ return !(obj instanceof java.lang.String);
+ }
+
+ /**
+ * Opens an external entity.
+ *
+ * @param xmlReader
+ * the current XML reader
+ * @param publicID
+ * the public ID, which may be null
+ * @param systemID
+ * the system ID
+ * @return the reader, or null if the reader could not be created/opened
+ */
+ protected Reader openExternalEntity(final IXMLReader xmlReader, final String publicID, final String systemID)
+ throws XMLParseException {
+ final String parentSystemID = xmlReader.getSystemID();
+ try {
+ return xmlReader.openStream(publicID, systemID);
+ }
+ catch (final Exception e) {
+ throw new XMLParseException(parentSystemID, xmlReader.getLineNr(), "Could not open external entity "
+ + "at system ID: " + systemID);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLException.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLException.java
new file mode 100644
index 0000000..a6d9fcd
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLException.java
@@ -0,0 +1,239 @@
+/*
+ * XMLException.java NanoXML/Java $Revision: 1.4 $ $Date: 2002/01/04 21:03:29 $
+ * $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.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ * An XMLException is thrown when an exception occurred while processing the XML
+ * data.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+public class XMLException extends Exception {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Builds the exception message
+ *
+ * @param systemID
+ * the system ID from where the data came
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param e
+ * the encapsulated exception.
+ * @param msg
+ * the message of the exception.
+ * @param reportParams
+ * true if the systemID, lineNr and e params need to be appended
+ * to the message
+ */
+ private static String buildMessage(final String systemID, final int lineNr, final Exception e, final String msg,
+ final boolean reportParams) {
+ String str = msg;
+ if (reportParams) {
+ if (systemID != null) {
+ str += ", SystemID='" + systemID + "'";
+ }
+ if (lineNr >= 0) {
+ str += ", Line=" + lineNr;
+ }
+ if (e != null) {
+ str += ", Exception: " + e;
+ }
+ }
+ return str;
+ }
+
+ /**
+ * Encapsulated exception.
+ */
+ private Exception encapsulatedException;
+ /**
+ * The line number in the XML data where the exception occurred.
+ */
+ final private int lineNr;
+ /**
+ * The message of the exception.
+ */
+ final private String msg;
+ /**
+ * The system ID of the XML data where the exception occurred.
+ */
+ private String systemID;
+
+ /**
+ * Creates a new exception.
+ *
+ * @param e
+ * the encapsulated exception.
+ */
+ public XMLException(final Exception e) {
+ this(null, -1, e, "Nested Exception", false);
+ }
+
+ /**
+ * Creates a new exception.
+ *
+ * @param msg
+ * the message of the exception.
+ */
+ public XMLException(final String msg) {
+ this(null, -1, null, msg, false);
+ }
+
+ /**
+ * Creates a new exception.
+ *
+ * @param systemID
+ * the system ID of the XML data where the exception occurred
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param e
+ * the encapsulated exception.
+ */
+ public XMLException(final String systemID, final int lineNr, final Exception e) {
+ this(systemID, lineNr, e, "Nested Exception", true);
+ }
+
+ /**
+ * Creates a new exception.
+ *
+ * @param systemID
+ * the system ID from where the data came
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param e
+ * the encapsulated exception.
+ * @param msg
+ * the message of the exception.
+ * @param reportParams
+ * true if the systemID, lineNr and e params need to be appended
+ * to the message
+ */
+ public XMLException(final String systemID, final int lineNr, final Exception e, final String msg,
+ final boolean reportParams) {
+ super(XMLException.buildMessage(systemID, lineNr, e, msg, reportParams));
+ this.systemID = systemID;
+ this.lineNr = lineNr;
+ encapsulatedException = e;
+ this.msg = XMLException.buildMessage(systemID, lineNr, e, msg, reportParams);
+ }
+
+ /**
+ * Creates a new exception.
+ *
+ * @param systemID
+ * the system ID of the XML data where the exception occurred
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param msg
+ * the message of the exception.
+ */
+ public XMLException(final String systemID, final int lineNr, final String msg) {
+ this(systemID, lineNr, null, msg, true);
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ systemID = null;
+ encapsulatedException = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns the encapsulated exception, or null if no exception is
+ * encapsulated.
+ */
+ public Exception getException() {
+ return encapsulatedException;
+ }
+
+ /**
+ * Returns the line number in the XML data where the exception occurred. If
+ * there is no line number known, -1 is returned.
+ */
+ public int getLineNr() {
+ return lineNr;
+ }
+
+ /**
+ * Returns the system ID of the XML data where the exception occurred. If
+ * there is no system ID known, null is returned.
+ */
+ public String getSystemID() {
+ return systemID;
+ }
+
+ /**
+ * Dumps the exception stack to System.err.
+ */
+ @Override
+ public void printStackTrace() {
+ super.printStackTrace();
+ if (encapsulatedException != null) {
+ System.err.println("*** Nested Exception:");
+ encapsulatedException.printStackTrace();
+ }
+ }
+
+ /**
+ * Dumps the exception stack to an output stream.
+ *
+ * @param stream
+ * the output stream
+ */
+ @Override
+ public void printStackTrace(final PrintStream stream) {
+ super.printStackTrace(stream);
+ if (encapsulatedException != null) {
+ stream.println("*** Nested Exception:");
+ encapsulatedException.printStackTrace(stream);
+ }
+ }
+
+ /**
+ * Dumps the exception stack to a print writer.
+ *
+ * @param writer
+ * the print writer
+ */
+ @Override
+ public void printStackTrace(final PrintWriter writer) {
+ super.printStackTrace(writer);
+ if (encapsulatedException != null) {
+ writer.println("*** Nested Exception:");
+ encapsulatedException.printStackTrace(writer);
+ }
+ }
+
+ /**
+ * Returns a string representation of the exception.
+ */
+ @Override
+ public String toString() {
+ return msg;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLParseException.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLParseException.java
new file mode 100644
index 0000000..18ff4be
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLParseException.java
@@ -0,0 +1,55 @@
+/*
+ * XMLParseException.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04
+ * 21:03:29 $ $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;
+
+/**
+ * An XMLParseException is thrown when the XML passed to the XML parser is not
+ * well-formed.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+public class XMLParseException extends XMLException {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Creates a new exception.
+ *
+ * @param msg
+ * the message of the exception.
+ */
+ public XMLParseException(final String msg) {
+ super(msg);
+ }
+
+ /**
+ * Creates a new exception.
+ *
+ * @param systemID
+ * the system ID from where the data came
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param msg
+ * the message of the exception.
+ */
+ public XMLParseException(final String systemID, final int lineNr, final String msg) {
+ super(systemID, lineNr, null, msg, true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLParserFactory.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLParserFactory.java
new file mode 100644
index 0000000..36e85e3
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLParserFactory.java
@@ -0,0 +1,108 @@
+/*
+ * XMLParserFactory.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04
+ * 21:03:29 $ $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;
+
+/**
+ * Creates an XML parser.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+public class XMLParserFactory {
+ /**
+ * The Java properties key of the XML parser class name.
+ */
+ public static final String CLASS_KEY = "org.freeplane.io.xml.n3.nanoxml.XMLParser";
+ /**
+ * The class name of the default XML parser.
+ */
+ public static final String DEFAULT_CLASS = "org.freeplane.io.xml.n3.nanoxml.StdXMLParser";
+
+ /**
+ * Creates a default parser.
+ *
+ * @see #DEFAULT_CLASS
+ * @see #CLASS_KEY
+ * @return the non-null parser.
+ * @throws java.lang.ClassNotFoundException
+ * if the class of the parser or validator could not be found.
+ * @throws java.lang.InstantiationException
+ * if the parser could not be created
+ * @throws java.lang.IllegalAccessException
+ * if the parser could not be created
+ */
+ public static IXMLParser createDefaultXMLParser() {
+ try {
+ return XMLParserFactory.createXMLParser(StdXMLParser.class.getName(), new StdXMLBuilder());
+ }
+ catch (final ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ catch (final InstantiationException e) {
+ e.printStackTrace();
+ }
+ catch (final IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * Creates a default parser.
+ *
+ * @see #DEFAULT_CLASS
+ * @see #CLASS_KEY
+ * @param builder
+ * the XML builder.
+ * @return the non-null parser.
+ * @throws java.lang.ClassNotFoundException
+ * if the class of the parser could not be found.
+ * @throws java.lang.InstantiationException
+ * if the parser could not be created
+ * @throws java.lang.IllegalAccessException
+ * if the parser could not be created
+ */
+ public static IXMLParser createDefaultXMLParser(final IXMLBuilder builder) throws ClassNotFoundException,
+ InstantiationException, IllegalAccessException {
+ final String className = System.getProperty(XMLParserFactory.CLASS_KEY, XMLParserFactory.DEFAULT_CLASS);
+ return XMLParserFactory.createXMLParser(className, builder);
+ }
+
+ /**
+ * Creates a parser.
+ *
+ * @param className
+ * the name of the class of the XML parser
+ * @param builder
+ * the XML builder.
+ * @return the non-null parser.
+ * @throws java.lang.ClassNotFoundException
+ * if the class of the parser could not be found.
+ * @throws java.lang.InstantiationException
+ * if the parser could not be created
+ * @throws java.lang.IllegalAccessException
+ * if the parser could not be created
+ */
+ public static IXMLParser createXMLParser(final String className, final IXMLBuilder builder)
+ throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+ final Class<?> cls = Class.forName(className);
+ final IXMLParser parser = (IXMLParser) cls.newInstance();
+ parser.setBuilder(builder);
+ parser.setValidator(new NonValidator());
+ return parser;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java
new file mode 100644
index 0000000..b067353
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java
@@ -0,0 +1,614 @@
+/*
+ * 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/XMLValidationException.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLValidationException.java
new file mode 100644
index 0000000..9a70631
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLValidationException.java
@@ -0,0 +1,139 @@
+/*
+ * XMLValidationException.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04
+ * 21:03:29 $ $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;
+
+/**
+ * An XMLValidationException is thrown when the XML passed to the XML parser is
+ * well-formed but not valid.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+class XMLValidationException extends XMLException {
+ /**
+ * An attribute has an invalid value.
+ */
+ public static final int ATTRIBUTE_WITH_INVALID_VALUE = 5;
+ /**
+ * Another error than those specified in this class was encountered.
+ */
+ public static final int MISC_ERROR = 0;
+ /**
+ * An attribute was missing.
+ */
+ public static final int MISSING_ATTRIBUTE = 3;
+ /**
+ * An element was missing.
+ */
+ public static final int MISSING_ELEMENT = 1;
+ /**
+ * A PCDATA element was missing.
+ */
+ public static final int MISSING_PCDATA = 6;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ * An unexpected attribute was encountered.
+ */
+ public static final int UNEXPECTED_ATTRIBUTE = 4;
+ /**
+ * An unexpected element was encountered.
+ */
+ public static final int UNEXPECTED_ELEMENT = 2;
+ /**
+ * An unexpected PCDATA element was encountered.
+ */
+ public static final int UNEXPECTED_PCDATA = 7;
+ /**
+ * The name of the attribute where the exception occurred.
+ */
+ private String attributeName;
+ /**
+ * The value of the attribute where the exception occurred.
+ */
+ private String attributeValue;
+ /**
+ * The name of the element where the exception occurred.
+ */
+ private String elementName;
+
+ /**
+ * Creates a new exception.
+ *
+ * @param errorType
+ * the type of validity error
+ * @param systemID
+ * the system ID from where the data came
+ * @param lineNr
+ * the line number in the XML data where the exception occurred.
+ * @param elementName
+ * the name of the offending element
+ * @param attributeName
+ * the name of the offending attribute
+ * @param attributeValue
+ * the value of the offending attribute
+ * @param msg
+ * the message of the exception.
+ */
+ public XMLValidationException(final int errorType, final String systemID, final int lineNr,
+ final String elementName, final String attributeName, final String attributeValue,
+ final String msg) {
+ super(systemID, lineNr, null, msg + ((elementName == null) ? "" : (", element=" + elementName))
+ + ((attributeName == null) ? "" : (", attribute=" + attributeName))
+ + ((attributeValue == null) ? "" : (", value='" + attributeValue + "'")), false);
+ this.elementName = elementName;
+ this.attributeName = attributeName;
+ this.attributeValue = attributeValue;
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ elementName = null;
+ attributeName = null;
+ attributeValue = null;
+ super.finalize();
+ }
+
+ /**
+ * Returns the name of the attribute in which the validation is violated. If
+ * there is no current attribute, null is returned.
+ */
+ public String getAttributeName() {
+ return attributeName;
+ }
+
+ /**
+ * Returns the value of the attribute in which the validation is violated.
+ * If there is no current attribute, null is returned.
+ */
+ public String getAttributeValue() {
+ return attributeValue;
+ }
+
+ /**
+ * Returns the name of the element in which the validation is violated. If
+ * there is no current element, null is returned.
+ */
+ public String getElementName() {
+ return elementName;
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java
new file mode 100644
index 0000000..1efe894
--- /dev/null
+++ b/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java
@@ -0,0 +1,274 @@
+/*
+ * 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;
+
+ /**
+ * 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 0x0A:
+ writer.print(c);
+ break;
+ case '<':
+ writer.print("<");
+ break;
+ case '>':
+ writer.print(">");
+ break;
+ case '&':
+ writer.print("&");
+ break;
+ case '\'':
+ writer.print("'");
+ break;
+ case '"':
+ writer.print(""");
+ 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) {
+ writeEncoded(str);
+ }
+
+ 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
new file mode 100644
index 0000000..555b242
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/BlinkingNodeHook.java
@@ -0,0 +1,193 @@
+/*
+ * 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/FitToPage.java b/freeplane/src/org/freeplane/view/swing/features/FitToPage.java
new file mode 100644
index 0000000..c09f5b0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/FitToPage.java
@@ -0,0 +1,85 @@
+/*
+ * 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.features;
+
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JViewport;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MapView;
+
+/**
+ * @author foltin
+ * @author Dimitry Polivaev
+ */
+public class FitToPage extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private MapView view;
+
+ /**
+ *
+ */
+ public FitToPage() {
+ super("FitToPage");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ view = (MapView) Controller.getCurrentController().getViewController().getMapView();
+ if (view == null) {
+ return;
+ }
+ zoom();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ scroll();
+ }
+ });
+ }
+
+ private void scroll() {
+ final Rectangle rect = view.getInnerBounds();
+ final Rectangle viewer = view.getVisibleRect();
+ view.scrollBy(shift(rect.x, rect.width, viewer.x, viewer.width), shift(rect.y, rect.height, viewer.y,
+ viewer.height));
+ }
+
+ private int shift(final int coord1, final int size1, final int coord2, final int size2) {
+ return coord1 - coord2 + (size1 - size2) / 2;
+ }
+
+ private void zoom() {
+ final Rectangle rect = view.getInnerBounds();
+ final double oldZoom = view.getZoom();
+ final JViewport viewPort = (JViewport) view.getParent();
+ final Dimension viewer = viewPort.getExtentSize();
+ double newZoom = viewer.width * oldZoom / (rect.width + 0.0);
+ final double heightZoom = viewer.height * oldZoom / (rect.height + 0.0);
+ if (heightZoom < newZoom) {
+ newZoom = heightZoom;
+ }
+ Controller.getCurrentController().getViewController().setZoom((float) (newZoom));
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java
new file mode 100644
index 0000000..b25f774
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java
@@ -0,0 +1,77 @@
+/*
+ * 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.view.swing.features.filepreview;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.Collection;
+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.view.swing.features.progress.mindmapmode.ProgressUtilities;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This action adds an external image to a node
+ */
+ at EnabledAction(checkOnNodeChange = true)
+public class AddExternalImageAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public AddExternalImageAction() {
+ super("ExternalImageAddAction");
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final Collection<NodeModel> nodes = mapController.getSelectedNodes();
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ final ExternalResource extRes = (ExternalResource) vc.createExtension(selectedNode);
+ if (extRes != null) {
+ final File file = new File(extRes.getAbsoluteUri(selectedNode.getMap()));
+ for (final NodeModel node : nodes) {
+ if (!progUtil.hasExternalResource(node)) {
+ vc.paste(file, node, node.isLeft());
+ }
+ }
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && !progUtil.hasExternalResource(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
new file mode 100644
index 0000000..fbc72ff
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
@@ -0,0 +1,100 @@
+/*
+ * 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/ChangeExternalImageAction.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java
new file mode 100644
index 0000000..0814041
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java
@@ -0,0 +1,77 @@
+/*
+ * 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.view.swing.features.filepreview;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.Collection;
+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.view.swing.features.progress.mindmapmode.ProgressUtilities;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This action changes the external resource of a node against another
+ */
+ at EnabledAction(checkOnNodeChange = true)
+public class ChangeExternalImageAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public ChangeExternalImageAction() {
+ super("ExternalImageChangeAction");
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final Collection<NodeModel> nodes = mapController.getSelectedNodes();
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ final ExternalResource extRes = (ExternalResource) vc.createExtension(mapController.getSelectedNode());
+ if (extRes != null) {
+ final File file = new File(extRes.getAbsoluteUri(mapController.getSelectedNode().getMap()));
+ for (final NodeModel node : nodes) {
+ if (progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ vc.undoableDeactivateHook(node);
+ vc.paste(file, node, node.isLeft());
+ }
+ }
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java
new file mode 100644
index 0000000..4611ad2
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java
@@ -0,0 +1,234 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Stefan Ott
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have 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.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.File;
+import java.util.Collection;
+
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.features.progress.mindmapmode.ProgressUtilities;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class shows a popup menu for the external image.
+ */
+class ExternalImagePopupMenu extends JPopupMenu implements MouseListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private NodeModel node = null;
+ private ViewerController viewer = null;
+ private JMenuItem remove = null;
+ private JMenuItem change = null;
+ private JMenuItem open = null;
+ private JMenuItem resetZoom = null;
+
+ @Override
+ protected void firePopupMenuWillBecomeInvisible() {
+ super.firePopupMenuWillBecomeInvisible();
+ // removeAll();
+ }
+
+ @Override
+ protected void firePopupMenuWillBecomeVisible() {
+ super.firePopupMenuWillBecomeVisible();
+ }
+
+ /**
+ * @return Returns the delete menu item.
+ */
+ private JMenuItem getRemove() {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (remove == null) {
+ remove = new JMenuItem(TextUtils.getText("ExternalImage_popupMenu_Remove"));
+ remove.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final ExternalResource extRes = (ExternalResource) node.getExtension(ExternalResource.class);
+ if (progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ viewer.remove(node, extRes);
+ NodeView nv = null;
+ final Collection<INodeView> invs = Controller.getCurrentController().getModeController()
+ .getMapController().getSelectedNode().getViewers();
+ for (final INodeView inv : invs) {
+ if (inv instanceof NodeView) {
+ nv = (NodeView) inv;
+ break;
+ }
+ }
+ viewer.deleteViewer(extRes, nv);
+ viewer.undoableDeactivateHook(node);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node,
+ NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+ }
+ });
+ }
+ return remove;
+ }
+
+ /**
+ * @return Returns the open menu item.
+ */
+ private JMenuItem getOpen() {
+ if (open == null) {
+ open = new JMenuItem(TextUtils.getText("ExternalImage_popupMenu_Open"));
+ open.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final ExternalResource extRes = (ExternalResource) node.getExtension(ExternalResource.class);
+ if(extRes == null)
+ return;
+ final UrlManager urlManager = (UrlManager) Controller.getCurrentModeController().getExtension(
+ UrlManager.class);
+ urlManager.loadURL(extRes.getUri());
+ }
+ });
+ }
+ return open;
+ }
+
+ /**
+ * @return Returns the change menu item.
+ */
+ private JMenuItem getChange() {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (change == null) {
+ change = new JMenuItem(TextUtils.getText("ExternalImage_popupMenu_Change"));
+ change.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final ExternalResource extRes = (ExternalResource) viewer.createExtension(node);
+ if (extRes != null) {
+ final File file = new File(extRes.getAbsoluteUri(node.getMap()));
+ if (progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ viewer.undoableDeactivateHook(node);
+ viewer.paste(file, node, node.isLeft());
+ }
+ }
+ }
+ });
+ }
+ return change;
+ }
+
+ /**
+ * @return Returns the reset zoom menu item
+ */
+ private JMenuItem getResetZoom() {
+ resetZoom = new JMenuItem(TextUtils.getText("ExternalImage_popupMenu_ResetZoom"));
+ final ExternalResource extRes = (ExternalResource) node.getExtension(ExternalResource.class);
+ if ((extRes != null) && (extRes.getZoom() != 1.0f)) {
+ resetZoom.setEnabled(true);
+ }
+ else {
+ resetZoom.setEnabled(false);
+ }
+ resetZoom.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ viewer.setZoom(Controller.getCurrentController().getModeController(), node.getMap(), extRes, 1f);
+ }
+ });
+ return resetZoom;
+ }
+
+ /**
+ * Builds the menu.
+ */
+ private void make() {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (progUtil.hasExtendedProgressIcon(node)) {
+ removeAll();
+ add(getOpen());
+ add(getResetZoom());
+ }
+ else {
+ removeAll();
+ add(getRemove());
+ add(getChange());
+ add(getOpen());
+ add(getResetZoom());
+ }
+ }
+
+ protected void maybeShowPopup(final MouseEvent e) {
+ MainView mv = null;
+ if (e.isPopupTrigger()) {
+ for (final Component cmp : e.getComponent().getParent().getComponents()) {
+ if (cmp instanceof MainView) {
+ mv = (MainView) cmp;
+ node = mv.getNodeView().getModel();
+ viewer = ((ViewerController) Controller.getCurrentController().getModeController().getExtension(
+ ViewerController.class));
+ break;
+ }
+ }
+ make();
+ show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+ */
+ public void mouseClicked(final MouseEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+ */
+ public void mouseEntered(final MouseEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+ */
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ @Override
+ public void setVisible(final boolean visible) {
+ super.setVisible(visible);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java
new file mode 100644
index 0000000..8fbcd8b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java
@@ -0,0 +1,93 @@
+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
new file mode 100644
index 0000000..e8c2427
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/IViewerFactory.java
@@ -0,0 +1,23 @@
+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 {
+ boolean accept(URI uri);
+
+ JComponent createViewer(ExternalResource resource, URI absoluteUri, int maximumWidth) throws MalformedURLException, IOException;
+
+ Dimension getOriginalSize(JComponent viewer);
+
+ void setFinalViewerSize(JComponent viewer, Dimension size);
+ void setDraftViewerSize(JComponent viewer, Dimension size);
+
+ String getDescription();
+
+ JComponent createViewer(URI uri, final Dimension preferredSize) throws MalformedURLException, IOException;
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java
new file mode 100644
index 0000000..d659347
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java
@@ -0,0 +1,54 @@
+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/MExternalImageDropListener.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java
new file mode 100644
index 0000000..1845fc9
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java
@@ -0,0 +1,122 @@
+/*
+ * 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.Component;
+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.util.List;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.clipboard.MindMapNodesSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.NodeView;
+
+public class MExternalImageDropListener implements DropTargetListener {
+// final private ModeController modeController;
+
+ public MExternalImageDropListener() {
+ }
+
+ /**
+ * 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) {
+ if (isDragAcceptable(dtde)) {
+ dtde.acceptDrag(DnDConstants.ACTION_MOVE);
+ }
+ else {
+ dtde.rejectDrag();
+ }
+ }
+
+ public void dragExit(final DropTargetEvent e) {
+ }
+
+ public void dragOver(final DropTargetDragEvent e) {
+ }
+
+ public void dragScroll(final DropTargetDragEvent e) {
+ }
+
+ public void drop(final DropTargetDropEvent ev) {
+ try {
+ int dropAction = ev.getDropAction();
+ if (dropAction == DnDConstants.ACTION_MOVE && ev.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
+ try {
+ ev.acceptDrop(ev.getDropAction());
+ @SuppressWarnings("unchecked")
+ final List<File> transferData = (List<File>) ev.getTransferable().getTransferData(MindMapNodesSelection.fileListFlavor);
+ if(transferData.size() != 1)
+ return;
+ final Component target = ev.getDropTargetContext().getComponent();
+ NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, target);
+ final File file = transferData.get(0);
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ final NodeModel node = nodeView.getModel();
+ vc.paste(file, node, node.isLeft());
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe("Drop exception:", e);
+ ev.dropComplete(false);
+ return;
+ }
+ ev.dropComplete(true);
+ }
+
+ public void dropActionChanged(final DropTargetDragEvent e) {
+ }
+
+ private boolean isDragAcceptable(final DropTargetDragEvent ev) {
+ if (ev.getDropAction() == DnDConstants.ACTION_MOVE && ev.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
+ try {
+ @SuppressWarnings("unchecked")
+ final List<File> transferData = (List<File>) ev.getTransferable().getTransferData(MindMapNodesSelection.fileListFlavor);
+ if(transferData.size() != 1)
+ return false;
+ final File file = transferData.get(0);
+ if(! file.canRead())
+ return false;
+ return true;
+ }
+ catch (Exception e) {
+ }
+ }
+ return false;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java
new file mode 100644
index 0000000..adbdc27
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java
@@ -0,0 +1,67 @@
+/*
+ * 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.view.swing.features.filepreview;
+
+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.view.swing.features.progress.mindmapmode.ProgressUtilities;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This action removes external resources from nodes
+ */
+ at EnabledAction(checkOnNodeChange = true)
+public class RemoveExternalImageAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public RemoveExternalImageAction() {
+ super("ExternalImageRemoveAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent arg0, final NodeModel node) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ if (progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ vc.undoableDeactivateHook(node);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && progUtil.hasExternalResource(node) && !progUtil.hasExtendedProgressIcon(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java
new file mode 100644
index 0000000..a6eac73
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java
@@ -0,0 +1,689 @@
+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.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 = (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 = input.toURI();
+ if (uri == null) {
+ return null;
+ }
+ if (useRelativeUri) {
+ uri = LinkController.toRelativeURI(map.getFile(), input);
+ }
+ final ExternalResource preview = new ExternalResource(uri);
+ ProgressIcons.updateExtendedProgressIcons(node, input.getName());
+ return preview;
+ }
+
+ 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 = (ExternalResource) 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 = (ExternalResource) 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(final File file, final NodeModel node, final boolean isLeft) {
+ return paste(file, node, PasteMode.INSIDE, isLeft);
+ }
+
+ public boolean paste(final File file, final NodeModel targetNode, final PasteMode mode, final boolean isLeft) {
+ if (!file.exists()) {
+ return false;
+ }
+ URI uri = file.toURI();
+ if (uri == null || getViewerFactory(uri) == null) {
+ return false;
+ }
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
+ "relative");
+ final File mapFile = targetNode.getMap().getFile();
+ if (mapFile == null && useRelativeUri) {
+ JOptionPane.showMessageDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(),
+ TextUtils.getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
+ return false;
+ }
+ if (useRelativeUri) {
+ uri = LinkController.toRelativeURI(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
new file mode 100644
index 0000000..c759667
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.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.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/BackAction.java b/freeplane/src/org/freeplane/view/swing/features/nodehistory/BackAction.java
new file mode 100644
index 0000000..592ce11
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/nodehistory/BackAction.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.view.swing.features.nodehistory;
+
+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
+ * 13.12.2008
+ */
+/**
+ * @author Dimitry Polivaev
+ * 13.12.2008
+ */
+ at EnabledAction(checkOnNodeChange = true)
+class BackAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private NodeHistory nodeHistory;
+
+ public BackAction(final Controller controller, final NodeHistory nodeHistory) {
+ super("BackAction");
+ this.nodeHistory = nodeHistory;
+ setEnabled(false);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ nodeHistory.goBack(0 != (e.getModifiers() & ActionEvent.CTRL_MASK));
+ }
+
+ @Override
+ public void setEnabled() {
+ setEnabled(nodeHistory.canGoBack());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/ForwardAction.java b/freeplane/src/org/freeplane/view/swing/features/nodehistory/ForwardAction.java
new file mode 100644
index 0000000..1a1bdee
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/nodehistory/ForwardAction.java
@@ -0,0 +1,54 @@
+/*
+ * 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.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 13.12.2008
+ */
+ at EnabledAction(checkOnNodeChange = true)
+class ForwardAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private NodeHistory nodeHistory;
+
+ public ForwardAction(final Controller controller, final NodeHistory nodeHistory) {
+ super("ForwardAction");
+ this.nodeHistory = nodeHistory;
+ setEnabled(false);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ nodeHistory.goForward(0 != (e.getModifiers() & ActionEvent.CTRL_MASK));
+ }
+
+ @Override
+ public void setEnabled() {
+ setEnabled(nodeHistory.canGoForward());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHistory.java b/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHistory.java
new file mode 100644
index 0000000..c0ef67b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHistory.java
@@ -0,0 +1,205 @@
+/*
+ * 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.features.nodehistory;
+
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.INodeSelectionListener;
+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.view.swing.map.MapView;
+
+/**
+ * @author foltin
+ */
+public class NodeHistory implements IExtension {
+ static public void install(final Controller controller) {
+ controller.addExtension(NodeHistory.class, new NodeHistory(controller));
+ }
+
+ static public void install(final ModeController modeController) {
+ final Controller controller = modeController.getController();
+ final NodeHistory history = (NodeHistory) controller.getExtension(NodeHistory.class);
+ modeController.getMapController().addNodeSelectionListener(history.getMapSelectionListener());
+ LinkController.getController(modeController).addNodeSelectionListener(history.getLinkSelectionListener());
+ history.backAction = new BackAction(controller, history);
+ modeController.addAction(history.backAction);
+ history.forwardAction = new ForwardAction(controller, history);
+ modeController.addAction(history.forwardAction);
+ }
+
+ private BackAction backAction;
+ final private Controller controller;
+ private NodeHolder currentNodeHolder;
+ private ForwardAction forwardAction;
+ private ListIterator<NodeHolder> nodeIterator;
+ private final LinkedList<NodeHolder> nodes;
+
+ private NodeHistory(final Controller controller) {
+ this.controller = controller;
+ nodes = new LinkedList<NodeHolder>();
+ nodeIterator = nodes.listIterator();
+ }
+
+ boolean canGoBack() {
+ return nodeIterator.previousIndex() > 0;
+ }
+
+ boolean canGoForward() {
+ return nodeIterator.hasNext();
+ }
+
+ private INodeSelectionListener getLinkSelectionListener() {
+ return new INodeSelectionListener() {
+ public void onDeselect(final NodeModel node) {
+ onNodeSelect(node);
+ currentNodeHolder.setReachedByLink(true);
+ }
+
+ public void onSelect(final NodeModel node) {
+ onNodeSelect(node);
+ currentNodeHolder.setReachedByLink(true);
+ }
+ };
+ }
+
+ private INodeSelectionListener getMapSelectionListener() {
+ return new INodeSelectionListener() {
+ public void onDeselect(final NodeModel node) {
+ }
+
+ public void onSelect(final NodeModel node) {
+ onNodeSelect(node);
+ }
+ };
+ }
+
+ private void go(final boolean back) {
+ final NodeHolder lastNodeHolder = currentNodeHolder;
+ if (back) {
+ if (canGoBack()) {
+ nodeIterator.previous();
+ nodeIterator.previous();
+ currentNodeHolder = nodeIterator.next();
+ }
+ else {
+ backAction.setEnabled(false);
+ return;
+ }
+ }
+ else {
+ if (canGoForward()) {
+ currentNodeHolder = nodeIterator.next();
+ }
+ else {
+ forwardAction.setEnabled(false);
+ return;
+ }
+ }
+ if (lastNodeHolder.equals(currentNodeHolder)) {
+ go(back);
+ return;
+ }
+ final NodeModel toBeSelected = currentNodeHolder.getNode();
+ if (removed(toBeSelected)) {
+ currentNodeHolder = lastNodeHolder;
+ go(back);
+ return;
+ }
+ boolean changeModule = false;
+ MapView newModule = null;
+ if (lastNodeHolder.getHoldMapView() != currentNodeHolder.getHoldMapView()) {
+ changeModule = true;
+ newModule = currentNodeHolder.getMapView();
+ if (newModule == null) {
+ nodeIterator.remove();
+ go(back);
+ return;
+ }
+ }
+ final boolean fChangeModule = changeModule;
+ final MapView newView;
+ if (fChangeModule) {
+ newView = newModule;
+ final Controller controller = newView.getModeController().getController();
+ final IMapViewManager mapViewManager = controller.getMapViewManager();
+ final boolean res = mapViewManager.changeToMapView(newView);
+ if (!res) {
+ LogUtils.warn("Can't change to map mapView " + newView);
+ return;
+ }
+ }
+ else {
+ newView = currentNodeHolder.getHoldMapView();
+ }
+ if (!toBeSelected.isRoot()) {
+ newView.getModeController().getMapController().setFolded(toBeSelected.getParentNode(), false);
+ }
+ newView.getModeController().getMapController().select(toBeSelected);
+ }
+
+ private boolean removed(final NodeModel toBeSelected) {
+ if (toBeSelected == null) {
+ return true;
+ }
+ if (toBeSelected.isRoot()) {
+ return false;
+ }
+ return removed(toBeSelected.getParentNode());
+ }
+
+ private void go(final boolean back, final boolean fast) {
+ NodeHolder lastCurrentNodeHolder;
+ do {
+ lastCurrentNodeHolder = currentNodeHolder;
+ go(back);
+ } while (fast && lastCurrentNodeHolder != currentNodeHolder && !currentNodeHolder.isReachedByLink());
+ }
+
+ public void goBack(final boolean fast) {
+ go(true, fast);
+ }
+
+ public void goForward(final boolean fast) {
+ go(false, fast);
+ }
+
+ private void onNodeSelect(final NodeModel pNode) {
+ if (currentNodeHolder != null
+ && currentNodeHolder.isIdentical(((MapView) controller.getViewController().getMapView())
+ .getNodeView(pNode))) {
+ return;
+ }
+ while (canGoForward()) {
+ nodeIterator.next();
+ nodeIterator.remove();
+ }
+ if (nodes.size() > 100) {
+ nodes.removeFirst();
+ nodeIterator = nodes.listIterator(nodes.size());
+ }
+ currentNodeHolder = new NodeHolder(((MapView) controller.getViewController().getMapView()).getNodeView(pNode));
+ nodeIterator.add(currentNodeHolder);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java b/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
new file mode 100644
index 0000000..0015043
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
@@ -0,0 +1,109 @@
+/*
+ * 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/progress/mindmapmode/ExtendedProgress10Action.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java
new file mode 100644
index 0000000..0cee07b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java
@@ -0,0 +1,40 @@
+package org.freeplane.view.swing.features.progress.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class is called when the 10% step extended progress icon is added
+ */
+class ExtendedProgress10Action extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public ExtendedProgress10Action() {
+ super("IconProgressExtended10Action");
+ }
+
+ /**
+ * Adds a svg-file as an external object to the node.
+ * The handling of the file and the updating of the icons
+ * is done in the ViewerController.
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ try {
+ URI uri = new URI(ResourceController.FREEPLANE_RESOURCE_URL_PROTOCOL, null, "/images/svg/Progress_tenth_00.svg", null);
+ vc.paste(uri, node);
+ } catch (URISyntaxException e1) {
+ e1.printStackTrace();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java
new file mode 100644
index 0000000..5430d2e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java
@@ -0,0 +1,41 @@
+package org.freeplane.view.swing.features.progress.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class is called when the 25% step extended progress icon is added
+ */
+class ExtendedProgress25Action extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public ExtendedProgress25Action() {
+ super("IconProgressExtended25Action");
+ }
+
+ /**
+ * Adds a svg-file as an external object to the node.
+ * The handling of the file and the updating of the icons
+ * is done in the ViewerController.
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ try {
+ URI uri = new URI(ResourceController.FREEPLANE_RESOURCE_URL_PROTOCOL, null, "/images/svg/Progress_quarter_00.svg", null);
+ vc.paste(uri, node);
+ } catch (URISyntaxException e1) {
+ e1.printStackTrace();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java
new file mode 100644
index 0000000..5e55a9f
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java
@@ -0,0 +1,44 @@
+package org.freeplane.view.swing.features.progress.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;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class is called when the progress icons are decreased
+ */
+ at EnabledAction(checkOnNodeChange = true)
+class ProgressDownAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public ProgressDownAction() {
+ super("IconProgressIconDownAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (!progUtil.hasExtendedProgressIcon(node)) {
+ ProgressIcons.updateProgressIcons(node, false);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && !progUtil.hasExtendedProgressIcon(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java
new file mode 100644
index 0000000..b0fca31
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java
@@ -0,0 +1,36 @@
+/*
+ * 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.features.progress.mindmapmode;
+
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * Jun 13, 2011
+ */
+public class ProgressFactory {
+ public void installActions(ModeController modeController){
+ modeController.addAction(new ProgressUpAction());
+ modeController.addAction(new ProgressDownAction());
+ modeController.addAction(new ExtendedProgress10Action());
+ modeController.addAction(new ExtendedProgress25Action());
+ modeController.addAction(new RemoveProgressAction());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java
new file mode 100644
index 0000000..a0e372c
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java
@@ -0,0 +1,203 @@
+package org.freeplane.view.swing.features.progress.mindmapmode;
+
+import java.util.List;
+
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class holds the static method to update the progress icons
+ */
+public class ProgressIcons {
+ private static final long serialVersionUID = 1L;
+ public static final String EXTENDED_PROGRESS_ICON_IDENTIFIER = ".*[Pp]rogress_(tenth|quarter)_[0-9]{2}\\.[a-zA-Z0-9]*";
+ private final static String[] iconNames = new String[] { "0%", "25%", "50%", "75%", "100%" };
+ private final static MindIcon[] progressIcons = new MindIcon[] { new MindIcon(iconNames[0], iconNames[0] + ".png"),
+ new MindIcon(iconNames[1], iconNames[1] + ".png"), new MindIcon(iconNames[2], iconNames[2] + ".png"),
+ new MindIcon(iconNames[3], iconNames[3] + ".png"), new MindIcon(iconNames[4], iconNames[4] + ".png") };
+ private final static MindIcon OKIcon = new MindIcon("button_ok", "button_ok.png");
+
+ /**
+ * This method increases/ decreases the progress icons.
+ * If none is present then the 0% icon is set.
+ * At 100% the OK-icon is additionally added
+ *
+ * @param node : the node to update the icons
+ * @param up : true if the progress is increased (0% -> 25% -> 50%...)
+ * if false the progress is decreased
+ */
+ public static void updateProgressIcons(final NodeModel node, final boolean up) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final MIconController iconController = (MIconController) IconController.getController();
+ String activeIcon = null;
+ final List<MindIcon> icons = node.getIcons();
+ //get active progress icon and remove it
+ if (progUtil.hasProgressIcons(node)) {
+ for (int i = 0; i < icons.size(); i++) {
+ for (int j = 0; j < iconNames.length; j++) {
+ if (icons.get(i).getName().equals(iconNames[j])) {
+ activeIcon = iconNames[j];
+ break;
+ }
+ }
+ }
+ ProgressIcons.removeProgressIcons(node);
+ }
+ // set initial progress icon always 0%
+ if (activeIcon == null) {
+ ProgressIcons.removeProgressIcons(node);
+ iconController.addIcon(node, progressIcons[0], 0);
+ }
+ else {
+ final int iActiveIcon = Integer.parseInt(activeIcon.substring(0, activeIcon.length() - 1));
+ //progress is increased
+ if (up) {
+ switch (iActiveIcon) {
+ case 0:
+ iconController.addIcon(node, progressIcons[1], 0);
+ break;
+ case 25:
+ iconController.addIcon(node, progressIcons[2], 0);
+ break;
+ case 50:
+ iconController.addIcon(node, progressIcons[3], 0);
+ break;
+ case 75:
+ iconController.addIcon(node, progressIcons[4], 0);
+ if (!progUtil.hasOKIcon(node)) {
+ iconController.addIcon(node, OKIcon, 0);
+ }
+ break;
+ //at 100% draw an extra OK-icon
+ case 100:
+ iconController.addIcon(node, progressIcons[4], 0);
+ iconController.addIcon(node, OKIcon, 0);
+ break;
+ default:
+ break;
+ }
+ }
+ //progress is decreased
+ else {
+ switch (iActiveIcon) {
+ case 25:
+ iconController.addIcon(node, progressIcons[0], 0);
+ break;
+ case 50:
+ iconController.addIcon(node, progressIcons[1], 0);
+ break;
+ case 75:
+ iconController.addIcon(node, progressIcons[2], 0);
+ break;
+ case 100:
+ iconController.addIcon(node, progressIcons[3], 0);
+ break;
+ case 0:
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * This method updates the progress icons dependent of the added external object (svg file)
+ * The file has a distinct naming scheme from which the progress and the icons to be painted
+ * are derived.
+ *
+ * @param node : the node to update the icons
+ * @param sFile : the name of the added file.
+ */
+ public static void updateExtendedProgressIcons(final NodeModel node, final String sFile) {
+ if (sFile.matches(EXTENDED_PROGRESS_ICON_IDENTIFIER)) {
+ final MIconController iconController = (MIconController) IconController.getController();
+ ProgressIcons.removeProgressIcons(node);
+ //add the right progress icon
+ if (sFile.matches(".*_quarter_.*")) {
+ final int fileNum = Integer.parseInt(sFile.substring(sFile.lastIndexOf("_") + 1,
+ sFile.lastIndexOf("_") + 3));
+ switch (fileNum) {
+ case 0:
+ iconController.addIcon(node, progressIcons[0], 0);
+ break;
+ case 1:
+ iconController.addIcon(node, progressIcons[1], 0);
+ break;
+ case 2:
+ iconController.addIcon(node, progressIcons[2], 0);
+ break;
+ case 3:
+ iconController.addIcon(node, progressIcons[3], 0);
+ break;
+ case 4:
+ iconController.addIcon(node, progressIcons[4], 0);
+ iconController.addIcon(node, OKIcon, 0);
+ break;
+ default:
+ iconController.addIcon(node, progressIcons[0], 0);
+ break;
+ }
+ }
+ else if (sFile.matches(".*_tenth_.*")) {
+ final int fileNum = Integer.parseInt(sFile.substring(sFile.lastIndexOf("_") + 1,
+ sFile.lastIndexOf("_") + 3));
+ switch (fileNum) {
+ case 0:
+ case 1:
+ iconController.addIcon(node, progressIcons[0], 0);
+ break;
+ case 2:
+ case 3:
+ iconController.addIcon(node, progressIcons[1], 0);
+ break;
+ case 4:
+ case 5:
+ case 6:
+ iconController.addIcon(node, progressIcons[2], 0);
+ break;
+ case 7:
+ case 8:
+ case 9:
+ iconController.addIcon(node, progressIcons[3], 0);
+ break;
+ case 10:
+ iconController.addIcon(node, progressIcons[4], 0);
+ iconController.addIcon(node, OKIcon, 0);
+ break;
+ default:
+ iconController.addIcon(node, progressIcons[0], 0);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Removes the progress icons (0%, 25%, 50%, 75%, 100%) from the node
+ *
+ * @param node : the node from which the progress icons are removed
+ */
+ public static void removeProgressIcons(final NodeModel node) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (progUtil.hasProgressIcons(node) || progUtil.hasOKIcon(node)) {
+ final MIconController iconController = (MIconController) IconController.getController();
+ final String[] progressIconNames = new String[] { "0%", "25%", "50%", "75%", "100%", "button_ok" };
+ final List<MindIcon> icons = node.getIcons();
+ // remove progress icons
+ for (int i = 0; i < icons.size(); i++) {
+ String iconName = icons.get(i).getName();
+ for (int j = 0; j < progressIconNames.length; j++) {
+ if (iconName.equals(progressIconNames[j])) {
+ iconController.removeIcon(node, i);
+ i--;
+ break;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java
new file mode 100644
index 0000000..a341bcc
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java
@@ -0,0 +1,44 @@
+package org.freeplane.view.swing.features.progress.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;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class is called when the progress icons are increased
+ */
+ at EnabledAction(checkOnNodeChange = true)
+class ProgressUpAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public ProgressUpAction() {
+ super("IconProgressIconUpAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ if (!progUtil.hasExtendedProgressIcon(node)) {
+ ProgressIcons.updateProgressIcons(node, true);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean enable = false;
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && !progUtil.hasExtendedProgressIcon(node)) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java
new file mode 100644
index 0000000..64ea2f7
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java
@@ -0,0 +1,77 @@
+package org.freeplane.view.swing.features.progress.mindmapmode;
+
+import java.util.List;
+
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.view.swing.features.filepreview.ExternalResource;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class has methods to get informations about progress icons attached to a NodeModel
+ */
+public class ProgressUtilities {
+ public ProgressUtilities() {
+ };
+
+ /**
+ *
+ * @return : true if the node has an external resource attached.
+ */
+ public boolean hasExternalResource(final NodeModel node) {
+ final ExternalResource extResource = (ExternalResource) node.getExtension(ExternalResource.class);
+ if (extResource == null) {
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+
+ /**
+ *
+ * @return : true if the node has an extended progress icon attached.
+ */
+ public boolean hasExtendedProgressIcon(final NodeModel node) {
+ final ExternalResource extResource = (ExternalResource) node.getExtension(ExternalResource.class);
+ if (extResource == null) {
+ return false;
+ }
+ if (extResource.getUri().toString().matches(ProgressIcons.EXTENDED_PROGRESS_ICON_IDENTIFIER)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @return : true if OK icon is attached
+ */
+ public boolean hasOKIcon(final NodeModel node) {
+ final List<MindIcon> icons = node.getIcons();
+ for (int i = 0; i < icons.size(); i++) {
+ if (icons.get(i).getName().equals("button_ok")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @return : true if the node has a progress icon (0%, 25%, 50%, 75%, 100%) attached
+ */
+ public boolean hasProgressIcons(final NodeModel node) {
+ final String[] iconNames = new String[] { "0%", "25%", "50%", "75%", "100%" };
+ final List<MindIcon> icons = node.getIcons();
+ for (int i = 0; i < icons.size(); i++) {
+ for (int j = 0; j < iconNames.length; j++) {
+ if (icons.get(i).getName().equals(iconNames[j])) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java
new file mode 100644
index 0000000..b126e56
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java
@@ -0,0 +1,55 @@
+package org.freeplane.view.swing.features.progress.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.view.swing.features.filepreview.ViewerController;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class is called when the progress icons are removed
+ */
+ at EnabledAction(checkOnNodeChange = true)
+class RemoveProgressAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+
+ public RemoveProgressAction() {
+ super("IconProgressRemoveAction");
+ }
+
+ /**
+ *Removes the progresss icons and the extended progress icons
+ */
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ //remove progress icon if present
+ if (progUtil.hasProgressIcons(node)) {
+ ProgressIcons.removeProgressIcons(node);
+ }
+ //remove extended progress icon
+ if (progUtil.hasExtendedProgressIcon(node)) {
+ final ViewerController vc = ((ViewerController) Controller.getCurrentController().getModeController()
+ .getExtension(ViewerController.class));
+ vc.undoableDeactivateHook(node);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ final ProgressUtilities progUtil = new ProgressUtilities();
+ boolean enable = false;
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && (progUtil.hasProgressIcons(node) || progUtil.hasExtendedProgressIcon(node))) {
+ enable = true;
+ break;
+ }
+ }
+ setEnabled(enable);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/AllMapsNodeListAction.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/AllMapsNodeListAction.java
new file mode 100644
index 0000000..b9c0cd4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.09.2009
+ */
+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/ClockState.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java
new file mode 100644
index 0000000..74bf769
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java
@@ -0,0 +1,7 @@
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import org.freeplane.core.extension.IExtension;
+
+public enum ClockState implements IExtension{
+ CLOCK_INVISIBLE, CLOCK_VISIBLE
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/FlatNodeTableFilterModel.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/FlatNodeTableFilterModel.java
new file mode 100644
index 0000000..159000d
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/FlatNodeTableFilterModel.java
@@ -0,0 +1,161 @@
+/*
+ * 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.ArrayList;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
+
+import org.freeplane.view.swing.features.time.mindmapmode.NodeList.NodeHolder;
+
+/**
+ * @author foltin
+ */
+class FlatNodeTableFilterModel extends AbstractTableModel {
+ private class TableModelHandler implements TableModelListener {
+ public void tableChanged(final TableModelEvent arg0) {
+ fireTableDataChanged();
+ }
+ }
+
+ private static final long serialVersionUID = 1L;
+ private String mFilterRegexp;
+ private Pattern mPattern;
+ /**
+ * Contains indices or rows matching the filter criteria.
+ */
+ private ArrayList<Integer> mIndexArray;
+ /**
+ * The column that contains the NodeHolder items
+ */
+ final private int mNodeTextColumn;
+ final private TableModel mTableModel;
+ private boolean matchCase;
+
+ /**
+ * @param node_text_column
+ */
+ public FlatNodeTableFilterModel(final TableModel tableModel, final int node_text_column) {
+ super();
+ mTableModel = tableModel;
+ mNodeTextColumn = node_text_column;
+ tableModel.addTableModelListener(new TableModelHandler());
+ resetFilter();
+ }
+
+ @Override
+ public Class<?> getColumnClass(final int arg0) {
+ return mTableModel.getColumnClass(arg0);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getColumnCount()
+ */
+ public int getColumnCount() {
+ return mTableModel.getColumnCount();
+ }
+
+ @Override
+ public String getColumnName(final int pColumnIndex) {
+ return mTableModel.getColumnName(pColumnIndex);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getRowCount()
+ */
+ public int getRowCount() {
+ return mIndexArray.size();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getValueAt(int, int)
+ */
+ public Object getValueAt(final int row, final int column) {
+ if (row < 0 || row >= getRowCount()) {
+ throw new IllegalArgumentException("Illegal Row specified: " + row);
+ }
+ final int origRow = mIndexArray.get(row).intValue();
+ return mTableModel.getValueAt(origRow, column);
+ }
+
+ public void resetFilter() {
+ setFilter(null, false, false);
+ }
+
+ public void setFilter(final String filterRegexp, boolean matchCase, boolean useRegex) {
+ if(filterRegexp == null || "".equals(filterRegexp)){
+ mFilterRegexp = null;
+ }
+ else{
+ mFilterRegexp = matchCase ? filterRegexp : filterRegexp.toLowerCase();
+ }
+ this.matchCase = matchCase;
+ // System.out.println("Setting filter to '" + mFilterRegexp + "'");
+ try {
+ if(! useRegex || mFilterRegexp == null){
+ mPattern = null;
+ }
+ else{
+ mPattern = Pattern.compile(mFilterRegexp, matchCase ? 0 : Pattern.CASE_INSENSITIVE);
+ }
+ updateIndexArray();
+ fireTableDataChanged();
+ }
+ catch (final PatternSyntaxException e) {
+ }
+ }
+
+ private void updateIndexArray() {
+ final ArrayList<Integer> newIndexArray = new ArrayList<Integer>();
+ for (int i = 0; i < mTableModel.getRowCount(); i++) {
+ final NodeHolder nodeContent = (NodeHolder) mTableModel.getValueAt(i, mNodeTextColumn);
+ if(mFilterRegexp == null){
+ newIndexArray.add(new Integer(i));
+ continue;
+ }
+ if(mPattern == null){
+ if(matchCase){
+ if(nodeContent.toString().contains(mFilterRegexp)){
+ newIndexArray.add(new Integer(i));
+ }
+ }
+ else{
+ if(nodeContent.toString().toLowerCase().contains(mFilterRegexp)){
+ newIndexArray.add(new Integer(i));
+ }
+ }
+ continue;
+ }
+ if (mPattern.matcher(nodeContent.toString()).find()) {
+ newIndexArray.add(new Integer(i));
+ continue;
+ }
+ }
+ mIndexArray = newIndexArray;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/NodeList.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/NodeList.java
new file mode 100644
index 0000000..a3f0492
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/NodeList.java
@@ -0,0 +1,1042 @@
+/*
+ * 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.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.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+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.DefaultTableCellRenderer;
+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.MultipleImage;
+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.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+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.note.NoteModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+/**
+ * @author foltin
+ */
+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();
+ }
+ }
+
+ static 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));
+ }
+ }
+
+ 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 NodeHolder) {
+ return nodeRenderer;
+ }
+ if (object instanceof NotesHolder) {
+ return notesRenderer;
+ }
+ 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 = timeTable.rowAtPoint(p);
+ gotoNodesAndClose(row, new int[] { row });
+ }
+ }
+ }
+
+ static 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;
+ }
+ }
+
+ static 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);
+ }
+ }
+ }
+ }
+
+ public interface IReplaceInputInformation {
+ void changeString(NodeHolder holder, String newText);
+
+ int getLength();
+
+ NodeHolder getNodeHolderAt(int i);
+ }
+
+ /** removes html in nodes before comparison. */
+ public static class NodeHolder implements Comparable<NodeHolder> {
+ final private NodeModel node;
+ private String originalNodeText = null;
+ private String untaggedNodeText = null;
+
+ /**
+ *
+ */
+ public NodeHolder(final NodeModel node) {
+ this.node = node;
+ }
+
+ public int compareTo(final NodeHolder compareToObject) {
+ return toString().compareTo(compareToObject.toString());
+ }
+
+ public String getUntaggedNodeText() {
+ final String nodeText = node.getText();
+ if (untaggedNodeText == null || (originalNodeText != null && !originalNodeText.equals(nodeText))) {
+ originalNodeText = nodeText;
+ untaggedNodeText = HtmlUtils.removeHtmlTagsFromString(nodeText).replaceAll("\\s+", " ");
+ }
+ return untaggedNodeText;
+ }
+
+ @Override
+ public String toString() {
+ return getUntaggedNodeText();
+ }
+ }
+
+ static class NodeRenderer extends DefaultTableCellRenderer {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NodeRenderer() {
+ super();
+ }
+
+ @Override
+ public void setValue(final Object value) {
+ setText((value == null) ? "" : ((NodeHolder) value).getUntaggedNodeText());
+ }
+ }
+
+ /** removes html in notes before comparison. */
+ public static class NotesHolder implements Comparable<NotesHolder> {
+ final private NodeModel node;
+ private String originalNotesText = null;
+ private String untaggedNotesText = null;
+
+ /**
+ *
+ */
+ public NotesHolder(final NodeModel node) {
+ this.node = node;
+ }
+
+ public int compareTo(final NotesHolder compareToObject) {
+ return toString().compareTo(compareToObject.toString());
+ }
+
+ public String getUntaggedNotesText() {
+ final String notesText = NoteModel.getNoteText(node);
+ if (notesText == null) {
+ return "";
+ }
+ if (untaggedNotesText == null || (originalNotesText != null && !originalNotesText.equals(notesText))) {
+ originalNotesText = notesText;
+ untaggedNotesText = HtmlUtils.removeHtmlTagsFromString(notesText).replaceAll("\\s+", " ");
+ }
+ return untaggedNotesText;
+ }
+
+ @Override
+ public String toString() {
+ return getUntaggedNotesText();
+ }
+ }
+
+ static class NotesRenderer extends DefaultTableCellRenderer {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NotesRenderer() {
+ super();
+ }
+
+ @Override
+ public void setValue(final Object value) {
+ setText((value == null) ? "" : ((NotesHolder) value).getUntaggedNotesText());
+ }
+ }
+
+ private class ReplaceAllInfo implements IReplaceInputInformation {
+ public void changeString(final NodeHolder nodeHolder, final String newText) {
+ ((MTextController) TextController.getController()).setNodeText(nodeHolder.node, newText);
+ }
+
+ public int getLength() {
+ return mFlatNodeTableFilterModel.getRowCount();
+ }
+
+ public NodeHolder getNodeHolderAt(final int i) {
+ return (NodeHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_TEXT_COLUMN);
+ }
+ }
+
+ private class ReplaceSelectedInfo implements IReplaceInputInformation {
+ public void changeString(final NodeHolder nodeHolder, final String newText) {
+ ((MTextController) TextController.getController()).setNodeText(nodeHolder.node, newText);
+ }
+
+ public int getLength() {
+ return timeTable.getSelectedRowCount();
+ }
+
+ public NodeHolder getNodeHolderAt(final int i) {
+ return (NodeHolder) sorter.getValueAt(timeTable.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 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_NOTES_COLUMN = 5;
+ 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_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 NodeRenderer nodeRenderer;
+ private NotesRenderer notesRenderer;
+ private boolean showAllNodes = false;
+ private org.freeplane.view.swing.features.time.mindmapmode.TableSorter sorter;
+ private JTable timeTable;
+ private DefaultTableModel timeTableModel;
+ 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) {
+ timeTable.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 < timeTable.getColumnCount(); i++) {
+ final TimeWindowColumnSetting setting = new TimeWindowColumnSetting();
+ setting.setColumnWidth(timeTable.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 = timeTable.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 = ((NodeHolder) timeTable.getModel().getValueAt(focussedRow,
+ NodeList.NODE_TEXT_COLUMN)).node;
+ return selectedNode;
+ }
+
+ private void gotoNodesAndClose(final int focussedRow, final int[] selectedRows) {
+ selectNodes(focussedRow, selectedRows);
+ disposeDialog();
+ }
+
+ private void replace(final IReplaceInputInformation info) {
+ 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);
+ }
+ catch (final PatternSyntaxException e) {
+ UITools.errorMessage(TextUtils.format("wrong_regexp", searchString, e.getMessage()));
+ return;
+ }
+ final String replacement = replaceString == null ? "" : replaceString;
+ final int length = info.getLength();
+ for (int i = 0; i < length; i++) {
+ final NodeHolder nodeHolder = info.getNodeHolderAt(i);
+ final String text = nodeHolder.node.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)) {
+ info.changeString(nodeHolder, replaceResult);
+ }
+ }
+ timeTableModel.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(timeTable.getSelectedRow(), timeTable.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_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();
+ nodeRenderer = new NodeRenderer();
+ notesRenderer = new NotesRenderer();
+ iconsRenderer = new IconsRenderer();
+ timeTable = new FlatNodeTable();
+ timeTable.addKeyListener(new FlatNodeTableKeyListener());
+ timeTable.addMouseListener(new FlatNodeTableMouseAdapter());
+ timeTable.getTableHeader().setReorderingAllowed(false);
+ timeTableModel = updateModel();
+ mFlatNodeTableFilterModel = new FlatNodeTableFilterModel(timeTableModel, NodeList.NODE_TEXT_COLUMN);
+ sorter = new TableSorter(mFlatNodeTableFilterModel);
+ timeTable.setModel(sorter);
+ sorter.setTableHeader(timeTable.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(timeTable);
+ 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 ReplaceAllInfo());
+ }
+ };
+ 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 ReplaceSelectedInfo());
+ }
+ };
+ 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 = timeTable.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) {
+ timeTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+ int column = 0;
+ for (final TimeWindowColumnSetting setting : ((TimeWindowConfigurationStorage) storage)
+ .getListTimeWindowColumnSettingList()) {
+ timeTable.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:
+ return NodeHolder.class;
+ case NODE_ICON_COLUMN:
+ return IconsHolder.class;
+ case NODE_NOTES_COLUMN:
+ return NotesHolder.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_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 NodeHolder(node), new IconsHolder(node),
+ node.getHistoryInformation().getCreatedAt(), node.getHistoryInformation().getLastModifiedAt(),
+ new NotesHolder(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/NodeListAction.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/NodeListAction.java
new file mode 100644
index 0000000..6a04241
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/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;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.09.2009
+ */
+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/PeriodPanel.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
new file mode 100644
index 0000000..aa2c63b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
@@ -0,0 +1,79 @@
+/*
+ * 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
new file mode 100644
index 0000000..9d5dc22
--- /dev/null
+++ b/freeplane/src/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;
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java
new file mode 100644
index 0000000..8dcb062
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.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.view.swing.features.time.mindmapmode;
+
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public abstract class ReminderCondition extends ASelectableCondition {
+ static final String DATE = "DATE";
+ static final String FILTER_REMINDER_AFTER = "filter_reminder_after";
+ static final String FILTER_REMINDER_BEFORE = "filter_reminder_before";
+
+ final private FormattedDate date;
+ public ReminderCondition(final FormattedDate date) {
+ this.date = date;
+ }
+
+ abstract protected String createDescription();
+
+ public FormattedDate 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/view/swing/features/time/mindmapmode/ReminderConditionAfter.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java
new file mode 100644
index 0000000..6b962f4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java
@@ -0,0 +1,63 @@
+/*
+ * 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.Date;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class ReminderConditionAfter extends ReminderCondition {
+ static final String NAME = "reminder_condition_after";
+
+ public ReminderConditionAfter(final FormattedDate date) {
+ super(date);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final ReminderExtension reminder = ReminderExtension.getExtension(node);
+ if(reminder == null)
+ return false;
+ final long reminderTime = reminder.getRemindUserAt();
+ final Date filterDate = getDate();
+ final boolean before = reminderTime > filterDate.getTime();
+ return before;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(ReminderConditionController.FILTER_REMINDER);
+ final String before = TextUtils.getText(FILTER_REMINDER_AFTER);
+ final String dateAsString = getDate().toString();
+ return ConditionFactory.createDescription(filterTime, before, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java
new file mode 100644
index 0000000..fbd4dc3
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java
@@ -0,0 +1,63 @@
+/*
+ * 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.Date;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 6, 2009
+ */
+public class ReminderConditionBefore extends ReminderCondition {
+ static final String NAME = "reminder_condition_before";
+
+ public ReminderConditionBefore(final FormattedDate date) {
+ super(date);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final ReminderExtension reminder = ReminderExtension.getExtension(node);
+ if(reminder == null)
+ return false;
+ final long reminderTime = reminder.getRemindUserAt();
+ final Date filterDate = getDate();
+ final boolean before = reminderTime < filterDate.getTime();
+ return before;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String filterTime = TextUtils.getText(ReminderConditionController.FILTER_REMINDER);
+ final String dateAsString = getDate().toString();
+ final String before = TextUtils.getText(FILTER_REMINDER_BEFORE);
+ return ConditionFactory.createDescription(filterTime, before, dateAsString, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
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
new file mode 100644
index 0000000..ac03e5a
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java
@@ -0,0 +1,159 @@
+/*
+ * 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/ReminderConditionExecuted.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java
new file mode 100644
index 0000000..554f889
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java
@@ -0,0 +1,57 @@
+/*
+ * 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 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class ReminderConditionExecuted extends ASelectableCondition {
+ static final String NAME = "reminder_condition_earlier";
+ static final String FILTER_REMINDER_EXECUTED = "filter_reminder_executed";
+
+ public boolean checkNode(final NodeModel node) {
+ final ReminderExtension reminder = ReminderExtension.getExtension(node);
+ if(reminder == null)
+ return false;
+ final long reminderTime = reminder.getRemindUserAt();
+ final long currentTimeMillis = System.currentTimeMillis();
+ final boolean before = reminderTime < currentTimeMillis;
+ return before;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String reminder = TextUtils.getText(ReminderConditionController.FILTER_REMINDER);
+ final String executed = TextUtils.getText(FILTER_REMINDER_EXECUTED);
+ return ConditionFactory.createDescription(reminder, executed, null, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java
new file mode 100644
index 0000000..e9e184e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java
@@ -0,0 +1,58 @@
+/*
+ * 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 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class ReminderConditionLater extends ASelectableCondition {
+ static final String NAME = "reminder_condition_later";
+ static final String FILTER_REMINDER_LATER = "filter_reminder_later";
+ static final String FILTER_REMINDER_EARLIER = "filter_reminder_earlier";
+
+ public boolean checkNode(final NodeModel node) {
+ final ReminderExtension reminder = ReminderExtension.getExtension(node);
+ if(reminder == null)
+ return false;
+ final long reminderTime = reminder.getRemindUserAt();
+ final long currentTimeMillis = System.currentTimeMillis();
+ final boolean later = reminderTime >= currentTimeMillis;
+ return later;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String reminder = TextUtils.getText(ReminderConditionController.FILTER_REMINDER);
+ final String before = TextUtils.getText(FILTER_REMINDER_LATER);
+ return ConditionFactory.createDescription(reminder, before, null, false, false);
+ }
+
+ @Override
+ protected
+ String getName() {
+ return NAME;
+ }
+}
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
new file mode 100644
index 0000000..627f74d
--- /dev/null
+++ b/freeplane/src/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.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
new file mode 100644
index 0000000..7e93560
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java
@@ -0,0 +1,348 @@
+/*
+ * 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.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/TableSorter.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TableSorter.java
new file mode 100644
index 0000000..7ea0f58
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TableSorter.java
@@ -0,0 +1,454 @@
+/*
+ * 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.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.SwingConstants;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+/**
+ * TableSorter is a decorator for TableModels; adding sorting functionality to a
+ * supplied TableModel. TableSorter does not store or copy the data in its
+ * TableModel; instead it maintains a map from the row indexes of the view to
+ * the row indexes of the model. As requests are made of the sorter (like
+ * getValueAt(row, col)) they are passed to the underlying model after the row
+ * numbers have been translated via the internal mapping array. This way, the
+ * TableSorter appears to hold another copy of the table with the rows in a
+ * different order. <p/> TableSorter registers itself as a listener to the
+ * underlying model, just as the JTable itself would. Events recieved from the
+ * model are examined, sometimes manipulated (typically widened), and then
+ * passed on to the TableSorter's listeners (typically the JTable). If a change
+ * to the model has invalidated the order of TableSorter's rows, a note of this
+ * is made and the sorter will resort the rows the next time a value is
+ * requested. <p/> When the tableHeader property is set, either by using the
+ * setTableHeader() method or the two argument constructor, the table header may
+ * be used as a complete UI for TableSorter. The default renderer of the
+ * tableHeader is decorated with a renderer that indicates the sorting status of
+ * each column. In addition, a mouse listener is installed with the following
+ * behavior:
+ * <ul>
+ * <li>Mouse-click: Clears the sorting status of all other columns and advances
+ * the sorting status of that column through three values: {NOT_SORTED,
+ * ASCENDING, DESCENDING} (then back to NOT_SORTED again).
+ * <li>SHIFT-mouse-click: Clears the sorting status of all other columns and
+ * cycles the sorting status of the column through the same three values, in the
+ * opposite order: {NOT_SORTED, DESCENDING, ASCENDING}.
+ * <li>CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except that
+ * the changes to the column do not cancel the statuses of columns that are
+ * already sorting - giving a way to initiate a compound sort.
+ * </ul>
+ * <p/> This is a long overdue rewrite of a class of the same name that first
+ * appeared in the swing table demos in 1997.
+ *
+ * @author Philip Milne
+ * @author Brendon McLean
+ * @author Dan van Enckevort
+ * @author Parwinder Sekhon
+ * @version 2.0 02/27/04
+ */
+class TableSorter extends AbstractTableModel {
+ private static class Arrow implements Icon {
+ final private boolean descending;
+ final private int priority;
+ final private int size;
+
+ public Arrow(final boolean descending, final int size, final int priority) {
+ this.descending = descending;
+ this.size = size;
+ this.priority = priority;
+ }
+
+ public int getIconHeight() {
+ return size;
+ }
+
+ public int getIconWidth() {
+ return size;
+ }
+
+ public void paintIcon(final Component c, final Graphics g, final int x, int y) {
+ final Color color = c == null ? Color.GRAY : c.getBackground();
+ final int dx = (int) (size / 2 * Math.pow(0.8, priority));
+ final int dy = descending ? dx : -dx;
+ y = y + 5 * size / 6 + (descending ? -dy : 0);
+ final int shift = descending ? 1 : -1;
+ g.translate(x, y);
+ g.setColor(color.darker());
+ g.drawLine(dx / 2, dy, 0, 0);
+ g.drawLine(dx / 2, dy + shift, 0, shift);
+ g.setColor(color.brighter());
+ g.drawLine(dx / 2, dy, dx, 0);
+ g.drawLine(dx / 2, dy + shift, dx, shift);
+ if (descending) {
+ g.setColor(color.darker().darker());
+ }
+ else {
+ g.setColor(color.brighter().brighter());
+ }
+ g.drawLine(dx, 0, 0, 0);
+ g.setColor(color);
+ g.translate(-x, -y);
+ }
+ }
+
+ private static class Directive {
+ final private int column;
+ final private int direction;
+
+ public Directive(final int column, final int direction) {
+ this.column = column;
+ this.direction = direction;
+ }
+ }
+
+ private class MouseHandler extends MouseAdapter {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ final JTableHeader h = (JTableHeader) e.getSource();
+ final TableColumnModel columnModel = h.getColumnModel();
+ final int viewColumn = columnModel.getColumnIndexAtX(e.getX());
+ final int column = columnModel.getColumn(viewColumn).getModelIndex();
+ if (column != -1) {
+ int status = getSortingStatus(column);
+ if (!e.isControlDown()) {
+ cancelSorting();
+ }
+ status = status + (e.isShiftDown() ? -1 : 1);
+ status = (status + 4) % 3 - 1;
+ setSortingStatus(column, status);
+ }
+ }
+ }
+
+ private class Row implements Comparable<Object> {
+ final private int modelIndex;
+
+ public Row(final int index) {
+ modelIndex = index;
+ }
+
+ public int compareTo(final Object o) {
+ final int row1 = modelIndex;
+ final int row2 = ((Row) o).modelIndex;
+ for (final Directive directive : sortingColumns) {
+ final int column = directive.column;
+ final Object o1 = tableModel.getValueAt(row1, column);
+ final Object o2 = tableModel.getValueAt(row2, column);
+ int comparison = 0;
+ if (o1 == null && o2 == null) {
+ comparison = 0;
+ }
+ else if (o1 == null) {
+ comparison = -1;
+ }
+ else if (o2 == null) {
+ comparison = 1;
+ }
+ else {
+ comparison = getComparator(column).compare(o1, o2);
+ }
+ if (comparison != 0) {
+ return directive.direction == TableSorter.DESCENDING ? -comparison : comparison;
+ }
+ }
+ return 0;
+ }
+ }
+
+ private class SortableHeaderRenderer implements TableCellRenderer {
+ final private TableCellRenderer tableCellRenderer;
+
+ public SortableHeaderRenderer(final TableCellRenderer tableCellRenderer) {
+ this.tableCellRenderer = tableCellRenderer;
+ }
+
+ public Component getTableCellRendererComponent(final JTable table, final Object value,
+ final boolean isSelected, final boolean hasFocus, final int row,
+ final int column) {
+ final Component c = tableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus,
+ row, column);
+ if (c instanceof JLabel) {
+ final JLabel l = (JLabel) c;
+ l.setHorizontalTextPosition(SwingConstants.LEFT);
+ final int modelColumn = table.convertColumnIndexToModel(column);
+ l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize()));
+ }
+ return c;
+ }
+ }
+
+ private class TableModelHandler implements TableModelListener {
+ public void tableChanged(final TableModelEvent e) {
+ if (!isSorting()) {
+ clearSortingState();
+ fireTableChanged(e);
+ return;
+ }
+ if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
+ cancelSorting();
+ fireTableChanged(e);
+ return;
+ }
+ final int column = e.getColumn();
+ if (e.getFirstRow() == e.getLastRow() && column != TableModelEvent.ALL_COLUMNS
+ && getSortingStatus(column) == TableSorter.NOT_SORTED && modelToView != null) {
+ final int viewIndex = getModelToView()[e.getFirstRow()];
+ fireTableChanged(new TableModelEvent(TableSorter.this, viewIndex, viewIndex, column, e.getType()));
+ return;
+ }
+ clearSortingState();
+ fireTableDataChanged();
+ return;
+ }
+ }
+
+ public static final int ASCENDING = 1;
+ public static final Comparator<Object> COMPARABLE_COMPARATOR = new Comparator<Object>() {
+ @SuppressWarnings("unchecked")
+ public int compare(final Object o1, final Object o2) {
+ return ((Comparable<Object>) o1).compareTo(o2);
+ }
+ };
+ public static final int DESCENDING = -1;
+ private static Directive EMPTY_DIRECTIVE = new Directive(-1, TableSorter.NOT_SORTED);
+ public static final Comparator<Object> LEXICAL_COMPARATOR = new Comparator<Object>() {
+ public int compare(final Object o1, final Object o2) {
+ return o1.toString().compareTo(o2.toString());
+ }
+ };
+ public static final int NOT_SORTED = 0;
+ private static final long serialVersionUID = 1L;
+ final private Map<Class<?>, Comparator<Object>> columnComparators = new HashMap<Class<?>, Comparator<Object>>();
+ private int[] modelToView;
+ final private MouseListener mouseListener;
+ final private List<Directive> sortingColumns = new ArrayList<Directive>();
+ private JTableHeader tableHeader;
+ protected TableModel tableModel;
+ final private TableModelListener tableModelListener;
+ private Row[] viewToModel;
+
+ public TableSorter() {
+ mouseListener = new MouseHandler();
+ tableModelListener = new TableModelHandler();
+ }
+
+ public TableSorter(final TableModel tableModel) {
+ this();
+ setTableModel(tableModel);
+ }
+
+ public TableSorter(final TableModel tableModel, final JTableHeader tableHeader) {
+ this();
+ setTableHeader(tableHeader);
+ setTableModel(tableModel);
+ }
+
+ private void cancelSorting() {
+ sortingColumns.clear();
+ sortingStatusChanged();
+ }
+
+ private void clearSortingState() {
+ viewToModel = null;
+ modelToView = null;
+ }
+
+ @Override
+ public Class<?> getColumnClass(final int column) {
+ return tableModel.getColumnClass(column);
+ }
+
+ public int getColumnCount() {
+ return (tableModel == null) ? 0 : tableModel.getColumnCount();
+ }
+
+ @Override
+ public String getColumnName(final int column) {
+ return tableModel.getColumnName(column);
+ }
+
+ protected Comparator<Object> getComparator(final int column) {
+ final Class<?> columnType = tableModel.getColumnClass(column);
+ final Comparator<Object> comparator = columnComparators.get(columnType);
+ if (comparator != null) {
+ return comparator;
+ }
+ if (Comparable.class.isAssignableFrom(columnType)) {
+ return TableSorter.COMPARABLE_COMPARATOR;
+ }
+ return TableSorter.LEXICAL_COMPARATOR;
+ }
+
+ private Directive getDirective(final int column) {
+ for (final Directive directive : sortingColumns) {
+ if (directive.column == column) {
+ return directive;
+ }
+ }
+ return TableSorter.EMPTY_DIRECTIVE;
+ }
+
+ protected Icon getHeaderRendererIcon(final int column, final int size) {
+ final Directive directive = getDirective(column);
+ if (directive == TableSorter.EMPTY_DIRECTIVE) {
+ return null;
+ }
+ return new Arrow(directive.direction == TableSorter.DESCENDING, size, sortingColumns.indexOf(directive));
+ }
+
+ private int[] getModelToView() {
+ if (modelToView == null) {
+ final int n = getViewToModel().length;
+ modelToView = new int[n];
+ for (int i = 0; i < n; i++) {
+ modelToView[modelIndex(i)] = i;
+ }
+ }
+ return modelToView;
+ }
+
+ public int getRowCount() {
+ return (tableModel == null) ? 0 : tableModel.getRowCount();
+ }
+
+ public int getSortingStatus(final int column) {
+ return getDirective(column).direction;
+ }
+
+ public JTableHeader getTableHeader() {
+ return tableHeader;
+ }
+
+ public TableModel getTableModel() {
+ return tableModel;
+ }
+
+ public Object getValueAt(final int row, final int column) {
+ return tableModel.getValueAt(modelIndex(row), column);
+ }
+
+ private Row[] getViewToModel() {
+ if (viewToModel == null) {
+ final int tableModelRowCount = tableModel.getRowCount();
+ viewToModel = new Row[tableModelRowCount];
+ for (int row = 0; row < tableModelRowCount; row++) {
+ viewToModel[row] = new Row(row);
+ }
+ if (isSorting()) {
+ Arrays.sort(viewToModel);
+ }
+ }
+ return viewToModel;
+ }
+
+ @Override
+ public boolean isCellEditable(final int row, final int column) {
+ return tableModel.isCellEditable(modelIndex(row), column);
+ }
+
+ public boolean isSorting() {
+ return sortingColumns.size() != 0;
+ }
+
+ public int modelIndex(final int viewIndex) {
+ return getViewToModel()[viewIndex].modelIndex;
+ }
+
+ public void setColumnComparator(final Class<?> type, final Comparator<Object> comparator) {
+ if (comparator == null) {
+ columnComparators.remove(type);
+ }
+ else {
+ columnComparators.put(type, comparator);
+ }
+ }
+
+ public void setSortingStatus(final int column, final int status) {
+ final Directive directive = getDirective(column);
+ if (directive != TableSorter.EMPTY_DIRECTIVE) {
+ sortingColumns.remove(directive);
+ }
+ if (status != TableSorter.NOT_SORTED) {
+ sortingColumns.add(new Directive(column, status));
+ }
+ sortingStatusChanged();
+ }
+
+ public void setTableHeader(final JTableHeader tableHeader) {
+ if (this.tableHeader != null) {
+ this.tableHeader.removeMouseListener(mouseListener);
+ final TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
+ if (defaultRenderer instanceof SortableHeaderRenderer) {
+ this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer);
+ }
+ }
+ this.tableHeader = tableHeader;
+ if (this.tableHeader != null) {
+ this.tableHeader.addMouseListener(mouseListener);
+ this.tableHeader.setDefaultRenderer(new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer()));
+ }
+ }
+
+ public void setTableModel(final TableModel tableModel) {
+ if (this.tableModel != null) {
+ this.tableModel.removeTableModelListener(tableModelListener);
+ }
+ this.tableModel = tableModel;
+ if (this.tableModel != null) {
+ this.tableModel.addTableModelListener(tableModelListener);
+ }
+ clearSortingState();
+ fireTableStructureChanged();
+ }
+
+ @Override
+ public void setValueAt(final Object aValue, final int row, final int column) {
+ tableModel.setValueAt(aValue, modelIndex(row), column);
+ }
+
+ private void sortingStatusChanged() {
+ clearSortingState();
+ fireTableDataChanged();
+ if (tableHeader != null) {
+ tableHeader.repaint();
+ }
+ }
+}
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
new file mode 100644
index 0000000..b565694
--- /dev/null
+++ b/freeplane/src/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.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/TimeWindowColumnSetting.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeWindowColumnSetting.java
new file mode 100644
index 0000000..c5a6a19
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeWindowColumnSetting.java
@@ -0,0 +1,38 @@
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class TimeWindowColumnSetting {
+ static TimeWindowColumnSetting create(final XMLElement xml) {
+ final TimeWindowColumnSetting timeWindowColumnSetting = new TimeWindowColumnSetting();
+ timeWindowColumnSetting.columnSorting = Integer.parseInt(xml.getAttribute("column_sorting", null));
+ timeWindowColumnSetting.columnWidth = Integer.parseInt(xml.getAttribute("column_width", null));
+ return timeWindowColumnSetting;
+ }
+
+ protected int columnSorting;
+ protected int columnWidth;
+
+ public int getColumnSorting() {
+ return columnSorting;
+ }
+
+ public int getColumnWidth() {
+ return columnWidth;
+ }
+
+ void marschall(final XMLElement xml) {
+ final XMLElement child = new XMLElement("time_window_column_setting");
+ child.setAttribute("column_sorting", Integer.toString(columnSorting));
+ child.setAttribute("column_width", Integer.toString(columnWidth));
+ xml.addChild(child);
+ }
+
+ public void setColumnSorting(final int columnSorting) {
+ this.columnSorting = columnSorting;
+ }
+
+ public void setColumnWidth(final int columnWidth) {
+ this.columnWidth = columnWidth;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeWindowConfigurationStorage.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeWindowConfigurationStorage.java
new file mode 100644
index 0000000..5c18fda
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeWindowConfigurationStorage.java
@@ -0,0 +1,63 @@
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.JDialog;
+
+import org.freeplane.core.resources.WindowConfigurationStorage;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class TimeWindowConfigurationStorage extends WindowConfigurationStorage {
+ public static TimeWindowConfigurationStorage decorateDialog(final String marshalled, final JDialog dialog) {
+ final TimeWindowConfigurationStorage storage = new TimeWindowConfigurationStorage();
+ final XMLElement xml = storage.unmarschall(marshalled, dialog);
+ if (xml != null) {
+ final Iterator<XMLElement> iterator = xml.getChildren().iterator();
+ while (iterator.hasNext()) {
+ storage.addTimeWindowColumnSetting(TimeWindowColumnSetting.create(iterator.next()));
+ }
+ return storage;
+ }
+ return null;
+ }
+
+ public TimeWindowConfigurationStorage() {
+ super("time_window_configuration_storage");
+ }
+
+ protected List<TimeWindowColumnSetting> timeWindowColumnSettingList = new ArrayList<TimeWindowColumnSetting>();
+
+ public void addAtTimeWindowColumnSetting(final int position, final TimeWindowColumnSetting timeWindowColumnSetting) {
+ timeWindowColumnSettingList.add(position, timeWindowColumnSetting);
+ }
+
+ public void addTimeWindowColumnSetting(final TimeWindowColumnSetting timeWindowColumnSetting) {
+ timeWindowColumnSettingList.add(timeWindowColumnSetting);
+ }
+
+ public void clearTimeWindowColumnSettingList() {
+ timeWindowColumnSettingList.clear();
+ }
+
+ public List<TimeWindowColumnSetting> getListTimeWindowColumnSettingList() {
+ return java.util.Collections.unmodifiableList(timeWindowColumnSettingList);
+ }
+
+ public TimeWindowColumnSetting getTimeWindowColumnSetting(final int index) {
+ return timeWindowColumnSettingList.get(index);
+ }
+
+ @Override
+ protected void marshallSpecificElements(final XMLElement xml) {
+ final Iterator<TimeWindowColumnSetting> iterator = timeWindowColumnSettingList.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().marschall(xml);
+ }
+ }
+
+ public int sizeTimeWindowColumnSettingList() {
+ return timeWindowColumnSettingList.size();
+ }
+}
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
new file mode 100644
index 0000000..1ee2f71
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java
@@ -0,0 +1,73 @@
+/*
+ * 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/map/ArrowIcon.java b/freeplane/src/org/freeplane/view/swing/map/ArrowIcon.java
new file mode 100644
index 0000000..a6a7c4e
--- /dev/null
+++ b/freeplane/src/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().getViewController().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
new file mode 100644
index 0000000..c4b7944
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/BubbleMainView.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.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().getViewController().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
new file mode 100644
index 0000000..e6dcea0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ClickableImageCreator.java
@@ -0,0 +1,103 @@
+/*
+ * 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().getViewController().getMapView());
+ 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
new file mode 100644
index 0000000..0fdef16
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ContentPane.java
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..676f129
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ContentPaneLayout.java
@@ -0,0 +1,86 @@
+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
new file mode 100644
index 0000000..e021e2f
--- /dev/null
+++ b/freeplane/src/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);
+ }
+
+
+}
\ 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
new file mode 100644
index 0000000..8c52377
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/FoldingMark.java
@@ -0,0 +1,117 @@
+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
new file mode 100644
index 0000000..f083693
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ForkMainView.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.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/GlyphPainterMetricResetter.java b/freeplane/src/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java
new file mode 100644
index 0000000..ce81d94
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java
@@ -0,0 +1,107 @@
+/*
+ * 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.view.swing.map;
+
+import java.awt.Container;
+import java.awt.Font;
+
+import javax.swing.JLabel;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.GlyphView;
+
+/**
+ * @author Dimitry Polivaev
+ * May 19, 2010
+ */
+
+class GlyphPainterMetricResetter extends GlyphView{
+
+ private static final Element elem = new DummyElement();
+ private static final JLabel c;
+ private static final Font f;
+ static {
+ c= new JLabel();
+ f = new Font(null, 0, 0);
+ c.setFont(f);
+ }
+ private static GlyphPainterMetricResetter dummyGlyphView = new GlyphPainterMetricResetter();
+
+ private GlyphPainterMetricResetter() {
+ super(elem);
+ }
+
+ @Override
+ public Font getFont() {
+ return f;
+ }
+
+ @Override
+ public Container getContainer() {
+ return c;
+ }
+
+ static void resetPainter(){
+ dummyGlyphView.checkPainter();
+ dummyGlyphView.getGlyphPainter().getAscent(dummyGlyphView);
+ }
+}
+class DummyElement implements Element {
+ public AttributeSet getAttributes() {
+ return null;
+ }
+
+ public Document getDocument() {
+ return null;
+ }
+
+ public Element getElement(int index) {
+ return null;
+ }
+
+ public int getElementCount() {
+ return 0;
+ }
+
+ public int getElementIndex(int offset) {
+ return 0;
+ }
+
+ public int getEndOffset() {
+ return 0;
+ }
+
+ public String getName() {
+ return "";
+ }
+
+ public Element getParentElement() {
+ return null;
+ }
+
+ public int getStartOffset() {
+ return 0;
+ }
+
+ public boolean isLeaf() {
+ return false;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java
new file mode 100644
index 0000000..970598a
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java
@@ -0,0 +1,25 @@
+/*
+ * 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
new file mode 100644
index 0000000..5a40513
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/LeftNodeViewLayout.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000..4405cbd
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MainView.java
@@ -0,0 +1,736 @@
+/*
+ * 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().getViewController().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 obj = textController.getTransformedObject(content, nodeModel, userObject);
+ if(nodeView.isSelected()){
+ nodeView.getMap().getModeController().getController().getViewController().addObjectTypeInfo(obj);
+ }
+ text = obj.toString();
+ textModified = obj 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();
+ 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
new file mode 100644
index 0000000..f746214
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MapView.java
@@ -0,0 +1,1917 @@
+/*
+ * 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.event.HierarchyBoundsAdapter;
+import java.awt.event.HierarchyEvent;
+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.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.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.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 class Resizer extends HierarchyBoundsAdapter{
+
+ @Override
+ public void ancestorResized(HierarchyEvent e) {
+ if (! isAncorPositionSet()) {
+ return;
+ }
+ if (nodeToBeVisible == null) {
+ nodeToBeVisible = getSelected();
+ extraWidth = 0;
+ }
+ setViewPositionAfterValidate();
+ }
+
+ }
+
+ 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 int centerNodeCounter;
+// // final private Controller controller;
+ 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;
+
+ 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");
+ addHierarchyBoundsListener(new Resizer());
+ }
+
+ 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;
+ 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);
+ }
+
+ /**
+ * Problem: Before scrollRectToVisible is called, the node has the location
+ * (0,0), ie. the location first gets calculated after the scrollpane is
+ * actually scrolled. Thus, as a workaround, I simply call
+ * scrollRectToVisible twice, the first time the location of the node is
+ * calculated, the second time the scrollPane is actually scrolled.
+ * @param slowScroll TODO
+ */
+// public void centerNode(final NodeView node) {
+//
+// }
+ public void centerNode(final NodeView node, boolean slowScroll) {
+ nodeToBeCentered = node;
+ this.slowScroll = slowScroll;
+ if (SwingUtilities.getRoot(this) == null) {
+ return;
+ }
+ nodeToBeVisible = null;
+ if (!(isValid() && isShowing())) {
+ return;
+ }
+ 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);
+ final Point oldAnchorContentLocation = anchorContentLocation;
+ anchorContentLocation = new Point();
+ final Point oldViewPosition = viewPort.getViewPosition();
+ content.scrollRectToVisible(rect);
+ final Point newViewPosition = viewPort.getViewPosition();
+ if (oldViewPosition.equals(newViewPosition)) {
+ anchorContentLocation = oldAnchorContentLocation;
+ }
+ nodeToBeCentered = null;
+ this.slowScroll = false;
+ }
+
+ 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().getViewController().getMapView();
+ 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() {
+ final MainView mainView = anchor.getMainView();
+ final Point anchorCenterPoint = new Point((int) (mainView.getWidth() * anchorHorizontalPoint), (int) (mainView
+ .getHeight() * anchorVerticalPoint));
+ final JViewport parent = (JViewport) getParent();
+ if (parent == null) {
+ return new Point();
+ }
+ try {
+ UITools.convertPointToAncestor(mainView, anchorCenterPoint, parent);
+ }
+ catch (final NullPointerException e) {
+ return new Point();
+ }
+ final Point viewPosition = parent.getViewPosition();
+ anchorCenterPoint.x += viewPosition.x - parent.getWidth() / 2;
+ anchorCenterPoint.y += viewPosition.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() {
+ if (!getParent().isValid()) {
+ final Dimension preferredLayoutSize = getLayout().preferredLayoutSize(this);
+ return preferredLayoutSize;
+ }
+ return super.getPreferredSize();
+ }
+
+ 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() {
+ 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)) {
+ 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 = (NodeStyleController) 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;
+ }
+ if (isValid()) {
+ anchorContentLocation = getAnchorCenterPoint();
+ }
+ final Graphics2D g2 = (Graphics2D) g.create();
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ Controller.getCurrentController().getViewController().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().getViewController().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().getViewController().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 = (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, true);
+ }
+ 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 setViewPositionAfterValidate() {
+ if(nodeToBeCentered != null){
+ centerNodeCounter = 5;
+ centerNodeLater(slowScroll);
+ }
+ 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();
+ if (anchor != getRoot()) {
+ anchor = getRoot();
+ anchorContentLocation = getAnchorCenterPoint();
+ }
+ else {
+ anchorContentLocation = newAnchorContentLocation;
+ }
+ 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;
+ }
+ }
+
+ private void centerNodeLater(final boolean slowScroll) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ if(centerNodeCounter == 0 && nodeToBeCentered != null){
+ centerNode(nodeToBeCentered, slowScroll);
+ return;
+ }
+ if(centerNodeCounter > 0){
+ centerNodeCounter--;
+ centerNodeLater(slowScroll);
+ }
+ }
+ });
+ }
+
+ // @Override
+ // public void repaint(int x, int y, int width, int height) {
+ // final JViewport vp = (JViewport) getParent();
+ // final Rectangle viewRect = vp.getViewRect();
+ // super.repaint(viewRect.x, viewRect.y, viewRect.width, viewRect.height);
+ //// super.repaint(x, y, width, height);
+ // }
+ 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();
+ setViewPositionAfterValidate();
+ }
+
+ 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);
+ }
+
+ private boolean isAncorPositionSet() {
+ return anchorContentLocation.getX() != 0 || anchorContentLocation.getY() != 0;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java b/freeplane/src/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java
new file mode 100644
index 0000000..df2e2df
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java
@@ -0,0 +1,93 @@
+/*
+ * 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;
+
+import java.util.HashSet;
+
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.ui.IMapViewChangeListener;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 19, 2009
+ */
+class MapViewChangeObserverCompound {
+ final private HashSet<IMapSelectionListener> mapListeners = new HashSet<IMapSelectionListener>();
+ final private HashSet<IMapViewChangeListener> viewListeners = new HashSet<IMapViewChangeListener>();
+
+ void addListener(final IMapSelectionListener listener) {
+ mapListeners.add(listener);
+ }
+
+ void addListener(final IMapViewChangeListener listener) {
+ viewListeners.add(listener);
+ }
+
+ void afterMapViewChange(final MapView oldMap, final MapView newMap) {
+ final MapModel oldModel = getModel(oldMap);
+ final MapModel newModel = getModel(newMap);
+ if (oldModel != newModel) {
+ for (final IMapSelectionListener observer:mapListeners.toArray(new IMapSelectionListener[]{})) {
+ observer.afterMapChange(oldModel, newModel);
+ }
+ }
+ for (final IMapViewChangeListener observer : viewListeners.toArray(new IMapViewChangeListener[]{})) {
+ observer.afterViewChange(oldMap, newMap);
+ }
+ }
+
+ void afterMapViewClose(final MapView pOldMap) {
+ for (final IMapViewChangeListener observer : viewListeners.toArray(new IMapViewChangeListener[]{})) {
+ observer.afterViewClose(pOldMap);
+ }
+ }
+
+ void beforeMapViewChange(final MapView oldMap, final MapView newMap) {
+ final MapModel oldModel = getModel(oldMap);
+ final MapModel newModel = getModel(newMap);
+ if (oldModel != newModel) {
+ for (final IMapSelectionListener observer:mapListeners.toArray(new IMapSelectionListener[]{})) {
+ observer.beforeMapChange(getModel(oldMap), getModel(newMap));
+ }
+ }
+ for (final IMapViewChangeListener observer : viewListeners.toArray(new IMapViewChangeListener[]{})) {
+ observer.beforeViewChange(oldMap, newMap);
+ }
+ }
+
+ private MapModel getModel(final MapView view) {
+ return view == null ? null : view.getModel();
+ }
+
+ void mapViewCreated(final MapView mapView) {
+ for (final IMapViewChangeListener observer : viewListeners.toArray(new IMapViewChangeListener[]{})) {
+ observer.afterViewCreated(mapView);
+ }
+ }
+
+ void removeListener(final IMapSelectionListener listener) {
+ mapListeners.remove(listener);
+ }
+
+ void removeListener(final IMapViewChangeListener listener) {
+ viewListeners.remove(listener);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapViewController.java b/freeplane/src/org/freeplane/view/swing/map/MapViewController.java
new file mode 100644
index 0000000..f253166
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MapViewController.java
@@ -0,0 +1,553 @@
+/*
+ * 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.Font;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+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 org.freeplane.core.resources.ResourceController;
+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.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;
+
+/**
+ * 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 {
+ private String lastModeName;
+ /** reference to the current mapmapView; null is allowed, too. */
+ private MapView mapView;
+ 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;
+
+ /**
+ * Reference to the current mode as the mapView may be null.
+ */
+ public MapViewController() {
+ }
+
+ /* (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 = mapView;
+ if (newMapView == oldMapView) {
+ return true;
+ }
+ mapViewChangeListeners.beforeMapViewChange(oldMapView, newMapView);
+ mapView = newMapView;
+ if (mapView != null) {
+ mapView.revalidateSelecteds();
+ final ModeController modeController = mapView.getModeController();
+ lastModeName = modeController.getModeName();
+ final float mapViewZoom = mapView.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 = mapView;
+ final boolean changed = changeToMapView(mapViewCandidate);
+ if (changed) {
+ lastModeName = modeName;
+ if (oldMapView == mapView) {
+ // if the same map remains selected post event for menu updates.
+ mapViewChangeListeners.afterMapViewChange(oldMapView, mapView);
+ }
+ }
+ 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();
+ if (mapView == null) {
+ return false;
+ }
+ final MapController mapController = mapView.getModeController().getMapController();
+ final boolean closingNotCancelled = mapController.close(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 (index >= mapViewVector.size() || index < 0) {
+ index = mapViewVector.size() - 1;
+ }
+ changeToMapView((mapViewVector.get(index)));
+ }
+ mapViewChangeListeners.afterMapViewClose(mapView);
+ 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() {
+ 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;
+ final BufferedImage myImage = (BufferedImage) view.createImage(innerBounds.width, innerBounds.height);
+ final Graphics g = myImage.getGraphics();
+ 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(mapView == null)
+ return null;
+ final NodeView nodeView = mapView.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 mapView;
+ }
+
+ /* (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 = mapView.getNodeView(node);
+ if (nodeView != null) {
+ mapView.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 = (MapStyle) mapView.getModeController().getExtension(MapStyle.class);
+ if(mapView.getZoom() == zoom){
+ return;
+ }
+ mapStyle.setZoom(map, zoom);
+ mapView.setZoom(zoom);
+ }
+
+ /* (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;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MindMapLayout.java b/freeplane/src/org/freeplane/view/swing/map/MindMapLayout.java
new file mode 100644
index 0000000..8957528
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MindMapLayout.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.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+/**
+ * This class will Layout the Nodes and Edges of an MapView.
+ */
+public class MindMapLayout implements LayoutManager {
+ final static int BORDER = 30;
+ public final static int MINIMAL_LEAF_WIDTH = 150;
+
+ public MindMapLayout() {
+ }
+
+ public void addLayoutComponent(final String name, final Component comp) {
+ }
+
+ private int calcXBorderSize(final MapView map) {
+ int xBorderSize;
+ final Dimension visibleSize = map.getViewportSize();
+ final int minBorderWidth = map.getZoomed(MindMapLayout.BORDER + MindMapLayout.MINIMAL_LEAF_WIDTH);
+ if (visibleSize != null) {
+ xBorderSize = Math.max(visibleSize.width, minBorderWidth);
+ }
+ else {
+ xBorderSize = minBorderWidth;
+ }
+ return xBorderSize;
+ }
+
+ /**
+ * @param map
+ */
+ private int calcYBorderSize(final MapView map) {
+ int yBorderSize;
+ final int minBorderHeight = map.getZoomed(MindMapLayout.BORDER);
+ final Dimension visibleSize = map.getViewportSize();
+ if (visibleSize != null) {
+ yBorderSize = Math.max(visibleSize.height, minBorderHeight);
+ }
+ else {
+ yBorderSize = minBorderHeight;
+ }
+ return yBorderSize;
+ }
+
+ private NodeView getRoot(final Container c) {
+ return ((MapView) c).getRoot();
+ }
+
+ public void layoutContainer(final Container c) {
+ final MapView mapView = (MapView) c;
+ final int calcXBorderSize = calcXBorderSize(mapView);
+ final int calcYBorderSize = calcYBorderSize(mapView);
+ getRoot(mapView).validate();
+ getRoot(mapView).setLocation(calcXBorderSize, calcYBorderSize);
+ mapView.setSize(calcXBorderSize * 2 + getRoot(mapView).getWidth(), calcYBorderSize * 2
+ + getRoot(mapView).getHeight());
+ }
+
+ public Dimension minimumLayoutSize(final Container parent) {
+ return new Dimension(200, 200);
+ }
+
+ public Dimension preferredLayoutSize(final Container c) {
+ final MapView mapView = (MapView) c;
+ final Dimension preferredSize = mapView.getRoot().getPreferredSize();
+ return new Dimension(2 * calcXBorderSize(mapView) + preferredSize.width, 2 * calcYBorderSize(mapView)
+ + preferredSize.height);
+ }
+
+ public void removeLayoutComponent(final Component comp) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MouseArea.java b/freeplane/src/org/freeplane/view/swing/map/MouseArea.java
new file mode 100644
index 0000000..4fdc900
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/MouseArea.java
@@ -0,0 +1,5 @@
+package org.freeplane.view.swing.map;
+
+public enum MouseArea {
+ FOLDING, LINK, MOTION, DEFAULT, OUT
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java b/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java
new file mode 100644
index 0000000..225fdc9
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java
@@ -0,0 +1,170 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Window;
+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.SwingUtilities;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
+
+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 {
+ public 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 mouseListener = new LinkMouseListener();
+ tip.addMouseListener(mouseListener);
+ tip.addMouseMotionListener(mouseListener);
+ 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.setText(tipText);
+ Dimension preferredSize = tip.getPreferredSize();
+ if (preferredSize.width < maximumWidth) {
+ 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);
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ return getComponent(0).getPreferredSize();
+ }
+
+ @Override
+ public void layout() {
+ Window window = SwingUtilities.windowForComponent(this);
+ if(! window.getFocusableWindowState()){
+ window.setFocusableWindowState(true);
+ }
+ getComponent(0).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
new file mode 100644
index 0000000..fab76f1
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/NodeTooltipManager.java
@@ -0,0 +1,348 @@
+package org.freeplane.view.swing.map;
+
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
+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.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.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JToolTip;
+import javax.swing.Popup;
+import javax.swing.PopupFactory;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+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 Timer enterTimer;
+ private Timer exitTimer;
+ private String toolTipText;
+ private JComponent insideComponent;
+ private MouseEvent mouseEvent;
+
+ private Popup 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;
+
+ public static NodeTooltipManager getSharedInstance(ModeController modeController){
+ {
+ final NodeTooltipManager instance = (NodeTooltipManager) 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);
+ 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();
+ }
+
+ /**
+ * 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() {
+ if (insideComponent == null || !insideComponent.isShowing())
+ 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);
+ PopupFactory popupFactory = PopupFactory.getSharedInstance();
+ final JComponent nearComponent;
+// if (insideComponent instanceof MainView) {
+// nearComponent = ((MainView)insideComponent).getNodeView().getContent();
+// }
+// else{
+ nearComponent = insideComponent;
+// }
+ final Point locationOnScreen = nearComponent.getLocationOnScreen();
+ final int height = nearComponent.getHeight();
+ Rectangle sBounds = nearComponent.getGraphicsConfiguration().getBounds();
+ final int minX = sBounds.x;
+ final int maxX = sBounds.x + sBounds.width;
+ final int minY = sBounds.y;
+ final int maxY = sBounds.y + sBounds.height;
+ int x = locationOnScreen.x;
+ int y = locationOnScreen.y + height;
+ final Dimension tipSize = tip.getPreferredSize();
+ final int tipWidth = tipSize.width;
+ if(x + tipWidth > maxX){
+ x = maxX - tipWidth;
+ }
+ if(x < minX){
+ x = minX;
+ }
+ final int tipHeight = tipSize.height;
+ if(y + tipHeight > maxY){
+ if(locationOnScreen.y - tipHeight > minY){
+ y = locationOnScreen.y - tipHeight;
+ }
+ else{
+ y = maxY - tipHeight;
+ }
+ }
+ if(y < minY){
+ y = minY;
+ }
+ focusOwnerRef = new WeakReference<Component>(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner());
+ tipPopup = popupFactory.getPopup(nearComponent, tip, x, y);
+ tipPopup.show();
+ 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.hide();
+ if(component != null)
+ component.requestFocusInWindow();
+ tipPopup = 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{
+
+ public void mouseEntered(MouseEvent event) {
+ initiateToolTip(event);
+ }
+ public void mouseMoved(MouseEvent event) {
+ initiateToolTip(event);
+ }
+ public void mouseExited(MouseEvent event) {
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ }
+ @Override
+ public void mousePressed(MouseEvent e) {
+ hideTipWindow();
+ }
+ }
+
+ private void initiateToolTip(MouseEvent event) {
+ JComponent component = (JComponent) event.getSource();
+ if(insideComponent == component){
+ return;
+ }
+ hideTipWindow();
+ insideComponent = component;
+ mouseEvent = event;
+ if(ResourceController.getResourceController().getBooleanProperty(RESOURCES_SHOW_NODE_TOOLTIPS))
+ enterTimer.restart();
+ }
+
+ protected boolean mouseOverComponent() {
+ if(insideComponent.isShowing()){
+ final Point mousePosition = insideComponent.getMousePosition(true);
+ return mousePosition != null
+ && new Rectangle(0, 0, insideComponent.getWidth(),
+ insideComponent.getHeight()).contains(mousePosition);
+ }
+ return false;
+ }
+
+
+ private class insideTimerAction implements ActionListener {
+ public void actionPerformed(ActionEvent e) {
+ if (insideComponent != null){
+ if( mouseOverComponent()) {
+ // Lazy lookup
+ if (toolTipText == null && mouseEvent != null) {
+ toolTipText = insideComponent.getToolTipText(mouseEvent);
+ }
+ if (toolTipText != null) {
+ showTipWindow();
+ return;
+ }
+ }
+ hideTipWindow();
+ }
+ }
+ }
+
+ 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().getViewController().getMapView(), activeWindow)){
+ hideTipWindow();
+ return;
+ }
+
+ if(tip.getMousePosition(true) != null || mouseOverComponent()){
+ exitTimer.restart();
+ return;
+ }
+ final Component focusOwner = currentKeyboardFocusManager.getFocusOwner();
+ if(focusOwner != null){
+ if(SwingUtilities.isDescendingFrom(focusOwner, tip)){
+ exitTimer.restart();
+ return;
+ }
+ }
+ hideTipWindow();
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeView.java b/freeplane/src/org/freeplane/view/swing/map/NodeView.java
new file mode 100644
index 0000000..853cb8e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/NodeView.java
@@ -0,0 +1,1507 @@
+/*
+ * 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.FocusAdapter;
+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.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.FreeNode;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.NodeModel.NodeChangeType;
+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 = System.getProperty("org.freeplane.view.swing.map.NodeView.PAINT_DEBUG_BORDER", "false").equalsIgnoreCase("true");
+ }
+ 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 = (NodeView) 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 = (NodeView) 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().getViewController().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().getViewController().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(spaceAround, spaceAround, 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 = (Graphics2D) g;
+ final ModeController modeController = map.getModeController();
+ final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ g2.setStroke(BubbleMainView.DEF_STROKE);
+ modeController.getController().getViewController().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);
+ getParent().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;
+ }
+ getMap().scrollNodeToVisible(this);
+ Controller.getCurrentController().getViewController().addObjectTypeInfo(getModel().getUserObject());
+ return mainView.requestFocusInWindow();
+ }
+
+ @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
new file mode 100644
index 0000000..083eaa0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/NodeViewFactory.java
@@ -0,0 +1,311 @@
+/*
+ * 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.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.nodestyle.NodeStyleModel;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.TextController;
+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);
+ 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.setMainView(newMainView(newView));
+ updateNoteViewer(newView);
+ newView.update();
+ fireNodeViewCreated(newView);
+ newView.addChildViews();
+ }
+
+ private static Map<Color, Icon> coloredNoteIcons = new HashMap<Color, Icon>();
+ private 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 TextController textController = TextController.getController();
+ final NodeModel model = nodeView.getModel();
+ final NoteModel extension = NoteModel.getNote(model);
+ if(extension != null){
+ final String originalText = extension.getHtml();
+ try {
+ newText = textController.getTransformedTextNoThrow(originalText, model, extension);
+ final boolean markTransformedText = TextController.isMarkTransformedTextSet();
+ if (markTransformedText && newText != originalText)
+ newText = colorize(newText, "green");
+ }
+ catch (Exception e) {
+ newText = colorize(TextUtils.format("MainView.errorUpdateText", originalText, e.getLocalizedMessage())
+ .replace("\n", "<br>"), "red");
+ }
+ }
+ }
+ 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);
+
+ }
+ private String colorize(final String text, String color) {
+ return "<span style=\"color:" + color + ";font-style:italic;\">" + text + "</span>";
+ }
+
+ 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);
+ }
+ 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 {
+ final MapView map = nodeView.getMap();
+ 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);
+ }
+ }
+
+ 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
new file mode 100644
index 0000000..9aae8b3
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/NodeViewLayoutAdapter.java
@@ -0,0 +1,508 @@
+/*
+ * 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
new file mode 100644
index 0000000..a76ff9b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/OutlineLayout.java
@@ -0,0 +1,108 @@
+/*
+ * 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
new file mode 100644
index 0000000..bed0601
--- /dev/null
+++ b/freeplane/src/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
+}
\ 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
new file mode 100644
index 0000000..416b83f
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/RightNodeViewLayout.java
@@ -0,0 +1,38 @@
+/*
+ * 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
new file mode 100644
index 0000000..be6932c
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/RootMainView.java
@@ -0,0 +1,184 @@
+/*
+ * 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().getViewController().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
new file mode 100644
index 0000000..b20d7da
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/SelectableLayout.java
@@ -0,0 +1,79 @@
+/*
+ * 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/ShowNotesInMapAction.java b/freeplane/src/org/freeplane/view/swing/map/ShowNotesInMapAction.java
new file mode 100644
index 0000000..b659c84
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ShowNotesInMapAction.java
@@ -0,0 +1,38 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+
+ at SuppressWarnings("serial")
+ at SelectableAction(checkOnPopup=true)
+public class ShowNotesInMapAction extends AFreeplaneAction {
+
+ public ShowNotesInMapAction() {
+ super("ShowNotesInMapAction");
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final MNoteController noteController = (MNoteController) NoteController.getController();
+ noteController.setShowNotesInMap(map, ! NoteController.getController().showNotesInMap(map));
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.keepNodePosition(selection.getSelected(), 0.5f, 0.5f);
+ setSelected();
+ }
+
+ @Override
+ public void setSelected() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final boolean notesShown = map != null && NoteController.getController().showNotesInMap(map);
+ setSelected(notesShown);
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/SummaryEdgePainter.java b/freeplane/src/org/freeplane/view/swing/map/SummaryEdgePainter.java
new file mode 100644
index 0000000..b82819d
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/SummaryEdgePainter.java
@@ -0,0 +1,124 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Graphics2D;
+import java.awt.Point;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.view.swing.map.edge.EdgeView;
+import org.freeplane.view.swing.map.edge.SummaryEdgeView;
+
+class SummaryEdgePainter {
+ SummaryEdgePainter(NodeView parent, boolean isLeft){
+ this.isLeft = isLeft;
+ int maxSize = parent.getComponentCount();
+ xs = new int[maxSize];
+ yMins = new int[maxSize];
+ yMaxs = new int[maxSize];
+ level = 0;
+ maxLevel = 0;
+ resetLevelValues(0);
+ saveCurrentValues();
+ }
+ private void resetLevelValues(int level) {
+ if(this.isLeft)
+ xs[level] = Integer.MAX_VALUE;
+ else
+ xs[level] = Integer.MIN_VALUE;
+ yMins[level] = Integer.MAX_VALUE;
+ yMaxs[level] = Integer.MIN_VALUE;
+ }
+ private void saveCurrentValues() {
+ currentX = xs[level];
+ currentY1 = yMins[level];
+ currentY2 = yMaxs[level];
+ }
+
+ final private int yMins[];
+ final private int yMaxs[];
+ final private int xs[];
+ private int currentX;
+ private int currentY1;
+ private int currentY2;
+ final private boolean isLeft;
+ private int level;
+ private int maxLevel;
+ void addChild(NodeView child){
+ if(child.isLeft() != isLeft)
+ return;
+ setCurrentLevel(child);
+ updateLevelValues(child);
+
+
+ }
+ private void updateLevelValues(NodeView child) {
+ resetLevelValuesForStart(child);
+ int spaceAround = child.getSpaceAround();
+ if(child.getHeight() == 2 * spaceAround)
+ return;
+ int yMin = child.getY() + spaceAround;
+ int yMax = child.getY() + child.getHeight() - child.getSpaceAround();
+ int x;
+ if (isLeft) {
+ x = child.getX() + spaceAround;
+ }
+ else {
+ x = child.getX() + child.getWidth() - spaceAround;
+ }
+ yMins[level] = Math.min(yMin, yMins[level]);
+ yMaxs[level] = Math.max(yMax, yMaxs[level]);
+ if (isLeft) {
+ xs[level] = Math.min(x, xs[level]);
+ }
+ else {
+ xs[level] = Math.max(x, xs[level]);
+ }
+ }
+ private void resetLevelValuesForStart(NodeView child) {
+ if(child.isFirstGroupNode())
+ resetLevelValues(level);
+ if(level > maxLevel){
+ maxLevel = level;
+ resetLevelValues(level);
+ }
+ }
+ private void setCurrentLevel(NodeView child) {
+ if(child.isSummary()){
+ saveCurrentValues();
+ resetLevelValues(level);
+ level++;
+ }
+ else{
+ level = 0;
+ }
+ }
+ private boolean hasSummaryEdge(){
+ return level > 0 && currentY1 != Integer.MAX_VALUE;
+ }
+
+ boolean paintSummaryEdge(Graphics2D g, NodeView source, NodeView target) {
+ if(! hasSummaryEdge())
+ return false;
+ final Point start1 = new Point(currentX, currentY1);
+ final Point start2 = new Point(currentX, currentY2);
+ final NodeView parentView = target.getParentView();
+ UITools.convertPointToAncestor(parentView, start1, source);
+ UITools.convertPointToAncestor(parentView, start2, source);
+ final EdgeView edgeView = new SummaryEdgeView(source, target, source);
+ edgeView.setStart(start1);
+ edgeView.paint(g);
+ edgeView.setStart(start2);
+ edgeView.paint(g);
+ return true;
+ }
+
+ int getY1(){
+ return currentY1;
+ }
+ int getY2(){
+ return currentY2;
+ }
+ int getX(){
+ return currentX;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java
new file mode 100644
index 0000000..9482ff3
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000..74c3e52
--- /dev/null
+++ b/freeplane/src/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().getViewController().getMapView();
+ 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().getViewController().getMapView();
+ 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
new file mode 100644
index 0000000..b18ecee
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ZoomableLabel.java
@@ -0,0 +1,212 @@
+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 {
+
+ 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
new file mode 100644
index 0000000..0c6e3f4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/ZoomableLabelUI.java
@@ -0,0 +1,271 @@
+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;
+ ScaledHTML.Renderer v = null;
+ 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;
+ 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;
+ 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;
+ }
+ }
+ }
+ super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
+ return text;
+ }
+
+ @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 JLabel label) {
+ try {
+ super.paint(g, label);
+ } catch (ClassCastException e) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ label.setText(TextUtils.format("html_problem", label.getText()));
+ }
+ });
+ }
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent e) {
+ GlyphPainterMetricResetter.resetPainter();
+ try {
+ String name = e.getPropertyName();
+ if (name == "text" || "font" == name || "foreground" == name) {
+ JLabel lbl = ((JLabel) e.getSource());
+ String text = lbl.getText();
+ ScaledHTML.updateRenderer(lbl, text);
+ View v = (View) lbl.getClientProperty(BasicHTML.propertyKey);
+ if (v != null) {
+ lbl.putClientProperty("preferredWidth", v.getPreferredSpan(View.X_AXIS));
+ }
+ }
+ else
+ super.propertyChange(e);
+
+ }
+ finally{
+ GlyphPainterMetricResetter.resetPainter();
+ }
+ }
+
+ @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
new file mode 100644
index 0000000..362daa0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePanelManager.java
@@ -0,0 +1,246 @@
+/*
+ * 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.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().getViewController()
+ .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 toFormat) {
+ if (formatChooser.getSelectedItem() == null)
+ return null;
+ if(toFormat instanceof IFormattedObject)
+ return formatValue(newFormat, table, ((IFormattedObject) toFormat).getObject());
+ if (toFormat instanceof String && ((String)toFormat).startsWith("="))
+ return new FormattedFormula((String) toFormat, newFormat.getPattern());
+ return newFormat.formatObject(toFormat);
+ }
+ });
+
+ 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(format);
+ }
+ else {
+ formatChooser.setSelectedItem(null);
+ }
+ }
+ else {
+ formatChooser.setEnabled(false);
+ }
+ }
+
+ private JComboBox createFormatChooser() {
+ final List<PatternFormat> formats = FormatController.getController().getAllFormats();
+ final JComboBox formatChooser = new JComboBox(new Vector<PatternFormat>(formats));
+ 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/AttributePopupMenu.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java
new file mode 100644
index 0000000..419a984
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java
@@ -0,0 +1,416 @@
+/*
+ * 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.EventQueue;
+import java.awt.KeyboardFocusManager;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.swing.JComponent;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.table.JTableHeader;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.AttributeTableLayoutModel;
+import org.freeplane.features.attribute.IAttributeTableModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.view.swing.ui.mindmapmode.INodeSelector;
+import org.freeplane.view.swing.ui.mindmapmode.NodeSelector;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AttributePopupMenu extends JPopupMenu implements MouseListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private JMenuItem delete = null;
+ private JMenuItem down = null;
+ private JMenuItem insert = null;
+ private JMenuItem insertFileLink = null;
+ private boolean oldTable;
+ private JMenuItem optimalWidth = null;
+ private int row;
+ private AttributeTable table;
+ private JMenuItem up = null;
+ private int col;
+ private JMenuItem insertLink;
+ private JMenuItem insertNodeLink;
+ private JMenuItem insertAnchoredLink;
+
+ @Override
+ protected void firePopupMenuWillBecomeInvisible() {
+ if (row != -1) {
+ table.removeRowSelectionInterval(row, row);
+ }
+ oldTable = true;
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ if (!oldTable) {
+ return;
+ }
+ final KeyboardFocusManager focusManager = java.awt.KeyboardFocusManager
+ .getCurrentKeyboardFocusManager();
+ final Component focusOwner = SwingUtilities.getAncestorOfClass(AttributeTable.class, focusManager
+ .getFocusOwner());
+ if (table != focusOwner && focusOwner instanceof JComponent) {
+ table.requestFocus(true);
+ ((JComponent) focusOwner).requestFocusInWindow();
+ }
+ table = null;
+ }
+ });
+ }
+
+ @Override
+ protected void firePopupMenuWillBecomeVisible() {
+ super.firePopupMenuWillBecomeVisible();
+ if (row != -1) {
+ table.addRowSelectionInterval(row, row);
+ }
+ }
+
+ /**
+ * @return Returns the delete.
+ */
+ private JMenuItem getDelete() {
+ if (delete == null) {
+ delete = new JMenuItem(TextUtils.getText("attributes_popup_delete"));
+ delete.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ table.removeRow(row);
+ }
+ });
+ }
+ return delete;
+ }
+
+ /**
+ * @return Returns the down.
+ */
+ private JMenuItem getDown() {
+ if (down == null) {
+ down = new JMenuItem(TextUtils.getText("attributes_popup_down"));
+ down.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ table.moveRowDown(row);
+ }
+ });
+ }
+ return down;
+ }
+
+ /**
+ * @return Returns the insert.
+ */
+ private JMenuItem getInsert() {
+ if (insert == null) {
+ insert = new JMenuItem(TextUtils.getText("attributes_popup_new"));
+ insert.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ table.insertRow(row + 1);
+ }
+ });
+ }
+ return insert;
+ }
+ /**
+ * @return Returns the insert.
+ */
+ private JMenuItem getInsertFileLink() {
+ if (insertFileLink == null) {
+ insertFileLink = new JMenuItem(TextUtils.getText("SetLinkByFileChooserAction.text"));
+ insertFileLink.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final AttributeTable table = AttributePopupMenu.this.table;
+ final URI relative = ((MFileManager) UrlManager.getController())
+ .getLinkByFileChooser(Controller.getCurrentController().getMap());
+ if (relative != null) {
+ table.setValueAt(relative, row, col);
+ }
+ }
+ });
+ }
+ return insertFileLink;
+ }
+ /**
+ * @return Returns the insert.
+ */
+ private JMenuItem getInsertLink() {
+ if (insertLink == null) {
+ insertLink = new JMenuItem(TextUtils.getText("SetLinkByTextFieldAction.text"));
+ insertLink.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final AttributeTable table = AttributePopupMenu.this.table;
+ final Object oldValue = table.getValueAt(row, col);
+ final String inputValue = JOptionPane.showInputDialog(table, TextUtils.getText("edit_link_manually"), oldValue.toString());
+ if (inputValue != null && (oldValue instanceof String || ! oldValue.equals(inputValue))) {
+ if (inputValue.toString().equals("")) {
+ table.setValueAt("", row, col);
+ }
+ try {
+ final URI link = LinkController.createURI(inputValue.trim());
+ if(! oldValue.equals(link))
+ table.setValueAt(link, row, col);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ UITools.errorMessage(TextUtils.format("invalid_uri", inputValue));
+ return;
+ }
+ }
+ }
+
+ });
+ }
+ return insertLink;
+ }
+
+ private JMenuItem getInsertNodeLink() {
+ if (insertNodeLink == null) {
+ insertNodeLink = new JMenuItem(TextUtils.getText("SetNodeLink.text"));
+ insertNodeLink.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final AttributeTable table = AttributePopupMenu.this.table;
+ final Object oldValue = table.getValueAt(row, col);
+ final NodeSelector nodeSelector = new NodeSelector();
+ nodeSelector.show(table, new INodeSelector() {
+ public void nodeSelected(NodeModel node) {
+ if(node == null)
+ return;
+ final String inputValue = "#" + node.getID();
+ try {
+ final URI link = LinkController.createURI(inputValue);
+ if(! oldValue.equals(link))
+ table.setValueAt(link, row, col);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.severe(e1);
+ return;
+ }
+ }
+ });
+ }
+
+ });
+ }
+ return insertNodeLink;
+ }
+
+ private JMenuItem getInsertAnchoredLink() {
+ if (insertAnchoredLink == null) {
+ insertAnchoredLink = new JMenuItem(TextUtils.getText("MakeLinkToAnchorAction.text"));
+ insertAnchoredLink.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final AttributeTable table = AttributePopupMenu.this.table;
+ final Object oldValue = table.getValueAt(row, col);
+ final LinkController linkController = LinkController.getController();
+ if(linkController instanceof MLinkController) {
+ final MLinkController mLinkController = (MLinkController)linkController;
+ if (mLinkController.isAnchored()) {
+ try {
+ final String anchorIDforNode = mLinkController.getAnchorIDforNode(((IAttributeTableModel) table.getModel()).getNode());
+ if(anchorIDforNode != null){
+ URI link = LinkController.createURI(anchorIDforNode);
+ if(! oldValue.equals(link))
+ table.setValueAt(link, row, col);
+ }
+ }
+ catch (URISyntaxException e1) {
+ }
+ }
+ }
+ }
+
+ });
+ }
+ return insertAnchoredLink;
+ }
+ /**
+ * @return Returns the optimalWidth.
+ */
+ private JMenuItem getOptimalWidth() {
+ if (optimalWidth == null) {
+ optimalWidth = new JMenuItem(TextUtils.getText("attributes_popup_optimal_width"));
+ optimalWidth.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ table.setOptimalColumnWidths();
+ }
+ });
+ }
+ return optimalWidth;
+ }
+
+ public AttributeTable getTable() {
+ return table;
+ }
+
+ /**
+ * @return Returns the up.
+ */
+ private JMenuItem getUp() {
+ if (up == null) {
+ up = new JMenuItem(TextUtils.getText("attributes_popup_up"));
+ up.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ table.moveRowUp(row);
+ }
+ });
+ }
+ return up;
+ }
+
+ /**
+ *
+ */
+ private void make() {
+ final String attributeViewType = table.getAttributeView().getViewType();
+ final IAttributeTableModel model = table.getAttributeTableModel();
+ final int rowCount = model.getRowCount();
+ add(getOptimalWidth());
+ if(col == 1){
+ add(getInsertLink());
+ add(getInsertFileLink());
+ add(getInsertNodeLink());
+ final LinkController linkController = LinkController.getController();
+ if(linkController instanceof MLinkController && ((MLinkController)linkController).isAnchored())
+ add(getInsertAnchoredLink());
+ }
+ if (attributeViewType.equals(AttributeTableLayoutModel.SHOW_ALL)) {
+ add(getInsert());
+ if (row != -1) {
+ add(getDelete());
+ if (row != 0) {
+ add(getUp());
+ }
+ if (row != rowCount - 1) {
+ add(getDown());
+ }
+ }
+ }
+ }
+
+ private void maybeShowPopup(final MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ selectTable(e.getComponent(), e.getPoint());
+ if (table.isEditing()) {
+ return;
+ }
+ table.requestFocusInWindow();
+ make();
+ show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+ */
+ public void mouseClicked(final MouseEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+ */
+ public void mouseEntered(final MouseEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+ */
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ private void selectTable(final Component component, final Point point) throws AssertionError {
+ final int componentCount = getComponentCount();
+ for (int i = componentCount; i > 0;) {
+ remove(--i);
+ }
+ if (component instanceof AttributeTable) {
+ table = (AttributeTable) component;
+ if (table.isEditing()) {
+ return;
+ }
+ oldTable = false;
+ row = table.rowAtPoint(point);
+ col = table.columnAtPoint(point);
+ if (row >= 0) {
+ if (table.getValueAt(row, 0).equals("")) {
+ row--;
+ }
+ }
+ if (row >= 0) {
+ table.changeSelection(row, table.columnAtPoint(point), false, false);
+ }
+ return;
+ }
+ if (component instanceof JTableHeader) {
+ final JTableHeader header = (JTableHeader) component;
+ table = (AttributeTable) header.getTable();
+ if (table.isEditing()) {
+ return;
+ }
+ oldTable = false;
+ row = -1;
+ col = -1;
+ return;
+ }
+ throw new AssertionError();
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if(visible){
+ return;
+ }
+ table.requestFocusInWindow();
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java
new file mode 100644
index 0000000..6b2529e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java
@@ -0,0 +1,871 @@
+/*
+ * 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.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.IFormattedObject;
+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.features.url.UrlManager;
+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){
+ UrlManager.getController().loadURL(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();
+ 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) {
+ attributeView.getNodeView().requestFocusInWindow();
+ return true;
+ }
+ 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) {
+ Object value = editor.getCellEditorValue();
+ if (value != null) {
+ final MTextController textController = (MTextController) TextController.getController();
+ final Object oldValue = getValueAt(editingRow, editingColumn);
+ final String pattern = oldValue instanceof IFormattedObject
+ ? ((IFormattedObject) oldValue).getPattern() : null;
+ setValueAt(textController.guessObjectOrURI(value, pattern), editingRow, editingColumn);
+ }
+ removeEditor();
+ }
+ }
+ finally{
+ putClientProperty(EDITING_STOPPED, null);
+ }
+ }
+
+ @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
new file mode 100644
index 0000000..3d7daa0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java
@@ -0,0 +1,159 @@
+/*
+ * 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
new file mode 100644
index 0000000..1510c3a
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java
@@ -0,0 +1,156 @@
+/*
+ * 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/AttributeView.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeView.java
new file mode 100644
index 0000000..439ceb2
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeView.java
@@ -0,0 +1,331 @@
+/*
+ * 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.EventQueue;
+
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.UIManager;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableModel;
+
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeTableLayoutModel;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * This class represents a single Node of a MindMap (in analogy to
+ * TreeCellRenderer).
+ */
+public class AttributeView implements ChangeListener, TableModelListener {
+ private static final Color HEADER_BACKGROUND = UIManager.getColor("TableHeader.background");
+ static private AttributePopupMenu tablePopupMenu;
+ private AttributeTable attributeTable;
+ private JScrollPane attributeViewScrollPane;
+ private AttributeTableModelDecoratorAdapter currentAttributeTableModel;
+ private ExtendedAttributeTableModelDecorator extendedAttributeTableModel = null;
+ final private NodeView nodeView;
+ final private ReducedAttributeTableModelDecorator reducedAttributeTableModel;
+ private JTableHeader tableHeader;
+ private ListSelectionListener tableSelectionListener;
+
+ public AttributeView(final NodeView nodeView, final boolean addToNodeView) {
+ super();
+ this.nodeView = nodeView;
+ if(addToNodeView){
+ reducedAttributeTableModel = new ReducedAttributeTableModelDecorator(this);
+ currentAttributeTableModel = reducedAttributeTableModel;
+ }
+ else{
+ reducedAttributeTableModel = null;
+ currentAttributeTableModel = extendedAttributeTableModel = new ExtendedAttributeTableModelDecorator(this);
+
+ }
+ setViewType(getAttributeRegistry().getAttributeViewType());
+ addListeners();
+ }
+
+ private void addListeners() {
+ getAttributeRegistry().addChangeListener(this);
+ addTableListeners();
+ }
+
+ private void addTableListeners() {
+ if (!getMapView().getModeController().canEdit()) {
+ return;
+ }
+ if (attributeTable != null) {
+ if (AttributeView.tablePopupMenu == null) {
+ AttributeView.tablePopupMenu = new AttributePopupMenu();
+ }
+ getAttributes().getLayout().addColumnWidthChangeListener(attributeTable);
+ attributeTable.addMouseListener(AttributeView.tablePopupMenu);
+ tableHeader.addMouseListener(AttributeView.tablePopupMenu);
+ if (tableSelectionListener != null) {
+ attributeTable.getSelectionModel().addListSelectionListener(tableSelectionListener);
+ attributeTable.getColumnModel().getSelectionModel().addListSelectionListener(tableSelectionListener);
+ }
+ }
+ else {
+ getAttributes().addTableModelListener(this);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @seejavax.swing.event.AncestorListener#ancestorMoved(javax.swing.event.
+ * AncestorEvent)
+ */
+ public void ancestorMoved(final AncestorEvent event) {
+ }
+
+ /**
+ */
+ public boolean areAttributesVisible() {
+ final String viewType = getViewType();
+ return viewType != AttributeTableLayoutModel.HIDE_ALL
+ && (currentAttributeTableModel.areAttributesVisible() || viewType != getAttributeRegistry()
+ .getAttributeViewType());
+ }
+
+ AttributeRegistry getAttributeRegistry() {
+ return AttributeRegistry.getRegistry(getNode().getMap());
+ }
+
+ public NodeAttributeTableModel getAttributes() {
+ return NodeAttributeTableModel.getModel(getNode());
+ }
+
+ public TableModel getCurrentAttributeTableModel() {
+ return currentAttributeTableModel;
+ }
+
+ /**
+ * @return Returns the extendedAttributeTableModel.
+ */
+ private ExtendedAttributeTableModelDecorator getExtendedAttributeTableModel() {
+ if (extendedAttributeTableModel == null) {
+ extendedAttributeTableModel = new ExtendedAttributeTableModelDecorator(this);
+ }
+ return extendedAttributeTableModel;
+ }
+
+ /**
+ */
+ public MapView getMapView() {
+ return getNodeView().getMap();
+ }
+
+ /**
+ */
+ NodeModel getNode() {
+ return getNodeView().getModel();
+ }
+
+ /**
+ */
+ public NodeView getNodeView() {
+ return nodeView;
+ }
+
+ public String getViewType() {
+ return currentAttributeTableModel == reducedAttributeTableModel ? getAttributeRegistry().getAttributeViewType()
+ : AttributeTableLayoutModel.SHOW_ALL;
+ }
+
+ boolean isPopupShown() {
+ return attributeTable != null && AttributeView.tablePopupMenu != null
+ && (AttributeView.tablePopupMenu.getTable() == attributeTable);
+ }
+
+ static private int VIEWER_POSITION = 3;
+
+ private void provideAttributeTable() {
+ if (attributeTable == null) {
+ getAttributes().removeTableModelListener(this);
+ attributeTable = new AttributeTable(this);
+ tableHeader = attributeTable.getTableHeader();
+ tableHeader.setBackground(AttributeView.HEADER_BACKGROUND);
+ addTableListeners();
+ attributeViewScrollPane = new AttributeViewScrollPane(attributeTable);
+ attributeViewScrollPane.setAlignmentX(AttributeViewScrollPane.LEFT_ALIGNMENT);
+ if(addToNodeView()){
+ getNodeView().addContent(attributeViewScrollPane, VIEWER_POSITION);
+ }
+ setViewType(getAttributeRegistry().getAttributeViewType());
+ }
+ }
+
+ boolean addToNodeView() {
+ return reducedAttributeTableModel != null;
+ }
+
+ private void removeListeners() {
+ getAttributeRegistry().removeChangeListener(this);
+ if (!getMapView().getModeController().canEdit()) {
+ return;
+ }
+ if (attributeTable != null) {
+ getAttributes().getLayout().removeColumnWidthChangeListener(attributeTable);
+ attributeTable.getParent().remove(attributeTable);
+ attributeTable.getModel().removeTableModelListener(attributeTable);
+ attributeTable.removeMouseListener(AttributeView.tablePopupMenu);
+ tableHeader.removeMouseListener(AttributeView.tablePopupMenu);
+ AttributeView.tablePopupMenu = null;
+ }
+ else {
+ getAttributes().removeTableModelListener(this);
+ }
+ }
+
+ private void setViewType(final String viewType) {
+ JTableHeader currentColumnHeaderView = null;
+ if (viewType == AttributeTableLayoutModel.SHOW_ALL || ! addToNodeView()) {
+ currentAttributeTableModel = getExtendedAttributeTableModel();
+ currentColumnHeaderView = tableHeader;
+ }
+ else {
+ currentAttributeTableModel = reducedAttributeTableModel;
+ }
+ if (attributeTable != null) {
+ attributeTable.setModel(currentAttributeTableModel);
+ attributeTable.setTableHeader(currentColumnHeaderView);
+ attributeViewScrollPane.setColumnHeaderView(currentColumnHeaderView);
+ attributeViewScrollPane.invalidate();
+ }
+ }
+
+ public void startEditing() {
+ provideAttributeTable();
+ if (currentAttributeTableModel == reducedAttributeTableModel) {
+ getExtendedAttributeTableModel();
+ setViewType(AttributeTableLayoutModel.SHOW_ALL);
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ startEditingTable();
+ }
+ });
+ }
+
+ private void startEditingTable() {
+ attributeTable.requestFocusInWindow();
+ if (currentAttributeTableModel.getRowCount() == 0) {
+ attributeTable.insertRow(0);
+ }
+ else {
+ attributeTable.changeSelection(0, 0, false, false);
+ }
+ }
+
+ public void stateChanged(final ChangeEvent event) {
+ setViewType(getAttributeRegistry().getAttributeViewType());
+ if(addToNodeView()){
+ reducedAttributeTableModel.stateChanged(null);
+ }
+ if(attributeTable != null)
+ attributeTable.revalidate();
+ }
+
+ public void stopEditing() {
+ if (attributeTable.isEditing()) {
+ attributeTable.getCellEditor().stopCellEditing();
+ }
+ final String registryAttributeViewType = getAttributeRegistry().getAttributeViewType();
+ if (registryAttributeViewType != getViewType()) {
+ setViewType(registryAttributeViewType);
+ }
+ getNodeView().requestFocusInWindow();
+ }
+
+ public void syncronizeAttributeView() {
+ if (attributeTable == null && currentAttributeTableModel.areAttributesVisible()) {
+ provideAttributeTable();
+ }
+ }
+
+ public void tableChanged(final TableModelEvent e) {
+ final NodeModel node = getNode();
+ getMapView().getModeController().getMapController().nodeChanged(node);
+ }
+
+ /**
+ */
+ public void update() {
+ if (attributeTable != null && attributeTable.isVisible()) {
+ attributeTable.updateAttributeTable();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.AncestorListener#ancestorRemoved(javax.swing.event.
+ * AncestorEvent)
+ */
+ public void viewRemoved() {
+ removeListeners();
+ if (addToNodeView()) {
+ reducedAttributeTableModel.viewRemoved(nodeView);
+ }
+ if (extendedAttributeTableModel != null) {
+ extendedAttributeTableModel.viewRemoved(nodeView);
+ }
+ if (attributeTable != null) {
+ attributeTable.viewRemoved(nodeView);
+ attributeTable = null;
+ }
+ }
+
+ JComponent getContainer() {
+ if(attributeViewScrollPane == null){
+ provideAttributeTable();
+ }
+ return attributeViewScrollPane;
+ }
+
+ public void addRow() {
+ attributeTable.insertRow(attributeTable.getRowCount());
+ }
+
+ public void setOptimalColumnWidths() {
+ attributeTable.setOptimalColumnWidths();
+ }
+
+ public AttributeTable getAttributeTable() {
+ return attributeTable;
+ }
+
+ public void addTableSelectionListener(ListSelectionListener listSelectionListener) {
+ // we have to cache the listener to enable lazy construction of the AttributeTable
+ tableSelectionListener = listSelectionListener;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
new file mode 100644
index 0000000..3a349c4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
@@ -0,0 +1,62 @@
+/*
+ * 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/attribute/CursorUpdater.java b/freeplane/src/org/freeplane/view/swing/map/attribute/CursorUpdater.java
new file mode 100644
index 0000000..17dbf63
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/CursorUpdater.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.view.swing.map.attribute;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Point;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+import java.net.URI;
+
+import javax.swing.Icon;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 4, 2011
+ */
+class CursorUpdater extends MouseAdapter implements MouseMotionListener{
+
+ public void mouseDragged(MouseEvent e) {
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ updateCursor(e);
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ updateCursor(e);
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ updateCursor(e.getComponent(), Cursor.DEFAULT_CURSOR);
+ }
+
+
+ private void updateCursor(MouseEvent e) {
+ final int cursor = getCursor(e);
+ updateCursor(e.getComponent(), cursor);
+
+ }
+
+ private int getCursor(MouseEvent e) {
+ final AttributeTable table = (AttributeTable) e.getComponent();
+ final Point point = e.getPoint();
+ final int col = table.columnAtPoint(point);
+ if(col != 1){
+ return Cursor.DEFAULT_CURSOR;
+ }
+ final int row = table.rowAtPoint(e.getPoint());
+ if(row == -1 || row >= table.getRowCount()){
+ return Cursor.DEFAULT_CURSOR;
+ }
+ Object value = table.getValueAt(row, col);
+ if(!(value instanceof URI)){
+ return Cursor.DEFAULT_CURSOR;
+ }
+ final Icon linkIcon = table.getLinkIcon((URI) value);
+ if (linkIcon == null)
+ return Cursor.DEFAULT_CURSOR;
+ final int leftColumnWidth = table.getColumnModel().getColumn(0).getWidth();
+ if (point.x < leftColumnWidth + linkIcon.getIconWidth()) {
+ return Cursor.HAND_CURSOR;
+ }
+ return Cursor.DEFAULT_CURSOR;
+ }
+
+ private void updateCursor(Component component, int cursor) {
+ final Cursor newCursor = Cursor.getPredefinedCursor(cursor);
+ if( component.getCursor().equals(newCursor))
+ return;
+ component.setCursor(cursor == Cursor.DEFAULT_CURSOR ? null : newCursor);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/EditAttributesAction.java b/freeplane/src/org/freeplane/view/swing/map/attribute/EditAttributesAction.java
new file mode 100644
index 0000000..f6c066b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/EditAttributesAction.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.view.swing.map.attribute;
+
+import java.awt.Component;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.ShortenedTextModel;
+import org.freeplane.view.swing.map.MapView;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class EditAttributesAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public EditAttributesAction() {
+ super("EditAttributesAction");
+ };
+
+ public void actionPerformed(final ActionEvent e) {
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ final Controller controller = Controller.getCurrentController();
+ final AttributeView attributeView = (((MapView) controller.getViewController().getMapView()).getSelected())
+ .getAttributeView();
+ final boolean attributesClosed = null == SwingUtilities.getAncestorOfClass(AttributeTable.class, focusOwner);
+ if (attributesClosed) {
+ attributeView.startEditing();
+ }
+ else {
+ attributeView.stopEditing();
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ setEnabled(selection != null && ! ShortenedTextModel.isShortened(selection.getSelected()));
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java b/freeplane/src/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java
new file mode 100644
index 0000000..eda75e2
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java
@@ -0,0 +1,142 @@
+/*
+ * 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.attribute;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.TableModelEvent;
+
+import org.freeplane.features.attribute.Attribute;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class ExtendedAttributeTableModelDecorator extends AttributeTableModelDecoratorAdapter {
+ private static final int AFTER_LAST_ROW = Integer.MAX_VALUE;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ int newRow;
+ final private AttributeView attributeView;
+
+ public ExtendedAttributeTableModelDecorator(final AttributeView attrView) {
+ super(attrView);
+ this.attributeView = attrView;
+ newRow = ExtendedAttributeTableModelDecorator.AFTER_LAST_ROW;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.view.mindmapview.attributeview.AttributeTableModelDecoratorAdapter
+ * #areAttributesVisible()
+ */
+ @Override
+ public boolean areAttributesVisible() {
+ return getRowCount() != 0 || ! attributeView.addToNodeView();
+ }
+
+ @Override
+ public void editingCanceled() {
+ if (newRow != ExtendedAttributeTableModelDecorator.AFTER_LAST_ROW) {
+ final int row = newRow;
+ newRow = ExtendedAttributeTableModelDecorator.AFTER_LAST_ROW;
+ fireTableRowsDeleted(row, row);
+ }
+ }
+
+ public int getRowCount() {
+ if (newRow == ExtendedAttributeTableModelDecorator.AFTER_LAST_ROW) {
+ return getNodeAttributeModel().getRowCount();
+ }
+ return getNodeAttributeModel().getRowCount() + 1;
+ }
+
+ public Object getValueAt(final int row, final int col) {
+ if (row < newRow) {
+ return getNodeAttributeModel().getValueAt(row, col);
+ }
+ if (row == newRow) {
+ return "";
+ }
+ return getNodeAttributeModel().getValueAt(row - 1, col);
+ }
+
+ public void insertRow(final int index) {
+ newRow = index;
+ fireTableRowsInserted(index, index);
+ }
+
+ @Override
+ public boolean isCellEditable(final int row, final int col) {
+ if (row != newRow) {
+ return getAttributeController().canEdit();
+ }
+ return col == 0;
+ }
+
+ /**
+ */
+ public void moveRowDown(final int row) {
+ final Attribute attribute = getAttributeController().performRemoveRow(getNodeAttributeModel(), row);
+ getAttributeController().performInsertRow(getNodeAttributeModel(), (row + 1), attribute.getName(),
+ attribute.getValue());
+ }
+
+ /**
+ */
+ public void moveRowUp(final int row) {
+ final Attribute attribute = getAttributeController().performRemoveRow(getNodeAttributeModel(), row);
+ getAttributeController().performInsertRow(getNodeAttributeModel(), (row - 1), attribute.getName(),
+ attribute.getValue());
+ }
+
+ public Object removeRow(final int index) {
+ return getAttributeController().performRemoveRow(getNodeAttributeModel(), index);
+ }
+
+ @Override
+ public void setValueAt(final Object o, final int row, final int col) {
+ if (row != newRow) {
+ if (col == 1 || o.toString().length() > 0) {
+ final int rowInModel = row < newRow ? row : row - 1;
+ getAttributeController().performSetValueAt(getNodeAttributeModel(), o, rowInModel, col);
+ }
+ return;
+ }
+ else {
+ newRow = ExtendedAttributeTableModelDecorator.AFTER_LAST_ROW;
+ fireTableRowsDeleted(row, row);
+ if (col == 0 && o != null && o.toString().length() > 0) {
+ getAttributeController().performInsertRow(getNodeAttributeModel(), row, o.toString(), "");
+ }
+ return;
+ }
+ }
+
+ public void stateChanged(final ChangeEvent e) {
+ fireTableDataChanged();
+ }
+
+ public void tableChanged(final TableModelEvent e) {
+ super.tableChanged(e);
+ fireTableChanged(new TableModelEvent(this, e.getFirstRow(), e.getLastRow(), e.getColumn(), e.getType()));
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java b/freeplane/src/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java
new file mode 100644
index 0000000..9025cd2
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.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.view.swing.map.attribute;
+
+import java.util.Vector;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.TableModelEvent;
+
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class ReducedAttributeTableModelDecorator extends AttributeTableModelDecoratorAdapter {
+ private static final long serialVersionUID = 1L;
+ private Vector<Integer> index = null;
+ private int visibleRowCount;
+
+ ReducedAttributeTableModelDecorator(final AttributeView attrView) {
+ super(attrView);
+ rebuildTableModel();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @seefreeplane.modes.attributes.AttributeTableModel#addRow(freeplane.modes.
+ * attributes.Attribute)
+ */
+ public void addRow(final Attribute newAttribute) {
+ throw new Error();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.view.mindmapview.attributeview.AttributeTableModelDecoratorAdapter
+ * #areAttributesVisible()
+ */
+ @Override
+ public boolean areAttributesVisible() {
+ return getRowCount() != 0;
+ }
+
+ private int calcRow(final int row) {
+ return index.get(row).intValue();
+ }
+
+ private Vector<Integer> getIndex() {
+ if (index == null && getAttributeRegistry().getVisibleElementsNumber() > 0) {
+ index = new Vector<Integer>(getNodeAttributeModel().getRowCount(), 10);
+ }
+ return index;
+ }
+
+ public int getRowCount() {
+ return visibleRowCount;
+ }
+
+ public Object getValueAt(final int row, final int col) {
+ if(index == null)
+ return null;
+ return getNodeAttributeModel().getValueAt(calcRow(row), col);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.modes.attributes.AttributeTableModel#insertRow(int,
+ * freeplane.modes.attributes.Attribute)
+ */
+ public void insertRow(final int index, final Attribute newAttribute) {
+ throw new Error();
+ }
+
+ @Override
+ public boolean isCellEditable(final int row, final int col) {
+ if (getAttributeController() instanceof MAttributeController) {
+ return col == 1;
+ }
+ return false;
+ }
+
+ private void rebuildTableModel() {
+ getIndex();
+ if (index != null) {
+ visibleRowCount = 0;
+ index.clear();
+ for (int i = 0; i < getNodeAttributeModel().getRowCount(); i++) {
+ final String name = (String) getNodeAttributeModel().getValueAt(i, 0);
+ if (getAttributeRegistry().getElement(name).isVisible()) {
+ index.add(new Integer(i));
+ visibleRowCount++;
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.modes.attributes.AttributeTableModel#removeRow(int)
+ */
+ public Object removeRow(final int index) {
+ throw new Error();
+ }
+
+ @Override
+ public void setValueAt(final Object o, final int row, final int col) {
+ getAttributeController().performSetValueAt(getNodeAttributeModel(), o, calcRow(row), col);
+ fireTableCellUpdated(row, col);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent
+ * )
+ */
+ public void stateChanged(final ChangeEvent e) {
+ rebuildTableModel();
+ if (index != null) {
+ fireTableDataChanged();
+ }
+ }
+
+ public void tableChanged(final TableModelEvent e) {
+ super.tableChanged(e);
+ if (e.getType() != TableModelEvent.UPDATE || e.getColumn() != 0) {
+ rebuildTableModel();
+ }
+ fireTableDataChanged();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/ArcCloudView.java b/freeplane/src/org/freeplane/view/swing/map/cloud/ArcCloudView.java
new file mode 100644
index 0000000..8f53c2a
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/ArcCloudView.java
@@ -0,0 +1,42 @@
+package org.freeplane.view.swing.map.cloud;
+
+import java.awt.Graphics2D;
+import java.awt.Shape;
+import java.awt.geom.QuadCurve2D;
+
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.view.swing.map.NodeView;
+
+public class ArcCloudView extends CloudView {
+
+ @Override
+ protected double calcDistanceBetweenPoints() {
+ final double distanceBetweenPoints;
+ if (getIterativeLevel() > 4) {
+ distanceBetweenPoints = 140 * getZoom(); /* flat */
+ }
+ else{
+ distanceBetweenPoints = 6 * getDistanceToConvexHull();
+ }
+ return distanceBetweenPoints;
+ }
+
+ ArcCloudView(CloudModel cloudModel, NodeView source) {
+ super(cloudModel, source);
+ }
+
+ protected void paintDecoration(final Graphics2D g, final Graphics2D gstroke, final double x0, final double y0,
+ final double x1, final double y1, double dx, double dy, double dxn, double dyn) {
+ double xctrl;
+ double yctrl;
+ final double middleDistanceToConvexHull = getDistanceToConvexHull();
+ final double distanceToConvexHull = middleDistanceToConvexHull * 2.2 * random(0.7);
+ xctrl = x0 + .5f * dx - distanceToConvexHull * dyn;
+ yctrl = y0 + .5f * dy + distanceToConvexHull * dxn;
+ final Shape shape = new QuadCurve2D.Double(x0, y0, xctrl, yctrl, x1, y1);
+ g.fill(shape);
+ gstroke.draw(shape);
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/CloudView.java b/freeplane/src/org/freeplane/view/swing/map/cloud/CloudView.java
new file mode 100644
index 0000000..dae95fc
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/CloudView.java
@@ -0,0 +1,236 @@
+/*
+ * 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.cloud;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Polygon;
+import java.awt.Stroke;
+import java.util.LinkedList;
+import java.util.Random;
+import java.util.Vector;
+
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * This class represents a Cloud around a node.
+ */
+abstract public class CloudView {
+ static final Stroke DEF_STROKE = new BasicStroke(1);
+
+ /** the layout functions can get the additional height of the clouded node .
+ * @param cloud */
+ static public int getAdditionalHeigth(CloudModel cloud, final NodeView source) {
+ final CloudView heightCalculator = new CloudViewFactory().createCloudView(cloud, source);
+ return (int) (2.2 * heightCalculator.getDistanceToConvexHull());
+ }
+
+ protected CloudModel cloudModel;
+ protected NodeView source;
+ private final int iterativeLevel;
+ private Random random;
+
+ CloudView(final CloudModel cloudModel, final NodeView source) {
+ this.cloudModel = cloudModel;
+ this.source = source;
+ iterativeLevel = getCloudIterativeLevel();
+ }
+
+ private int getCloudIterativeLevel() {
+ int iterativeLevel = 0;
+ for (NodeView parentNode = source.getParentView(); parentNode != null; parentNode = parentNode.getParentView()) {
+ if (null != parentNode.getCloudModel()) {
+ iterativeLevel++;
+ }
+ }
+ return iterativeLevel;
+ }
+
+ public Color getColor() {
+ return source.getCloudColor();
+ }
+
+ protected double getDistanceToConvexHull() {
+ return 20 / (getIterativeLevel() + 1) * getZoom();
+ }
+
+ public Color getExteriorColor(final Color color) {
+ return color.darker();
+ }
+
+ /**
+ * getIterativeLevel() describes the n-th nested cloud that is to be
+ * painted.
+ */
+ protected int getIterativeLevel() {
+ return iterativeLevel;
+ }
+
+ protected MapView getMap() {
+ return source.getMap();
+ }
+
+ protected CloudModel getModel() {
+ return cloudModel;
+ }
+
+ /**
+ * Get the width in pixels rather than in width constant (like -1)
+ */
+ public int getRealWidth() {
+ final int width = getWidth();
+ return (width < 1) ? 1 : width;
+ }
+
+ public Stroke getStroke() {
+ final int width = getWidth();
+ if (width < 1) {
+ return CloudView.DEF_STROKE;
+ }
+ return new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
+ }
+
+ public int getWidth() {
+ final NodeModel node = source.getModel();
+ return CloudController.getController(source.getMap().getModeController()).getWidth(node);
+ }
+
+ protected double getZoom() {
+ return getMap().getZoom();
+ }
+
+ public void paint(final Graphics graphics) {
+ random = new Random(0);
+ final Graphics2D g = (Graphics2D) graphics.create();
+ final Graphics2D gstroke = (Graphics2D) g.create();
+ final Color color = getColor();
+ g.setColor(color);
+ /* set a bigger stroke to prevent not filled areas. */
+ g.setStroke(getStroke());
+ /* now bold */
+ gstroke.setColor(getExteriorColor(color));
+ gstroke.setStroke(getStroke());
+ /*
+ * calculate the distances between two points on the convex hull
+ * depending on the getIterativeLevel().
+ */
+ /** get coordinates */
+ final LinkedList<Point> coordinates = new LinkedList<Point>();
+ source.getCoordinates(coordinates);
+ final ConvexHull hull = new ConvexHull();
+ final Vector<Point> res = hull.calculateHull(coordinates);
+ final Polygon p = new Polygon();
+ Point lastPt = null;
+ for (int i = 0; i < res.size(); ++i) {
+ final Point pt = (Point) res.get(i);
+ if(!pt.equals(lastPt)){
+ p.addPoint(pt.x, pt.y);
+ lastPt = pt;
+ }
+ }
+ final Point pt = (Point) res.get(0);
+ p.addPoint(pt.x, pt.y);
+ paintDecoration(p, g, gstroke);
+ g.dispose();
+ }
+
+ protected void paintDecoration(final Polygon p, Graphics2D g, Graphics2D gstroke){
+ fillPolygon(p, g);
+ double middleDistanceBetweenPoints = calcDistanceBetweenPoints();
+ final int[] xpoints = p.xpoints;
+ final int[] ypoints = p.ypoints;
+ final Point lastPoint = new Point(xpoints[0], ypoints[0]);
+ double x0, y0;
+ x0 = lastPoint.x;
+ y0 = lastPoint.y;
+ /* close the path: */
+ double x2, y2; /* the drawing start points. */
+ x2 = x0;
+ y2 = y0;
+ for (int i = p.npoints - 2; i >= 0; --i) {
+ final Point nextPoint = new Point(xpoints[i], ypoints[i]);
+ double x1, y1, x3, y3, dx, dy, dxn, dyn;
+ x1 = nextPoint.x;
+ y1 = nextPoint.y;
+ dx = x1 - x0; /* direction of p0 -> p1 */
+ dy = y1 - y0;
+ final double length = Math.sqrt(dx * dx + dy * dy);
+ dxn = dx / length; /* normalized direction of p0 -> p1 */
+ dyn = dy / length;
+ for (int j = 0;;) {
+ double distanceBetweenPoints = middleDistanceBetweenPoints * random(0.7);
+ if (j + 2* distanceBetweenPoints < length) {
+ j += distanceBetweenPoints;
+ x3 = x0 + j * dxn;
+ /* the drawing end point.*/
+ y3 = y0 + j * dyn;
+ }
+ else {
+ /* last point */
+ break;
+ }
+ paintDecoration(g, gstroke, x2, y2, x3, y3);
+ x2 = x3;
+ y2 = y3;
+ }
+
+ paintDecoration(g, gstroke, x2, y2, x1, y1);
+ x2 = x1;
+ y2 = y1;
+ x0 = x1;
+ y0 = y1;
+ }
+ }
+
+ protected void fillPolygon(final Polygon p, Graphics2D g) {
+ g.fillPolygon(p);
+ g.drawPolygon(p);
+ }
+
+ protected void paintDecoration(Graphics2D g, Graphics2D gstroke, double x0, double y0, double x1, double y1) {
+ double dx, dy;
+ dx = x1 - x0;
+ dy = y1 - y0;
+ final double length = Math.sqrt(dx * dx + dy * dy);
+ double dxn, dyn;
+ dxn = dx / length;
+ dyn = dy / length;
+ paintDecoration(g, gstroke, x0, y0, x1, y1, dx, dy, dxn, dyn);
+ }
+
+ abstract protected void paintDecoration(Graphics2D g, Graphics2D gstroke, double x0, double y0, double x1, double y1,
+ double dx, double dy, double dxn, double dyn);
+
+ protected double calcDistanceBetweenPoints() {
+ final double distanceBetweenPoints = getDistanceToConvexHull();
+ return distanceBetweenPoints;
+ }
+
+ protected double random(double min) {
+ return (min + (1-min) * random.nextDouble());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/CloudViewFactory.java b/freeplane/src/org/freeplane/view/swing/map/cloud/CloudViewFactory.java
new file mode 100644
index 0000000..b71998b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/CloudViewFactory.java
@@ -0,0 +1,23 @@
+package org.freeplane.view.swing.map.cloud;
+
+import java.util.NoSuchElementException;
+
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.cloud.CloudModel.Shape;
+import org.freeplane.view.swing.map.NodeView;
+
+public class CloudViewFactory {
+ public CloudView createCloudView(CloudModel cloudModel, NodeView nodeView){
+ if(null == cloudModel.getShape())
+ return new ArcCloudView(cloudModel, nodeView);
+ if(Shape.ARC.equals(cloudModel.getShape()))
+ return new ArcCloudView(cloudModel, nodeView);
+ if(Shape.STAR.equals(cloudModel.getShape()))
+ return new StarCloudView(cloudModel, nodeView);
+ if(Shape.ROUND_RECT.equals(cloudModel.getShape()))
+ return new RectangleCloudView(cloudModel, nodeView, true);
+ if(Shape.RECT.equals(cloudModel.getShape()))
+ return new RectangleCloudView(cloudModel, nodeView, false);
+ throw new NoSuchElementException();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/ConvexHull.java b/freeplane/src/org/freeplane/view/swing/map/cloud/ConvexHull.java
new file mode 100644
index 0000000..a5fab0b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/ConvexHull.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.view.swing.map.cloud;
+
+import java.awt.Point;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.Vector;
+
+class ConvexHull {
+ protected class thetaComparator implements Comparator<Object> {
+ Point p0;
+
+ public thetaComparator(final Point p0) {
+ this.p0 = new Point(p0);
+ }
+
+ /* the < relation. */
+ public int compare(final Object p1, final Object p2) {
+ final double comp = theta(p0, (Point) p1) - theta(p0, (Point) p2);
+ if (((Point) p1).equals(p2)) {
+ return 0;
+ }
+ if (comp > 0) {
+ return 1;
+ }
+ if (comp < 0) {
+ return -1;
+ }
+ int dx1, dx2, dy1, dy2;
+ dx1 = ((Point) p1).x - (p0).x;
+ dy1 = ((Point) p1).y - (p0).y;
+ dx2 = ((Point) p2).x - (p0).x;
+ dy2 = ((Point) p2).y - (p0).y;
+ final int comp2 = (dx1 * dx1 + dy1 * dy1) - (dx2 * dx2 + dy2 * dy2);
+ if (comp2 > 0) {
+ return -1;
+ }
+ if (comp2 < 0) {
+ return 1;
+ }
+ return 0;
+ }
+
+ double theta(final Point p1, final Point p2) {
+ int dx, dy, ax, ay;
+ double t;
+ dx = p2.x - p1.x;
+ ax = Math.abs(dx);
+ dy = p2.y - p1.y;
+ ay = Math.abs(dy);
+ if ((dx == 0) && (dy == 0)) {
+ t = 0;
+ }
+ else {
+ t = ((double) dy) / ((double) (ax + ay));
+ }
+ if (dx < 0) {
+ t = 2f - t;
+ }
+ else {
+ if (dy < 0) {
+ t = 4f + t;
+ }
+ }
+ return t * 90f;
+ }
+ }
+
+ public Vector<Point>/* <newPoint> */calculateHull(final LinkedList<Point> coordinates) {
+ // use a copy of coordinates since it will get modified in doGraham()
+ return doGraham(new Vector<Point>(coordinates));
+ }
+
+ protected int ccw(final Point p0, final Point p1, final Point p2) {
+ int dx1, dx2, dy1, dy2;
+ dx1 = p1.x - p0.x;
+ dy1 = p1.y - p0.y;
+ dx2 = p2.x - p0.x;
+ dy2 = p2.y - p0.y;
+ final int comp = dx1 * dy2 - dy1 * dx2;
+ if (comp > 0) {
+ return 1;
+ }
+ if (comp < 0) {
+ return -1;
+ }
+ if ((dx1 * dx2 < 0) || (dy1 * dy2 < 0)) {
+ return -1;
+ }
+ if (dx1 * dx1 + dy1 * dy1 >= dx2 * dx2 + dy2 * dy2) {
+ return 0;
+ }
+ return 1;
+ }
+
+ Vector<Point> doGraham(final Vector<Point> p) {
+ int i;
+ int min, m;
+ Point t;
+ min = 0;
+ for (i = 1; i < p.size(); ++i) {
+ if (((Point) p.get(i)).y < ((Point) p.get(min)).y) {
+ min = i;
+ }
+ }
+ for (i = 0; i < p.size(); ++i) {
+ if ((((Point) p.get(i)).y == ((Point) p.get(min)).y) && (((Point) p.get(i)).x > ((Point) p.get(min)).x)) {
+ min = i;
+ }
+ }
+ t = p.get(0);
+ p.set(0, p.get(min));
+ p.set(min, t);
+ final thetaComparator comp = new thetaComparator((Point) p.get(0));
+ Collections.sort(p, comp);
+ p.add(0, new Point((Point) p.get(p.size() - 1)));
+ m = 3;
+ for (i = 4; i < p.size(); ++i) {
+ while (m > 0 && ccw((Point) p.get(m), (Point) p.get(m - 1), (Point) p.get(i)) >= 0) {
+ m--;
+ }
+ m++;
+ t = (Point) p.get(m);
+ p.set(m, p.get(i));
+ p.set(i, t);
+ }
+ p.remove(0);
+ p.setSize(m);
+ return p;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/RectangleCloudView.java b/freeplane/src/org/freeplane/view/swing/map/cloud/RectangleCloudView.java
new file mode 100644
index 0000000..4833eb0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/RectangleCloudView.java
@@ -0,0 +1,49 @@
+package org.freeplane.view.swing.map.cloud;
+
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.view.swing.map.NodeView;
+
+public class RectangleCloudView extends CloudView {
+
+ private final boolean isRound;
+ RectangleCloudView(CloudModel cloudModel, NodeView source, boolean isRound) {
+ super(cloudModel, source);
+ this.isRound = isRound;
+ }
+
+ @Override
+ protected void fillPolygon(Polygon p, Graphics2D g) {
+ }
+
+ @Override
+ protected void paintDecoration(Polygon p, Graphics2D g, Graphics2D gstroke) {
+ final Rectangle bounds = p.getBounds();
+ final int distanceToConvexHull = (int) getDistanceToConvexHull();
+ bounds.x -= distanceToConvexHull;
+ bounds.y -= distanceToConvexHull;
+ bounds.width += 2 * distanceToConvexHull;
+ bounds.height += 2 * distanceToConvexHull;
+ if(isRound){
+ g.fillRoundRect(bounds.x, bounds.y, bounds.width, bounds.height, distanceToConvexHull, distanceToConvexHull);
+ gstroke.drawRoundRect(bounds.x, bounds.y, bounds.width, bounds.height, distanceToConvexHull, distanceToConvexHull);
+ }
+ else{
+ g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
+ gstroke.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);
+ }
+ }
+
+ @Override
+ protected void paintDecoration(Graphics2D g, Graphics2D gstroke, double x0, double y0, double x1, double y1,
+ double dx, double dy, double dxn, double dyn) {
+ }
+
+ @Override
+ protected double getDistanceToConvexHull() {
+ return 0.5 * super.getDistanceToConvexHull();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/StarCloudView.java b/freeplane/src/org/freeplane/view/swing/map/cloud/StarCloudView.java
new file mode 100644
index 0000000..5094dcd
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/cloud/StarCloudView.java
@@ -0,0 +1,35 @@
+package org.freeplane.view.swing.map.cloud;
+
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.view.swing.map.NodeView;
+
+public class StarCloudView extends CloudView {
+
+ StarCloudView(CloudModel cloudModel, NodeView source) {
+ super(cloudModel, source);
+ }
+ protected void paintDecoration(final Graphics2D g, final Graphics2D gstroke, final double x0, final double y0,
+ final double x1, final double y1, double dx, double dy, double dxn, double dyn) {
+ final double xctrl, yctrl;
+ final double middleDistanceToConvexHull = getDistanceToConvexHull();
+ final double distanceToConvexHull = middleDistanceToConvexHull * random(0.5);
+ final double k = random(0.3);
+ xctrl = x0 + .5f * dx * k - distanceToConvexHull * dyn;
+ yctrl = y0 + .5f * dy* k + distanceToConvexHull * dxn;
+ final Polygon shape = new Polygon();
+ shape.addPoint((int)x0, (int)y0);
+ shape.addPoint((int)xctrl, (int)yctrl);
+ shape.addPoint((int)x1, (int)y1);
+ g.fill(shape);
+ gstroke.drawLine((int)x0, (int)y0, (int)xctrl, (int)yctrl);
+ gstroke.drawLine((int)xctrl, (int)yctrl, (int)x1, (int)y1);
+ }
+ @Override
+ protected double getDistanceToConvexHull() {
+ return 3 * super.getDistanceToConvexHull();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/BezierEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/BezierEdgeView.java
new file mode 100644
index 0000000..1223688
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/BezierEdgeView.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.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.CubicCurve2D;
+
+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 BezierEdgeView extends EdgeView {
+ private static final int CHILD_XCTRL = 20;
+ private static final int XCTRL = 12;
+
+ public BezierEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final CubicCurve2D.Float graph = update();
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ g.draw(graph);
+ if (isTargetEclipsed()) {
+ g.setColor(g.getBackground());
+ g.setStroke(EdgeView.getEclipsedStroke());
+ g.draw(graph);
+ g.setStroke(stroke);
+ g.setColor(color);
+ }
+ }
+
+ private CubicCurve2D.Float update() {
+ final Point startControlPoint = getControlPoint(getStartConnectorLocation());
+ final int zoomedXCTRL = getMap().getZoomed(XCTRL);
+ final int xctrl = startControlPoint.x * zoomedXCTRL;
+ final int yctrl = startControlPoint.y * zoomedXCTRL;
+ final Point endControlPoint = getControlPoint(getEndConnectorLocation());
+ final int zoomedChildXCTRL = getMap().getZoomed(CHILD_XCTRL);
+ final int childXctrl = endControlPoint.x * zoomedChildXCTRL;
+ final int childYctrl = endControlPoint.y * zoomedChildXCTRL;
+ final CubicCurve2D.Float graph = new CubicCurve2D.Float();
+ graph.setCurve(start.x, start.y, start.x + xctrl, start.y + yctrl, end.x + childXctrl, end.y + childYctrl, end.x, end.y);
+ return graph;
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ final CubicCurve2D.Float graph = update();
+ return new CollisionDetector().detectCollision(p, graph);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/EdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/EdgeView.java
new file mode 100644
index 0000000..5f7d69a
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/EdgeView.java
@@ -0,0 +1,210 @@
+/*
+ * 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.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Stroke;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MainView.ConnectorLocation;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * This class represents a single Edge of a MindMap.
+ */
+public abstract class EdgeView {
+ protected static final BasicStroke DEF_STROKE = new BasicStroke();
+ static Stroke ECLIPSED_STROKE = null;
+
+ protected static Stroke getEclipsedStroke() {
+ if (EdgeView.ECLIPSED_STROKE == null) {
+ final float dash[] = { 3.0f, 9.0f };
+ EdgeView.ECLIPSED_STROKE = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 12.0f, dash,
+ 0.0f);
+ }
+ return EdgeView.ECLIPSED_STROKE;
+ }
+
+ private final NodeView source;
+ protected Point start, end;
+
+ public void setStart(Point start) {
+ this.start = start;
+ }
+
+ public Point getStart() {
+ return start;
+ }
+
+ public void setEnd(Point end) {
+ this.end = end;
+ }
+
+ public Point getEnd() {
+ return end;
+ }
+
+ private final NodeView target;
+ private Color color;
+ private Integer width;
+ private ConnectorLocation startConnectorLocation;
+ private ConnectorLocation endConnectorLocation;
+
+ protected void createStart() {
+ final MainView mainView = source.getMainView();
+ final MainView targetMainView = target.getMainView();
+
+ final Point relativeLocation = source.getRelativeLocation(target);
+ relativeLocation.x += targetMainView.getWidth()/2;
+ relativeLocation.y += targetMainView.getHeight()/2;
+ start = mainView.getConnectorPoint(relativeLocation);
+ startConnectorLocation = mainView.getConnectorLocation(relativeLocation);
+
+ relativeLocation.x -= targetMainView.getWidth()/2;
+ relativeLocation.y -= targetMainView.getHeight()/2;
+ relativeLocation.x = - relativeLocation.x + mainView.getWidth()/2;
+ relativeLocation.y = - relativeLocation.y + mainView.getHeight()/2;
+ end = target.getMainView().getConnectorPoint(relativeLocation);
+ endConnectorLocation = targetMainView.getConnectorLocation(relativeLocation);
+ }
+
+ protected ConnectorLocation getStartConnectorLocation() {
+ return startConnectorLocation;
+ }
+
+ protected ConnectorLocation getEndConnectorLocation() {
+ return endConnectorLocation;
+ }
+
+ protected Point getControlPoint(ConnectorLocation startConnectorLocation){
+ final int xctrl;
+ final int yctrl;
+ if(ConnectorLocation.LEFT.equals(startConnectorLocation)){
+ xctrl= - 1;
+ yctrl = 0;
+ }
+ else if(ConnectorLocation.RIGHT.equals(startConnectorLocation)){
+ xctrl= 1;
+ yctrl = 0;
+ }
+ else if(ConnectorLocation.TOP.equals(startConnectorLocation)){
+ xctrl= 0;
+ yctrl = - 1;
+ }
+ else if(ConnectorLocation.LEFT.equals(startConnectorLocation)){
+ xctrl= 0;
+ yctrl = 1;
+ }
+ else {
+ xctrl = 0;
+ yctrl = 0;
+ }
+ return new Point(xctrl, yctrl);
+ }
+
+ protected void align(Point start, Point end) {
+ if(1 == Math.abs(start.y - end.y)){
+ end.y = start.y;
+ }
+ }
+
+ public Color getColor() {
+ if (color == null) {
+ color = target.getEdgeColor();
+ }
+ return color;
+ }
+
+ public void setColor(final Color color) {
+ this.color = color;
+ }
+
+ protected MapView getMap() {
+ return getTarget().getMap();
+ }
+
+ /**
+ * @return Returns the source.
+ */
+ public NodeView getSource() {
+ return source;
+ }
+
+ protected Stroke getStroke() {
+ final int width = getWidth();
+ if (width < 0) {
+ return EdgeView.DEF_STROKE;
+ }
+ if (width == 0) {
+ return EdgeView.DEF_STROKE;
+ }
+ return new BasicStroke(width * getMap().getZoom(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
+ }
+
+ /**
+ * @return Returns the target.
+ */
+ public NodeView getTarget() {
+ return target;
+ }
+
+ public int getWidth() {
+ if (width != null) {
+ return width;
+ }
+ final int width = target.getEdgeWidth();
+ return width;
+ }
+
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+
+ protected boolean isTargetEclipsed() {
+ return getTarget().isParentHidden();
+ }
+
+ abstract protected void draw(Graphics2D g);
+
+ public void paint(final Graphics2D g) {
+ final Stroke stroke = g.getStroke();
+ final Color color = g.getColor();
+ draw(g);
+ g.setStroke(stroke);
+ g.setColor(color);
+ }
+
+ public EdgeView(final NodeView source, final NodeView target, final Component paintedComponent) {
+ this.source = source;
+ this.target = target;
+ createStart();
+ UITools.convertPointToAncestor(target.getMainView(), end, paintedComponent);
+ UITools.convertPointToAncestor(source.getMainView(), start, paintedComponent);
+ align(start, end);
+ }
+
+ abstract public boolean detectCollision(Point p);
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/EdgeViewFactory.java b/freeplane/src/org/freeplane/view/swing/map/edge/EdgeViewFactory.java
new file mode 100644
index 0000000..03c7bff
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/EdgeViewFactory.java
@@ -0,0 +1,72 @@
+/*
+ * 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.Component;
+
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.08.2009
+ */
+public class EdgeViewFactory {
+ final private static EdgeViewFactory instance = new EdgeViewFactory();
+
+ public EdgeView getEdge(final NodeView source, final NodeView target, Component paintedComponent) {
+ final EdgeStyle edgeStyle = target.getEdgeStyle();
+ if (source.getMap().getLayoutType() == MapViewLayout.OUTLINE) {
+ if(edgeStyle.equals(EdgeStyle.EDGESTYLE_HIDDEN))
+ return new HiddenOutlineEdgeView(source, target, paintedComponent);
+ return new OutlineEdgeView(source, target, paintedComponent);
+ }
+ if (edgeStyle.equals(EdgeStyle.EDGESTYLE_LINEAR)) {
+ return new LinearEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_BEZIER)) {
+ return new BezierEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_SUMMARY)) {
+ return new SummaryEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_SHARP_LINEAR)) {
+ return new SharpLinearEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_SHARP_BEZIER)) {
+ return new SharpBezierEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_HORIZONTAL)) {
+ return new HorizontalEdgeView(source, target, paintedComponent);
+ }
+ else if (edgeStyle.equals(EdgeStyle.EDGESTYLE_HIDDEN)) {
+ return new HiddenEdgeView(source, target, paintedComponent);
+ }
+ else {
+ System.err.println("Unknown Edge Type.");
+ return new LinearEdgeView(source, target, paintedComponent);
+ }
+ }
+
+ public static EdgeViewFactory getInstance() {
+ return instance;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HiddenEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/HiddenEdgeView.java
new file mode 100644
index 0000000..6d31aae
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/HiddenEdgeView.java
@@ -0,0 +1,70 @@
+/*
+ * 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.edge;
+
+import java.awt.BasicStroke;
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Stroke;
+
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 23, 2009
+ */
+public class HiddenEdgeView extends BezierEdgeView {
+ private static Stroke STROKE;
+
+ public HiddenEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ protected static Stroke getHiddenStroke() {
+ if (HiddenEdgeView.STROKE == null) {
+ final float dash[] = { 5.0f, 5.0f };
+ HiddenEdgeView.STROKE = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 12.0f, dash,
+ 0.0f);
+ }
+ return HiddenEdgeView.STROKE;
+ }
+
+ @Override
+ public Stroke getStroke() {
+ return HiddenEdgeView.getHiddenStroke();
+ }
+
+ @Override
+ public void paint(final Graphics2D g) {
+ if (getSource().isRoot() || !getTarget().isSelected()) {
+ return;
+ }
+ super.paint(g);
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ if (!getTarget().isSelected()) {
+ return false;
+ }
+ return super.detectCollision(p);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java
new file mode 100644
index 0000000..fc4dc8d
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java
@@ -0,0 +1,52 @@
+/*
+ * 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.edge;
+
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * Oct 23, 2011
+ */
+public class HiddenOutlineEdgeView extends OutlineEdgeView {
+
+ public HiddenOutlineEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected Stroke getStroke() {
+ return HiddenEdgeView.getHiddenStroke();
+ }
+
+ @Override
+ public void paint(Graphics2D g) {
+ if (getSource().isRoot() || !getTarget().isSelected()) {
+ return;
+ }
+ super.paint(g);
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java
new file mode 100644
index 0000000..1332d93
--- /dev/null
+++ b/freeplane/src/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.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/LinearEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/LinearEdgeView.java
new file mode 100644
index 0000000..ed61de8
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/LinearEdgeView.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.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.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.link.CollisionDetector;
+
+/**
+ * This class represents a single Edge of a MindMap.
+ */
+public class LinearEdgeView extends EdgeView {
+ public LinearEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ final int w = getWidth();
+ if (w <= 1) {
+ g.drawLine(start.x, start.y, end.x, end.y);
+ if (isTargetEclipsed()) {
+ g.setColor(g.getBackground());
+ g.setStroke(EdgeView.getEclipsedStroke());
+ g.drawLine(start.x, start.y, end.x, end.y);
+ g.setColor(color);
+ g.setStroke(stroke);
+ }
+ }
+ else {
+ final Point startControlPoint = getControlPoint(getStartConnectorLocation());
+ final int zoomedXCTRL = w + 1;
+ final int xctrl = startControlPoint.x * zoomedXCTRL;
+ final int yctrl = startControlPoint.y * zoomedXCTRL;
+ final Point endControlPoint = getControlPoint(getEndConnectorLocation());
+ final int childXctrl = endControlPoint.x * zoomedXCTRL;
+ final int childYctrl = endControlPoint.y * zoomedXCTRL;
+ final int xs[] = { start.x, start.x + xctrl, end.x + childXctrl, end.x };
+ final int ys[] = { start.y, start.y + yctrl, end.y + childYctrl, 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 Line2D line = new Line2D.Float(start, end);
+ return new CollisionDetector().detectCollision(p, line);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/OutlineEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/OutlineEdgeView.java
new file mode 100644
index 0000000..d24f751
--- /dev/null
+++ b/freeplane/src/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.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/SharpBezierEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java
new file mode 100644
index 0000000..f809ad0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java
@@ -0,0 +1,93 @@
+/*
+ * 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.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Stroke;
+import java.awt.geom.CubicCurve2D;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.link.CollisionDetector;
+
+/**
+ * This class represents a sharp Edge of a MindMap.
+ */
+public class SharpBezierEdgeView extends SharpEdgeView {
+ private static final float XCTRL = 12;
+ Point2D.Float one, two;
+ public SharpBezierEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ public Stroke getStroke() {
+ return EdgeView.DEF_STROKE;
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final GeneralPath graph = update();
+ g.setColor(getColor());
+ g.setPaint(getColor());
+ g.setStroke(getStroke());
+ g.fill(graph);
+ g.draw(graph);
+ }
+
+ private GeneralPath update() {
+ final Point startControlPoint = getControlPoint(getStartConnectorLocation());
+ final float zoom = getMap().getZoom();
+ final float zoomedXCTRL = zoom * XCTRL;
+ final float xctrl = startControlPoint.x * zoomedXCTRL;
+ final float yctrl = startControlPoint.y * zoomedXCTRL;
+ final Point endControlPoint = getControlPoint(getEndConnectorLocation());
+ final float w = (getWidth() / 2f + 1) * zoom;
+ final float w2 = w / 2;
+ final int deltaX = getDeltaX();
+ final int deltaY = getDeltaY();
+ final float childXctrl = deltaX > 0 ? endControlPoint.y * w2 : -endControlPoint.y * w2;
+ final float childYctrl = deltaY > 0 ? endControlPoint.x * w2 : -endControlPoint.x * w2;
+
+ one = new Point2D.Float(start.x + xctrl, start.y + yctrl);
+ two = new Point2D.Float(end.x - xctrl, end.y - yctrl);
+ final CubicCurve2D.Float line1 = new CubicCurve2D.Float();
+ final CubicCurve2D.Float line2 = new CubicCurve2D.Float();
+ line1.setCurve(start.x - deltaX, start.y - deltaY, one.x - deltaX, one.y - deltaY, two.x - childXctrl, two.y - childYctrl, end.x - childXctrl/4,
+ end.y - childYctrl / 4);
+ line2.setCurve(end.x + childXctrl/4, end.y + childYctrl / 4, two.x + childXctrl, two.y + childYctrl, one.x + deltaX, one.y + deltaY, start.x + deltaX,
+ start.y + deltaY);
+ final GeneralPath graph = new GeneralPath();
+ graph.append(line1, true);
+ graph.append(line2, true);
+ graph.closePath();
+ return graph;
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ final CubicCurve2D.Float line1 = new CubicCurve2D.Float();
+ line1.setCurve(start.x, start.y, one.x, one.y, two.x, two.y, end.x, end.y);
+ return new CollisionDetector().detectCollision(p, line1);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SharpEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/SharpEdgeView.java
new file mode 100644
index 0000000..579d7a9
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/SharpEdgeView.java
@@ -0,0 +1,78 @@
+/*
+ * 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.edge;
+
+/**
+ * @author Dimitry Polivaev
+ * May 8, 2011
+ */
+import java.awt.Component;
+
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.NodeView;
+
+public abstract class SharpEdgeView extends EdgeView {
+ private int deltaY;
+ private int deltaX;
+
+ protected int getDeltaY() {
+ return deltaY;
+ }
+
+ protected int getDeltaX() {
+ return deltaX;
+ }
+
+ public SharpEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected void createStart() {
+ super.createStart();
+ final int delta = getMap().getZoomed(getWidth() + 1);
+ if (getSource().isRoot()) {
+ final MainView mainView = getSource().getMainView();
+ final double w = mainView.getWidth() / 2;
+ final double x0 = start.x - w;
+ final double w2 = w * w;
+ final double x02 = x0 * x0;
+ if (Double.compare(w2, x02) == 0) {
+ deltaX = 0;
+ deltaY = delta;
+ }
+ else {
+ final int h = mainView.getHeight() / 2;
+ final int y0 = start.y - h;
+ final double k = h / w * x0 / Math.sqrt(w2 - x02);
+ final double dx = delta / Math.sqrt(1 + k * k);
+ deltaX = (int) dx;
+ deltaY = (int) (k * dx);
+ if (y0 > 0) {
+ deltaY = -deltaY;
+ }
+ }
+ }
+ else {
+ deltaX = 0;
+ deltaY = delta;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java
new file mode 100644
index 0000000..1ed38e7
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java
@@ -0,0 +1,64 @@
+/*
+ * 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.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Polygon;
+import java.awt.Stroke;
+
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.link.CollisionDetector;
+
+/**
+ * This class represents a sharp Edge of a MindMap.
+ */
+public class SharpLinearEdgeView extends SharpEdgeView {
+ public SharpLinearEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ public Stroke getStroke() {
+ return EdgeView.DEF_STROKE;
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ g.setColor(getColor());
+ g.setPaint(getColor());
+ g.setStroke(getStroke());
+ final int deltaX = getDeltaX();
+ final int deltaY = getDeltaY();
+ final int xs[] = { start.x + deltaX, end.x, start.x - deltaX};
+ final int ys[] = { start.y + deltaY, end.y, start.y - deltaY };
+ g.fillPolygon(xs, ys, 3);
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ final int w = getMap().getZoomed(getWidth() / 2 + 1);
+ final int xs[] = { start.x, end.x, start.x };
+ final int ys[] = { start.y + w, end.y, start.y - w };
+ final Polygon polygon = new Polygon(xs, ys, 3);
+ return new CollisionDetector().detectCollision(p, polygon);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SummaryEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/SummaryEdgeView.java
new file mode 100644
index 0000000..8aa53cc
--- /dev/null
+++ b/freeplane/src/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 = 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/AConnectorView.java b/freeplane/src/org/freeplane/view/swing/map/link/AConnectorView.java
new file mode 100644
index 0000000..d06c3d0
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/AConnectorView.java
@@ -0,0 +1,104 @@
+/*
+ * 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.view.swing.map.link;
+
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Polygon;
+
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 29, 2010
+ */
+abstract class AConnectorView implements ILinkView {
+ protected final ConnectorModel connectorModel;
+ protected final NodeView source;
+ protected final NodeView target;
+
+ protected double getZoom() {
+ return getMap().getZoom();
+ }
+
+ protected int getZoomed(int i) {
+ return getMap().getZoomed(i);
+ }
+ protected MapView getMap() {
+ return (source == null) ? target.getMap() : source.getMap();
+ }
+
+ /**
+ * @param from
+ * is the another point indicating the direction of the arrow.
+ * @param to
+ * is the start point
+ * @param d
+ */
+ protected void paintArrow(final Point from, final Point to, final Graphics2D g, final double size) {
+ int dx, dy;
+ double dxn, dyn;
+ dx = from.x - to.x;
+ dy = from.y - to.y;
+ final int r2 = dx * dx + dy * dy;
+ if(r2 == 0)
+ return;
+ final double length = Math.sqrt(r2);
+ dxn = size * dx / length;
+ dyn = size * dy / length;
+ final double arrowWidth = .5f;
+ final Polygon p = new Polygon();
+ p.addPoint((to.x), (to.y));
+ p.addPoint((int) (to.x + dxn + arrowWidth * dyn), (int) (to.y + dyn - arrowWidth * dxn));
+ p.addPoint((int) (to.x + dxn - arrowWidth * dyn), (int) (to.y + dyn + arrowWidth * dxn));
+ p.addPoint((to.x), (to.y));
+ g.fillPolygon(p);
+ g.drawPolygon(p);
+ }
+
+ NodeView getSource() {
+ return source;
+ }
+
+ NodeView getTarget() {
+ return target;
+ }
+
+ /**
+ */
+ protected boolean isSourceVisible() {
+ return (source != null && source.isContentVisible());
+ }
+
+ /**
+ */
+ protected boolean isTargetVisible() {
+ return (target != null && target.isContentVisible());
+ }
+
+ public AConnectorView(final ConnectorModel connectorModel, final NodeView source, final NodeView target) {
+ super();
+ this.connectorModel = connectorModel;
+ this.source = source;
+ this.target = target;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/CollisionDetector.java b/freeplane/src/org/freeplane/view/swing/map/link/CollisionDetector.java
new file mode 100644
index 0000000..5f067c2
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/CollisionDetector.java
@@ -0,0 +1,65 @@
+/*
+ * 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.Point;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.08.2009
+ */
+public class CollisionDetector {
+ /** MAXIMAL_RECTANGLE_SIZE_FOR_COLLISION_DETECTION describes itself. */
+ static final private int MAXIMAL_RECTANGLE_SIZE_FOR_COLLISION_DETECTION = 16;
+
+ public boolean detectCollision(final Point p, final Shape shape) {
+ final Rectangle2D rec = getControlRectangle(p);
+ final PathIterator pathIterator = shape.getPathIterator(new AffineTransform(),
+ MAXIMAL_RECTANGLE_SIZE_FOR_COLLISION_DETECTION / 4);
+ double lastCoords[] = new double[6];
+ pathIterator.currentSegment(lastCoords);
+ for (;;) {
+ pathIterator.next();
+ final double nextCoords[] = new double[6];
+ if (pathIterator.isDone() || PathIterator.SEG_CLOSE == pathIterator.currentSegment(nextCoords)) {
+ break;
+ }
+ final double x = Math.min(lastCoords[0], nextCoords[0]) - 1;
+ final double y = Math.min(lastCoords[1], nextCoords[1]) - 1;
+ final double w = Math.abs(lastCoords[0] - nextCoords[0]) + 2;
+ final double h = Math.abs(lastCoords[1] - nextCoords[1]) + 2;
+ if (rec.intersects(x, y, w, h)) {
+ return true;
+ }
+ lastCoords = nextCoords;
+ }
+ return false;
+ }
+
+ private Rectangle2D getControlRectangle(final Point2D p) {
+ final int side = MAXIMAL_RECTANGLE_SIZE_FOR_COLLISION_DETECTION;
+ return new Rectangle2D.Double(p.getX() - side / 2, p.getY() - side / 2, side, side);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java b/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java
new file mode 100644
index 0000000..6a90226
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java
@@ -0,0 +1,501 @@
+/*
+ * 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 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) {
+ 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;
+ 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(selfLink)
+ arrowLinkCurve = createLine(startPoint, startPoint2);
+ else if(isLine)
+ 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)
+ paintArrow(g, startPoint2, startPoint);
+ else if(isLine && endPoint != null)
+ paintArrow(g, endPoint, startPoint);
+ else
+ paintArrow(g, startPoint2, startPoint);
+ }
+ if (isTargetVisible() && !connectorModel.getEndArrow().equals(ArrowType.NONE)) {
+ if (selfLink)
+ paintArrow(g, startPoint, startPoint2);
+ else if(isLine && startPoint != null)
+ 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) {
+ 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) {
+ if(getTarget() == getSource()){
+ if( !connectorModel.getEndArrow().equals(ArrowType.NONE))
+ middleTextRectangle = drawEndPointText(g, middleLabel, startPoint2, startPoint);
+ else
+ middleTextRectangle = drawMiddleLabel(g, middleLabel, startPoint2);
+ }
+ else
+ 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);
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/EdgeLinkView.java b/freeplane/src/org/freeplane/view/swing/map/link/EdgeLinkView.java
new file mode 100644
index 0000000..ecaa34a
--- /dev/null
+++ b/freeplane/src/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.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/ILinkView.java b/freeplane/src/org/freeplane/view/swing/map/link/ILinkView.java
new file mode 100644
index 0000000..3500fa4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/ILinkView.java
@@ -0,0 +1,53 @@
+/*
+ * 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.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+
+import org.freeplane.features.link.ConnectorModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.08.2009
+ */
+public interface ILinkView {
+ /**
+ * Determines, whether or not a given point p is in an epsilon-neighbourhood
+ * for the cubic curve.
+ * @param b
+ */
+ public abstract boolean detectCollision(final Point p, boolean selectedOnly);
+
+ /**
+ * fc: This getter is public, because the view gets the model by click on
+ * the curve.
+ */
+ public abstract ConnectorModel getModel();
+
+ /**
+ * \param iterativeLevel describes the n-th nested arrowLink that is to be
+ * painted.
+ */
+ public abstract void paint(final Graphics graphics);
+
+ public abstract void increaseBounds(final Rectangle innerBounds);
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/OutlineLinkView.java b/freeplane/src/org/freeplane/view/swing/map/link/OutlineLinkView.java
new file mode 100644
index 0000000..4965965
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/OutlineLinkView.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.view.swing.map.link;
+
+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 java.awt.geom.Line2D;
+
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.edge.EdgeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.08.2009
+ */
+public class OutlineLinkView extends EdgeView {
+ private int xs[];
+ private int ys[];
+
+ public OutlineLinkView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @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;
+ }
+
+ @Override
+ protected void createStart() {
+ final MainView startMainView = getSource().getMainView();
+ start = new Point(startMainView.getWidth(), startMainView.getHeight() / 2);
+ final MainView targetMainView = getTarget().getMainView();
+ end = new Point(targetMainView.getWidth(), targetMainView.getHeight() / 2);
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ final int xMiddle = Math.max(start.x, end.x) + getSource().getMap().getZoomed(10);
+ 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);
+}
+
+ @Override
+ protected Stroke getStroke() {
+ return new BasicStroke(getWidth());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/PathBBox.java b/freeplane/src/org/freeplane/view/swing/map/link/PathBBox.java
new file mode 100644
index 0000000..e72de08
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/link/PathBBox.java
@@ -0,0 +1,146 @@
+/*
+ * 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.Shape;
+import java.awt.geom.PathIterator;
+import java.awt.geom.QuadCurve2D;
+import java.awt.geom.Rectangle2D;
+
+class PathBBox {
+ private static void accum(final double[] bounds, final double x, final double y) {
+ bounds[0] = Math.min(bounds[0], x);
+ bounds[1] = Math.min(bounds[1], y);
+ bounds[2] = Math.max(bounds[2], x);
+ bounds[3] = Math.max(bounds[3], y);
+ }
+
+ private static void accumCubic(final double bounds[], final double t, final double curx, final double cury,
+ final double cpx0, final double cpy0, final double cpx1, final double cpy1,
+ final double endx, final double endy) {
+ final double u = (1 - t);
+ final double x = curx * u * u * u + 3.0 * cpx0 * t * u * u + 3.0 * cpx1 * t * t * u + endx * t * t * t;
+ final double y = cury * u * u * u + 3.0 * cpy0 * t * u * u + 3.0 * cpy1 * t * t * u + endy * t * t * t;
+ PathBBox.accum(bounds, x, y);
+ }
+
+ private static void accumQuad(final double bounds[], final double t, final double curx, final double cury,
+ final double cpx0, final double cpy0, final double endx, final double endy) {
+ final double u = (1 - t);
+ final double x = curx * u * u + 2.0 * cpx0 * t * u + endx * t * t;
+ final double y = cury * u * u + 2.0 * cpy0 * t * u + endy * t * t;
+ PathBBox.accum(bounds, x, y);
+ }
+
+ private static int findCubicZeros(final double zeros[], final double cur, final double cp0, final double cp1,
+ final double end) {
+ zeros[0] = (cp0 - cur) * 3.0;
+ zeros[1] = (cp1 - cp0 - cp0 + cur) * 6.0;
+ zeros[2] = (end + (cp0 - cp1) * 3.0 - cur) * 3.0;
+ final int num = QuadCurve2D.solveQuadratic(zeros);
+ int ret = 0;
+ for (int i = 0; i < num; i++) {
+ final double t = zeros[i];
+ if (t > 0 && t < 1) {
+ zeros[ret] = t;
+ ret++;
+ }
+ }
+ return ret;
+ }
+
+ private static double findQuadZero(final double cur, final double cp, final double end) {
+ return -(cp + cp - cur - cur) / (2.0 * (cur - cp - cp + end));
+ }
+
+ public static Rectangle2D getBBox(final Shape s) {
+ boolean first = true;
+ final double bounds[] = new double[4];
+ final double coords[] = new double[6];
+ double curx = 0;
+ double cury = 0;
+ double movx = 0;
+ double movy = 0;
+ double cpx0, cpy0, cpx1, cpy1, endx, endy;
+ for (final PathIterator pi = s.getPathIterator(null); !pi.isDone(); pi.next()) {
+ pi.currentSegment(coords);
+ switch (pi.currentSegment(coords)) {
+ case PathIterator.SEG_MOVETO:
+ movx = curx = coords[0];
+ movy = cury = coords[1];
+ if (first) {
+ bounds[0] = bounds[2] = curx;
+ bounds[1] = bounds[3] = cury;
+ first = false;
+ }
+ else {
+ PathBBox.accum(bounds, curx, cury);
+ }
+ break;
+ case PathIterator.SEG_LINETO:
+ curx = coords[0];
+ cury = coords[1];
+ PathBBox.accum(bounds, curx, cury);
+ break;
+ case PathIterator.SEG_QUADTO:
+ cpx0 = coords[0];
+ cpy0 = coords[1];
+ endx = coords[2];
+ endy = coords[3];
+ double t = PathBBox.findQuadZero(curx, cpx0, endx);
+ if (t > 0 && t < 1) {
+ PathBBox.accumQuad(bounds, t, curx, cury, cpx0, cpy0, endx, endy);
+ }
+ t = PathBBox.findQuadZero(cury, cpy0, endy);
+ if (t > 0 && t < 1) {
+ PathBBox.accumQuad(bounds, t, curx, cury, cpx0, cpy0, endx, endy);
+ }
+ curx = endx;
+ cury = endy;
+ PathBBox.accum(bounds, curx, cury);
+ break;
+ case PathIterator.SEG_CUBICTO:
+ cpx0 = coords[0];
+ cpy0 = coords[1];
+ cpx1 = coords[2];
+ cpy1 = coords[3];
+ endx = coords[4];
+ endy = coords[5];
+ int num = PathBBox.findCubicZeros(coords, curx, cpx0, cpx1, endx);
+ for (int i = 0; i < num; i++) {
+ PathBBox.accumCubic(bounds, coords[i], curx, cury, cpx0, cpy0, cpx1, cpy1, endx, endy);
+ }
+ num = PathBBox.findCubicZeros(coords, cury, cpy0, cpy1, endy);
+ for (int i = 0; i < num; i++) {
+ PathBBox.accumCubic(bounds, coords[i], curx, cury, cpx0, cpy0, cpx1, cpy1, endx, endy);
+ }
+ curx = endx;
+ cury = endy;
+ PathBBox.accum(bounds, curx, cury);
+ break;
+ case PathIterator.SEG_CLOSE:
+ curx = movx;
+ cury = movy;
+ break;
+ }
+ }
+ return new Rectangle2D.Double(bounds[0], bounds[1], bounds[2] - bounds[0], bounds[3] - bounds[1]);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/TextPainter.java b/freeplane/src/org/freeplane/view/swing/map/link/TextPainter.java
new file mode 100644
index 0000000..b42b451
--- /dev/null
+++ b/freeplane/src/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);
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java
new file mode 100644
index 0000000..b5efdd7
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.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.view.swing.map.mindmapmode;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.text.MessageFormat;
+
+import javax.swing.RootPaneContainer;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+
+/**
+ * @author Daniel Polansky
+ */
+class EditNodeExternalApplication extends EditNodeBase {
+
+ public EditNodeExternalApplication(final NodeModel node, final String text, final IEditControl editControl) {
+ super(node, text, editControl);
+ }
+
+ public void show(RootPaneContainer frame) {
+ new Thread() {
+ @Override
+ public void run() {
+ FileWriter writer = null;
+ try {
+ final File temporaryFile = File.createTempFile("tmm", ".html");
+ writer = new FileWriter(temporaryFile);
+ writer.write(EditNodeExternalApplication.this.text);
+ writer.close();
+ final String htmlEditingCommand = ResourceController.getResourceController().getProperty(
+ "html_editing_command");
+ final String expandedHtmlEditingCommand = new MessageFormat(htmlEditingCommand)
+ .format(new String[] { temporaryFile.toString() });
+ final Process htmlEditorProcess = Controller.exec(expandedHtmlEditingCommand);
+ htmlEditorProcess.waitFor();
+ final String content = FileUtils.readFile(temporaryFile);
+ if (content == null) {
+ getEditControl().cancel();
+ }
+ getEditControl().ok(content);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ try {
+ if (writer != null) {
+ writer.close();
+ }
+ }
+ catch (final Exception e1) {
+ }
+ }
+ }
+ }.start();
+ return;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
new file mode 100644
index 0000000..6475e20
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
@@ -0,0 +1,713 @@
+/*
+ * 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.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 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.StyleConstants;
+import javax.swing.text.StyledEditorKit;
+import javax.swing.text.Position.Bias;
+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.ui.ViewController;
+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 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")){
+ 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;
+ }
+ if(textfield.isShowing()){
+ submitText();
+ }
+ else{
+ getEditControl().cancel();
+ }
+ 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;
+ 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"));
+
+ 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));
+ }
+ }
+
+ 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);
+ textfield.getParent().remove(textfield);
+ parent.revalidate();
+ parent.repaint();
+ 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 ViewController viewController = modeController.getController().getViewController();
+ 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.getMapView();
+ 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/ExtendedEditorKit.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java
new file mode 100644
index 0000000..4e6214b
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java
@@ -0,0 +1,58 @@
+/*
+ * 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.view.swing.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JEditorPane;
+import javax.swing.text.StyledDocument;
+import javax.swing.text.StyledEditorKit;
+import com.lightdev.app.shtm.SHTMLEditorKit;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 28, 2010
+ */
+ at SuppressWarnings("serial")
+class ExtendedEditorKit extends StyledEditorKit{
+
+ static public class RemoveStyleAttributeAction extends StyledTextAction {
+ final private Object attribute;
+
+ public RemoveStyleAttributeAction(Object attribute, String name) {
+ super(name);
+ this.attribute = attribute;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final JEditorPane editor = getEditor(e);
+ if(editor == null){
+ return;
+ }
+ final int selectionStart = editor.getSelectionStart();
+ final int selectionEnd = editor.getSelectionEnd();
+ if(selectionStart == selectionEnd){
+ return;
+ }
+ SHTMLEditorKit.removeCharacterAttributes((StyledDocument) editor.getDocument(), attribute, selectionStart, selectionEnd - selectionStart);
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
new file mode 100644
index 0000000..864c73f
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
@@ -0,0 +1,141 @@
+/*
+ * 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) (viewController.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) (viewController.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 = viewController.getFont(node);
+ editNodeWYSIWYG.setTitle("edit_long_node");
+ editNodeWYSIWYG.setFont(font);
+ final Color nodeTextColor = viewController.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() {
+ 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
new file mode 100644
index 0000000..a293270
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/DefaultMapMouseListener.java
@@ -0,0 +1,196 @@
+/*
+ * 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 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().getViewController().getMapView();
+ 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.getViewController().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) {
+ if (e.isPopupTrigger()) {
+ handlePopup(e);
+ }
+ else if (e.getButton() == MouseEvent.BUTTON1){
+ final MapView mapView = getMapView(e.getComponent());
+ if(mapView != null){
+ mapView.setMoveCursor(true);
+ originX = e.getX();
+ originY = e.getY();
+ }
+ }
+ e.consume();
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ final 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 Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
+ final JComponent component = (JComponent) e.getComponent();
+ final MapView mapView = getMapView(component);
+ if(mapView == null)
+ return;
+ final boolean isEventPointVisible = component.getVisibleRect().contains(r);
+ if (!isEventPointVisible) {
+ component.scrollRectToVisible(r);
+ }
+ if (originX >= 0 && isEventPointVisible) {
+ mapView.scrollBy(originX - e.getX(), originY - e.getY());
+ }
+ }
+
+ private MapView getMapView(final Component component) {
+ if(component instanceof MapView)
+ return (MapView) component;
+ return (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java b/freeplane/src/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java
new file mode 100644
index 0000000..0b84ec4
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java
@@ -0,0 +1,84 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.InputEvent;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.util.Set;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IMouseWheelEventHandler;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MapView;
+
+/**
+ * @author foltin
+ */
+public class DefaultMouseWheelListener implements MouseWheelListener {
+ private static final int HORIZONTAL_SCROLL_MASK = InputEvent.SHIFT_MASK | InputEvent.BUTTON1_MASK
+ | InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK;
+ public static final String RESOURCES_WHEEL_VELOCITY = "wheel_velocity";
+ private static int SCROLL_SKIPS = 8;
+ private static final int ZOOM_MASK = InputEvent.CTRL_MASK;
+// // final private Controller controller;
+
+ /**
+ *
+ */
+ public DefaultMouseWheelListener() {
+ super();
+// this.controller = controller;
+ ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.equals(DefaultMouseWheelListener.RESOURCES_WHEEL_VELOCITY)) {
+ DefaultMouseWheelListener.SCROLL_SKIPS = Integer.parseInt(newValue);
+ }
+ }
+ });
+ DefaultMouseWheelListener.SCROLL_SKIPS = ResourceController.getResourceController().getIntProperty(
+ DefaultMouseWheelListener.RESOURCES_WHEEL_VELOCITY, 8);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.ModeController.MouseWheelEventHandler#handleMouseWheelEvent
+ * (java.awt.event.MouseWheelEvent)
+ */
+ public void mouseWheelMoved(final MouseWheelEvent e) {
+ final MapView mapView = (MapView) e.getSource();
+ final ModeController mController = mapView.getModeController();
+ if (mController.isBlocked()) {
+ return;
+ }
+ final Set<IMouseWheelEventHandler> registeredMouseWheelEventHandler = mController.getUserInputListenerFactory()
+ .getMouseWheelEventHandlers();
+ for (final IMouseWheelEventHandler handler : registeredMouseWheelEventHandler) {
+ final boolean result = handler.handleMouseWheelEvent(e);
+ if (result) {
+ return;
+ }
+ }
+ if ((e.getModifiers() & DefaultMouseWheelListener.ZOOM_MASK) != 0) {
+ float newZoomFactor = 1f + Math.abs((float) e.getWheelRotation()) / 10f;
+ if (e.getWheelRotation() < 0) {
+ newZoomFactor = 1 / newZoomFactor;
+ }
+ final float oldZoom = ((MapView) e.getComponent()).getZoom();
+ float newZoom = oldZoom / newZoomFactor;
+ newZoom = (float) Math.rint(newZoom * 1000f) / 1000f;
+ newZoom = Math.max(1f / 32f, newZoom);
+ newZoom = Math.min(32f, newZoom);
+ if (newZoom != oldZoom) {
+ Controller.getCurrentController().getViewController().setZoom(newZoom);
+ }
+ }
+ else if ((e.getModifiers() & DefaultMouseWheelListener.HORIZONTAL_SCROLL_MASK) != 0) {
+ ((MapView) e.getComponent()).scrollBy(DefaultMouseWheelListener.SCROLL_SKIPS * e.getWheelRotation(), 0);
+ }
+ else {
+ ((MapView) e.getComponent()).scrollBy(0, DefaultMouseWheelListener.SCROLL_SKIPS * e.getWheelRotation());
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java b/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
new file mode 100644
index 0000000..59571fc
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
@@ -0,0 +1,139 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+
+import javax.swing.JPopupMenu;
+
+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().getViewController().getMapView();
+ 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
new file mode 100644
index 0000000..ee4d4af
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java
@@ -0,0 +1,383 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.Cursor;
+import java.awt.KeyboardFocusManager;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.geom.Point2D;
+import java.net.URI;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.swing.FocusManager;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ControllerPopupMenuListener;
+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.core.util.SysUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.FoldingController;
+import org.freeplane.features.map.IMapSelection;
+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 {
+ private static final String FOLD_ON_CLICK_INSIDE = "fold_on_click_inside";
+ 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";
+
+ 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 = ((MainView) e.getComponent()).getNodeView();
+ if(nodeV.isDisplayable() && nodeV.getModel().isVisible()
+ && nodeV.getMap() == controller.getMapViewManager().getMapViewComponent())
+ controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
+ }
+ }
+ catch (NullPointerException e) {
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * The mouse has to stay in this region to enable the selection after a
+ * given time.
+ */
+ private Rectangle controlRegionForDelayedSelection;
+// final private ModeController mc;
+ final private ControllerPopupMenuListener popupListener;
+ private Timer timerForDelayedSelection;
+ protected final DoubleClickTimer doubleClickTimer;
+ private boolean wasFocused;
+
+ public DefaultNodeMouseMotionListener() {
+// mc = modeController;
+ popupListener = new ControllerPopupMenuListener();
+ doubleClickTimer = new DoubleClickTimer();
+ }
+
+ private void createTimer(final MouseEvent e) {
+ if(! isInside(e))
+ return;
+ stopTimerForDelayedSelection();
+ if (!JOptionPane.getFrameForComponent(e.getComponent()).isFocused()) {
+ 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 isInFoldingRegion(MouseEvent e) {
+ return ((MainView)e.getComponent()).isInFoldingRegion(e.getPoint());
+ }
+
+ protected boolean isInDragRegion(MouseEvent e) {
+ return ((MainView)e.getComponent()).isInDragRegion(e.getPoint());
+ }
+
+ 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 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 = 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(!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))
+ && !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())
+ extendSelection(e);
+ }
+
+
+ private boolean shouldSelectOnClick(MouseEvent e) {
+ if(isInside(e)){
+ final MainView component = (MainView) e.getComponent();
+ NodeView nodeView = component.getNodeView();
+ return !nodeView.isSelected() || Controller.getCurrentController().getSelection().size() != 1;
+ }
+ return false;
+ }
+
+ 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(! isInside(e))
+ return;
+ stopTimerForDelayedSelection();
+ final NodeView nodeV = ((MainView) e.getComponent()).getNodeView();
+ final Controller controller = Controller.getCurrentController();
+ if (!((MapView) controller.getViewController().getMapView()).isSelected(nodeV)) {
+ controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
+ }
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ createTimer(e);
+ mouseMoved(e);
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ stopTimerForDelayedSelection();
+ final MainView v = (MainView) e.getSource();
+ v.setMouseArea(MouseArea.OUT);
+ }
+
+ public void mouseMoved(final MouseEvent e) {
+ 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);
+ }
+ if (controlRegionForDelayedSelection == null
+ || !controlRegionForDelayedSelection.contains(e.getPoint())) {
+ createTimer(e);
+ }
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ doubleClickTimer.cancel();
+ final MainView component = (MainView) e.getComponent();
+ wasFocused = component.hasFocus();
+ showPopupMenu(e);
+ }
+
+ public boolean wasFocused() {
+ return wasFocused;
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ stopTimerForDelayedSelection();
+ showPopupMenu(e);
+ }
+
+ public void showPopupMenu(final MouseEvent e) {
+ if (! e.isPopupTrigger())
+ return;
+ final boolean inside = isInside(e);
+ final boolean inFoldingRegion = ! inside && isInFoldingRegion(e);
+ if (inside || inFoldingRegion) {
+ if(inside){
+ stopTimerForDelayedSelection();
+ ModeController mc = Controller.getCurrentController().getModeController();
+ final MainView component = (MainView) e.getComponent();
+ final NodeView nodeView = component.getNodeView();
+ if(! nodeView.isSelected()){
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeView.getModel());
+ }
+ final JPopupMenu popupmenu = mc.getUserInputListenerFactory().getNodePopupMenu();
+ showMenuAndConsumeEvent(popupmenu, 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 MainView component = (MainView) e.getComponent();
+ final NodeView nodeView = component.getNodeView();
+ final JPopupMenu popupmenu = foldingController.createFoldingPopupMenu(nodeView.getModel());
+ AutoHide.start(popupmenu);
+ showMenuAndConsumeEvent(popupmenu, e);
+ }
+
+ private void showMenuAndConsumeEvent(final JPopupMenu popupmenu, final MouseEvent e) {
+ if (popupmenu != null) {
+ popupmenu.addHierarchyListener(popupListener);
+ popupmenu.show(e.getComponent(), e.getX(), e.getY());
+ e.consume();
+ }
+ }
+
+ protected boolean isInside(final MouseEvent e) {
+ return new Rectangle(0, 0, e.getComponent().getWidth(), e.getComponent().getHeight()).contains(e.getPoint());
+ }
+
+ protected void stopTimerForDelayedSelection() {
+ if (timerForDelayedSelection != null) {
+ timerForDelayedSelection.cancel();
+ }
+ timerForDelayedSelection = null;
+ controlRegionForDelayedSelection = null;
+ }
+
+ private void extendSelection(final MouseEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final MainView mainView = (MainView) e.getComponent();
+ final NodeModel newlySelectedNode = mainView.getNodeView().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();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java b/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
new file mode 100644
index 0000000..820c7a3
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
@@ -0,0 +1,65 @@
+/*
+ * 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.SwingUtilities;
+
+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;
+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 {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ final NodeView nodeView = (NodeView)SwingUtilities.getAncestorOfClass(NodeView.class, e.getComponent());
+ if(nodeView == null)
+ return;
+ final NodeModel model = nodeView.getModel();
+ TextController controller = TextController.getController();
+ final ZoomableLabel component = (ZoomableLabel) e.getComponent();
+ if(e.getX() < component.getIconWidth())
+ controller.setDetailsHidden(model, ! DetailTextModel.getDetailText(model).isHidden());
+ else if(canEdit(controller) && isEditingStartEventt(e)){
+ ((MTextController) controller).editDetails(model, e, e.isAltDown());
+ }
+ else super.mouseClicked(e);
+ }
+
+ private boolean canEdit(TextController controller) {
+ try {
+ return controller instanceof MTextController;
+ } catch (Throwable e) {
+ return false;
+ }
+ }
+
+ private boolean isEditingStartEventt(MouseEvent e) {
+ return e.getClickCount() == 2;
+ }
+}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java b/freeplane/src/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java
new file mode 100644
index 0000000..afc859f
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+/**
+ * @author Dimitry Polivaev
+ * Oct 1, 2011
+ */
+import java.awt.Cursor;
+import java.awt.event.MouseEvent;
+import java.net.URI;
+
+import org.freeplane.core.ui.AMouseListener;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.map.ZoomableLabel;
+
+public class LinkNavigatorMouseListener extends AMouseListener {
+ public LinkNavigatorMouseListener() {
+ super();
+ }
+
+ public void mouseMoved(final MouseEvent e) {
+ final ZoomableLabel node = ((ZoomableLabel) e.getComponent());
+ String link = node.getLink(e.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 (node.getCursor().getType() != requiredCursor) {
+ node.setCursor(requiredCursor != Cursor.DEFAULT_CURSOR ? new Cursor(requiredCursor) : null);
+ }
+ }
+
+ public void mouseClicked(final MouseEvent e) {
+ final ZoomableLabel component = (ZoomableLabel) e.getComponent();
+ if(e.getClickCount() == 1 && e.getButton() == 1)
+ if(Compat.isPlainEvent(e)){
+ final String link = component.getLink(e.getPoint());
+ if(link != null){
+ if (link != null) {
+ try {
+ UrlManager.getController().loadURL(new URI(link));
+ } catch (Exception ex) {
+ LogUtils.warn(ex);
+ }
+ }
+ return;
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.java b/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.java
new file mode 100644
index 0000000..9c701ce
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.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.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/ModesMenuActionListener.java b/freeplane/src/org/freeplane/view/swing/ui/ModesMenuActionListener.java
new file mode 100644
index 0000000..6cb7292
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/ModesMenuActionListener.java
@@ -0,0 +1,49 @@
+/*
+ * 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/UserInputListenerFactory.java b/freeplane/src/org/freeplane/view/swing/ui/UserInputListenerFactory.java
new file mode 100644
index 0000000..e10a6e6
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/UserInputListenerFactory.java
@@ -0,0 +1,335 @@
+/*
+ * 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.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;
+ 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;
+
+ public UserInputListenerFactory(final ModeController modeController) {
+ 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");
+ }
+
+ private void updateMapList(final String mapsMenuPosition) {
+ 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 = ResourceController.getResourceController().getResource(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 ViewController viewController = Controller.getCurrentController().getViewController();
+ 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
new file mode 100644
index 0000000..859e43e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java
@@ -0,0 +1,65 @@
+/*
+ * 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
new file mode 100644
index 0000000..c7d0b27
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java
@@ -0,0 +1,158 @@
+/*
+ * 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/INodeSelector.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java
new file mode 100644
index 0000000..4c49ba5
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java
@@ -0,0 +1,30 @@
+/*
+ * 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 org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 3, 2011
+ */
+public interface INodeSelector {
+ void nodeSelected(final NodeModel model);
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java
new file mode 100644
index 0000000..0b9e78e
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java
@@ -0,0 +1,160 @@
+/*
+ * 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.Point;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JComponent;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+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.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+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.ui.DefaultMapMouseListener;
+
+/** */
+public class MMapMouseListener extends DefaultMapMouseListener{
+ ConnectorModel draggedLink = null;
+ private Point draggedLinkOldEndPoint;
+ private Point draggedLinkOldStartPoint;
+
+ /**
+ *
+ */
+ public MMapMouseListener() {
+ super();
+ }
+
+ public void mouseDragged(final MouseEvent e) {
+ final MapView mapView = (MapView) e.getComponent();
+ if (draggedLink != null && mapView.getLayoutType().equals(MapViewLayout.MAP)) {
+ final int deltaX = (int) ((e.getX() - originX) / mapView.getZoom());
+ final int deltaY = (int) ((e.getY() - originY) / mapView.getZoom());
+ double distSqToTarget = 0;
+ double distSqToSource = 0;
+ final NodeModel target = draggedLink.getTarget();
+ final NodeView targetView = mapView.getNodeView(target);
+ final NodeView sourceView = mapView.getNodeView(draggedLink.getSource());
+ if (targetView != null && sourceView != null) {
+ final Point targetLinkPoint = targetView.getLinkPoint(draggedLink.getEndInclination());
+ final Point sourceLinkPoint = sourceView.getLinkPoint(draggedLink.getStartInclination());
+ distSqToTarget = targetLinkPoint.distanceSq(originX, originY);
+ distSqToSource = sourceLinkPoint.distanceSq(originX, originY);
+ }
+ if ((targetView == null || sourceView != null) && distSqToSource <= distSqToTarget * 2.25) {
+ final Point changedInclination = draggedLink.getStartInclination();
+ draggedLink.changeInclination(deltaX, deltaY, draggedLink.getSource(), changedInclination);
+ draggedLink.setStartInclination(changedInclination);
+ }
+ if ((sourceView == null || targetView != null) && distSqToTarget <= distSqToSource * 2.25) {
+ final Point changedInclination = draggedLink.getEndInclination();
+ draggedLink.changeInclination(deltaX, deltaY, target, changedInclination);
+ draggedLink.setEndInclination(changedInclination);
+ }
+ originX = e.getX();
+ originY = e.getY();
+ mapView.repaintVisible();
+ }
+ else {
+ super.mouseDragged(e);
+ }
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ super.mousePressed(e);
+ if(e.isPopupTrigger())
+ return;
+ final MapView mapView = (MapView) e.getComponent();
+ final Object object = mapView.detectCollision(new Point(originX, originY));
+ if (object instanceof ConnectorModel) {
+ final ConnectorModel arrowLinkModel = (ConnectorModel) object;
+ final Shape shape = arrowLinkModel.getShape();
+ if (Shape.EDGE_LIKE.equals(shape) || Shape.LINE.equals(shape)) {
+ return;
+ }
+ draggedLink = arrowLinkModel;
+ draggedLinkOldStartPoint = draggedLink.getStartInclination();
+ draggedLinkOldEndPoint = draggedLink.getEndInclination();
+ draggedLink.setShowControlPoints(true);
+ mapView.repaintVisible();
+ }
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ super.mouseReleased(e);
+ if (draggedLink != null) {
+ draggedLink.setShowControlPoints(false);
+ final Point draggedLinkNewStartPoint = draggedLink.getStartInclination();
+ final Point draggedLinkNewEndPoint = draggedLink.getEndInclination();
+ draggedLink.setStartInclination(draggedLinkOldStartPoint);
+ draggedLink.setEndInclination(draggedLinkOldEndPoint);
+ ((MLinkController) LinkController.getController(Controller.getCurrentController().getModeController())).setArrowLinkEndPoints(draggedLink,
+ draggedLinkNewStartPoint, draggedLinkNewEndPoint);
+ final MapView mapView = (MapView) e.getComponent();
+ mapView.repaintVisible();
+ draggedLink = null;
+ }
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+
+ if(e.getClickCount() == 2 && Compat.isCtrlEvent(e)){
+ final MapView mapView = (MapView) e.getComponent();
+ final Object object = mapView.detectCollision(new Point(originX, originY));
+ if(object != null)
+ return;
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IExtension freeNode = modeController.getExtension(FreeNode.class);
+ if(freeNode != null && modeController instanceof MModeController){
+ final JComponent rootContent = mapView.getRoot().getMainView();
+ final Point contentPt = new Point();
+ UITools.convertPointToAncestor(rootContent, contentPt, mapView);
+ final float zoom = mapView.getZoom();
+ final Point eventPoint = e.getPoint();
+ int x =(int) ((eventPoint.x - contentPt.x)/zoom);
+ final int y =(int) ((eventPoint.y - contentPt.y)/zoom);
+ final int rootContentNormalWidth = (int)(rootContent.getWidth()/zoom);
+ final boolean newNodeIsLeft = x < rootContentNormalWidth/2;
+ if(newNodeIsLeft){
+ x = rootContentNormalWidth - x;
+ }
+ final Point pt = new Point(x, y);
+ ((MMapController)modeController.getMapController()).addFreeNode(pt, newNodeIsLeft);
+ }
+ }
+ else
+ super.mouseClicked(e);
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java
new file mode 100644
index 0000000..0429e09
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java
@@ -0,0 +1,96 @@
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.Cursor;
+import java.awt.Rectangle;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceEvent;
+import java.awt.dnd.DragSourceListener;
+import java.awt.dnd.InvalidDnDOperationException;
+import java.awt.event.InputEvent;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.MindMapNodesSelection;
+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.NodeView;
+
+/**
+ * The NodeDragListener which belongs to every NodeView
+ */
+public class MNodeDragListener implements DragGestureListener {
+ public void dragGestureRecognized(final DragGestureEvent e) {
+ final MainView mainView = (MainView) e.getComponent();
+ final NodeView nodeView = mainView.getNodeView();
+ if(! nodeView.isSelected()){
+ nodeView.getMap().getModeController().getController().getSelection().selectAsTheOnlyOneSelected(nodeView.getModel());
+ }
+ Rectangle bounds = new Rectangle(0, 0, mainView.getWidth(), mainView.getHeight());
+ if(!bounds.contains(e.getDragOrigin()))
+ return;
+ final int dragActionType = e.getDragAction();
+ if (dragActionType == DnDConstants.ACTION_MOVE) {
+ final NodeModel node = nodeView.getModel();
+ if (node.isRoot()) {
+ if(! isLinkDragEvent(e))
+ return;
+ }
+ }
+ final String dragActionName;
+ Cursor cursor = getCursorByAction(dragActionType);
+ if (isLinkDragEvent(e)) {
+ cursor = DragSource.DefaultLinkDrop;
+ dragActionName = "LINK";
+ }
+ else if ((e.getTriggerEvent().getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK) != 0) {
+ cursor = DragSource.DefaultCopyDrop;
+ dragActionName = "COPY";
+ }
+ else {
+ dragActionName = "MOVE";
+ }
+ final Transferable t = ClipboardController.getController().copy(Controller.getCurrentController().getSelection());
+ ((MindMapNodesSelection) t).setDropAction(dragActionName);
+ try {
+ e.startDrag(cursor, t, new DragSourceListener() {
+ public void dragDropEnd(final DragSourceDropEvent dsde) {
+ }
+
+ public void dragEnter(final DragSourceDragEvent e) {
+ }
+
+ public void dragExit(final DragSourceEvent dse) {
+ }
+
+ public void dragOver(final DragSourceDragEvent dsde) {
+ }
+
+ public void dropActionChanged(final DragSourceDragEvent dsde) {
+ dsde.getDragSourceContext().setCursor(getCursorByAction(dsde.getUserAction()));
+ }
+ });
+ }
+ catch (final InvalidDnDOperationException ex) {
+ }
+ }
+
+ private boolean isLinkDragEvent(final DragGestureEvent e) {
+ return (e.getTriggerEvent().getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0;
+ }
+
+ public Cursor getCursorByAction(final int dragAction) {
+ switch (dragAction) {
+ case DnDConstants.ACTION_COPY:
+ return DragSource.DefaultCopyDrop;
+ case DnDConstants.ACTION_LINK:
+ return DragSource.DefaultLinkDrop;
+ default:
+ return DragSource.DefaultMoveDrop;
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
new file mode 100644
index 0000000..da85fd8
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
@@ -0,0 +1,218 @@
+/*
+ * 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.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+
+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.NodeView;
+
+public class MNodeDropListener implements DropTargetListener {
+// 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) {
+ if (isDragAcceptable(dtde)) {
+ dtde.acceptDrag(DnDConstants.ACTION_MOVE);
+ }
+ else {
+ dtde.rejectDrag();
+ }
+ }
+
+ public void dragExit(final DropTargetEvent e) {
+ final Component draggedNode = e.getDropTargetContext().getComponent();
+ ((MainView) draggedNode).setDraggedOver(NodeView.DRAGGED_OVER_NO);
+ draggedNode.repaint();
+ }
+
+ public void dragOver(final DropTargetDragEvent e) {
+ final MainView draggedNode = (MainView) e.getDropTargetContext().getComponent();
+ final int oldDraggedOver = draggedNode.getDraggedOver();
+ draggedNode.setDraggedOver(e.getLocation());
+ final int newDraggedOver = draggedNode.getDraggedOver();
+ final boolean repaint = newDraggedOver != oldDraggedOver;
+ if (repaint) {
+ draggedNode.repaint();
+ }
+ }
+
+ 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 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
new file mode 100644
index 0000000..9be48a7
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java
@@ -0,0 +1,384 @@
+/*
+ * 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.IMouseListener;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+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.getViewController().getMapView());
+ 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.getViewController().getMapView());
+ 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.getViewController().getMapView());
+ 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) MTextController.getController();
+ textController.getEventQueue().activate(e);
+ textController.edit(FirstAction.EDIT_CURRENT, false);
+ }
+ }
+ }
+ super.mouseClicked(e);
+ }
+
+ 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) {
+ doubleClickTimer.cancel();
+ setClickDelay();
+ if (isInDragRegion(e)) {
+ if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == (InputEvent.BUTTON1_DOWN_MASK)) {
+ 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);
+ }
+
+ 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/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java
new file mode 100644
index 0000000..8182115
--- /dev/null
+++ b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java
@@ -0,0 +1,60 @@
+/*
+ * 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.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+
+import javax.swing.JDialog;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 3, 2011
+ */
+public class NodeSelector implements INodeSelector {
+ private NodeModel node = null;
+ private JDialog dialog;
+ NodeModel getNode() {
+ return node;
+ }
+ public void nodeSelected(NodeModel node) {
+ this.node = node;
+ dialog.setVisible(false);
+ }
+ public void show(final Component component, final INodeSelector externalSelector) {
+ node = null;
+ dialog = UITools.createCancelDialog(component, TextUtils.getText("node_selector"), TextUtils.getText("node_selector_message"));
+ UITools.setDialogLocationRelativeTo(dialog, component);
+ dialog.getRootPane().addAncestorListener(new GlassPaneManager(SwingUtilities.getRootPane(component), this));
+ dialog.addComponentListener(new ComponentAdapter() {
+ @Override
+ public void componentHidden(ComponentEvent e) {
+ externalSelector.nodeSelected(node);
+ }
+ });
+ dialog.setVisible(true);
+ }
+}
diff --git a/freeplane/svg-src/Negative.svg b/freeplane/svg-src/Negative.svg
new file mode 100644
index 0000000..31b093c
--- /dev/null
+++ b/freeplane/svg-src/Negative.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="16px"
+ height="16px"
+ id="svg3331"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="Positive.svg">
+ <defs
+ id="defs3333">
+ <linearGradient
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4119">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4627451;"
+ offset="0"
+ id="stop4135" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4133" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective3339" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8457534,1.8137181,-1.0895853,1.2969875,-6.3729184,-18.281717)"
+ cx="9.5579424"
+ cy="2.1020255"
+ fx="9.5579424"
+ fy="2.1020255"
+ r="6.3613076" />
+ <inkscape:perspective
+ id="perspective4375"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4397"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.144272"
+ inkscape:cy="8"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1238"
+ inkscape:window-height="743"
+ inkscape:window-x="38"
+ inkscape:window-y="35"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3336">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4153);fill-opacity:1;stroke:#800000;stroke-width:1.25884606999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ sodipodi:cx="11.442575"
+ sodipodi:cy="3.3636138"
+ sodipodi:rx="5.8612852"
+ sodipodi:ry="6.3391075"
+ d="m 17.303861,3.3636138 a 5.8612852,6.3391075 0 1 1 -11.7225708,0 5.8612852,6.3391075 0 1 1 11.7225708,0 z"
+ transform="matrix(1.2391853,0,0,1.1457794,-6.1794722,4.1460412)" />
+ <path
+ style="fill:#800000;stroke:#800000;stroke-width:1.99742854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4.998714,7.9888933 c 6.002572,0.04998 6.002572,0 6.002572,0"
+ id="path4218" />
+ </g>
+</svg>
diff --git a/freeplane/svg-src/Neutral.svg b/freeplane/svg-src/Neutral.svg
new file mode 100644
index 0000000..efac045
--- /dev/null
+++ b/freeplane/svg-src/Neutral.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="16px"
+ height="16px"
+ id="svg3331"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="Neutral.svg"
+ inkscape:export-filename="Neutral.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3333">
+ <linearGradient
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4119">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4627451;"
+ offset="0"
+ id="stop4135" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4133" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective3339" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8457534,1.8137181,-1.0895853,1.2969875,-6.3729184,-18.281717)"
+ cx="9.5579424"
+ cy="2.1020255"
+ fx="9.5579424"
+ fy="2.1020255"
+ r="6.3613076" />
+ <inkscape:perspective
+ id="perspective4375"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4397"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="14.177139"
+ inkscape:cy="8.4145272"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1238"
+ inkscape:window-height="743"
+ inkscape:window-x="38"
+ inkscape:window-y="35"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3336">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4153);fill-opacity:1;stroke:#000000;stroke-width:1.25884606999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ sodipodi:cx="11.442575"
+ sodipodi:cy="3.3636138"
+ sodipodi:rx="5.8612852"
+ sodipodi:ry="6.3391075"
+ d="m 17.303861,3.3636138 a 5.8612852,6.3391075 0 1 1 -11.7225708,0 5.8612852,6.3391075 0 1 1 11.7225708,0 z"
+ transform="matrix(1.2391853,0,0,1.1457794,-6.1794722,4.1460412)" />
+ <text
+ xml:space="preserve"
+ style="font-size:13.28897858px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="3.7758179"
+ y="12.83737"
+ id="text4868"><tspan
+ sodipodi:role="line"
+ id="tspan4870"
+ x="3.7758179"
+ y="12.83737">0</tspan></text>
+ </g>
+</svg>
diff --git a/freeplane/svg-src/Positive.svg b/freeplane/svg-src/Positive.svg
new file mode 100644
index 0000000..b4f7634
--- /dev/null
+++ b/freeplane/svg-src/Positive.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="16px"
+ height="16px"
+ id="svg3331"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="Negative.svg">
+ <defs
+ id="defs3333">
+ <linearGradient
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4119">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4627451;"
+ offset="0"
+ id="stop4135" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4133" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective3339" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8457534,1.8137181,-1.0895853,1.2969875,-6.3729184,-18.281717)"
+ cx="9.5579424"
+ cy="2.1020255"
+ fx="9.5579424"
+ fy="2.1020255"
+ r="6.3613076" />
+ <inkscape:perspective
+ id="perspective4375"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4397"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.144272"
+ inkscape:cy="8"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1238"
+ inkscape:window-height="743"
+ inkscape:window-x="38"
+ inkscape:window-y="35"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3336">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4153);fill-opacity:1;stroke:#008000;stroke-width:1.25884606999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ sodipodi:cx="11.442575"
+ sodipodi:cy="3.3636138"
+ sodipodi:rx="5.8612852"
+ sodipodi:ry="6.3391075"
+ d="m 17.303861,3.3636138 a 5.8612852,6.3391075 0 1 1 -11.7225708,0 5.8612852,6.3391075 0 1 1 11.7225708,0 z"
+ transform="matrix(1.2391853,0,0,1.1457794,-6.1794722,4.1460412)" />
+ <path
+ style="fill:#800000;stroke:#008000;stroke-width:1.99742854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4.9987141,7.9888933 c 6.0025719,0.04998 6.0025719,0 6.0025719,0"
+ id="path4218" />
+ <path
+ style="fill:#800000;stroke:#008000;stroke-width:1.99742854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 8.0111067,4.9987138 c -0.04998,6.0025722 0,6.0025722 0,6.0025722"
+ id="path4218-1" />
+ </g>
+</svg>
diff --git a/freeplane/svg-src/Very_Positive.svg b/freeplane/svg-src/Very_Positive.svg
new file mode 100644
index 0000000..9cb9f7a
--- /dev/null
+++ b/freeplane/svg-src/Very_Positive.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="16px"
+ height="16px"
+ id="svg3331"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="Very_Positive2.svg"
+ inkscape:export-filename="/home/stefan/Projekte/Freeplane/Rating/VeryPositive.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3333">
+ <linearGradient
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#71f700;stop-opacity:0.88484848;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#007c00;stop-opacity:1;"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4119">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4627451;"
+ offset="0"
+ id="stop4135" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4133" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective3339" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.86076877,0.9520075,-0.568892,0.60165362,1.9469962,-8.5839267)"
+ cx="9.5579424"
+ cy="2.1020255"
+ fx="9.5579424"
+ fy="2.1020255"
+ r="6.3613076" />
+ <inkscape:perspective
+ id="perspective4375"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4397"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.144272"
+ inkscape:cy="6.6287706"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1238"
+ inkscape:window-height="743"
+ inkscape:window-x="38"
+ inkscape:window-y="35"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3336">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4153);fill-opacity:1;stroke:#008000;stroke-width:1.25884606999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ sodipodi:cx="11.442575"
+ sodipodi:cy="3.3636138"
+ sodipodi:rx="5.8612852"
+ sodipodi:ry="6.3391075"
+ d="m 17.303861,3.3636138 a 5.8612852,6.3391075 0 1 1 -11.7225708,0 5.8612852,6.3391075 0 1 1 11.7225708,0 z"
+ transform="matrix(1.2391853,0,0,1.1457794,-6.1794722,4.1460412)" />
+ <path
+ style="fill:#800000;stroke:#225500;stroke-width:1.99742854000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4.9987141,7.9888933 c 6.0025719,0.04998 6.0025719,0 6.0025719,0"
+ id="path4218" />
+ <path
+ style="fill:#800000;stroke:#225500;stroke-width:1.99742854000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 8.0111067,4.9987138 c -0.04998,6.0025722 0,6.0025722 0,6.0025722"
+ id="path4218-1" />
+ </g>
+</svg>
diff --git a/freeplane/svg-src/very_negative.svg b/freeplane/svg-src/very_negative.svg
new file mode 100644
index 0000000..8cff550
--- /dev/null
+++ b/freeplane/svg-src/very_negative.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="16px"
+ height="16px"
+ id="svg3331"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="very_negative.svg"
+ inkscape:export-filename="/home/stefan/Projekte/Freeplane/Rating/Very_Negative.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3333">
+ <linearGradient
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#ff5858;stop-opacity:0.82352942;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#b90000;stop-opacity:1;"
+ offset="1"
+ id="stop4224" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4119">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4627451;"
+ offset="0"
+ id="stop4135" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4133" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective3339" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.69417901,0.83442016,-0.59347173,0.57750702,3.5909189,-7.4092765)"
+ cx="9.5579424"
+ cy="2.1020255"
+ fx="9.5579424"
+ fy="2.1020255"
+ r="6.3613076" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="2.144272"
+ inkscape:cy="7.8925395"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1238"
+ inkscape:window-height="743"
+ inkscape:window-x="38"
+ inkscape:window-y="35"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3336">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4153);fill-opacity:1;stroke:#800000;stroke-width:1.25884606999999993;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ sodipodi:cx="11.442575"
+ sodipodi:cy="3.3636138"
+ sodipodi:rx="5.8612852"
+ sodipodi:ry="6.3391075"
+ d="m 17.303861,3.3636138 a 5.8612852,6.3391075 0 1 1 -11.7225708,0 5.8612852,6.3391075 0 1 1 11.7225708,0 z"
+ transform="matrix(1.2391853,0,0,1.1457794,-6.1794722,4.1460412)" />
+ <path
+ style="fill:#000000;stroke:#501616;stroke-width:1.99742854000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4.9987141,7.9888933 c 6.0025719,0.04998 6.0025719,0 6.0025719,0"
+ id="path4218" />
+ </g>
+</svg>
diff --git a/freeplane/viewer-resources/freeplane.properties b/freeplane/viewer-resources/freeplane.properties
new file mode 100644
index 0000000..6e3d89e
--- /dev/null
+++ b/freeplane/viewer-resources/freeplane.properties
@@ -0,0 +1,695 @@
+#/*$Id$*/ -*- mode:sh -*-
+#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, 25.5.07: tabbed pane or not:
+use_tabbed_pane=true
+
+
+# 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
+BackAction.icon=/images/MoveTo_PrevNode.png
+BoldAction.icon=/images/Bold16.png
+CenterSelectedNodeAction.icon=/images/CenterSelectedNodeAction.png
+CloudAction.icon=/images/Cloud24.png
+CloudColorAction.icon=/images/Colors24.png
+ConnectorColorAction.icon=/images/connector_color.png
+CopyAction.icon=/images/editcopy.png
+CutAction.icon=/images/editcut.png
+DeleteAction.icon=/images/editdelete.png
+DeleteDetailsAction.icon =/images/DeleteDetailsAction.png
+EditDetailsInDialogAction.icon =/images/EditDetailsInDialogAction.png
+EditFilterAction.icon=/images/Btn_edit.gif
+EncryptedMap.icon=/images/lock.png
+EnterPassword.icon=/images/unlock.png
+ExternalImageAddAction.icon =/images/ExternalImageAddAction.png
+FaqOpenURLAction.icon=/images/Link.png
+FindAction.icon=/images/filefind.png
+FitToPage.icon=/images/FitToPage.png
+FoldAllAction.icon=/images/fold_all.png
+FoldOneLevelAction.icon=/images/fold_one_level.png
+FormatCopy.icon=/images/colorpicker.png
+FormatPaste.icon=/images/color_fill.png
+ForwardAction.icon=/images/MoveTo_NextNode.png
+GotoLinkNodeAction.icon=/images/Link.png
+IconSelectionPlugin.icon=/images/kalzium.png
+ItalicAction.icon=/images/Italic16.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
+OpenAction.icon=/images/fileopen.png
+OpenURLAction.icon=/images/Link.png
+PasteAction.icon=/images/editpaste.png
+PrintAction.icon=/images/fileprint.png
+PrintDirectAction.icon=/images/fileprint.png
+RedoAction.icon=/images/redo.png
+RemoveAllIconsAction.icon=/images/icon_trash.png
+RemoveConnectorAction.icon=/images/remove_connector.png
+RemoveIcon_0_Action.icon=/images/remove_first_icon.png
+RemoveIconAction.icon=/images/remove_last_icon.png
+SaveAction.icon=/images/filesave.png
+SaveAsAction.icon=/images/filesaveas.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
+ShowFilterToolbarAction.icon=/images/filter.png
+SplitNode.icon=/images/split_node.png
+UndoAction.icon=/images/undo.png
+UnfoldAllAction.icon=/images/unfold_all.png
+UnfoldOneLevelAction.icon=/images/unfold_one_level.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
+
+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=https://sourceforge.net/apps/mantisbt/freeplane/set_project.php?project_id=1&ref=view_all_bug_page.php
+featureTrackerLocation=https://sourceforge.net/apps/mantisbt/freeplane/set_project.php?project_id=7&ref=view_all_bug_page.php
+helpForumLocation=https://sourceforge.net/apps/phpbb/freeplane/viewforum.php?f=1
+
+toolTipManager.initialDelay = 750
+toolTipManager.dismissDelay = 4000
+toolTipManager.reshowDelay = 500
+
+# fc, 28.4.2008: used and displayed icons as a list with divider ';':
+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;\
+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%;\
+attach;desktop_new;list;edit;kaddressbook;pencil;folder;kmail;Mail;revision;\
+video;audio;executable;image;internet;internet_warning;mindmap;narrative;\
+flag-black;flag-blue;flag-green;flag-orange;flag-pink;flag;flag-yellow;\
+clock;clock2;hourglass;calendar;\
+family;female1;female2;females;male1;male2;males;fema;group;\
+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
+fbarVisible=false
+leftToolbarVisible=true
+
+load_next_properties=
+filter_toolbar_visible=false
+editor_extra_width=80
+
+menubarVisible.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
+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
+
+link_icon=Link.png
+link_local_icon=LinkLocal.png
+mail_icon=Mail.png
+executable_icon=Executable.png
+always_load_last_maps=false
+browsemode_initial_map = map.mm
+standard_template=standard.mm
+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
+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
+
+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-2012
+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
+image_cache=ic_file
+edit_on_double_click=true
+fold_on_click_inside=true
+apply_system_screen_resolution = true
+user_defined_screen_resolution = 96
+org.freeplane.plugin.bugreport.userid=
+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
diff --git a/freeplane/viewer-resources/images/AttributesView.png b/freeplane/viewer-resources/images/AttributesView.png
new file mode 100644
index 0000000..e8edbfb
Binary files /dev/null and b/freeplane/viewer-resources/images/AttributesView.png differ
diff --git a/freeplane/viewer-resources/images/BranchStats.png b/freeplane/viewer-resources/images/BranchStats.png
new file mode 100644
index 0000000..66d2762
Binary files /dev/null and b/freeplane/viewer-resources/images/BranchStats.png differ
diff --git a/freeplane/viewer-resources/images/Btn_edit.gif b/freeplane/viewer-resources/images/Btn_edit.gif
new file mode 100644
index 0000000..1a6f83c
Binary files /dev/null and b/freeplane/viewer-resources/images/Btn_edit.gif differ
diff --git a/freeplane/viewer-resources/images/CenterSelectedNodeAction.png b/freeplane/viewer-resources/images/CenterSelectedNodeAction.png
new file mode 100644
index 0000000..96d26f3
Binary files /dev/null and b/freeplane/viewer-resources/images/CenterSelectedNodeAction.png differ
diff --git a/freeplane/viewer-resources/images/Executable.png b/freeplane/viewer-resources/images/Executable.png
new file mode 100644
index 0000000..25b1d7a
Binary files /dev/null and b/freeplane/viewer-resources/images/Executable.png differ
diff --git a/freeplane/viewer-resources/images/IconNotFound.png b/freeplane/viewer-resources/images/IconNotFound.png
new file mode 100644
index 0000000..993b3b9
Binary files /dev/null and b/freeplane/viewer-resources/images/IconNotFound.png differ
diff --git a/freeplane/viewer-resources/images/Link.png b/freeplane/viewer-resources/images/Link.png
new file mode 100644
index 0000000..c83b5ff
Binary files /dev/null and b/freeplane/viewer-resources/images/Link.png differ
diff --git a/freeplane/viewer-resources/images/LinkLocal.png b/freeplane/viewer-resources/images/LinkLocal.png
new file mode 100644
index 0000000..5fe19fb
Binary files /dev/null and b/freeplane/viewer-resources/images/LinkLocal.png differ
diff --git a/freeplane/viewer-resources/images/Mail.png b/freeplane/viewer-resources/images/Mail.png
new file mode 100644
index 0000000..d5a6eda
Binary files /dev/null and b/freeplane/viewer-resources/images/Mail.png differ
diff --git a/freeplane/viewer-resources/images/MapStats.png b/freeplane/viewer-resources/images/MapStats.png
new file mode 100644
index 0000000..baf0a52
Binary files /dev/null and b/freeplane/viewer-resources/images/MapStats.png differ
diff --git a/freeplane/viewer-resources/images/ShowSelectionAsRectangleAction.png b/freeplane/viewer-resources/images/ShowSelectionAsRectangleAction.png
new file mode 100644
index 0000000..f20e8b0
Binary files /dev/null and b/freeplane/viewer-resources/images/ShowSelectionAsRectangleAction.png differ
diff --git a/freeplane/viewer-resources/images/ZoomIn24.png b/freeplane/viewer-resources/images/ZoomIn24.png
new file mode 100644
index 0000000..7d5953c
Binary files /dev/null and b/freeplane/viewer-resources/images/ZoomIn24.png differ
diff --git a/freeplane/viewer-resources/images/ZoomOut24.png b/freeplane/viewer-resources/images/ZoomOut24.png
new file mode 100644
index 0000000..35ff482
Binary files /dev/null and b/freeplane/viewer-resources/images/ZoomOut24.png differ
diff --git a/freeplane/viewer-resources/images/applies_to_filtered_nodes.png b/freeplane/viewer-resources/images/applies_to_filtered_nodes.png
new file mode 100644
index 0000000..a24f81b
Binary files /dev/null and b/freeplane/viewer-resources/images/applies_to_filtered_nodes.png differ
diff --git a/freeplane/viewer-resources/images/apply_quick_filter.png b/freeplane/viewer-resources/images/apply_quick_filter.png
new file mode 100644
index 0000000..4b2d2ce
Binary files /dev/null and b/freeplane/viewer-resources/images/apply_quick_filter.png differ
diff --git a/freeplane/viewer-resources/images/back.png b/freeplane/viewer-resources/images/back.png
new file mode 100644
index 0000000..1b7f399
Binary files /dev/null and b/freeplane/viewer-resources/images/back.png differ
diff --git a/freeplane/viewer-resources/images/calendar_clock_red.png b/freeplane/viewer-resources/images/calendar_clock_red.png
new file mode 100644
index 0000000..e3a593a
Binary files /dev/null and b/freeplane/viewer-resources/images/calendar_clock_red.png differ
diff --git a/freeplane/viewer-resources/images/calendar_red.png b/freeplane/viewer-resources/images/calendar_red.png
new file mode 100644
index 0000000..2533a15
Binary files /dev/null and b/freeplane/viewer-resources/images/calendar_red.png differ
diff --git a/freeplane/viewer-resources/images/close.png b/freeplane/viewer-resources/images/close.png
new file mode 100644
index 0000000..5e0ebf5
Binary files /dev/null and b/freeplane/viewer-resources/images/close.png differ
diff --git a/freeplane/viewer-resources/images/copy_single.png b/freeplane/viewer-resources/images/copy_single.png
new file mode 100644
index 0000000..e741f6e
Binary files /dev/null and b/freeplane/viewer-resources/images/copy_single.png differ
diff --git a/freeplane/viewer-resources/images/edit_filtering_condition.png b/freeplane/viewer-resources/images/edit_filtering_condition.png
new file mode 100644
index 0000000..241fe6f
Binary files /dev/null and b/freeplane/viewer-resources/images/edit_filtering_condition.png differ
diff --git a/freeplane/viewer-resources/images/editcopy.png b/freeplane/viewer-resources/images/editcopy.png
new file mode 100644
index 0000000..d9be659
Binary files /dev/null and b/freeplane/viewer-resources/images/editcopy.png differ
diff --git a/freeplane/viewer-resources/images/empty.png b/freeplane/viewer-resources/images/empty.png
new file mode 100644
index 0000000..bf91fa5
Binary files /dev/null and b/freeplane/viewer-resources/images/empty.png differ
diff --git a/freeplane/viewer-resources/images/filefind.png b/freeplane/viewer-resources/images/filefind.png
new file mode 100644
index 0000000..811f275
Binary files /dev/null and b/freeplane/viewer-resources/images/filefind.png differ
diff --git a/freeplane/viewer-resources/images/filenew.png b/freeplane/viewer-resources/images/filenew.png
new file mode 100644
index 0000000..107bee7
Binary files /dev/null and b/freeplane/viewer-resources/images/filenew.png differ
diff --git a/freeplane/viewer-resources/images/fileprint.png b/freeplane/viewer-resources/images/fileprint.png
new file mode 100644
index 0000000..6058d7b
Binary files /dev/null and b/freeplane/viewer-resources/images/fileprint.png differ
diff --git a/freeplane/viewer-resources/images/filter.gif b/freeplane/viewer-resources/images/filter.gif
new file mode 100644
index 0000000..699cefb
Binary files /dev/null and b/freeplane/viewer-resources/images/filter.gif differ
diff --git a/freeplane/viewer-resources/images/filter.png b/freeplane/viewer-resources/images/filter.png
new file mode 100644
index 0000000..69efe38
Binary files /dev/null and b/freeplane/viewer-resources/images/filter.png differ
diff --git a/freeplane/viewer-resources/images/filter_selected_nodes.png b/freeplane/viewer-resources/images/filter_selected_nodes.png
new file mode 100644
index 0000000..eec881b
Binary files /dev/null and b/freeplane/viewer-resources/images/filter_selected_nodes.png differ
diff --git a/freeplane/viewer-resources/images/find_next.png b/freeplane/viewer-resources/images/find_next.png
new file mode 100644
index 0000000..416d6e7
Binary files /dev/null and b/freeplane/viewer-resources/images/find_next.png differ
diff --git a/freeplane/viewer-resources/images/find_previous.png b/freeplane/viewer-resources/images/find_previous.png
new file mode 100644
index 0000000..8ea40cf
Binary files /dev/null and b/freeplane/viewer-resources/images/find_previous.png differ
diff --git a/freeplane/viewer-resources/images/fold_all.png b/freeplane/viewer-resources/images/fold_all.png
new file mode 100644
index 0000000..7bfa137
Binary files /dev/null and b/freeplane/viewer-resources/images/fold_all.png differ
diff --git a/freeplane/viewer-resources/images/fold_one_level.png b/freeplane/viewer-resources/images/fold_one_level.png
new file mode 100644
index 0000000..2f059ab
Binary files /dev/null and b/freeplane/viewer-resources/images/fold_one_level.png differ
diff --git a/freeplane/viewer-resources/images/forward.png b/freeplane/viewer-resources/images/forward.png
new file mode 100644
index 0000000..81ac999
Binary files /dev/null and b/freeplane/viewer-resources/images/forward.png differ
diff --git a/freeplane/viewer-resources/images/highlight_matching_nodes.png b/freeplane/viewer-resources/images/highlight_matching_nodes.png
new file mode 100644
index 0000000..743fe8e
Binary files /dev/null and b/freeplane/viewer-resources/images/highlight_matching_nodes.png differ
diff --git a/freeplane/viewer-resources/images/icons/0%.png b/freeplane/viewer-resources/images/icons/0%.png
new file mode 100644
index 0000000..797c04d
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/0%.png differ
diff --git a/freeplane/viewer-resources/images/icons/100%.png b/freeplane/viewer-resources/images/icons/100%.png
new file mode 100644
index 0000000..20c2a13
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/100%.png differ
diff --git a/freeplane/viewer-resources/images/icons/25%.png b/freeplane/viewer-resources/images/icons/25%.png
new file mode 100644
index 0000000..9e81757
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/25%.png differ
diff --git a/freeplane/viewer-resources/images/icons/50%.png b/freeplane/viewer-resources/images/icons/50%.png
new file mode 100644
index 0000000..9dd37d5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/50%.png differ
diff --git a/freeplane/viewer-resources/images/icons/75%.png b/freeplane/viewer-resources/images/icons/75%.png
new file mode 100644
index 0000000..ee6e6f3
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/75%.png differ
diff --git a/freeplane/viewer-resources/images/icons/Mail.png b/freeplane/viewer-resources/images/icons/Mail.png
new file mode 100644
index 0000000..66553c3
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/Mail.png differ
diff --git a/freeplane/viewer-resources/images/icons/addition.png b/freeplane/viewer-resources/images/icons/addition.png
new file mode 100644
index 0000000..931bd85
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/addition.png differ
diff --git a/freeplane/viewer-resources/images/icons/attach.png b/freeplane/viewer-resources/images/icons/attach.png
new file mode 100644
index 0000000..2e4657e
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/attach.png differ
diff --git a/freeplane/viewer-resources/images/icons/audio.png b/freeplane/viewer-resources/images/icons/audio.png
new file mode 100644
index 0000000..d83124b
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/audio.png differ
diff --git a/freeplane/viewer-resources/images/icons/back.png b/freeplane/viewer-resources/images/icons/back.png
new file mode 100644
index 0000000..27930f9
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/back.png differ
diff --git a/freeplane/viewer-resources/images/icons/bee.png b/freeplane/viewer-resources/images/icons/bee.png
new file mode 100644
index 0000000..a5ef8d7
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/bee.png differ
diff --git a/freeplane/viewer-resources/images/icons/bell.png b/freeplane/viewer-resources/images/icons/bell.png
new file mode 100644
index 0000000..354f6d5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/bell.png differ
diff --git a/freeplane/viewer-resources/images/icons/bookmark.png b/freeplane/viewer-resources/images/icons/bookmark.png
new file mode 100644
index 0000000..2b61e4a
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/bookmark.png differ
diff --git a/freeplane/viewer-resources/images/icons/broken-line.png b/freeplane/viewer-resources/images/icons/broken-line.png
new file mode 100644
index 0000000..cc55444
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/broken-line.png differ
diff --git a/freeplane/viewer-resources/images/icons/button.png b/freeplane/viewer-resources/images/icons/button.png
new file mode 100644
index 0000000..70e4314
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/button.png differ
diff --git a/freeplane/viewer-resources/images/icons/button_cancel.png b/freeplane/viewer-resources/images/icons/button_cancel.png
new file mode 100644
index 0000000..0711270
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/button_cancel.png differ
diff --git a/freeplane/viewer-resources/images/icons/button_ok.png b/freeplane/viewer-resources/images/icons/button_ok.png
new file mode 100644
index 0000000..dd1c408
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/button_ok.png differ
diff --git a/freeplane/viewer-resources/images/icons/calendar.png b/freeplane/viewer-resources/images/icons/calendar.png
new file mode 100644
index 0000000..c7fa6be
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/calendar.png differ
diff --git a/freeplane/viewer-resources/images/icons/checked.png b/freeplane/viewer-resources/images/icons/checked.png
new file mode 100644
index 0000000..a75a4b5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/checked.png differ
diff --git a/freeplane/viewer-resources/images/icons/clanbomber.png b/freeplane/viewer-resources/images/icons/clanbomber.png
new file mode 100644
index 0000000..270f771
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/clanbomber.png differ
diff --git a/freeplane/viewer-resources/images/icons/clock.png b/freeplane/viewer-resources/images/icons/clock.png
new file mode 100644
index 0000000..380c419
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/clock.png differ
diff --git a/freeplane/viewer-resources/images/icons/clock2.png b/freeplane/viewer-resources/images/icons/clock2.png
new file mode 100644
index 0000000..2bfcf44
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/clock2.png differ
diff --git a/freeplane/viewer-resources/images/icons/closed.png b/freeplane/viewer-resources/images/icons/closed.png
new file mode 100644
index 0000000..7f0fa48
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/closed.png differ
diff --git a/freeplane/viewer-resources/images/icons/decrypted.png b/freeplane/viewer-resources/images/icons/decrypted.png
new file mode 100644
index 0000000..90b0193
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/decrypted.png differ
diff --git a/freeplane/viewer-resources/images/icons/desktop_new.png b/freeplane/viewer-resources/images/icons/desktop_new.png
new file mode 100644
index 0000000..0337ddd
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/desktop_new.png differ
diff --git a/freeplane/viewer-resources/images/icons/division.png b/freeplane/viewer-resources/images/icons/division.png
new file mode 100644
index 0000000..dbb04e4
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/division.png differ
diff --git a/freeplane/viewer-resources/images/icons/down.png b/freeplane/viewer-resources/images/icons/down.png
new file mode 100644
index 0000000..9ea6d45
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/down.png differ
diff --git a/freeplane/viewer-resources/images/icons/edit.png b/freeplane/viewer-resources/images/icons/edit.png
new file mode 100644
index 0000000..aeca7aa
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/edit.png differ
diff --git a/freeplane/viewer-resources/images/icons/encrypted.png b/freeplane/viewer-resources/images/icons/encrypted.png
new file mode 100644
index 0000000..4f15c63
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/encrypted.png differ
diff --git a/freeplane/viewer-resources/images/icons/executable.png b/freeplane/viewer-resources/images/icons/executable.png
new file mode 100644
index 0000000..d4d9f96
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/executable.png differ
diff --git a/freeplane/viewer-resources/images/icons/family.png b/freeplane/viewer-resources/images/icons/family.png
new file mode 100644
index 0000000..abeb561
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/family.png differ
diff --git a/freeplane/viewer-resources/images/icons/fema.png b/freeplane/viewer-resources/images/icons/fema.png
new file mode 100644
index 0000000..f2691a9
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/fema.png differ
diff --git a/freeplane/viewer-resources/images/icons/female1.png b/freeplane/viewer-resources/images/icons/female1.png
new file mode 100644
index 0000000..a67091f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/female1.png differ
diff --git a/freeplane/viewer-resources/images/icons/female2.png b/freeplane/viewer-resources/images/icons/female2.png
new file mode 100644
index 0000000..7202015
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/female2.png differ
diff --git a/freeplane/viewer-resources/images/icons/females.png b/freeplane/viewer-resources/images/icons/females.png
new file mode 100644
index 0000000..84b1349
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/females.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-black.png b/freeplane/viewer-resources/images/icons/flag-black.png
new file mode 100644
index 0000000..3394ebb
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-black.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-blue.png b/freeplane/viewer-resources/images/icons/flag-blue.png
new file mode 100644
index 0000000..3bee08a
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-blue.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-green.png b/freeplane/viewer-resources/images/icons/flag-green.png
new file mode 100644
index 0000000..07850a2
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-green.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-orange.png b/freeplane/viewer-resources/images/icons/flag-orange.png
new file mode 100644
index 0000000..a5a4346
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-orange.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-pink.png b/freeplane/viewer-resources/images/icons/flag-pink.png
new file mode 100644
index 0000000..221114c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-pink.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag-yellow.png b/freeplane/viewer-resources/images/icons/flag-yellow.png
new file mode 100644
index 0000000..c29b9cf
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag-yellow.png differ
diff --git a/freeplane/viewer-resources/images/icons/flag.png b/freeplane/viewer-resources/images/icons/flag.png
new file mode 100644
index 0000000..be26f26
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/flag.png differ
diff --git a/freeplane/viewer-resources/images/icons/folder.png b/freeplane/viewer-resources/images/icons/folder.png
new file mode 100644
index 0000000..f34809f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/folder.png differ
diff --git a/freeplane/viewer-resources/images/icons/forward.png b/freeplane/viewer-resources/images/icons/forward.png
new file mode 100644
index 0000000..af3668f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/forward.png differ
diff --git a/freeplane/viewer-resources/images/icons/freemind_butterfly.png b/freeplane/viewer-resources/images/icons/freemind_butterfly.png
new file mode 100644
index 0000000..896188f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/freemind_butterfly.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-0.png b/freeplane/viewer-resources/images/icons/full-0.png
new file mode 100644
index 0000000..253af36
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-0.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-1.png b/freeplane/viewer-resources/images/icons/full-1.png
new file mode 100644
index 0000000..a2adb49
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-1.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-2.png b/freeplane/viewer-resources/images/icons/full-2.png
new file mode 100644
index 0000000..4796906
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-2.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-3.png b/freeplane/viewer-resources/images/icons/full-3.png
new file mode 100644
index 0000000..66acf1c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-3.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-4.png b/freeplane/viewer-resources/images/icons/full-4.png
new file mode 100644
index 0000000..595d587
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-4.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-5.png b/freeplane/viewer-resources/images/icons/full-5.png
new file mode 100644
index 0000000..bffcee9
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-5.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-6.png b/freeplane/viewer-resources/images/icons/full-6.png
new file mode 100644
index 0000000..9618296
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-6.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-7.png b/freeplane/viewer-resources/images/icons/full-7.png
new file mode 100644
index 0000000..69f057d
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-7.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-8.png b/freeplane/viewer-resources/images/icons/full-8.png
new file mode 100644
index 0000000..64b20a8
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-8.png differ
diff --git a/freeplane/viewer-resources/images/icons/full-9.png b/freeplane/viewer-resources/images/icons/full-9.png
new file mode 100644
index 0000000..754226f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/full-9.png differ
diff --git a/freeplane/viewer-resources/images/icons/go.png b/freeplane/viewer-resources/images/icons/go.png
new file mode 100644
index 0000000..0fe8843
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/go.png differ
diff --git a/freeplane/viewer-resources/images/icons/gohome.png b/freeplane/viewer-resources/images/icons/gohome.png
new file mode 100644
index 0000000..a47001d
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/gohome.png differ
diff --git a/freeplane/viewer-resources/images/icons/group.png b/freeplane/viewer-resources/images/icons/group.png
new file mode 100644
index 0000000..c2c76e5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/group.png differ
diff --git a/freeplane/viewer-resources/images/icons/help.png b/freeplane/viewer-resources/images/icons/help.png
new file mode 100644
index 0000000..31c4e67
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/help.png differ
diff --git a/freeplane/viewer-resources/images/icons/hourglass.png b/freeplane/viewer-resources/images/icons/hourglass.png
new file mode 100644
index 0000000..84f9cdd
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/hourglass.png differ
diff --git a/freeplane/viewer-resources/images/icons/idea.png b/freeplane/viewer-resources/images/icons/idea.png
new file mode 100644
index 0000000..b2c4be8
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/idea.png differ
diff --git a/freeplane/viewer-resources/images/icons/image.png b/freeplane/viewer-resources/images/icons/image.png
new file mode 100644
index 0000000..bc38937
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/image.png differ
diff --git a/freeplane/viewer-resources/images/icons/info.png b/freeplane/viewer-resources/images/icons/info.png
new file mode 100644
index 0000000..c7719ba
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/info.png differ
diff --git a/freeplane/viewer-resources/images/icons/internet.png b/freeplane/viewer-resources/images/icons/internet.png
new file mode 100644
index 0000000..4824f4f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/internet.png differ
diff --git a/freeplane/viewer-resources/images/icons/internet_warning.png b/freeplane/viewer-resources/images/icons/internet_warning.png
new file mode 100644
index 0000000..c62303f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/internet_warning.png differ
diff --git a/freeplane/viewer-resources/images/icons/kaddressbook.png b/freeplane/viewer-resources/images/icons/kaddressbook.png
new file mode 100644
index 0000000..e1067af
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/kaddressbook.png differ
diff --git a/freeplane/viewer-resources/images/icons/kmail.png b/freeplane/viewer-resources/images/icons/kmail.png
new file mode 100644
index 0000000..56325b6
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/kmail.png differ
diff --git a/freeplane/viewer-resources/images/icons/knotify.png b/freeplane/viewer-resources/images/icons/knotify.png
new file mode 100644
index 0000000..9bea5a0
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/knotify.png differ
diff --git a/freeplane/viewer-resources/images/icons/korn.png b/freeplane/viewer-resources/images/icons/korn.png
new file mode 100644
index 0000000..275f026
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/korn.png differ
diff --git a/freeplane/viewer-resources/images/icons/ksmiletris.png b/freeplane/viewer-resources/images/icons/ksmiletris.png
new file mode 100644
index 0000000..54ab5b0
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/ksmiletris.png differ
diff --git a/freeplane/viewer-resources/images/icons/launch.png b/freeplane/viewer-resources/images/icons/launch.png
new file mode 100644
index 0000000..30f8e3d
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/launch.png differ
diff --git a/freeplane/viewer-resources/images/icons/licq.png b/freeplane/viewer-resources/images/icons/licq.png
new file mode 100644
index 0000000..5ea5e4d
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/licq.png differ
diff --git a/freeplane/viewer-resources/images/icons/list.png b/freeplane/viewer-resources/images/icons/list.png
new file mode 100644
index 0000000..1827654
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/list.png differ
diff --git a/freeplane/viewer-resources/images/icons/male1.png b/freeplane/viewer-resources/images/icons/male1.png
new file mode 100644
index 0000000..6dfa853
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/male1.png differ
diff --git a/freeplane/viewer-resources/images/icons/male2.png b/freeplane/viewer-resources/images/icons/male2.png
new file mode 100644
index 0000000..f2e9819
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/male2.png differ
diff --git a/freeplane/viewer-resources/images/icons/males.png b/freeplane/viewer-resources/images/icons/males.png
new file mode 100644
index 0000000..54b7fe4
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/males.png differ
diff --git a/freeplane/viewer-resources/images/icons/messagebox_warning.png b/freeplane/viewer-resources/images/icons/messagebox_warning.png
new file mode 100644
index 0000000..dfc69db
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/messagebox_warning.png differ
diff --git a/freeplane/viewer-resources/images/icons/mindmap.png b/freeplane/viewer-resources/images/icons/mindmap.png
new file mode 100644
index 0000000..8f70fac
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/mindmap.png differ
diff --git a/freeplane/viewer-resources/images/icons/multiplication.png b/freeplane/viewer-resources/images/icons/multiplication.png
new file mode 100644
index 0000000..dc607a5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/multiplication.png differ
diff --git a/freeplane/viewer-resources/images/icons/narrative.png b/freeplane/viewer-resources/images/icons/narrative.png
new file mode 100644
index 0000000..209350c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/narrative.png differ
diff --git a/freeplane/viewer-resources/images/icons/negative.png b/freeplane/viewer-resources/images/icons/negative.png
new file mode 100644
index 0000000..26dbff4
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/negative.png differ
diff --git a/freeplane/viewer-resources/images/icons/neutral.png b/freeplane/viewer-resources/images/icons/neutral.png
new file mode 100644
index 0000000..4f9eb54
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/neutral.png differ
diff --git a/freeplane/viewer-resources/images/icons/password.png b/freeplane/viewer-resources/images/icons/password.png
new file mode 100644
index 0000000..f7e8e59
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/password.png differ
diff --git a/freeplane/viewer-resources/images/icons/pencil.png b/freeplane/viewer-resources/images/icons/pencil.png
new file mode 100644
index 0000000..b371127
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/pencil.png differ
diff --git a/freeplane/viewer-resources/images/icons/penguin.png b/freeplane/viewer-resources/images/icons/penguin.png
new file mode 100644
index 0000000..808dabd
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/penguin.png differ
diff --git a/freeplane/viewer-resources/images/icons/positive.png b/freeplane/viewer-resources/images/icons/positive.png
new file mode 100644
index 0000000..cf254b1
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/positive.png differ
diff --git a/freeplane/viewer-resources/images/icons/prepare.png b/freeplane/viewer-resources/images/icons/prepare.png
new file mode 100644
index 0000000..260be28
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/prepare.png differ
diff --git a/freeplane/viewer-resources/images/icons/redo.png b/freeplane/viewer-resources/images/icons/redo.png
new file mode 100644
index 0000000..69cff22
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/redo.png differ
diff --git a/freeplane/viewer-resources/images/icons/revision.png b/freeplane/viewer-resources/images/icons/revision.png
new file mode 100644
index 0000000..9e54025
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/revision.png differ
diff --git a/freeplane/viewer-resources/images/icons/smiley-angry.png b/freeplane/viewer-resources/images/icons/smiley-angry.png
new file mode 100644
index 0000000..43d0871
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/smiley-angry.png differ
diff --git a/freeplane/viewer-resources/images/icons/smiley-neutral.png b/freeplane/viewer-resources/images/icons/smiley-neutral.png
new file mode 100644
index 0000000..89b9b27
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/smiley-neutral.png differ
diff --git a/freeplane/viewer-resources/images/icons/smiley-oh.png b/freeplane/viewer-resources/images/icons/smiley-oh.png
new file mode 100644
index 0000000..3e1284c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/smiley-oh.png differ
diff --git a/freeplane/viewer-resources/images/icons/smily_bad.png b/freeplane/viewer-resources/images/icons/smily_bad.png
new file mode 100644
index 0000000..15bd61c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/smily_bad.png differ
diff --git a/freeplane/viewer-resources/images/icons/stop-sign.png b/freeplane/viewer-resources/images/icons/stop-sign.png
new file mode 100644
index 0000000..a978ed2
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/stop-sign.png differ
diff --git a/freeplane/viewer-resources/images/icons/stop.png b/freeplane/viewer-resources/images/icons/stop.png
new file mode 100644
index 0000000..a092f72
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/stop.png differ
diff --git a/freeplane/viewer-resources/images/icons/subtraction.png b/freeplane/viewer-resources/images/icons/subtraction.png
new file mode 100644
index 0000000..924fb6f
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/subtraction.png differ
diff --git a/freeplane/viewer-resources/images/icons/unchecked.png b/freeplane/viewer-resources/images/icons/unchecked.png
new file mode 100644
index 0000000..38e2b19
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/unchecked.png differ
diff --git a/freeplane/viewer-resources/images/icons/up.png b/freeplane/viewer-resources/images/icons/up.png
new file mode 100644
index 0000000..284181c
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/up.png differ
diff --git a/freeplane/viewer-resources/images/icons/user_icon.png b/freeplane/viewer-resources/images/icons/user_icon.png
new file mode 100644
index 0000000..d43c949
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/user_icon.png differ
diff --git a/freeplane/viewer-resources/images/icons/very_negative.png b/freeplane/viewer-resources/images/icons/very_negative.png
new file mode 100644
index 0000000..9588243
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/very_negative.png differ
diff --git a/freeplane/viewer-resources/images/icons/very_positive.png b/freeplane/viewer-resources/images/icons/very_positive.png
new file mode 100644
index 0000000..e3269ce
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/very_positive.png differ
diff --git a/freeplane/viewer-resources/images/icons/video.png b/freeplane/viewer-resources/images/icons/video.png
new file mode 100644
index 0000000..af904d5
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/video.png differ
diff --git a/freeplane/viewer-resources/images/icons/wizard.png b/freeplane/viewer-resources/images/icons/wizard.png
new file mode 100644
index 0000000..be4f3e8
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/wizard.png differ
diff --git a/freeplane/viewer-resources/images/icons/xmag.png b/freeplane/viewer-resources/images/icons/xmag.png
new file mode 100644
index 0000000..08d31e0
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/xmag.png differ
diff --git a/freeplane/viewer-resources/images/icons/yes.png b/freeplane/viewer-resources/images/icons/yes.png
new file mode 100644
index 0000000..d3c09a2
Binary files /dev/null and b/freeplane/viewer-resources/images/icons/yes.png differ
diff --git a/freeplane/viewer-resources/images/knotes.png b/freeplane/viewer-resources/images/knotes.png
new file mode 100644
index 0000000..bdc8101
Binary files /dev/null and b/freeplane/viewer-resources/images/knotes.png differ
diff --git a/freeplane/viewer-resources/images/lock.png b/freeplane/viewer-resources/images/lock.png
new file mode 100644
index 0000000..eda1e16
Binary files /dev/null and b/freeplane/viewer-resources/images/lock.png differ
diff --git a/freeplane/viewer-resources/images/note_black_and_transp.png b/freeplane/viewer-resources/images/note_black_and_transp.png
new file mode 100644
index 0000000..6d36202
Binary files /dev/null and b/freeplane/viewer-resources/images/note_black_and_transp.png differ
diff --git a/freeplane/viewer-resources/images/number.png b/freeplane/viewer-resources/images/number.png
new file mode 100644
index 0000000..b17113d
Binary files /dev/null and b/freeplane/viewer-resources/images/number.png differ
diff --git a/freeplane/viewer-resources/images/outline_view.png b/freeplane/viewer-resources/images/outline_view.png
new file mode 100644
index 0000000..8df5a57
Binary files /dev/null and b/freeplane/viewer-resources/images/outline_view.png differ
diff --git a/freeplane/viewer-resources/images/print_preview.png b/freeplane/viewer-resources/images/print_preview.png
new file mode 100644
index 0000000..5eee3d4
Binary files /dev/null and b/freeplane/viewer-resources/images/print_preview.png differ
diff --git a/freeplane/viewer-resources/images/quit.png b/freeplane/viewer-resources/images/quit.png
new file mode 100644
index 0000000..b3ccbff
Binary files /dev/null and b/freeplane/viewer-resources/images/quit.png differ
diff --git a/freeplane/viewer-resources/images/reapply_filter.png b/freeplane/viewer-resources/images/reapply_filter.png
new file mode 100644
index 0000000..c5f99bf
Binary files /dev/null and b/freeplane/viewer-resources/images/reapply_filter.png differ
diff --git a/freeplane/viewer-resources/images/redo_filter.png b/freeplane/viewer-resources/images/redo_filter.png
new file mode 100644
index 0000000..afca311
Binary files /dev/null and b/freeplane/viewer-resources/images/redo_filter.png differ
diff --git a/freeplane/viewer-resources/images/remove_filtering.png b/freeplane/viewer-resources/images/remove_filtering.png
new file mode 100644
index 0000000..9b232ff
Binary files /dev/null and b/freeplane/viewer-resources/images/remove_filtering.png differ
diff --git a/freeplane/viewer-resources/images/select_all_found_nodes.png b/freeplane/viewer-resources/images/select_all_found_nodes.png
new file mode 100644
index 0000000..f74bb89
Binary files /dev/null and b/freeplane/viewer-resources/images/select_all_found_nodes.png differ
diff --git a/freeplane/viewer-resources/images/showAttributes.png b/freeplane/viewer-resources/images/showAttributes.png
new file mode 100644
index 0000000..3efa6f3
Binary files /dev/null and b/freeplane/viewer-resources/images/showAttributes.png differ
diff --git a/freeplane/viewer-resources/images/show_ancestors.png b/freeplane/viewer-resources/images/show_ancestors.png
new file mode 100644
index 0000000..befd0a2
Binary files /dev/null and b/freeplane/viewer-resources/images/show_ancestors.png differ
diff --git a/freeplane/viewer-resources/images/show_descendants.png b/freeplane/viewer-resources/images/show_descendants.png
new file mode 100644
index 0000000..c6cd04f
Binary files /dev/null and b/freeplane/viewer-resources/images/show_descendants.png differ
diff --git a/freeplane/viewer-resources/images/text.png b/freeplane/viewer-resources/images/text.png
new file mode 100644
index 0000000..43580d8
Binary files /dev/null and b/freeplane/viewer-resources/images/text.png differ
diff --git a/freeplane/viewer-resources/images/undo_filter.png b/freeplane/viewer-resources/images/undo_filter.png
new file mode 100644
index 0000000..993cef9
Binary files /dev/null and b/freeplane/viewer-resources/images/undo_filter.png differ
diff --git a/freeplane/viewer-resources/images/unfold.png b/freeplane/viewer-resources/images/unfold.png
new file mode 100644
index 0000000..0347b30
Binary files /dev/null and b/freeplane/viewer-resources/images/unfold.png differ
diff --git a/freeplane/viewer-resources/images/unfold_all.png b/freeplane/viewer-resources/images/unfold_all.png
new file mode 100644
index 0000000..485f074
Binary files /dev/null and b/freeplane/viewer-resources/images/unfold_all.png differ
diff --git a/freeplane/viewer-resources/images/unfold_filtered_ancestors.png b/freeplane/viewer-resources/images/unfold_filtered_ancestors.png
new file mode 100644
index 0000000..5df2a55
Binary files /dev/null and b/freeplane/viewer-resources/images/unfold_filtered_ancestors.png differ
diff --git a/freeplane/viewer-resources/images/unfold_one_level.png b/freeplane/viewer-resources/images/unfold_one_level.png
new file mode 100644
index 0000000..5e4ed8c
Binary files /dev/null and b/freeplane/viewer-resources/images/unfold_one_level.png differ
diff --git a/freeplane/viewer-resources/images/unlock.png b/freeplane/viewer-resources/images/unlock.png
new file mode 100644
index 0000000..90b0193
Binary files /dev/null and b/freeplane/viewer-resources/images/unlock.png differ
diff --git a/freeplane/viewer-resources/special_applet.properties b/freeplane/viewer-resources/special_applet.properties
new file mode 100644
index 0000000..194d902
--- /dev/null
+++ b/freeplane/viewer-resources/special_applet.properties
@@ -0,0 +1,2 @@
+highlight_formulas = false
+image_cache=disable
\ No newline at end of file
diff --git a/freeplane/viewer-resources/styles/viewer_standard.mm b/freeplane/viewer-resources/styles/viewer_standard.mm
new file mode 100644
index 0000000..d25757d
--- /dev/null
+++ b/freeplane/viewer-resources/styles/viewer_standard.mm
@@ -0,0 +1,17 @@
+<map version="0.9.0">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node TEXT="viewer standard">
+<hook NAME="MapStyle" max_node_width="600">
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node">
+<stylenode LOCALIZED_TEXT="styles.predefined">
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork">
+<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
+<edge STYLE="bezier" COLOR="#808080" WIDTH="1"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+</node>
+</map>
diff --git a/freeplane/viewer-resources/translations/Resources_en.properties b/freeplane/viewer-resources/translations/Resources_en.properties
new file mode 100644
index 0000000..eefe7e6
--- /dev/null
+++ b/freeplane/viewer-resources/translations/Resources_en.properties
@@ -0,0 +1,1769 @@
+about_text = Freeplane - free mind mapping and knowledge building software
+AboutAction.text = About
+acceleratorPresets = Hot key presets
+accelerators_loading_error = Can not load accelerators from {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title = Change format of nodes
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Change pattern
+accessories/plugins/EncryptNode.properties_0 = Choose password for protected (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 password protection (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 = TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Exports the map as a TWiki document.
+accessories/plugins/ExportWithXSLT.tooltip = This is an uniform export method.
+accessories/plugins/ExportWithXSLT_Applet.text = Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exports the map as a java browser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exports the map as a flash application.
+accessories/plugins/ExportWithXSLT_HTML.text = XHTML (JavaScript version)...
+accessories/plugins/ExportWithXSLT_HTML3.text = 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>
+action_keystroke_in_use_error = Keystroke {0} requested for action {1} is already in use for action {2}
+active = Active
+actual_map_styles = Map conditional styles applied to node
+actual_node_styles = Node conditional styles applied to node
+add = &Add
+AddConnectorAction.text = Connect
+AddElementaryConditionAction.text = Add
+AddLocalLinkAction.text = Add local hyperlink
+AddMenuItemLinkAction.text = Add hyperlink to menu item...
+AddOnDetailsPanel.authored.by = By {0}
+AddOnDetailsPanel.header.function = Function
+AddOnDetailsPanel.header.menu = Menu location
+AddOnDetailsPanel.header.shortcut = Shortcut
+AddOnDetailsPanel.homepage = Homepage:
+addons.installer.canceled = Installation canceled
+addons.installer.confirm.licence = <html><body><h1>License</h1>{0}<p><p><em>Do you accept this license?</em></p></body></html>
+addons.installer.failed = Installation failed: {0}
+addons.installer.freeplaneversion.format.error = Format error in {0} (value: {1})
+addons.installer.groovy.script.name = Script name {0} does not end with ".groovy"
+addons.installer.html.script = Script body may not be formatted as HTML
+addons.installer.install = Install
+addons.installer.invalid.keyboard.shortcut = Invalid shortcut {0}.
+addons.installer.licence.unchanged = License is unchanged
+addons.installer.map.structure = Error in map structure: {0}
+addons.installer.missing.child.nodes = Missing child nodes: {0}
+addons.installer.missing.permission.attribute = Script {0}: missing permission attributes {1}
+addons.installer.missing.properties = Missing properties: {0}
+addons.installer.missing.translation = Missing translation of {0} for locale {1}
+addons.installer.no.scripts = No scripts found
+addons.installer.no.zipdata = No zip data found
+addons.installer.nonstandard.permissions = The script requests the following permissions that are currently not enabled: {0}.\nShould they be be added to the standard permissions?
+addons.installer.one.child.expected = Expected exactly one child of {0} but got {1}.
+addons.installer.script.no.execution_mode = No "execution_mode" attribute defined for {0}
+addons.installer.script.no.menulocation = No "menuLocation" attribute defined for {0}
+addons.installer.script.no.menutitle = No "menuTitleKey" attribute defined for {0}
+addons.installer.script.no.permissions = No permissions defined for {0}
+addons.installer.success = Installation successful.\nThe new add-on will be available after a restart.
+addons.installer.success.update = Update from {0} to {1} successful.\nSome functions may only be available after a restart.
+addons.installer.title = Add-on Installer
+addons.installer.too.new = Current Freeplane version {0} is too new. This add-on supports at most {1}
+addons.installer.too.old = Current Freeplane version {0} is too old. This add-on needs at least {1}
+addons.installer.unknown.deinstallation.rules = Unknown deinstallation rule(s) {0}
+addons.installer.update = Update from version {0}
+addons.installer.warning = <html><body><em>You should only install add-ons from sources you trust. Malicious software may cause damage to your data or violate your privacy.</em></body></html>
+addons.site = http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text = Attributes from style
+AddStyleAttributes.tooltip = Add attributes from style node
+AllMapsNodeListAction.text = Find and replace in all maps
+always = Always
+AlwaysUnfoldedNodeAction.text = Always unfolded node (set/reset)
+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 = Find and replace 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_name = Attribute Name
+attribute_replace = Replace with
+attribute_top = All known attributes for the loaded Maps
+attribute_value = Attribute Value
+attributes_AddAttributeAction.text = Add attribute in dialog...
+attributes_adding_empty_attribute_error = Can not use an empty string as attribute name
+attributes_all = All attributes
+attributes_assign_dialog = Extended attribute editor
+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_RemoveAllAttributesAction.text = Remove all attributes
+attributes_RemoveFirstAttributeAction.text = Remove first attribute
+attributes_RemoveLastAttributeAction.text = Remove last attribute
+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
+automatic_layout = Automatic layout
+automatic_layout_disabled = disabled
+automatically_save_message = Map was automatically saved (using the file name {0}) ...
+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.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.HEADINGS.text = for non leave nodes
+AutomaticLayoutControllerAction.null.text = disabled
+BackAction.text = Go backward
+BackAction.tooltip = Jumps back in the select chain
+background = Background
+bitmaps = Bitmaps
+black = Black
+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>
+blue = Blue
+BoldAction.text = Bold
+boldify_branch = Boldify
+branch = Branch
+browse = Browse...
+calendar_attributes_panel = Calendar and attributes
+calendar_panel = Calendar
+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_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
+ChangeConnectorArrowsAction.backward.text = Draw arrow back
+ChangeConnectorArrowsAction.both.text = Draw arrow forward and back
+ChangeConnectorArrowsAction.forward.text = Draw arrow forward
+ChangeConnectorArrowsAction.none.text = None
+ChangeConnectorArrowsAction.text = Change Arrows of Connector
+ChangeConnectorShapeAction.CUBIC_CURVE.text = Curve
+ChangeConnectorShapeAction.EDGE_LIKE.text = Simulate edge
+ChangeConnectorShapeAction.LINE.text = Line
+ChangeConnectorShapeAction.LINEAR_PATH.text = Linear path
+ChangeNodeLevelLeftsAction.text = Move node (Parents sibling)
+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 = Move node (Siblings child)
+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:
+ClearLinkAnchorAction.text = Clear link anchor
+ClearLinkAnchorAction.tooltip = <html>clear previously set node anchor</html>
+close_btn = &Close
+CloseAction.text = &Close current map
+CloudAction.text = Add / remove cloud (default)
+CloudColorAction.text = Cloud color...
+CloudShapeAction.ARC.text = Arc
+CloudShapeAction.RECT.text = Rectangle
+CloudShapeAction.ROUND_RECT.text = Round rectangle
+CloudShapeAction.STAR.text = Star
+ColorProperty.ResetColor = Reset color
+combined = Combined
+condition = Condition
+confirmation = Confirmation
+connector = Connector
+connector_arrows = Connector arrows
+connector_label = Connector label
+connector_lines = Connector lines
+connector_shapes = Connector shapes
+ConnectorColorAction.text = Connector color...
+CopyAction.text = &Copy
+CopyAction.tooltip = Copy selected branch
+CopyAttributes.text = Copy &attributes
+CopyIDAction.text = Copy node I&D
+CopyMapStylesAction.text = Copy map style from...
+CopyNodeURIAction.text = Copy node URI
+copyright = Copyright \u00a9 2000-2012 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.tooltip = <html>This function keeps track of node creation and modification times.</html>
+current_dir = Maps
+CutAction.text = Cu&t
+decrease_branch_font_size = Smaller font
+DecreaseNodeFontAction.text = Smaller font
+default = Default
+DefaultColorAction.text = Default color
+defaultstyle.details = Details
+defaultstyle.floating = Floating node
+defaultstyle.note = Note
+delete = &Delete
+delete_child = Delete node
+DeleteAction.text = Remove n&ode
+DeleteConditionAction.text = Delete
+DeleteDetailsAction.text = Remove node details
+DeleteLevelStyleAction.text = Remove level style
+DeleteStyleAction.text = Remove style
+DeleteUserStyleAction.text = Remove user defined style
+dialect_info.app = Mind map file {0} was created with program {1}.
+dialect_info.unknownApp = Mind map file {0} was created by unknown program.
+dialect_info.unknownURL = Its web site is not known.
+dialect_info.url = Visit program web site {0} for more info.
+dialect_info.warning = Freeplane may open, display or save it incorrectly.
+DirectHtmlFlavorHandler = HTML as single node
+DocumentationAction.text = Documentation
+down = D&own
+download = Download
+dropped_file_error = Couldn''t open dropped file(s). Reason: {0}
+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
+EdgeColorAction.text = Edge color...
+EdgeStyleAction.bezier.text = Smoothly curved (bezier)
+EdgeStyleAction.bezier.tooltip = <html>Display the edge as a smooth curve.</html>
+EdgeStyleAction.hide_edge.text = Hide edge
+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 = Horizontal
+EdgeStyleAction.horizontal.tooltip = <html>Use perpendicular straight lines for edges.</html>
+EdgeStyleAction.linear.text = Linear
+EdgeStyleAction.linear.tooltip = <html>Display the edge as a straight line.</html>
+EdgeStyleAction.sharp_bezier.text = Sharply curved (bezier)
+EdgeStyleAction.sharp_bezier.tooltip = <html>Display the edge as a smooth curve with sharpened ends.</html>
+EdgeStyleAction.sharp_linear.text = Sharp linear
+EdgeStyleAction.sharp_linear.tooltip = <html>Display the edge as a straight line with sharpened ends.</html>
+EdgeStyleAsParentAction.text = As parent
+EdgeStyleAsParentAction.tooltip = <html>Use edge style of parent node.</html>[obsolete]
+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_details = Edit node details
+edit_end_label = <html>Connector<br>label
+edit_label_font_family = Font
+edit_label_font_size = Font size
+edit_link_manually = Edit Hyperlink Manually...
+edit_long_node = Edit node core in dialog
+edit_middle_label = <html>Middle<br>label
+edit_note = Edit note
+edit_source_label = <html>Source<br>label
+edit_target_label = <html>Target<br>label
+edit_transparency_label = Opacity
+edit_width_label = Width
+EditAction.text = Edit node core in-line
+EditAttributesAction.text = Edit attribute in-line
+EditDetailsAction.text = Edit node details in-line
+EditDetailsInDialogAction.text = Edit node details in dialog
+EditFilterAction.text = Compose filter
+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.tooltip = New protected map
+enter_base_url = I am going to paste relative links. Enter please base URL.
+enter_condition_name = Enter new condition name
+enter_confirms = &Enter confirms
+enter_keyset_name = Enter hot key set name
+enter_map_url = Enter map URL
+enter_new_style_name = Enter new style name
+enter_node_id = Enter node ID
+enter_zoom = Enter zoom
+EnterPassword.text = Enter password
+error = Error
+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
+ExecuteScriptError.text = Error executing the script:\n{0}
+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.noScriptsAvailable = None available
+ExecuteScripts.text = Scripts
+ExecuteScriptSecurityError.text = An error occured during the script execution: {0}
+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
+ExportBranchAction.text = Move branch to new map ...
+ExportBranchToHTMLAction.text = Branch as HTML
+exported_file = {0} file
+ExportPdf.text = PDF
+ExportSvg.text = SVG
+ExportToHTMLAction.text = HTML
+ExportToImage.jpg.text = JPEG
+ExportToImage.png.text = PNG
+ExportToOoWriter.text = Open Office Writer Document...
+extension_menu = Physical style
+ExternalImage_popupMenu_Change = Change...
+ExternalImage_popupMenu_Open = Open in viewer
+ExternalImage_popupMenu_Remove = Remove
+ExternalImage_popupMenu_ResetZoom = Reset zoom
+ExternalImageAddAction.text = Add image...
+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
+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 {0} not found
+FileListFlavorHandler = Links to files
+FileProperties_BranchLeafCount = Number of leaf nodes in selected branch(es):
+FileProperties_BranchNodeCount = Number of nodes in selected branch(es):
+FileProperties_ChangesSinceLastSave = Changes since last save:
+FileProperties_FileName = Filename:
+FileProperties_FileSaved = File saved:
+FileProperties_FileSize = File size:
+FileProperties_MainBranchCount = Number of main branches:
+FileProperties_NeverSaved = Never saved
+FileProperties_NodeChildCount = Number of children of selected node(s):
+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...
+FileRevisionsDialog.cancel = &Cancel
+FileRevisionsDialog.file_last_modified = Timestamp
+FileRevisionsDialog.file_name = File
+FileRevisionsDialog.file_size = Bytes
+FileRevisionsDialog.open = &Open
+FileRevisionsDialog.open.tooltip = Open file even if it might be out of date
+FileRevisionsDialog.question = Found revisions of {0}
+FileRevisionsDialog.restore = Rest&ore
+FileRevisionsDialog.restore.tooltip = Replace {0} by {1}
+FileRevisionsDialog.title = File revisions
+filter = Filter
+filter_add = &Add
+filter_and = A&nd
+filter_any_text = Core, details or note
+filter_conditions = Filters
+filter_contains = Contains
+filter_created_after = Created after
+filter_created_before = Created before
+filter_delete = &Delete
+filter_details = Details
+filter_dialog = Filter Composer
+filter_does_not_exist = Not Exist
+filter_edit_description = Edit Filter List
+filter_enter_value = Enter Value
+filter_even_level = Odd level node
+filter_exist = Exists
+filter_icon = Icon
+filter_is_equal_to = Is equal to
+filter_is_not_equal_to = Is not equal to
+filter_leaf = Leaf Node
+filter_link = Hyperlink
+filter_match_approximately = &Approximate
+filter_match_approximately_tooltip = <html>Whether to allow approximate matches,<br/>i.e. searching for 'files' will find 'flies'.</html>
+filter_match_case = Match &Case
+filter_match_case_tooltip = Whether to honor case when matching.
+filter_modified_after = Modified after
+filter_modified_before = Modified before
+filter_no_filtering = No Filtering (remove)
+filter_node = Core text
+filter_node_level = Node level
+filter_not = &Not
+filter_note = Note
+filter_odd_level = Even level node
+filter_or = O&r
+filter_parent = Parent text
+filter_periodic_level = Periodical
+filter_priority = Priority
+filter_regexp_matches = Matches regexp
+filter_reminder = Reminder
+filter_reminder_after = scheduled after
+filter_reminder_before = scheduled before
+filter_reminder_executed = already fired
+filter_reminder_later = scheduled later
+filter_root = Root Node
+filter_script = Script filter
+filter_select = &Select
+filter_selected_node_view = Currently selected nodes
+filter_selected_node_view_snapshot = Saved selection
+filter_style = Style
+filter_time = Date filter
+FilterComposerDialog.save = &Save
+filters_not_loaded = Filter could not be loaded, file corrupted
+find_what = Find what
+FindAction.text = Find...
+FirstGroupNodeAction.text = Summary node (begin of group)
+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 = Goto:
+FollowLinkAction.text = Follow link
+font = Font
+FontFamilyAction.text = Font family
+FontSizeAction.text = Font size
+format_invalid_pattern = Not a valid pattern
+format_menu_cloud_shapes = Add cloud or change style
+format_menu_edge_styles = &Edge styles
+format_menu_edge_widths = Edge &widths
+format_panel = Format
+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>
+formats_not_loaded = Formats could not be loaded, file corrupted
+formula.error.attributeValueIsNull = Attribute value ''{0}'' is null after evaluation.
+formula.error.circularReference = Circular reference: The formula in node ''{0}'' references itself.
+formula.EvaluateAllAction.text = Evaluate all
+formula.EvaluateAllAction.tooltip = Evaluate all formulas in the current map
+formula.menuname = Formulas
+formula_editor = Edit Formula
+ForwardAction.text = Go forward
+ForwardAction.tooltip = Jumps forward in the select chain
+FreeNodeAction.text = Free positioned node (set/reset)
+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
+GettingStartedAction.text = Tutorial
+GotoLinkNodeAction.text = Goto Link
+GotoNodeAction.text = Goto node with ID...
+GrabKeyDialog.common.cancel = Cancel
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to = Assigned to
+GrabKeyDialog.grab-key.assigned-to.none = Currently not assigned
+GrabKeyDialog.grab-key.clear = Clear
+GrabKeyDialog.grab-key.remove = Remove
+GrabKeyDialog.grab-key.remove-ask = Are you sure to remove this keystroke?
+GrabKeyDialog.grab-key.title = Enter new key
+green = Green
+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.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
+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
+html_problem = <html>Can not render html<br><br>{0}
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_addition = Addition
+icon_attach = Look here
+icon_audio = Audio
+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_checked = Checked
+icon_clanbomber = Dangerous
+icon_clock = Time
+icon_clock2 = Reminder
+icon_closed = No Entry
+icon_decrypted = Unlocked
+icon_desktop_new = Do not forget
+icon_division = Division
+icon_down = Down
+icon_edit = Refine
+icon_encrypted = Locked
+icon_executable = Executable
+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_icon_not_found = Icon not found
+icon_idea = Idea
+icon_image = Image
+icon_info = Info
+icon_internet = Internet
+icon_internet_warning = Internet warning
+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&con
+icon_messagebox_warning = Important
+icon_mindmap = Mind Map
+icon_multiplication = Multiplication
+icon_narrative = Narrative
+icon_negative = Negative
+icon_neutral = Neutral
+icon_password = Key
+icon_pencil = To be refined
+icon_penguin = Linux
+icon_positive = Positive
+icon_prepare = Yellow Traffic Light
+icon_revision = Revision
+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_subtraction = Subtraction
+icon_unchecked = Unchecked
+icon_up = Up
+icon_user_icon = User icons
+icon_very_negative = Very Negative
+icon_very_positive = Very Positive
+icon_video = Video
+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.math.text = Math
+IconGroupPopupAction.media.text = Media
+IconGroupPopupAction.miscellaneous.text = Miscellaneous
+IconGroupPopupAction.nature.text = Nature
+IconGroupPopupAction.numbers.text = Numbers
+IconGroupPopupAction.office.text = Office
+IconGroupPopupAction.people.text = People
+IconGroupPopupAction.rating.text = Rating
+IconGroupPopupAction.signs.text = Signs
+IconGroupPopupAction.smiley.text = Smiley
+IconGroupPopupAction.time.text = Time
+IconGroupPopupAction.user.text = User icons
+IconProgressExtended10Action.text = Extended progress 10%
+IconProgressExtended10Action.tooltip = <html>Adds a progress indication that is increased by 10% upon double left click.<br>Control + double left click decreases/ removes it.</html>
+IconProgressExtended25Action.text = Extended progress 25%
+IconProgressExtended25Action.tooltip = <html>Adds a progress indication that is increased by 25% upon double left click.<br> Control + double left click decreases/ removes it.</html>
+IconProgressIconDownAction.text = Progress down
+IconProgressIconDownAction.tooltip = Decreases/ inserts/ removes the progress icons (100% -> 75% -> 50% -> 25% -> 0% -> remove).
+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.
+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_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...
+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.
+invalid_export_file = Invalid export file name
+invalid_file_msg = Couldn''t find file for {0}
+invalid_uri = Invalid URI {0}
+invalid_url = Couldn't create valid URL
+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
+LatexDeleteLatexAction.text = Remove LaTe&X formula
+LatexEditLatexAction.text = Edit &LaTeX formula...
+LatexInsertLatexAction.text = Add &LaTeX formula...
+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 License for more details.<br><br>You should have received a copy of the GNU General Public License<br>along with this program; if not, write to the Free Software<br>Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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.
+load = &Load
+load_accelerator_presets = Load
+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.
+locking_old_lock_removed = The map {0} was locked by the user {1}. The lock has been removed because it is old.
+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}
+MainView.errorUpdateText = Error setting the text for the following input: {0}.
+MakeLinkFromAnchorAction.text = Make link from anchor
+MakeLinkFromAnchorAction.tooltip = <html>create a local or global link from<br/>the anchor node to the selected node</html>
+MakeLinkToAnchorAction.text = Make link to anchor
+MakeLinkToAnchorAction.tooltip = <html>create a local or global link from<br/>the selected note to the anchor node</html>
+ManageAddOnsAction.text = Add-ons
+ManageAddOnsDialog.activate = Activate
+ManageAddOnsDialog.activation.success = {0} will be activated after a restart.
+ManageAddOnsDialog.authored.by = by {0}
+ManageAddOnsDialog.cannot.activate = Cannot activate: {0} is already active.
+ManageAddOnsDialog.cannot.configure = Cannot configure {0}.
+ManageAddOnsDialog.cannot.deactivate = Cannot deactivate: {0} is not active.
+ManageAddOnsDialog.cannot.deinstall = Cannot deinstall {0}.
+ManageAddOnsDialog.configure = Configure
+ManageAddOnsDialog.deactivate = Deactivate
+ManageAddOnsDialog.deactivation.success = {0} will be deactivated after a restart.
+ManageAddOnsDialog.deinstall = Deinstall
+ManageAddOnsDialog.deinstallation.success = {0} will be deinstalled after a restart.
+ManageAddOnsDialog.error = Error on installation: {0}.
+ManageAddOnsDialog.install = &Install
+ManageAddOnsDialog.install.from.known.location = Install add-on from a known location
+ManageAddOnsDialog.install.tooltip = Insert an URL of an add-on installation file here
+ManageAddOnsDialog.map.not.opened = Map {0} does not seem to be opened.
+ManageAddOnsDialog.really.deinstall = Really deinstall {0}?
+ManageAddOnsDialog.search = Search add-ons
+ManageAddOnsDialog.search.file = Search
+ManageAddOnsDialog.select.tooltip = Select file
+ManageAddOnsDialog.status.downloading = Downloading file...
+ManageAddOnsDialog.status.installing = Installing add-on...
+ManageAddOnsDialog.status.success = Successfully installed {0}.
+ManageAddOnsDialog.tab.install = Search and install
+ManageAddOnsDialog.tab.install.tooltip = Search and install new add-ons
+ManageAddOnsDialog.tab.manage = Add-ons
+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
+map_already_exists = The map already exists. Do you want to overwrite it?
+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
+MaxNodeWidth.text = Set maximum node width
+menu_applyStyle = Apply style
+menu_attributes = &Attribute
+menu_clouds = Clouds
+menu_copy = Copy
+menu_coreFormat = Node core
+menu_details = Details
+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...
+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_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
+MindMapNodesFlavorHandler = Node hierarchy
+mindmaps = &Maps
+mindmaps_desc = Maps (*.mm)
+mindmaps_filter_desc = Filters (*.mmfilter)
+MinNodeWidth.text = Set minimum node width
+mode_Browse = Browse mode
+mode_File = File mode
+mode_MindMap = Mind map 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 maps
+MoveToRootAction.text = Goto root
+NameConditionAction.text = Set name
+NavigationNextMapAction.text = Next map
+NavigationPreviousMapAction.text = Previous map
+new = &New
+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
+new_version_available = New version ''{0}'' available
+NewChildAction.text = New child node
+NewerFileRevisionsFoundDialog.cancel = &Skip
+NewerFileRevisionsFoundDialog.cancel.tooltip = Do not open this file
+NewerFileRevisionsFoundDialog.file_last_modified = Timestamp
+NewerFileRevisionsFoundDialog.file_name = File
+NewerFileRevisionsFoundDialog.file_size = Bytes
+NewerFileRevisionsFoundDialog.open = &Open
+NewerFileRevisionsFoundDialog.open.tooltip = Open file even if it might be out of date
+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
+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
+NewMapViewAction.text = New map view
+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
+NewSummaryAction.text = New summary node (selected nodes)
+NewUserStyleAction.text = New style from selection
+NextNodeAction.BACK.text = Goto previous node
+NextNodeAction.BACK_N_FOLD.text = Goto previous node (fold)
+NextNodeAction.FORWARD.text = Goto next node
+NextNodeAction.FORWARD_N_FOLD.text = Goto next node (fold)
+NextPresentationItemAction.text = Unfold next presentation item
+no = No
+no_copy_attributes_before_paste_attributes = You can't paste attributes until you've copied some.
+NO_FORMAT = Text
+no_format_copy_before_format_paste = You can't paste a format until you've copied one.
+no_found_from = <html>No <u>{0}</u> found from "{1}".</html>
+no_more_found_from = <html>No more <u>{0}</u> found from "{1}".</htm>
+no_previous_find = No previous find.
+no_styles_found_in_map = No styles found in map
+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_selector = Node Selection
+node_selector_message = Double Click to select Node
+node_styles = Node styles
+NodeBackgroundColorAction.text = &Node background color...
+NodeColorAction.text = Node color...
+NodeColorBlendAction.text = Blend color
+NodeDownAction.text = Move node (Sibling down)
+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
+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
+ok = &OK
+OKAction.text = &OK
+OnlineReference.text = Documentation Maps Online
+open_asMindMap = Mind Map
+OpenAction.text = &Open saved map...
+OpenFreeplaneSiteAction.text = Freeplane's Homepage
+OpenPathAction.text = Open File
+OpenURLMapAction.text = Open map from URL...
+OpenUserDirAction.text = Open user directory
+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 = Level style patterns
+OptionPanel.ADD_CHILD = Add child node
+OptionPanel.ADD_SIBLING = Add sibling node
+OptionPanel.addons = Add-ons
+OptionPanel.always_fold_all_after_load = Fold all
+OptionPanel.always_load_last_maps = Load last and new maps
+OptionPanel.always_load_last_maps.tooltip = Open last files set by above options, even starting FP with a selected map file.
+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_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>
+OptionPanel.antialias_all = Antialias all
+OptionPanel.antialias_edges = Antialias edges
+OptionPanel.antialias_none = No antialias
+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.ARC = Arc
+OptionPanel.as_parent = As parent
+OptionPanel.ask = Ask
+OptionPanel.automatic = Automatic
+OptionPanel.automaticFormat_level = Apply level styles
+OptionPanel.automaticFormat_level1 = Root node format
+OptionPanel.automaticFormat_level2 = 1. Level node format
+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.Cancel = Cancel
+OptionPanel.center_selected_node = Center selected node automatically
+OptionPanel.check_updates_automatically = Check for updates on program start
+OptionPanel.childpattern = Child Pattern
+OptionPanel.childpattern.tooltip = The selected pattern is applied to all children.
+OptionPanel.clear_all_setters = Switch all
+OptionPanel.clear_all_setters.tooltip = Enables or disables all change indications.
+OptionPanel.cloud = Cloud
+OptionPanel.cloudcolor = Cloud color
+OptionPanel.cloudshape = Cloud shape
+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.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
+OptionPanel.date_format = Standard date format
+OptionPanel.date_format.tooltip = Either SHORT, MEDIUM, LONG or FULL or a pattern like "MM/dd/yyyy"
+OptionPanel.datetime_format = Standard date-time format
+OptionPanel.datetime_format.tooltip = Either <datestyle>,<timestyle> (with SHORT, MEDIUM, LONG or FULL as style) or a full pattern like "M/d/yyyy hh:mm"
+OptionPanel.de = German / Deutsch
+OptionPanel.default = Default
+OptionPanel.default_attribute_key_column_width = Standard attribute key width
+OptionPanel.default_attribute_value_column_width = Standard attribute value width
+OptionPanel.default_browser_command_mac = Default browser command Mac
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_other_os = Default browser command other OS
+OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
+OptionPanel.default_browser_command_windows_9x = Default browser command Windows 9x
+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_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.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>
+OptionPanel.delete_nodes_without_question = Delete nodes without confirmation?
+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.disable_cursor_move_paper = Disable cursor move paper
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Don't display 'move' cursor during paper dragging</html>
+OptionPanel.display_inline_editor_for_all_new_nodes = Display inline editor for all new nodes
+OptionPanel.display_node_id = Display node ID
+OptionPanel.edgecolor = Edge color
+OptionPanel.edgecolor.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+OptionPanel.edgestyle = Edge style
+OptionPanel.edgestyle.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+OptionPanel.edgewidth = Edge width
+OptionPanel.edgewidth.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+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__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 = 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)
+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 = Permit file/read operations (NOT recommended)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>If your Groovy Scripts need read access (open, close, read),<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 = Permit network 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_write_restriction = Permit file/write operations (NOT recommended)
+OptionPanel.execute_scripts_without_write_restriction.tooltip = <html><body>If your Groovy Scripts need write access to files (write, delete(!)),<br>you have to enable this option. <br>Normally used with read access.<br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
+OptionPanel.experimental_file_locking_on = Experimental file locking
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experimental feature</html>
+OptionPanel.export_icons_in_html = Export icons in Html
+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.Files = Files
+OptionPanel.first = First
+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>
+OptionPanel.fork = Fork
+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.gl = Galician / Galego
+OptionPanel.goto_note_end_on_edit = Move note cursor to the end
+OptionPanel.grid_size = Grid gap size
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = Hide edge
+OptionPanel.highlight_formulas = Highlight formulas
+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.ic_disable = Disable
+OptionPanel.ic_file = Use disk
+OptionPanel.ic_ram = In RAM
+OptionPanel.icon = Icon
+OptionPanel.icon.tooltip = If applied, the node will have exactly this icon.
+OptionPanel.icons.list = List of Displayed Standard Icons
+OptionPanel.icons.list.tooltip = Here, you can order or disable the standard icons. The icons have to be separated by ';'.
+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.it = Italian / Italiano
+OptionPanel.ja = Japanese / \u65e5\u672c\u8a9e
+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.label_font_family = Font family
+OptionPanel.label_font_size = Font size
+OptionPanel.language = Language
+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.last = Last
+OptionPanel.last_opened_list_length = Last opened list length
+OptionPanel.layout_map_on_text_change = Layout map during editing
+OptionPanel.layout_map_on_text_change.tooltip = Disable for better performance
+OptionPanel.linear = Linear
+OptionPanel.links = Links
+OptionPanel.links.tooltip = <html>Set Links either relative or absolute </html>
+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_last_map = Automatically open last map
+OptionPanel.load_last_map.tooltip = <html>When Freeplane starts, it fetches the last opened map automatically if checked.</html>
+OptionPanel.load_last_maps = Load all last maps
+OptionPanel.lookandfeel = Look and Feel
+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.lt = Lithuanian / kalba
+OptionPanel.max_displayed_node_count = Maximum number of displayed nodes
+OptionPanel.max_image_width = Max initial image width
+OptionPanel.max_image_width.tooltip = New images are scaled down to this width
+OptionPanel.max_menu_item_count = Maximum number of menu items
+OptionPanel.max_menu_item_count.tooltip = Limits number if items in one submenu, at least 10
+OptionPanel.max_node_width = Max node width
+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.never_save_folding = Never
+OptionPanel.nl = Dutch, Flemish / Nederlands, Vlaams
+OptionPanel.nn = Norwegian Nynorsk / Norsk nynorsk
+OptionPanel.nodebackgroundcolor = Background
+OptionPanel.nodebackgroundcolor.tooltip = The node's background when not selected.
+OptionPanel.nodecolor = Text
+OptionPanel.nodecolor.tooltip = The node's text color when not selected.
+OptionPanel.nodefontbold = Bold
+OptionPanel.nodefonthyperlink = Hyperlink
+OptionPanel.nodefontitalic = Italic
+OptionPanel.nodefontname = Font family
+OptionPanel.nodefontsize = Font size
+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.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
+OptionPanel.number_format = Standard number format
+OptionPanel.number_format.tooltip = A pattern containing '#' for optional or '0' for mandatory digits. Examples: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save = Number of different files for automatic save
+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.OK = Save
+OptionPanel.org.freeplane.plugin.bugreport = Policy
+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.userid = Optional identifier to be sent
+OptionPanel.outline_hgap = Horizontal distance
+OptionPanel.outline_vgap = Vertical distance
+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.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.
+OptionPanel.patternname = Name
+OptionPanel.patternname.tooltip = Unique pattern name
+OptionPanel.pl = Polish / polski
+OptionPanel.placenewbranches = Place new branches
+OptionPanel.placenewbranches.tooltip = <html>Where to place new branches. Valid values are 'first' and 'last' </html>
+OptionPanel.plugin.tooltip = Non-core plugins.
+OptionPanel.plugins = Plugins
+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.RECT = 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.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
+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.save_folding = Save folding
+OptionPanel.save_folding_if_map_is_changed = If map is changed
+OptionPanel.save_modification_times = Save modification times
+OptionPanel.script_classpath = Script classpath: 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>
+OptionPanel.script_directories = Script search path (see tooltip)
+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 = 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.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
+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.cache = Cache
+OptionPanel.separator.CloudControls = Clouds
+OptionPanel.separator.commands_for_the_program = Commands for the program
+OptionPanel.separator.connectors = Connectors
+OptionPanel.separator.data_formats = Data formatting and parsing
+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 in dialog
+OptionPanel.separator.editing = Editor settings
+OptionPanel.separator.files = Files
+OptionPanel.separator.formula = Formulas
+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 = Color of whole core
+OptionPanel.separator.NodeFont = Font of whole core
+OptionPanel.separator.NodeShape = Node shape
+OptionPanel.separator.NodeStyle = Node style
+OptionPanel.separator.NodeText = Core text
+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.RichTextEditor = Rich-Text Editor
+OptionPanel.separator.root_node_appearance = Root node appearance
+OptionPanel.separator.save = Save
+OptionPanel.separator.scripting = Scripting
+OptionPanel.separator.scrollbar = Scrollbar
+OptionPanel.separator.search = Search
+OptionPanel.separator.selection_colors = Selection colors
+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.status = Status line
+OptionPanel.separator.tooltip = Tooltip times
+OptionPanel.separator.undo = Undo
+OptionPanel.separator.updates = Program updates
+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.sharp_bezier = Sharply curved (bezier)
+OptionPanel.sharp_linear = Sharp linear
+OptionPanel.show_icon_for_attributes = Show icon for attributes
+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
+OptionPanel.signed_script_are_trusted = Trust signed scripts (recommended).
+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.simplyhtml.default_paste_mode = Default paste mode
+OptionPanel.single_backup_directory = Use single directory for backup files
+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 directory (if above option is selected)
+OptionPanel.single_backup_directory_path.tooltip = <html>Overrides default <freeplaneuserdir>/.backup</html>
+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.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.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>
+OptionPanel.standardcloudcolor = Standard Cloud color
+OptionPanel.standardcloudcolor.tooltip = <html>The standard cloud color in html notation </html>
+OptionPanel.standardcloudestyle = Standard Cloud style
+OptionPanel.standardcloudestyle.tooltip = <html>The standard cloud style. </html>
+OptionPanel.standarddrawrectangleforselection = Display selected nodes in bubbles
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Mark selected nodes by bubble around.</html>
+OptionPanel.standardlinkcolor = Standard link color
+OptionPanel.standardlinkcolor.tooltip = <html>The standard link color in html notation </html>
+OptionPanel.standardlinkestyle = Standard link style
+OptionPanel.standardlinkestyle.tooltip = <html>The standard link style. currently, only 'bezier' is supported</html>
+OptionPanel.standardselectednodecolor = Standard selected node color
+OptionPanel.standardselectednodecolor.tooltip = <html>The standard node color if selected. In html notation (#RRGGBB in hex values) </html>
+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.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.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.reshowDelay = Reshow 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 = 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.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
+OptionPanel.use_tabbed_pane.tooltip = If selected the maps are displayed in tabs (like in FireFox :-) ).
+OptionPanel.user_defined_screen_resolution = User defined screen resolution (dpi)
+OptionPanel.validate_classpath_needs_readaccess = Scripting: When setting the classpath you have to permit read access on files!
+OptionPanel.validate_invalid_date_format = Invalid standard date format
+OptionPanel.validate_invalid_datetime_format = Invalid standard date-time format
+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.wheel_velocity = Speed
+OptionPanel.wheel_velocity.tooltip = A higher value results in fast mouse wheel move effects on the map.
+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.
+org.freeplane.plugin.bugreport.report = Current report
+org.freeplane.plugin.bugreport.wanted_bug = An internal error occurred and was automatically reported.
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined = Node {0} is not defined
+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
+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
+periodic_formula = {0} * n + {1}
+PeriodUnit.DAY = days
+PeriodUnit.HOUR = hours
+PeriodUnit.MINUTE = minutes
+PeriodUnit.MONTH = months
+PeriodUnit.WEEK = weeks
+PeriodUnit.YEAR = years
+plugins/latex/LatexNodeHook.editorTitle = Edit LaTeX formula
+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 = &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} {2}. 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 = Edit script
+plugins/ScriptingEngine.illegalAccessToInternalAPI = Illegal access to the internal API (package {0}). - Please contact the Freeplane team if the scripting API is not powerful enough.
+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 = Insert Date in Selection
+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_remindLaterButton = Remind later
+plugins/TimeManagement.xml_remindLaterButton_tooltip = Remind later
+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 = Reset calendar
+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...
+PrintDirectAction.text = Print
+printing_settings = Print scaling
+PrintPreviewAction.text = Print pre&view...
+PropertyAction.dialog = Preferences
+PropertyAction.text = Preferences ...
+QuickFilterAction.text = Quick filter
+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
+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>
+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 filter action
+red = Red
+RedefineStyleAction.text = Redefine style
+RedoAction.text = &Redo
+RedoFilterAction.text = Redo filter action
+regular_expressions = Regular expressions
+ReminderHookAction.text = Remove reminder
+ReminderHookAction.tooltip = Removes a reminder from a node.
+remove_file_from_list_on_error = File {0} not opened. Remove it from the last opened file list?
+remove_shortcut_question = Replace shortcut?
+RemoveAllIconsAction.text = Remove all icons
+RemoveConnectorAction.text = Remove Connector
+RemoveEncryption.text = Remove password
+RemoveFormatAction.text = Remove format
+RemoveIcon_0_Action.text = Remove first icon
+RemoveIconAction.text = Remove Last Icon
+RemoveNoteAction.text = Remove note
+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
+replace_shortcut_question = This keybord shortcut is currently assigned to\n {0}.\nReplace this assignment?
+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
+ResetStyleAction.text = Reset node style
+RevertAction.text = &Restore from local history
+RevisionPluginAction.text = Change &revisions background color
+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 open maps
+SaveAll.tooltip = Saves all open maps.
+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.tooltip = Enables to write larger scripts within Freeplane.
+ScriptEditorPanel.changed_cancel = The scripts were changed. Do you really want to abandon those changes?
+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
+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...
+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 panel
+set_accelerator_on_next_click_action = Click on any menu item to assign a new short cut
+SetAcceleratorOnNextClickAction.text = Assign hot key
+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.
+SetLinkAnchorAction.tooltip_anchored = <html>set selected node as anchor for future<br/>creation of local or global links. Current anchor:<br/>{0}
+SetLinkByFileChooserAction.text = Add hyperlink (choose)...
+SetLinkByTextFieldAction.text = Add or modify hyperlink (type)...
+SetNodeLink.text = Set Node Link...
+SetNoteWindowPosition.bottom.text = Bottom
+SetNoteWindowPosition.left.text = Left
+SetNoteWindowPosition.right.text = Right
+SetNoteWindowPosition.top.text = Top
+SetShortenerStateAction.text = Minimize node
+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
+ShowFormatPanel.text = Properties panel
+ShowFormatPanel.tooltip = Presents a dialog in which node and edge attributes can be changed at once.
+ShowHideNoteAction.text = Display note panel
+ShowHideNoteAction.tooltip = Lets the note panel appear resp. disappear.
+ShowNextChildAction.text = Show next child
+ShowNotesInMapAction.text = Display notes in map
+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 and replace
+simplyhtml.findReplaceLabel = Find and replace
+simplyhtml.findReplaceTip = Find and 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.matchApproximately = Match approximately
+simplyhtml.matchApproximately.tooltip = <html>Whether to allow approximate matches,<br/>i.e. searching for 'files' will find 'flies'.</html>
+simplyhtml.matchCase = Match case
+simplyhtml.matchCase.tooltip = Whether to honor case when matching.
+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.pasteHTMLLabel = Paste HTML
+simplyhtml.pasteLabel = Paste
+simplyhtml.pastePlainTextLabel = Paste plain text
+simplyhtml.pasteTip = paste
+simplyhtml.plainName = plain
+simplyhtml.previewLabel = Preview
+simplyhtml.previewText = Preview text
+simplyhtml.prevTableCellLabel = Previous cell
+simplyhtml.printLabel = Print...
+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.searchDown.tooltip = Search from top to bottom.
+simplyhtml.searchFromStart = Search from start
+simplyhtml.searchFromStart.tooltip = Start searching at the top instead of at the cursor position.
+simplyhtml.searchUp = Search up
+simplyhtml.searchUp.tooltip = Search from bottom to top.
+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
+simplyhtml.wholeWordsOnly.tooltip = Restrict matches to whole words.
+SortNodes.text = &Sort children
+SortNodes.tooltip = Sorts all children of a node alphabetically.
+split = &Split
+SplitConditionAction.text = Split
+SplitNode.text = &Split node
+SplitNode.tooltip = <html>Node is splitted</html>
+STANDARD_FORMAT = Standard
+stop_processing = Stop
+StringFlavorHandler = Plain text as node hierarchy
+StructuredHtmlFlavorHandler = HTML as node hierarchy
+style = Style
+style_already_exists = Style already exists.
+styledialog.cancel.text = Cancel
+styledialog.ok.text = OK
+styles = St&yles
+styles.AutomaticLayout = Apply level styles
+styles.connection = Connection
+styles.date = Date
+styles.definition = Definition
+styles.description = Description
+styles.floating_node = Floating node
+styles.idea = Idea
+styles.important = Important
+styles.key = Key
+styles.list = List
+styles.needs_action = Needs action
+styles.note = Note
+styles.ok = OK
+styles.pending = Pending
+styles.predefined = Predefined styles
+styles.question = Question
+styles.quotation = Quotation
+styles.root_node = Styles
+styles.subsubtopic = Subsubtopic
+styles.subtopic = Subtopic
+styles.topic = Topic
+styles.user-defined = User defined styles
+styles.website = Website
+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
+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>
+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
+ToggleMenubarAction.text = Menubar
+ToggleStatusAction.text = Display status line
+ToggleToolbarAction.text = &Toolbar
+undefined_error = An unexpected error occured. Please try to make a bug report.
+underline = Underline
+UnderlineAction.text = Underline
+underlined = Underlined
+UndoAction.text = &Undo
+UndoFilterAction.text = Undo filter action
+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 = Unfolds the selected nodes by one level.
+up = &Up
+update_failed = Update failed with message {0}
+UpdateCheckAction.text = Check for updates
+updatecheckdialog = Update check dialog
+url_error = This URL is malformed!
+url_open_error = Could not open URL {0}.
+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_icon = User icon "{0}"
+user_template_dir = User Templates
+user_zoom = Print zoom factor (0.0 - 2.0):
+value_format = Value format
+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.html = Html document
+xslt_export.latex = Latex document
+xslt_export.latexbook = Latex book
+xslt_export.mediawiki = Mediawiki
+xslt_export.ms_excel = Excel (2003 and above) XML format
+xslt_export.ms_project = MS Project (2003 and above) XML format
+xslt_export.ms_word = Word (2003 and above) XML format
+xslt_export.text = Plain text
+xslt_export_not_possible = Freeplane XSLT export not possible
+yes = Yes
+ZoomInAction.text = Zoom in
+ZoomOutAction.text = Zoom out
diff --git a/freeplane/viewer-resources/version.properties b/freeplane/viewer-resources/version.properties
new file mode 100644
index 0000000..81d35c0
--- /dev/null
+++ b/freeplane/viewer-resources/version.properties
@@ -0,0 +1,2 @@
+freeplane_version=1.2.20
+freeplane_version_status=
diff --git a/freeplane/viewer-resources/xml/appletMenu.xml b/freeplane/viewer-resources/xml/appletMenu.xml
new file mode 100644
index 0000000..2475f8f
--- /dev/null
+++ b/freeplane/viewer-resources/xml/appletMenu.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><menu_structure>
+ <menu_category name="menu_bar">
+ <menu_submenu name="file" name_ref="file">
+ <menu_submenu menu_key="main_menu_most_recent_files" name="last" name_ref="most_recent_files"/>
+ <menu_action action="PageAction"/>
+ <menu_action action="PrintPreviewAction"/>
+ <menu_action accelerator="control P" action="PrintAction"/>
+ <menu_action action="FilePropertiesAction"/>
+ </menu_submenu>
+ <menu_submenu name="edit" name_ref="edit">
+ <menu_submenu name="menu_extensions" name_ref="menu_extensions">
+ <menu_action action="SetShortenerStateAction"/>
+ </menu_submenu>
+ <menu_submenu name="menu_copy" name_ref="menu_copy">
+ <menu_action accelerator="control C" action="CopyAction"/>
+ <menu_action accelerator="control shift C" action="CopySingleAction"/>
+ </menu_submenu>
+ <menu_category name="find">
+ <menu_action accelerator="control F" action="FindAction"/>
+ <menu_action accelerator="control G" action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="view" name_ref="menu_view">
+ <menu_category name="Menu_Toolbar_Panel">
+ <menu_category name="toolbars">
+ <menu_submenu name="toolbars" name_ref="menu_toolbars">
+ <menu_action action="ToggleMenubarAction" menu_key="MB_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_category>
+ <menu_category name="zoom">
+ <menu_action accelerator="alt UP" action="ZoomInAction"/>
+ <menu_action accelerator="alt DOWN" action="ZoomOutAction"/>
+ <menu_action accelerator="control alt C" action="CenterSelectedNodeAction"/>
+ </menu_category>
+ <menu_submenu name="menu_viewmode" name_ref="menu_viewmode">
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="ShowSelectionAsRectangleAction"/>
+ </menu_submenu>
+ <menu_submenu name="menu_hoverView" name_ref="menu_hoverView">
+ <menu_action accelerator="alt F2" action="ToggleDetailsAction"/>
+ <menu_action action="SetBooleanPropertyAction.show_node_tooltips"/>
+ </menu_submenu>
+ <menu_category name="AttributeView">
+ <menu_submenu name="menu_displayAttributes" name_ref="menu_displayAttributes">
+ <menu_radio_action action="ShowSelectedAttributesAction"/>
+ <menu_radio_action action="ShowAllAttributesAction"/>
+ <menu_radio_action action="HideAllAttributesAction"/>
+ </menu_submenu>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="navigate" name_ref="menu_navigate">
+ <menu_category name="navigate">
+ <menu_category name="folding">
+ <menu_action accelerator="SPACE" action="ToggleFoldedAction"/>
+ <menu_action action="ShowNextChildAction" accelerator="shift SPACE" />
+ <menu_action accelerator="control SPACE" action="ToggleChildrenFoldedAction"/>
+ <menu_action accelerator="alt PAGE_DOWN" action="UnfoldOneLevelAction"/>
+ <menu_action accelerator="alt PAGE_UP" action="FoldOneLevelAction"/>
+ <menu_action accelerator="alt END" action="UnfoldAllAction"/>
+ <menu_action accelerator="alt HOME" action="FoldAllAction"/>
+ </menu_category>
+ </menu_category>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ <menu_action action="GotoNodeAction"/>
+ <menu_action accelerator="control alt LEFT" action="NextNodeAction.BACK"/>
+ <menu_action accelerator="control alt RIGHT" action="NextNodeAction.FORWARD"/>
+ <menu_action accelerator="control shift LEFT" action="NextNodeAction.BACK_N_FOLD"/>
+ <menu_action accelerator="control shift RIGHT" action="NextNodeAction.FORWARD_N_FOLD"/>
+ <menu_action action="NextPresentationItemAction" accelerator="control shift SPACE" />
+ <menu_category name="links">
+ <menu_action accelerator="control ENTER" action="FollowLinkAction"/>
+ <!-- goto -->
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="filter" name_ref="menu_filter">
+ <menu_category name="Filter">
+ <menu_category name="DoFilter">
+ <menu_action action="UndoFilterAction"/>
+ <menu_action action="RedoFilterAction"/>
+ <menu_action action="ReapplyFilterAction"/>
+ <menu_action action="QuickFilterAction"/>
+ <menu_action action="ApplySelectedViewConditionAction"/>
+ <menu_action action="QuickFindAllAction"/>
+ <menu_action action="ApplyNoFilteringAction"/>
+ <menu_action action="EditFilterAction"/>
+ </menu_category>
+ <menu_category name="FilterCondition">
+ <menu_action action="ApplyToVisibleAction"/>
+ <menu_action action="ShowAncestorsAction"/>
+ <menu_action action="ShowDescendantsAction"/>
+ </menu_category>
+ <menu_category name="Find">
+ <menu_action action="QuickFindAction.BACK"/>
+ <menu_action action="QuickFindAction.FORWARD"/>
+ </menu_category>
+ </menu_category>
+ </menu_submenu>
+ <menu_submenu name="extras" name_ref="menu_extras">
+ <menu_submenu name="encryption" name_ref="menu_encryption">
+ <menu_action action="EnterPassword"/>
+ </menu_submenu>
+ </menu_submenu>
+ <menu_submenu name="mindmaps" name_ref="mindmaps">
+ <menu_category menu_key="main_menu_modes" name="modes"/>
+ <menu_category menu_key="main_menu_navigate_maps" name="navigate"/>
+ <menu_category menu_key="main_menu_mindmaps" name="mindmaps"/>
+ </menu_submenu>
+ <menu_submenu name="help" name_ref="help">
+ <menu_category name="Web resources">
+ <menu_action action="OpenFreeplaneSiteAction"/>
+ </menu_category>
+ <menu_category name="legacy">
+ <menu_action action="AboutAction" menu_key="MB_AboutAction"/>
+ </menu_category>
+ </menu_submenu>
+ </menu_category>
+ <menu_category name="map_popup">
+ <menu_action action="ToggleMenubarAction" menu_key="MP_ToggleMenubarAction"/>
+ <menu_action action="ToggleToolbarAction"/>
+ <menu_action action="ShowFilterToolbarAction"/>
+ <menu_action action="ViewLayoutTypeAction.OUTLINE"/>
+ <menu_action action="CenterSelectedNodeAction"/>
+ <menu_action accelerator="ESCAPE" action="MoveToRootAction"/>
+ <menu_action action="GotoNodeAction"/>
+ </menu_category>
+ <menu_category name="node_popup">
+ <menu_action action="SetShortenerStateAction"/>
+ <menu_action action="EnterPassword"/>
+ <menu_action accelerator="control C" action="CopyAction"/>
+ <menu_action accelerator="control shift C" action="CopySingleAction"/>
+ </menu_category>
+ <menu_category name="main_toolbar">
+ <menu_category menu_key="main_toolbar_zoom" name="zoom">
+ </menu_category>
+ <menu_category name="open">
+ <menu_action action="PrintAction"/>
+ <menu_action action="PrintDirectAction"/>
+ </menu_category>
+ <menu_category name="paste">
+ <menu_action action="CopyAction"/>
+ </menu_category>
+ <menu_category name="update" menu_key="main_toolbar_update" />
+ <menu_category name="zoom" menu_key="main_toolbar_zoom" />
+ <menu_category name="folding">
+ <menu_action action="UnfoldOneLevelAction"/>
+ <menu_action action="FoldOneLevelAction"/>
+ <menu_action action="UnfoldAllAction"/>
+ <menu_action action="FoldAllAction"/>
+ </menu_category>
+ <menu_category name="find">
+ <menu_action action="FindAction"/>
+ <menu_action action="QuickFindAction.FORWARD"/>
+ <menu_action action="QuickFindAction.BACK"/>
+ </menu_category>
+ <menu_action action="EnterPassword" />
+ </menu_category>
+</menu_structure>
\ No newline at end of file
diff --git a/freeplane_ant/.classpath b/freeplane_ant/.classpath
new file mode 100644
index 0000000..f58a5a8
--- /dev/null
+++ b/freeplane_ant/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="test/src"/>
+ <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 kind="output" path="build"/>
+</classpath>
diff --git a/freeplane_ant/.project b/freeplane_ant/.project
new file mode 100644
index 0000000..d2dd62b
--- /dev/null
+++ b/freeplane_ant/.project
@@ -0,0 +1,17 @@
+<?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/README.txt b/freeplane_ant/README.txt
new file mode 100644
index 0000000..a4a39ef
--- /dev/null
+++ b/freeplane_ant/README.txt
@@ -0,0 +1,42 @@
+Custom Ant tasks for use in freeplane.
+======================================
+
+ - target "jar" builds build/freeplaneant.jar
+ - target "test" performs some tests
+ - See test/build.xml for examples of their use
+
+Task FormatTranslation
+----------------------
+formats a translation file and writes the result to another file.
+
+The following transformations are made:
+ - sort lines (case insensitive)
+ - remove duplicates
+ - if a key is present multiple times, then entries marked as
+ [translate me] and [auto] are removed in favor of normal entries.
+ - newline style is changed to the platform default.
+
+Attributes:
+ - dir: the input directory (default: ".")
+ - outputDir: the output directory. Overwrites existing files if
+ outputDir equals the input directory (default: the input directory)
+ - includes: wildcard pattern (default: all regular files).
+ - excludes: wildcard pattern, overrules includes (default: no
+ excludes).
+ - writeIfUnchanged: by default sorted files are not written if they
+ are unchanged after formatting. Set to "true" to change this
+ behaviour.
+
+Task FormatTranslationCheck
+---------------------------
+Does the same thing as FormatTranslation with the following exceptions:
+
+- no files are written or changed.
+- only the formatting status of each file is reported.
+- the build fails unless failonerror="false"
+
+Attributes:
+ - all attributes of the FormatTranslation task without
+ "outputDir" and "writeIfUnchanged"
+ - failonerror: boolean. By default the build fails if some wrongly
+ formatted file is found. Set to "false" to change this behaviour.
diff --git a/freeplane_ant/build.xml b/freeplane_ant/build.xml
new file mode 100644
index 0000000..7f8496d
--- /dev/null
+++ b/freeplane_ant/build.xml
@@ -0,0 +1,43 @@
+<project name="freeplane_ant" default="compile" basedir=".">
+ <property name="src" location="src" />
+ <property name="lib" location="lib" />
+ <property name="bin" location="bin" />
+ <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>
+ </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/org/freeplane/ant/CreatePlugin.java b/freeplane_ant/src/org/freeplane/ant/CreatePlugin.java
new file mode 100644
index 0000000..23d48ed
--- /dev/null
+++ b/freeplane_ant/src/org/freeplane/ant/CreatePlugin.java
@@ -0,0 +1,278 @@
+/**
+ * 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 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 Boolean hasAction;
+ private File newPluginDir;
+ private File pluginTemplateDir;
+ private File baseDir;
+
+ 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]");
+ if (hasAction == null)
+ hasAction = String.valueOf(
+ TaskUtils.multipleChoice(getProject(), "=> Optional: Does this plugin contribute to the GUI?", "yes,no", "yes"))
+ .equalsIgnoreCase("yes");
+ }
+
+ 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 {
+ if (hasAction)
+ createAction();
+ createActivator();
+ }
+
+ private void createAction() throws IOException {
+ final String capPluginName = TaskUtils.firstToUpper(pluginName);
+ String source = "" //
+ + "package " + packageName() + ";\n" //
+ + "\n" //
+ + "import java.awt.event.ActionEvent;\n" //
+ + "\n" //
+ + "import org.freeplane.core.controller.Controller;\n" //
+ + "import org.freeplane.core.ui.AFreeplaneAction;\n" //
+ + "import org.freeplane.core.ui.components.UITools;\n" //
+ + "\n" //
+ + "public class " + capPluginName + "Action extends AFreeplaneAction {\n" //
+ + " private static final long serialVersionUID = 1L;\n" //
+ + "\n" //
+ + " public " + capPluginName + "Action() {\n" //
+ + " super(\"" + capPluginName + "\", controller, \"" + capPluginName + "\", null);\n" //
+ + " }\n" //
+ + "\n" //
+ + " public void actionPerformed(final ActionEvent e) {\n" //
+ + " /*TODO: enter your GUI code here*/\n" //
+ + " UITools.informationMessage(\"Hi!\\n\\tThis is plugin " + capPluginName + "\");\n" //
+ + " }\n" //
+ + "}\n";
+ write(new File(sourceDir(), capPluginName + "Action.java"), source);
+ }
+
+ private void createActivator() throws IOException {
+ final String registerAction = hasAction ? " "
+ + "final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();\n"
+ + " menuBuilder.addAnnotatedAction(new " + TaskUtils.firstToUpper(pluginName)
+ + "Action(modeController.getController()));\n" : "";
+ String source = "" //
+ + "package " + packageName() + ";\n" //
+ + "\n" //
+ + "import java.util.Hashtable;\n" //
+ + "\n" //
+ + "import org.freeplane.core.ui.MenuBuilder;\n" //
+ + "import org.freeplane.features.common.map.ModeController;\n" //
+ + "import org.freeplane.features.mindmapmode.MModeController;\n" //
+ + "import org.freeplane.main.osgi.IModeControllerExtensionProvider;\n" //
+ + "import org.osgi.framework.BundleActivator;\n" //
+ + "import org.osgi.framework.BundleContext;\n" //
+ + "\n" //
+ + "public class Activator implements BundleActivator {\n" //
+ + " /*\n" //
+ + " * (non-Javadoc)\n" //
+ + " * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)\n" //
+ + " */\n" //
+ + " public void start(final BundleContext context) throws Exception {\n" //
+ + " final Hashtable<String, String[]> props = new Hashtable<String, String[]>();\n" //
+ + " props.put(\"mode\", new String[] { MModeController.MODENAME /*TODO: other modes too?*/});\n" //
+ + " context.registerService(IModeControllerExtensionProvider.class.getName(),\n" //
+ + " new IModeControllerExtensionProvider() {\n" //
+ + " public void installExtension() {\n" //
+ + registerAction + " }\n" //
+ + " /*TODO: further initializations*/}, props);\n" //
+ + " }\n" //
+ + "\n" //
+ + " /*\n" //
+ + " * (non-Javadoc)\n" //
+ + " * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)\n" //
+ + " */\n" //
+ + " public void stop(final BundleContext context) throws Exception {\n" //
+ + " }\n" //
+ + "}\n";
+ 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));
+ }
+
+ public Boolean getHasAction() {
+ return hasAction;
+ }
+
+ public void setHasAction(Boolean hasAction) {
+ this.hasAction = hasAction;
+ }
+}
diff --git a/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java b/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java
new file mode 100644
index 0000000..35f7e0d
--- /dev/null
+++ b/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java
@@ -0,0 +1,319 @@
+/**
+ * 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>() {
+ 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 ArrayList<Pattern> includePatterns = new ArrayList<Pattern>();
+ private ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>();
+ private String lineSeparator = System.getProperty("line.separator");
+
+ 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().process(inputFiles, false);
+ }
+
+ 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 = new File(outputDir, inputFile.getName());
+ 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[] keyValue = line.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");
+ }
+}
diff --git a/freeplane_ant/src/org/freeplane/ant/FormatTranslationCheck.java b/freeplane_ant/src/org/freeplane/ant/FormatTranslationCheck.java
new file mode 100644
index 0000000..54e5aa7
--- /dev/null
+++ b/freeplane_ant/src/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/org/freeplane/ant/TaskUtils.java b/freeplane_ant/src/org/freeplane/ant/TaskUtils.java
new file mode 100644
index 0000000..b2012d5
--- /dev/null
+++ b/freeplane_ant/src/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), "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/test-launcher/FormatTranslationTest.launch b/freeplane_ant/test-launcher/FormatTranslationTest.launch
new file mode 100644
index 0000000..1fd3fe7
--- /dev/null
+++ b/freeplane_ant/test-launcher/FormatTranslationTest.launch
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/freeplane_ant/test/src/org/freeplane/ant/FormatTranslationTest.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.ant.FormatTranslationTest"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane_ant"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-DTRANSLATIONS_SOURCE_DIR=${workspace_loc:freeplane/resources/translations}"/>
+</launchConfiguration>
diff --git a/freeplane_ant/test/build.xml b/freeplane_ant/test/build.xml
new file mode 100644
index 0000000..93bfcfc
--- /dev/null
+++ b/freeplane_ant/test/build.xml
@@ -0,0 +1,77 @@
+<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
new file mode 100644
index 0000000..a3f84a5
--- /dev/null
+++ b/freeplane_ant/test/src/org/freeplane/ant/FormatTranslationTest.java
@@ -0,0 +1,168 @@
+/**
+ * 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.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");
+ }
+}
diff --git a/freeplane_ant/test/unsorted/Test_de.properties b/freeplane_ant/test/unsorted/Test_de.properties
new file mode 100644
index 0000000..7bc9662
--- /dev/null
+++ b/freeplane_ant/test/unsorted/Test_de.properties
@@ -0,0 +1,1435 @@
+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/ManagePatterns.dialog.title=Stile Verwalten
+accessories/plugins/ManagePatterns.not_found=Die Datei mit den Stilen ('patterns.xml') wurde nicht gefunden.
+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 WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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 den Blasenstil, ungefaltete den Linienstil.</td></tr></table></html>
+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
new file mode 100644
index 0000000..09fc7c5
--- /dev/null
+++ b/freeplane_ant/test/unsorted/Test_en.properties
@@ -0,0 +1,1265 @@
+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 WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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}
+ManagePatterns.text = Manage Patterns...
+ManagePatterns.tooltip = Change the patterns defined in patterns.xml in an editor. The result is automatically saved.
+ManagePatternsPopupDialog.Actions = &Actions
+ManagePatternsPopupDialog.add = Add new Pattern
+ManagePatternsPopupDialog.apply = Apply
+ManagePatternsPopupDialog.duplicate = Duplicate Pattern
+ManagePatternsPopupDialog.DuplicateNameMessage = You have chosen a name twice. Please change this before leaving this dialog.
+ManagePatternsPopupDialog.from_nodes = Create Pattern From Selected Nodes
+ManagePatternsPopupDialog.remove = Remove Pattern
+ManagePatternsPopupDialog.Save = Save and Return
+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
new file mode 100644
index 0000000..942a9db
--- /dev/null
+++ b/freeplane_ant/test/unsorted/Test_ru.properties
@@ -0,0 +1,1294 @@
+#!
+#! 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 Polansky, Christian Foltin, Dimitry Polivaev \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.\n\u042d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 - \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439 \u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 GNU,\n\n\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: http://freeplane.sourceforge.net/\n\u0412\u0435\u0440\u0441\u0438\u044f:
+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<br> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0443\u0437\u0435\u043b \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e"
+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\u0437\u043b\u043e\u0432 \u0438 <strong> \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432</strong></html>
+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\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \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\u0432\u0435\u0440\u0445. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u0443\u0437\u043b\u044b \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.
+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\u0430\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \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\u0432\u0435\u0440\u0445. \u0420\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u0443\u0437\u043b\u044b \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.
+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\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438\n\n\u042d\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430; \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0435\u0435 \u0438/\u0438\u043b\u0438\n\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439 \u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 GNU,\n\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0424\u043e\u043d\u0434\u043e\u043c \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u041f\u041e; \u043b\u0438\u0431\u043e \u0432\u0435\u0440\u0441\u0438\u0438 2,\n\u043b\u0438\u0431\u043e (\u043f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443) \u043b\u044e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.\n\n\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 \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435, \u0447\u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439,\n\u043d\u043e \u0411\u0415\u0417 \u041a\u0410\u041a\u0418\u0425-\u041b\u0418\u0411\u041e \u0413\u0410\u0420\u0410\u041d\u0422\u0418\u0419; \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c\u044b\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439\n\u041a\u041e\u041c\u041c\u0415\u0420\u0427\u0415\u0421\u041a\u041e\u0419 \u0426\u0415\u041d\u041d\u041e\u0421\u0422\u0418 \u0438\u043b\u0438 \u041f\u0420\u0418\u0413\u041e\u0414\u041d\u041e\u0421\u0422\u0418 \u0414\u041b\u042f \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u041e\u0419 \u0426\u0415\u041b\u0418. \u0414\u043b\u044f\n\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044e GNU.\n\n\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439 \u041e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 GNU\n\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439; \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+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?
+ManagePatterns.text=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0442\u0438\u043b\u0435\u0439
+ManagePatterns.tooltip=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0446\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 patterns.xml
+ManagePatternsPopupDialog.Actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+ManagePatternsPopupDialog.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
+ManagePatternsPopupDialog.apply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c
+ManagePatternsPopupDialog.duplicate=\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0435\u0446
+ManagePatternsPopupDialog.DuplicateNameMessage=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0434\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430.
+ManagePatternsPopupDialog.from_nodes=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c
+ManagePatternsPopupDialog.remove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
+ManagePatternsPopupDialog.Save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c
+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\u043c\u0438, \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0449\u0435\u043b\u0447\u043e\u043a \u0438 <ctrl>+\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0449\u0435\u043b\u0447\u043e\u043a \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u0438\u0445.
+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\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.
+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\u0430\u0442\u0435\u043b\u0435\u0439) \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0431\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.</html>
+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\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0441\u0446\u0435\u043b\u044c\u043d\u043e.
+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 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d</html>
+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 \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</html>
+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\u043e\u0442\u0435\u0440\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0435\u043f\u0440\u0435\u0434\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e.
+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\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b.</html>
+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\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f(\!),<br>\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\!</body></html>
+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\u044b\u0442\u044c, \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c(\!)),<br>\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443\!</body></html>
+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\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e. <br>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e\!</body></html>
+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\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b </html>
+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\u043e\u043c ';'.
+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\u043e \u043d\u0430 MacOS.<br>"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b).<br>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 .jar.<br>\u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c "\u041d\u0438\u0447\u0435\u0433\u043e". \u042d\u0442\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u043f\u043f\u043b\u0435\u0442\u043e\u0432.</html>
+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,</td></tr><tr><td>bubble\: </td><td> \u0443\u0437\u0435\u043b \u0441 \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u044e\u044e\u0449\u0435\u0439 \u0440\u0430\u043c\u043a\u043e\u0439,</td></tr><tr><td>As parent\: </td><td> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0443\u0437\u043b\u0430-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f <br>\u0438\u043b\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0438\u043b\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430,</td></tr><tr><td>Combined\: </td><td> \u041f\u0443\u0437\u044b\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u0443\u0437\u0435\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442, \u0438\u043d\u0430\u0447\u0435 - \u0431\u0435\u0437 \u0440\u0430\u043c\u043a\u0438.</td></tr></table></html>
+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\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f.</html>
+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\u043e\u0440 Rich Text .<br>"\u041d\u0435\u0442" \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 Plain Text.</html>
+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\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u0431 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0446\u0435\u043b\u044c\u043d\u043e.
+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\u0435 \u0441\u0441\u044b\u043b\u0430\u0442\u0441\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u043e\u0441\u043e\u0431\u044b\u0435 \u0443\u0437\u043b\u044b \u0432 \u043a\u0430\u0440\u0442\u0435 \u0431\u0435\u0437 ID \u0443\u0437\u043b\u043e\u0432.
+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 \u043a\u043b\u044e\u0447 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. <br>\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).</html>
+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\u0436\u043a\u043e\u0439. \u041d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u0435\u0451, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b auto.properties \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<br><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e.</i></html>
+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\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.
+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 #RRGGBB)</html>
+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\u0434\u0435 #RRGGBB)</html>
+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\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRGGBB)</html>
+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\u0434\u0438\u0442\u0435\u043b\u044c"</html>
+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\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.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\u0443\u043d\u0434\u0430\u0445. \u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f .</html>
+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\u044f \u043d\u0430\u0434 \u043d\u0438\u043c (\u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445).<br>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431 \u0443\u0437\u0435\u043b \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.</html>
+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\u0440\u0430\u043c\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b</html>
+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|7\#Delete|8\#Read|9\#Write}. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445.
+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\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430.<br>\u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u0430\u0439\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441\u043d\u043e\u0432\u0430.</html>
+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\u0442\u044c \u0434\u0430\u0442\u0443 (\u0414\u0410), <br>\u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0436\u043d\u044e\u044e \u0434\u0430\u0442\u0443 (\u041d\u0415\u0422)?</html>
+
+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 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439.) </html>
+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\u0441\u043d\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\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\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<br>\u041e\u0442\u0447\u0435\u0442\u044b \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.
+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
new file mode 100644
index 0000000..f647ae4
--- /dev/null
+++ b/freeplane_devresources/.project
@@ -0,0 +1,11 @@
+<?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
new file mode 100644
index 0000000..752228f
--- /dev/null
+++ b/freeplane_devresources/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..b6f459b
--- /dev/null
+++ b/freeplane_devresources/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Mon Feb 15 22:56:26 CET 2010
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/freeplane_devresources/CodeStyle/clean-up.xml b/freeplane_devresources/CodeStyle/clean-up.xml
new file mode 100644
index 0000000..fc2979b
--- /dev/null
+++ b/freeplane_devresources/CodeStyle/clean-up.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="2">
+<profile kind="CleanUpProfile" name="Clean up" version="2">
+<setting id="cleanup.remove_unused_private_fields" value="false"/>
+<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
+<setting id="cleanup.never_use_blocks" value="false"/>
+<setting id="cleanup.remove_unused_private_methods" value="true"/>
+<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
+<setting id="cleanup.convert_to_enhanced_for_loop" value="false"/>
+<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
+<setting id="cleanup.sort_members" value="false"/>
+<setting id="cleanup.remove_unused_local_variables" value="true"/>
+<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
+<setting id="cleanup.remove_unused_private_members" value="true"/>
+<setting id="cleanup.remove_unnecessary_casts" value="true"/>
+<setting id="cleanup.make_parameters_final" value="true"/>
+<setting id="cleanup.use_this_for_non_static_field_access" value="true"/>
+<setting id="cleanup.remove_private_constructors" value="true"/>
+<setting id="cleanup.use_blocks" value="true"/>
+<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
+<setting id="cleanup.remove_trailing_whitespaces_all" value="true"/>
+<setting id="cleanup.always_use_this_for_non_static_field_access" value="false"/>
+<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="true"/>
+<setting id="cleanup.add_default_serial_version_id" value="true"/>
+<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="false"/>
+<setting id="cleanup.make_variable_declarations_final" value="true"/>
+<setting id="cleanup.add_missing_nls_tags" value="false"/>
+<setting id="cleanup.format_source_code" value="true"/>
+<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="true"/>
+<setting id="cleanup.add_missing_override_annotations" value="true"/>
+<setting id="cleanup.remove_unused_private_types" value="true"/>
+<setting id="cleanup.add_missing_methods" value="false"/>
+<setting id="cleanup.make_local_variable_final" value="true"/>
+<setting id="cleanup.correct_indentation" value="true"/>
+<setting id="cleanup.remove_unused_imports" value="true"/>
+<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="false"/>
+<setting id="cleanup.make_private_fields_final" value="true"/>
+<setting id="cleanup.add_generated_serial_version_id" value="false"/>
+<setting id="cleanup.organize_imports" value="true"/>
+<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
+<setting id="cleanup.sort_members_all" value="true"/>
+<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
+<setting id="cleanup.add_missing_annotations" value="true"/>
+<setting id="cleanup.use_parentheses_in_expressions" value="false"/>
+<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
+<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
+<setting id="cleanup.use_this_for_non_static_method_access" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="false"/>
+<setting id="cleanup.add_serial_version_id" value="false"/>
+<setting id="cleanup.format_source_code_changes_only" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
+<setting id="cleanup.always_use_blocks" value="true"/>
+</profile>
+</profiles>
diff --git a/freeplane_devresources/CodeStyle/codetemplates.xml b/freeplane_devresources/CodeStyle/codetemplates.xml
new file mode 100644
index 0000000..39837ec
--- /dev/null
+++ b/freeplane_devresources/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} = ${param};</template></templates>
\ No newline at end of file
diff --git a/freeplane_devresources/CodeStyle/formatter.xml b/freeplane_devresources/CodeStyle/formatter.xml
new file mode 100644
index 0000000..ff89f51
--- /dev/null
+++ b/freeplane_devresources/CodeStyle/formatter.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="12">
+<profile kind="CodeFormatterProfile" name="FreeplaneFormatter" version="12">
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="20"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="20"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="20"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="mixed"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="18"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="20"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="20"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="18"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+</profile>
+</profiles>
diff --git a/freeplane_devresources/eclipse/freeplane core.launch b/freeplane_devresources/eclipse/freeplane core.launch
new file mode 100644
index 0000000..d3a38d5
--- /dev/null
+++ b/freeplane_devresources/eclipse/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/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"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_formula"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane/lib\/commons-lang-2.0.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_bugreport"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_help"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_help/lib\/jhall.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_latex"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_latex/\/freeplane_plugin_latex\/lib\/HotEqn.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_latex_2"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_script"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_script/lib\/groovy-all-1.5.6.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_svg"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-awt-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-bridge.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-css.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-dom.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-ext.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-extension.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-gui-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-gvt.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-parser.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-script.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-svg-dom.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-svggen.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-swing.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-transcoder.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-xml.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/js.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/pdf-transcoder.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/xerces_2_5_0.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/xml-apis.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <default/> " typeId="org.eclipse.debug.core.containerType.default"/>
</sourceContainers>
</sourceLookupDirector>
"/>
+<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.launch b/freeplane_devresources/eclipse/freeplane knopflerfish.launch
new file mode 100644
index 0000000..748c115
--- /dev/null
+++ b/freeplane_devresources/eclipse/freeplane knopflerfish.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"/>
+</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"?> <javaProject name="freeplane"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_formula"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane/lib\/commons-lang-2.0.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_bugreport"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_help"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_help/lib\/jhall.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_latex"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_latex/\/freeplane_plugin_latex\/lib\/HotEqn.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_latex_2"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_script"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_script/lib\/groovy-all-1.5.6.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane_plugin_svg"/> " typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-awt-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-bridge.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-css.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-dom.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-ext.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-extension.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-gui-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-gvt.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-parser.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-script.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-svg-dom.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-svggen.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-swing.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-transcoder.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-util.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/batik-xml.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/js.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/pdf-transcoder.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/xerces_2_5_0.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <packageFragmentRoot handle="=freeplane_plugin_svg/lib\/xml-apis.jar"/> " typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/>
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <default/> " typeId="org.eclipse.debug.core.containerType.default"/>
</sourceContainers>
</sourceLookupDirector>
"/>
+<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/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.knopflerfish.framework.Main"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-xargs props.xargs -xargs init.xargs"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m -Dorg.knopflerfish.framework.bundlestorage=memory -Dorg.knopflerfish.gosg.jars=reference:file:core/"/>
+<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.launch b/freeplane_devresources/eclipse/freeplane-osgi.launch
new file mode 100644
index 0000000..41fc7af
--- /dev/null
+++ b/freeplane_devresources/eclipse/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=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="org.freeplane.plugin.help at default:default,org.freeplane.plugin.bugreport at default:default,org.freeplane.core at 2:default,freeplane_uitest at default:false,org.freeplane.plugin.latex at default:default,freeplane_plugin_script_test at default:false,org.freeplane.plugin.script at default:default,org.freeplane.uispec4j at default:default,org.freeplane.plugin.svg at default:default,org.freeplane.plugin.formula at default:default"/>
+<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
+</launchConfiguration>
diff --git a/freeplane_devresources/test/generateTestMap.pl b/freeplane_devresources/test/generateTestMap.pl
new file mode 100644
index 0000000..5fa8f5d
--- /dev/null
+++ b/freeplane_devresources/test/generateTestMap.pl
@@ -0,0 +1,159 @@
+#=================== Configuration ===================
+
+# $max_node_number - approximate number of nodes to generate
+our $max_node_number = 1000;
+# our $max_node_number = 10000;
+# our $max_node_number = 100000;
+#our $max_node_number = 200000;
+
+# $max_level - number of node levels, root node has level 0
+our $max_level = 7;
+
+# $max_level - number of child nodes for each node
+our $max_number = 7;
+
+# $attributeNumber - number of attributes added to each node
+our $attributeNumber = 0;
+
+# $iconNumber - number of icons added to each node
+our $iconNumber = 2;
+
+# $linkNumber - number of links added to each node
+our $linkNumber = 0;
+
+#$richcontent: 0 - use plain text, 1 - use rich content
+our $richcontent = 0;
+
+
+#=================== Script ==========================
+use strict;
+our $counter = 0;
+our $rest = 1;
+
+my $mmfile;
+
+open($mmfile,
+">map_$max_node_number-$max_level-$max_number-$attributeNumber-$linkNumber-$richcontent.mm");
+
+sub attributes($)
+{
+ my $level = shift;
+ for(my $i = 1; $i <= $attributeNumber; $i++)
+ {
+ print $mmfile " " x ($level * 4);
+ print $mmfile "<attribute NAME=\"$i\" VALUE=\"attribute $i $i
+$i\"/>\n";
+ }
+}
+
+sub icons($)
+{
+ my $level = shift;
+ for(my $i = 0; $ i < $iconNumber; $i++)
+ {
+ my $j = ($i + $level-1) % 9 + 1;
+ print $mmfile " " x ($level * 4);
+ print $mmfile "<icon BUILTIN=\"full-" . $j . "\"/>\n";
+ }
+}
+
+sub links($)
+{
+ if(! $linkNumber)
+ {
+ return;
+ }
+ my $level = shift;
+ for(my $i = 1; $i <= $attributeNumber; $i++)
+ {
+ my $target = int(rand($max_node_number)) + 1;
+ if($target == $counter)
+ {
+ $target--;
+ }
+ print $mmfile " " x ($level * 4);
+ print $mmfile "<arrowlink DESTINATION=\"Freemind_Link_$target\"
+ENDARROW=\"Default\" ENDINCLINATION=\"49;0;\" STARTARROW=\"None\"
+STARTINCLINATION=\"49;0;\"/>\n";
+ }
+}
+sub nodes($)
+{
+ if($counter + $rest > $max_node_number)
+ {
+ return;
+ }
+ my $level = shift;
+ if ($level > $max_level)
+ {
+ return;
+ }
+ $rest += $max_number;
+ for(my $i = 1; $i <= $max_number; $i++)
+ {
+ $counter++;
+ $rest--;
+
+ my $folded;
+ if($counter + $rest > $max_node_number || $level == $max_level) {
+ $folded = '';
+ }
+ else{
+ $folded='FOLDED = "true"';
+ }
+
+ my $space = " " x ($level * 4);
+ print $mmfile "$space<node ID=\"Freemind_Link_$counter\" ";
+ if(! $richcontent)
+ {
+ print $mmfile "TEXT=\"testnode $level $i $counter\" ";
+ }
+ print $mmfile "$folded>\n";
+ if($richcontent)
+ {
+ print $mmfile <<END;
+$space<richcontent TYPE=\"NODE\">
+$space<html>
+$space <head>
+$space </head>
+$space <body>
+$space <p>
+$space testnode $level $i $counter
+$space </p>
+$space </body>
+$space</html>
+$space</richcontent>
+END
+ }
+ attributes($level + 1);
+ links($level + 1);
+ icons($level + 1);
+ nodes($level + 1);
+ print $mmfile " " x ($level * 4);
+ print $mmfile "</node>\n";
+}
+ }
+my $rootNodeText = "our \$max_node_number = $max_node_number; # approximate
+number of nodes to generate
"
+ ."our \$max_level = $max_level; # number of node levels, root node
+has level 0
"
+ ."our \$max_number = $max_level; # number of child nodes for each
+node
"
+ ."our \$attributeNumber = $attributeNumber; # number of attributes
+added to each node
"
+ ."our \$linkNumber = $linkNumber; #number of links added to each
+node
"
+ ."our \$richcontent = $richcontent; # 0 - use plain text, 1 - use
+rich content";
+print $mmfile <<ENDOFMAP;
+<map version="0.9.0">
+<!-- To view this file, download free mind mapping software FreeMind from
+http://freemind.sourceforge.net -->
+<node TEXT=\"$rootNodeText\">
+ENDOFMAP
+nodes(1);
+print $mmfile <<ENDOFMAP2;
+</node>
+</map>
+ENDOFMAP2
+
diff --git a/freeplane_framework/.classpath b/freeplane_framework/.classpath
new file mode 100644
index 0000000..6c7e8af
--- /dev/null
+++ b/freeplane_framework/.classpath
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..8ae0ea0
--- /dev/null
+++ b/freeplane_framework/.project
@@ -0,0 +1,17 @@
+<?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
new file mode 100644
index 0000000..b2ba3b2
--- /dev/null
+++ b/freeplane_framework/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..ce3b778
--- /dev/null
+++ b/freeplane_framework/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Mon Feb 15 22:56:52 CET 2010
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF b/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF
new file mode 100644
index 0000000..9e7d56e
--- /dev/null
+++ b/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..45dea02
--- /dev/null
+++ b/freeplane_framework/ant/ant.properties
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..27d7f44
--- /dev/null
+++ b/freeplane_framework/ant/build.xml
@@ -0,0 +1,503 @@
+<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="ver" value="${freeplane_version}_${minor}" else="${freeplane_version}">
+ <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" />
+
+ <!-- Mac OS X -->
+ <condition property="isMacOs">
+ <os family="mac"/>
+ </condition>
+
+ <property name="mac-jarbundler" value = "${root}/mac-jarbundler"/>
+ <property name="jarbundler.jar" value = "jarbundler-2.1.0.jar"/>
+ <taskdef name="jarbundler" onerror="report"
+ classpath="${mac-jarbundler}/${jarbundler.jar}"
+ classname="net.sourceforge.jarbundler.JarBundler" />
+ <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_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_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">
+ <tar destfile="${dist}/freeplane_src-${ver}.tar.gz" compression="gzip" longfile="gnu">
+ <tarfileset prefix="freeplane-${ver}" dir="${workspace}" mode="664">
+ <patternset id="freeplane.sources">
+ <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="**/backups/**" />
+ <exclude name="bin/**" />
+ <exclude name="build/**" />
+ <exclude name="dist/**" />
+ <exclude name="*/bin/**" />
+ <exclude name="*/build/**" />
+ <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" />
+ </patternset>
+ </tarfileset>
+ <tarfileset prefix="freeplane-${ver}" dir="${root}" mode="664">
+ <include name="${license}" />
+ <include name="${readme_src}" />
+ </tarfileset>
+ </tar>
+
+ <tar destfile="${dist}/freeplane_srcpure-${ver}.tar.gz" compression="gzip" longfile="gnu">
+ <tarfileset prefix="freeplane-${ver}" dir="${workspace}" mode="664">
+ <patternset refid="freeplane.sources" />
+ <exclude name="**/*.exe" />
+ <exclude name="**/*.res" />
+ <exclude name="**/*.jar" />
+ <exclude name="**/*JavaApplicationStub*" />
+ </tarfileset>
+ <tarfileset prefix="freeplane-${ver}" dir="${root}" mode="664">
+ <include name="${license}" />
+ <include name="${readme_src}" />
+ </tarfileset>
+ </tar>
+ </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="${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">
+
+ <property name="macpluginsdir" value="plugins" />
+ <!-- !! TODO: Delete this unused property, and also delete its use in below in the jarbundler vmoptions field
+ Disabled "command-line" parameters because the "$1" syntax is probably incorrect here:
+ <property name="macparams" value="-Dorg.freeplane.param1=$1 -Dorg.freeplane.param2=$2 -Dorg.freeplane.param3=$3 -Dorg.freeplane.param4=$4" />
+ -->
+ <property name="macdefines" value="-Dorg.knopflerfish.framework.bundlestorage=memory -Dorg.freeplane.globalresourcedir=./resources -Dorg.knopflerfish.gosg.jars=reference:file:./core/" />
+
+ <!-- uncomment to start remote debug session for the app
+ <property name="debugparams" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=localhost:8000"/>
+ -->
+
+ <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"/>
+ <jarbundler dir="${build4mac}"
+ name="Freeplane"
+ mainclass="org.knopflerfish.framework.Main"
+ version="${ver}"
+ infostring="Freeplane ${ver}"
+ shortname="Freeplane"
+ bundleid="org.freeplane.core"
+ jvmversion="1.2+"
+ vmoptions="${debugparams} -Xmx512m ${macdefines}"
+ arguments="-xargs ./props.xargs -xargs ./init.xargs"
+ jar="${build}/framework.jar"
+ icon="${mac-jarbundler}/freeplane.icns"
+ stubfile="${mac-jarbundler}/FreeplaneJavaApplicationStub"
+ signature="FP"
+ >
+ <!-- For OSGI we want the entire build/ tree except WIndows-related stuff
+ Commented out to allow testing jar=framework.jar
+ <jarfileset dir="${macosgidir}">
+ <exclude name="**/*.bat" />
+ <exclude name="**/*.exe" />
+ </jarfileset>
+ -->
+
+ <!-- Commenting out the document icon until we get an appropriate image
+ iconfile="${mac-jarbundler}/Banner.icns"
+ -->
+ <documenttype name="Mindmap"
+ extensions="mm"
+ ostypes="MM"
+ iconfile="${mac-jarbundler}/freeplanedoc.icns"
+ role="Editor"/>
+ </jarbundler>
+ <chmod file="${macappfullpath}/Contents/MacOS/FreeplaneJavaApplicationStub" perm="ugo+rx" />
+ <!-- Patch the Info.plist file created by JarBundler, to work with Knopflerfish OSGI
+ Courtesy of Volker who supplied the logic for this <replace> subtask
+ Allows Freeplane to start when double-clicking on Freeplane.app in Finder
+ Sets the WorkingDirectory to $JAVAROOT
+ Found this idea in a post on Knopflerfish's SF site:
+ http://sourceforge.net/tracker/index.php?func=detail&aid=1651148&group_id=82798&atid=567241
+ The downloadable example code has problems but inspired the solution
+ -->
+ <echo message="Adding WorkingDirectory to Info.plist" />
+ <property name="dist_macos_info" location="${macappfullpath}/Contents/Info.plist"/>
+ <xslt style="${mac-jarbundler}/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 jarbundler task
+ Doing this separately to allow specifying jar=framework.jar in the jarbundler task
+ jarbundler allows either jar= or jarfileset but not both
+ Copying after the jarbundler task which creates the Freeplane.app directory
+ JarBundler may erase the directory if it already exists
+ This is documented in their change log
+ !! TODO: Test restoring the jarfileset inside jarbundler
+ Comment out this copy task, and delete it if jarfileset works
+ -->
+ <property name="macjavafullpath" value="${macappfullpath}/Contents/Resources/Java"/>
+ <copy todir="${macjavafullpath}">
+ <fileset dir="${build}">
+ <exclude name="**/*.bat" />
+ <exclude name="**/*.exe" />
+ <exclude name="**/framework.jar" />
+ </fileset >
+ </copy>
+
+ <!-- Restore the eXecutable permission flags on the Unix script -->
+ <echo message="Setting eXecutable permissions on ${macappfullpath}/Contents/Resources/Java/freeplane.sh" />
+ <chmod file="${macappfullpath}/Contents/Resources/Java/freeplane.sh" perm="ugo+rx" />
+ </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="${macappfullpath}/Contents/MacOS/FreeplaneJavaApplicationStub"/>
+ </zipfileset>
+ <zipfileset file="${macappfullpath}/Contents/MacOS/FreeplaneJavaApplicationStub" 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="dist" 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"/>
+ </target>
+
+</project>
+
diff --git a/freeplane_framework/launch4j/Freeplane_app.ico b/freeplane_framework/launch4j/Freeplane_app.ico
new file mode 100644
index 0000000..212f57e
Binary files /dev/null and b/freeplane_framework/launch4j/Freeplane_app.ico differ
diff --git a/freeplane_framework/launch4j/Freeplane_doc.ico b/freeplane_framework/launch4j/Freeplane_doc.ico
new file mode 100644
index 0000000..fb9789e
Binary files /dev/null and b/freeplane_framework/launch4j/Freeplane_doc.ico differ
diff --git a/freeplane_framework/launch4j/freeplane.l4j.ini b/freeplane_framework/launch4j/freeplane.l4j.ini
new file mode 100644
index 0000000..b06c7e1
--- /dev/null
+++ b/freeplane_framework/launch4j/freeplane.l4j.ini
@@ -0,0 +1 @@
+# Launch4j runtime config
diff --git a/freeplane_framework/launch4j/freeplaneConsole.l4j.ini b/freeplane_framework/launch4j/freeplaneConsole.l4j.ini
new file mode 100644
index 0000000..b06c7e1
--- /dev/null
+++ b/freeplane_framework/launch4j/freeplaneConsole.l4j.ini
@@ -0,0 +1 @@
+# Launch4j runtime config
diff --git a/freeplane_framework/launch4j/freeplaneConsole.lj4.xml b/freeplane_framework/launch4j/freeplaneConsole.lj4.xml
new file mode 100644
index 0000000..d6c0049
--- /dev/null
+++ b/freeplane_framework/launch4j/freeplaneConsole.lj4.xml
@@ -0,0 +1,25 @@
+<launch4jConfig>
+ <dontWrapJar>true</dontWrapJar>
+ <headerType>console</headerType>
+ <jar>freeplanelauncher.jar</jar>
+ <outfile>freeplaneConsole.exe</outfile>
+ <errTitle></errTitle>
+ <cmdLine></cmdLine>
+ <chdir></chdir>
+ <priority>normal</priority>
+ <downloadUrl>http://java.com/download</downloadUrl>
+ <supportUrl></supportUrl>
+ <customProcName>false</customProcName>
+ <stayAlive>true</stayAlive>
+ <manifest></manifest>
+ <icon></icon>
+ <jre>
+ <path>%FREEPLANE_JAVA_HOME%</path>
+ <minVersion>1.5.0</minVersion>
+ <maxVersion></maxVersion>
+ <jdkPreference>preferJre</jdkPreference>
+ <maxHeapSize>512</maxHeapSize>
+ <maxHeapPercent>40</maxHeapPercent>
+ <opt>-Dorg.freeplane.userfpdir="%APPDATA%\\Freeplane"</opt>
+ </jre>
+</launch4jConfig>
\ No newline at end of file
diff --git a/freeplane_framework/launch4j/freeplaneGui.lj4.xml b/freeplane_framework/launch4j/freeplaneGui.lj4.xml
new file mode 100644
index 0000000..26cba82
--- /dev/null
+++ b/freeplane_framework/launch4j/freeplaneGui.lj4.xml
@@ -0,0 +1,25 @@
+<launch4jConfig>
+ <dontWrapJar>true</dontWrapJar>
+ <headerType>gui</headerType>
+ <jar>freeplanelauncher.jar</jar>
+ <outfile>freeplane.exe</outfile>
+ <errTitle></errTitle>
+ <cmdLine></cmdLine>
+ <chdir></chdir>
+ <priority>normal</priority>
+ <downloadUrl>http://java.com/download</downloadUrl>
+ <supportUrl></supportUrl>
+ <customProcName>false</customProcName>
+ <stayAlive>true</stayAlive>
+ <manifest></manifest>
+ <icon>Freeplane_app.ico</icon>
+ <jre>
+ <path>%FREEPLANE_JAVA_HOME%</path>
+ <minVersion>1.5.0</minVersion>
+ <maxVersion></maxVersion>
+ <jdkPreference>preferJre</jdkPreference>
+ <maxHeapSize>512</maxHeapSize>
+ <maxHeapPercent>40</maxHeapPercent>
+ <opt>-Dorg.freeplane.userfpdir="%APPDATA%\\Freeplane"</opt>
+ </jre>
+</launch4jConfig>
\ No newline at end of file
diff --git a/freeplane_framework/launcher_build/org/freeplane/launcher/Launcher.class b/freeplane_framework/launcher_build/org/freeplane/launcher/Launcher.class
new file mode 100644
index 0000000..0ad53fd
Binary files /dev/null and b/freeplane_framework/launcher_build/org/freeplane/launcher/Launcher.class differ
diff --git a/freeplane_framework/license.txt b/freeplane_framework/license.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/freeplane_framework/license.txt
@@ -0,0 +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.
diff --git a/freeplane_framework/mac-jarbundler/freeplane.icns b/freeplane_framework/mac-jarbundler/freeplane.icns
new file mode 100644
index 0000000..ffa1e1e
Binary files /dev/null and b/freeplane_framework/mac-jarbundler/freeplane.icns differ
diff --git a/freeplane_framework/mac-jarbundler/freeplanedoc.icns b/freeplane_framework/mac-jarbundler/freeplanedoc.icns
new file mode 100644
index 0000000..b82ecd9
Binary files /dev/null and b/freeplane_framework/mac-jarbundler/freeplanedoc.icns differ
diff --git a/freeplane_framework/mac-jarbundler/mac_info_plist.xslt b/freeplane_framework/mac-jarbundler/mac_info_plist.xslt
new file mode 100644
index 0000000..eb3cab4
--- /dev/null
+++ b/freeplane_framework/mac-jarbundler/mac_info_plist.xslt
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" standalone="no" indent="yes"/>
+
+<xsl:template match="/plist/dict">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()"/>
+ <key>NSHighResolutionCapable</key><true/>
+ </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>
+
+<xsl:template match="/ | node() | @* | comment() | processing-instruction()">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()"/>
+ </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/freeplane_framework/portableApps/Splash.png b/freeplane_framework/portableApps/Splash.png
new file mode 100644
index 0000000..e4eac3f
Binary files /dev/null and b/freeplane_framework/portableApps/Splash.png differ
diff --git a/freeplane_framework/portableApps/portable.ini b/freeplane_framework/portableApps/portable.ini
new file mode 100644
index 0000000..4aa06cc
--- /dev/null
+++ b/freeplane_framework/portableApps/portable.ini
@@ -0,0 +1,6 @@
+# Launch4j runtime config
+-Xmx512m
+-Dportableapp=true
+-Duser.home="%PAL:DataDir%"
+-Dorg.freeplane.userfpdir="%PAL:DataDir%\Freeplane"
+-Dorg.freeplane.globalresourcedir="%PAL:AppDir%\Freeplane\resources"
diff --git a/freeplane_framework/readme.txt b/freeplane_framework/readme.txt
new file mode 100644
index 0000000..dc48b53
--- /dev/null
+++ b/freeplane_framework/readme.txt
@@ -0,0 +1,2 @@
+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/freeplane_framework/script/freeplane.bat b/freeplane_framework/script/freeplane.bat
new file mode 100644
index 0000000..1c24ac3
--- /dev/null
+++ b/freeplane_framework/script/freeplane.bat
@@ -0,0 +1,7 @@
+ 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.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
+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%"
diff --git a/freeplane_framework/script/freeplane.png b/freeplane_framework/script/freeplane.png
new file mode 100644
index 0000000..20f7939
Binary files /dev/null and b/freeplane_framework/script/freeplane.png differ
diff --git a/freeplane_framework/script/freeplane.sh b/freeplane_framework/script/freeplane.sh
new file mode 100644
index 0000000..a53f3a9
--- /dev/null
+++ b/freeplane_framework/script/freeplane.sh
@@ -0,0 +1,226 @@
+#!/bin/bash
+
+# we only want to test the script, not Freeplane itself
+if ( echo "${DEBUG}" | grep -qe "script" )
+then
+ set -x
+fi
+
+########## FUNCTIONS DEFINITIONS #######################################
+
+_debug() {
+ if [ -n "${DEBUG}" ]
+ then
+ echo "DEBUG: $1" >&2
+ shift
+ for text in "$@"
+ do
+ echo " ${text}" >&2
+ done
+ fi
+}
+
+_error() {
+ echo "ERROR: $1" >&2
+ shift
+ for text in "$@"
+ do
+ echo " ${text}" >&2
+ done
+}
+
+findjava() {
+ # We try hard to find the proper 'java' command
+ if [ -n "${JAVACMD}" ] && [ -x "${JAVACMD}" ]
+ then
+ _debug "Using \$JAVACMD to find java virtual machine."
+ elif [ -n "${JAVA_BINDIR}" ] && [ -x "${JAVA_BINDIR}/java" ]
+ then
+ JAVACMD="${JAVA_BINDIR}/java"
+ _debug "Using \$JAVA_BINDIR to find java virtual machine."
+ elif [ -n "${JAVA_HOME}" ] && [ -x "${JAVA_HOME}/bin/java" ]
+ then
+ JAVACMD="${JAVA_HOME}/bin/java"
+ _debug "Using \$JAVA_HOME to find java virtual machine."
+ else
+ JAVACMD=$(which java)
+ if [ -n "${JAVACMD}" ] && [ -x "${JAVACMD}" ]
+ then
+ _debug "Using \$PATH to find java virtual machine."
+ elif [ -x /usr/bin/java ]
+ then
+ _debug "Using /usr/bin/java to find java virtual machine."
+ JAVACMD=/usr/bin/java
+ fi
+ fi
+
+ # if we were successful, we return 0 else we complain and return 1
+ if [ -n "${JAVACMD}" ] && [ -x "${JAVACMD}" ]
+ then
+ _debug "Using '$JAVACMD' as java virtual machine..."
+ if [ -n "${DEBUG}" ]
+ then
+ "$JAVACMD" -version >&2
+ fi
+ if (! "${JAVACMD}" -version 2>&1 | grep -qe 'Java(TM)' -e OpenJDK)
+ then
+ _error "Your Java is not a derivative from Sun's code," \
+ "========================================" \
+ "FREEPLANE WILL MOST PROBABLY *NOT* WORK," \
+ "========================================" \
+ "define JAVACMD, JAVA_BINDIR, JAVA_HOME or PATH" \
+ "in order to point to such a VM." \
+ "See the manpage of freeplane(1) for details."
+ JAVA_TYPE=other
+ else
+ JAVA_TYPE=sun
+ fi
+ return 0
+ else
+ _error "Couldn't find a java virtual machine," \
+ "define JAVACMD, JAVA_BINDIR, JAVA_HOME or PATH."
+ return 1
+ fi
+}
+
+_source() {
+ if [ -f "$1" ]
+ then
+ _debug "Sourcing '$1'."
+ . "$1"
+ fi
+}
+
+output_debug_info() {
+ if [ -z "${DEBUG}" ]
+ then
+ return 0
+ fi
+ _debug "Freeplane parameters are '${@}'."
+ _debug "$(uname -a)"
+ if [ -x "$(which lsb_release 2>/dev/null)" ]
+ then
+ _debug "$(lsb_release -a)"
+ else
+ _debug "System is not LSB conform, 'lsb_release' does not exist."
+ fi
+ if [ -x "$(which dpkg 2>/dev/null)" ]
+ then
+ _debug "The following DEB packages are installed:"
+ COLUMNS=132 dpkg -l | grep -i -e freeplane >&2
+ elif [ -x "$(which rpm 2>/dev/null)" ]
+ then
+ _debug "The following RPM packages are installed:"
+ rpm -qa | grep -i -e freeplane >&2
+ else
+ _debug "Neither dpkg nor rpm is installed."
+ fi
+}
+
+########## START MAIN PART #############################################
+
+#--------- Put the environment together --------------------------------
+
+userfpdir="${HOME}/.freeplane"
+_source /etc/freeplane/freeplanerc
+_source "${userfpdir}/freeplanerc"
+
+findjava
+if [ $? -ne 0 ]
+then
+ exit 1
+fi
+
+output_debug_info
+
+if [ -x $(which readlink) ] && [ "`echo $OSTYPE | cut -b1-6`" != "darwin" ]
+then # if we have 'readlink' we can use it to get an absolute path
+ # -m should be faster and link does always resolve, else this script
+ # wouldn't be called, would it?
+ freefile=$(readlink -mn "$0")
+ _debug "Link '$0' resolved to '${freefile}'."
+else
+ freefile="$0"
+fi
+
+if [ "`echo $OSTYPE | cut -b1-6`" == "darwin" ]
+then
+ xdockname='-Xdock:name=Freeplane'
+else
+ xdockname=""
+fi
+
+freepath="$(dirname "${freefile}")"
+
+# we try different possibilities to find framework.jar
+for jar in "${FREEPLANE_BASE_DIR}" \
+ "${freepath}" "${freepath}/share/freeplane" "${freepath}/freeplane"
+do
+ if [ -f "${jar}/framework.jar" ]
+ then
+ freedir="${jar}"
+ _debug "Freeplane Directory is '${jar}'."
+ break
+ fi
+done
+
+if [ -z "${freedir}" ]
+then
+ _error "Couldn't find Freeplane under '${freepath}'."
+ exit 1
+fi
+
+if [ ! -f "${userfpdir}/patterns.xml" ] && [ -f /etc/freeplane/patterns.xml ]
+then
+ if [ ! -d "${userfpdir}" ]
+ then
+ _debug "Creating directory ${userfpdir}."
+ mkdir -p "${userfpdir}"
+ fi
+ _debug "Copying patterns.xml to ${userfpdir}."
+ cp /etc/freeplane/patterns.xml "${userfpdir}/patterns.xml"
+fi
+
+#--------- Call (at last) Freeplane -------------------------------------
+fwdir="${freedir}/fwdir"
+
+if [ "${JAVA_TYPE}" != "sun" ]
+then # non-Sun environments don't work currently but we try anyway, who knows.
+ defines=-Dgnu.java.awt.peer.gtk.Graphics=Graphics2D
+fi
+_debug "Calling: "\
+"${JAVACMD}" -Xmx512m\
+ "-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.knopflerfish.framework.bundlestorage=memory"\
+ "-Dorg.freeplane.globalresourcedir=${freedir}/resources"\
+ "-Dorg.knopflerfish.gosg.jars=reference:file:${freedir}/core/"\
+ $defines\
+ $xdockname\
+ -jar "${freedir}/framework.jar"\
+ -xargs "${freedir}/props.xargs"\
+ -xargs "${freedir}/init.xargs"
+( echo "${DEBUG}" | grep -qe "exit" ) && exit 0 # do not start Freeplane
+"${JAVACMD}" -Xmx512m\
+ "-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.knopflerfish.framework.bundlestorage=memory"\
+ "-Dorg.freeplane.globalresourcedir=${freedir}/resources"\
+ "-Dorg.knopflerfish.gosg.jars=reference:file:${freedir}/core/"\
+ $defines\
+ $xdockname\
+ -jar "${freedir}/framework.jar"\
+ -xargs "${freedir}/props.xargs"\
+ -xargs "${freedir}/init.xargs"
diff --git a/freeplane_framework/script/freeplane.svg b/freeplane_framework/script/freeplane.svg
new file mode 100644
index 0000000..c7770ea
--- /dev/null
+++ b/freeplane_framework/script/freeplane.svg
@@ -0,0 +1,747 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ 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="32px"
+ height="32px"
+ id="svg6561"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="Freeplane.svg">
+ <defs
+ id="defs6563">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient28843-5-50"
+ id="linearGradient6194"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.0549047,0,0,6.1375271,17130.774,12515.757)"
+ x1="-2609.5867"
+ y1="-2091.3706"
+ x2="-2584.4966"
+ y2="-2135.9219" />
+ <linearGradient
+ id="linearGradient28843-5-50">
+ <stop
+ id="stop28845-7-5"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop28847-0-9"
+ offset="1"
+ style="stop-color:#398989;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8456"
+ id="radialGradient6196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0000023,0,0.00106615)"
+ cx="-3782.6299"
+ cy="-454.88797"
+ fx="-3782.6299"
+ fy="-454.88797"
+ r="127.9997" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8456">
+ <stop
+ style="stop-color:#398989;stop-opacity:1;"
+ offset="0"
+ id="stop8458" />
+ <stop
+ style="stop-color:#398989;stop-opacity:0;"
+ offset="1"
+ id="stop8460" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter8468"
+ x="-0.12333348"
+ width="1.246667"
+ y="-0.12333319"
+ height="1.2466664">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="13.15554"
+ id="feGaussianBlur8470" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202"
+ id="linearGradient6198"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ id="linearGradient8202">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop8204" />
+ <stop
+ style="stop-color:#398989;stop-opacity:1"
+ offset="1"
+ id="stop8206" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202"
+ id="linearGradient6200"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ id="linearGradient6505">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6507" />
+ <stop
+ style="stop-color:#398989;stop-opacity:1"
+ offset="1"
+ id="stop6509" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter8252">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="4.7961895"
+ id="feGaussianBlur8254" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1"
+ id="linearGradient6202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6024697,-0.6243721,0.7701372,-0.503965,-480.8454,767.56695)"
+ x1="-614.90503"
+ y1="691.30798"
+ x2="-618.23792"
+ y2="666.33112" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1">
+ <stop
+ style="stop-color:#edeee9;stop-opacity:1;"
+ offset="0"
+ id="stop3404-4-0-5-6-4-3-4-9-1-8-7-6-4-3-2" />
+ <stop
+ style="stop-color:#edeee9;stop-opacity:0;"
+ offset="1"
+ id="stop3406-1-6-8-5-0-0-0-8-0-4-1-1-0-3-0" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14418-2-1-6-9-4-6-4-6-3-5-4-9-4-2-7"
+ id="radialGradient6204"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1161215,0.2111825,0.2648989,0.3320851,118.33003,678.61762)"
+ cx="-287.17224"
+ cy="762.15948"
+ fx="-287.17224"
+ fy="762.15948"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient14418-2-1-6-9-4-6-4-6-3-5-4-9-4-2-7"
+ inkscape:collect="always">
+ <stop
+ id="stop14420-63-8-9-0-8-4-8-2-4-4-3-2-8-3-5"
+ offset="0"
+ style="stop-color:#f5cd03;stop-opacity:1" />
+ <stop
+ id="stop14422-1-4-0-0-8-2-8-3-0-7-5-7-8-5-4"
+ offset="1"
+ style="stop-color:#f8d21d;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14412-9-6-9-1-4-9-4-2-7-1-9-5-4-4-0"
+ id="radialGradient6206"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1284464,0.233597,0.2930147,0.3673319,106.51268,644.95305)"
+ cx="-286.68304"
+ cy="770.31897"
+ fx="-286.68304"
+ fy="770.31897"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient14412-9-6-9-1-4-9-4-2-7-1-9-5-4-4-0"
+ inkscape:collect="always">
+ <stop
+ id="stop14414-7-3-3-3-5-1-5-6-5-4-1-4-5-0-1"
+ offset="0"
+ style="stop-color:#f6cd03;stop-opacity:1" />
+ <stop
+ id="stop14771-7-6-8-51-6-5-2-5-9-5-3-5-7-1"
+ offset="1"
+ style="stop-color:#f8d21d;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient13706-2-8-6-0-3-1-3-7-5-0-0-6-2-7-5-05"
+ id="radialGradient6208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.2807422,0.3273875,0.4826002,0.4280301,-92.62752,629.08291)"
+ cx="-202.57784"
+ cy="767.94434"
+ fx="-202.57784"
+ fy="767.94434"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient13706-2-8-6-0-3-1-3-7-5-0-0-6-2-7-5-05">
+ <stop
+ id="stop13708-61-2-9-8-4-1-3-1-7-9-3-7-3-1-5-89"
+ offset="0"
+ style="stop-color:#f1d103;stop-opacity:1;" />
+ <stop
+ id="stop13710-7-9-7-1-4-5-6-1-8-8-0-9-3-1-28-9"
+ offset="1"
+ style="stop-color:#f7cd03;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1"
+ id="linearGradient6210"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3514431,0.3203933,0.1632634,-0.260742,503.87397,1201.9769)"
+ x1="-612.17151"
+ y1="698.89111"
+ x2="-615.77301"
+ y2="646.06696" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3836-5-5-4-8-6-6-1-7-8-7-0-3-1-7-1-2"
+ id="radialGradient6212"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8795174,-0.03474934,0.09505968,2.4353698,-127.03027,-937.53364)"
+ cx="-549.5"
+ cy="639.86218"
+ fx="-549.5"
+ fy="639.86218"
+ r="27.5" />
+ <linearGradient
+ id="linearGradient3836-5-5-4-8-6-6-1-7-8-7-0-3-1-7-1-2">
+ <stop
+ id="stop3838-34-9-1-3-6-1-4-6-0-9-7-1-3-6-37-1"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0.88695651;" />
+ <stop
+ id="stop3840-07-8-5-0-1-4-3-1-2-0-67-9-8-1-7-4"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient28843-5-50-7"
+ id="linearGradient6194-1"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.0549047,0,0,6.1375271,17130.774,12515.757)"
+ x1="-2609.5867"
+ y1="-2091.3706"
+ x2="-2584.4966"
+ y2="-2135.9219" />
+ <linearGradient
+ id="linearGradient28843-5-50-7">
+ <stop
+ id="stop28845-7-5-4"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop28847-0-9-0"
+ offset="1"
+ style="stop-color:#398989;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8456-4"
+ id="radialGradient6196-9"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0000023,0,0.00106615)"
+ cx="-3782.6299"
+ cy="-454.88797"
+ fx="-3782.6299"
+ fy="-454.88797"
+ r="127.9997" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8456-4">
+ <stop
+ style="stop-color:#398989;stop-opacity:1;"
+ offset="0"
+ id="stop8458-8" />
+ <stop
+ style="stop-color:#398989;stop-opacity:0;"
+ offset="1"
+ id="stop8460-8" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter8468-2"
+ x="-0.12333348"
+ width="1.246667"
+ y="-0.12333319"
+ height="1.2466664">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="13.15554"
+ id="feGaussianBlur8470-4" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202-5"
+ id="linearGradient6198-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ id="linearGradient8202-5">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop8204-1" />
+ <stop
+ style="stop-color:#398989;stop-opacity:1"
+ offset="1"
+ id="stop8206-7" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202-5"
+ id="linearGradient6200-1"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ id="linearGradient6729">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop6731" />
+ <stop
+ style="stop-color:#398989;stop-opacity:1"
+ offset="1"
+ id="stop6733" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter8252-1">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="4.7961895"
+ id="feGaussianBlur8254-5" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1-7"
+ id="linearGradient6202-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6024697,-0.6243721,0.7701372,-0.503965,-480.8454,767.56695)"
+ x1="-614.90503"
+ y1="691.30798"
+ x2="-618.23792"
+ y2="666.33112" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1-7">
+ <stop
+ style="stop-color:#edeee9;stop-opacity:1;"
+ offset="0"
+ id="stop3404-4-0-5-6-4-3-4-9-1-8-7-6-4-3-2-6" />
+ <stop
+ style="stop-color:#edeee9;stop-opacity:0;"
+ offset="1"
+ id="stop3406-1-6-8-5-0-0-0-8-0-4-1-1-0-3-0-1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14418-2-1-6-9-4-6-4-6-3-5-4-9-4-2-7-2"
+ id="radialGradient6204-4"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1161215,0.2111825,0.2648989,0.3320851,118.33003,678.61762)"
+ cx="-287.17224"
+ cy="762.15948"
+ fx="-287.17224"
+ fy="762.15948"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient14418-2-1-6-9-4-6-4-6-3-5-4-9-4-2-7-2"
+ inkscape:collect="always">
+ <stop
+ id="stop14420-63-8-9-0-8-4-8-2-4-4-3-2-8-3-5-3"
+ offset="0"
+ style="stop-color:#f5cd03;stop-opacity:1" />
+ <stop
+ id="stop14422-1-4-0-0-8-2-8-3-0-7-5-7-8-5-4-2"
+ offset="1"
+ style="stop-color:#f8d21d;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14412-9-6-9-1-4-9-4-2-7-1-9-5-4-4-0-1"
+ id="radialGradient6206-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1284464,0.233597,0.2930147,0.3673319,106.51268,644.95305)"
+ cx="-286.68304"
+ cy="770.31897"
+ fx="-286.68304"
+ fy="770.31897"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient14412-9-6-9-1-4-9-4-2-7-1-9-5-4-4-0-1"
+ inkscape:collect="always">
+ <stop
+ id="stop14414-7-3-3-3-5-1-5-6-5-4-1-4-5-0-1-6"
+ offset="0"
+ style="stop-color:#f6cd03;stop-opacity:1" />
+ <stop
+ id="stop14771-7-6-8-51-6-5-2-5-9-5-3-5-7-1-8"
+ offset="1"
+ style="stop-color:#f8d21d;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient13706-2-8-6-0-3-1-3-7-5-0-0-6-2-7-5-05-7"
+ id="radialGradient6208-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.2807422,0.3273875,0.4826002,0.4280301,-92.62752,629.08291)"
+ cx="-202.57784"
+ cy="767.94434"
+ fx="-202.57784"
+ fy="767.94434"
+ r="27.026775" />
+ <linearGradient
+ id="linearGradient13706-2-8-6-0-3-1-3-7-5-0-0-6-2-7-5-05-7">
+ <stop
+ id="stop13708-61-2-9-8-4-1-3-1-7-9-3-7-3-1-5-89-6"
+ offset="0"
+ style="stop-color:#f1d103;stop-opacity:1;" />
+ <stop
+ id="stop13710-7-9-7-1-4-5-6-1-8-8-0-9-3-1-28-9-1"
+ offset="1"
+ style="stop-color:#f7cd03;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1-7"
+ id="linearGradient6210-8"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3514431,0.3203933,0.1632634,-0.260742,503.87397,1201.9769)"
+ x1="-612.17151"
+ y1="698.89111"
+ x2="-615.77301"
+ y2="646.06696" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3836-5-5-4-8-6-6-1-7-8-7-0-3-1-7-1-2-2"
+ id="radialGradient6212-9"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8795174,-0.03474934,0.09505968,2.4353698,-127.03027,-937.53364)"
+ cx="-549.5"
+ cy="639.86218"
+ fx="-549.5"
+ fy="639.86218"
+ r="27.5" />
+ <linearGradient
+ id="linearGradient3836-5-5-4-8-6-6-1-7-8-7-0-3-1-7-1-2-2">
+ <stop
+ id="stop3838-34-9-1-3-6-1-4-6-0-9-7-1-3-6-37-1-7"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0.88695651;" />
+ <stop
+ id="stop3840-07-8-5-0-1-4-3-1-2-0-67-9-8-1-7-4-9"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202"
+ id="linearGradient6972"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8202"
+ id="linearGradient6974"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(269.70694,-4.9945731)"
+ x1="-4128.4556"
+ y1="-329.36334"
+ x2="-4030.8174"
+ y2="-500.60583" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1"
+ id="linearGradient6976"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6024697,-0.6243721,0.7701372,-0.503965,-480.8454,767.56695)"
+ x1="-614.90503"
+ y1="691.30798"
+ x2="-618.23792"
+ y2="666.33112" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14418-2-1-6-9-4-6-4-6-3-5-4-9-4-2-7"
+ id="radialGradient6978"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1161215,0.2111825,0.2648989,0.3320851,118.33003,678.61762)"
+ cx="-287.17224"
+ cy="762.15948"
+ fx="-287.17224"
+ fy="762.15948"
+ r="27.026775" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14412-9-6-9-1-4-9-4-2-7-1-9-5-4-4-0"
+ id="radialGradient6980"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1284464,0.233597,0.2930147,0.3673319,106.51268,644.95305)"
+ cx="-286.68304"
+ cy="770.31897"
+ fx="-286.68304"
+ fy="770.31897"
+ r="27.026775" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient13706-2-8-6-0-3-1-3-7-5-0-0-6-2-7-5-05"
+ id="radialGradient6982"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.2807422,0.3273875,0.4826002,0.4280301,-92.62752,629.08291)"
+ cx="-202.57784"
+ cy="767.94434"
+ fx="-202.57784"
+ fy="767.94434"
+ r="27.026775" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3402-96-6-73-8-7-7-7-6-4-5-9-7-7-1-1"
+ id="linearGradient6984"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3514431,0.3203933,0.1632634,-0.260742,503.87397,1201.9769)"
+ x1="-612.17151"
+ y1="698.89111"
+ x2="-615.77301"
+ y2="646.06696" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3836-5-5-4-8-6-6-1-7-8-7-0-3-1-7-1-2"
+ id="radialGradient6986"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8795174,-0.03474934,0.09505968,2.4353698,-127.03027,-937.53364)"
+ cx="-549.5"
+ cy="639.86218"
+ fx="-549.5"
+ fy="639.86218"
+ r="27.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient28843-5-50"
+ id="linearGradient6988"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.78713782,-0.10833559,0.08245113,0.60047025,2233.9355,1003.7068)"
+ x1="-2609.5867"
+ y1="-2091.3706"
+ x2="-2584.4966"
+ y2="-2135.9219" />
+ <filter
+ inkscape:collect="always"
+ id="filter7832">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.71130234"
+ id="feGaussianBlur7834" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="10.983485"
+ inkscape:cx="27.921815"
+ inkscape:cy="5.0939282"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ showborder="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1018"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata6566">
+ <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
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g7836">
+ <path
+ transform="matrix(1.0043091,0,0,1.0043091,-0.06728246,-0.07971019)"
+ sodipodi:nodetypes="cccccc"
+ id="path31828-1-1-2"
+ d="M 1.7706228,5.1889415 27.949111,1.7864938 30.226213,26.791843 5.2095535,30.234943 1.770475,5.1890256 z"
+ style="fill:url(#linearGradient6988);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:44.5175209;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7832);enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="matrix(1.1510947,0,0,1.1510947,0.04102613,-5.423263)"
+ id="g6952">
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:url(#linearGradient6972);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6974);stroke-width:16;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter8252);enable-background:accumulate"
+ d="m -3795.3556,-574.08832 c -1.532,0.12989 -3.103,0.85181 -4.7187,2.21875 -11.3083,12.0859 18.4336,-3.38055 20.9062,44.59375 -14.5544,2.71667 -27.7669,13.03361 -33.9375,28.3125 -0.064,0.15722 -0.1258,0.3113 -0.1875,0.46875 -22.8158,-32.24439 -59.2995,-64.33525 -86,-28.34375 -15.754,24.83219 -1.0091,43.00632 22.25,54.9375 -5.7426,4.81511 -9.4684,12.42658 -9.8438,23.84375 0.5356,16.19709 8.2521,23.53234 19.0938,25.40625 -18.6368,37.69505 -14.6822,75.23396 8.375,88.15625 23.3196,13.06949 57.9954,-3.62459 82.4375,-38.90625 7.1964,9.64727 17.932,13.45684 33.3437,5.09375 9.7585,-6.14344 14.5169,-13.16444 15.7813,-20.5 22.2527,13.66381 45.5904,16.88347 59.1875,-9.15625 18.3009,-42.33195 -31.8486,-56.56736 -72.3125,-58.84375 2.6988,-3.43834 4.9943,-7.32381 6.7187,-11.59375 5.5037,-13.62746 4.1598,-28.13032 -2.375,-39.4375 44.9032,-15.11611 31.3658,27.10083 44.875,15.65625 6.9877,-8.57594 -7.5258,-32.08649 -46.6874,-18.5 -4.4462,-6.42371 -10.7024,-11.59387 -18.4376,-14.59375 -6.1415,-2.38184 -12.563,-3.13503 -18.8124,-2.5 -2.6428,-25.84812 -10.2215,-47.11241 -19.6563,-46.3125 z"
+ id="path8011"
+ transform="matrix(0.09615566,0,0,0.09615566,377.84349,62.081945)" />
+ <g
+ transform="matrix(0.14722682,-0.04633562,0.0455464,0.14570533,-82.482395,-86.267728)"
+ id="g32718-8-1-78-0-0-8-4-0-3-5-1-9-4-1-7">
+ <g
+ transform="matrix(0.99958087,0.03070704,-0.02999686,0.99949781,32.079385,-10.011944)"
+ id="g7441-5-6-2-9-34-8-2-8-4-0-1-3-2-9-0">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.78305888;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path31827-6-4-7-4-00-8-3-7-3-1-5-4-3-3-8"
+ sodipodi:cx="-414.88635"
+ sodipodi:cy="767.36218"
+ sodipodi:rx="52.159092"
+ sodipodi:ry="49.090908"
+ d="m -362.72726,767.36218 c 0,27.11216 -23.35242,49.09091 -52.15909,49.09091 -28.80667,0 -52.15909,-21.97875 -52.15909,-49.09091 0,-27.11216 23.35242,-49.09091 52.15909,-49.09091 28.80667,0 52.15909,21.97875 52.15909,49.09091 z"
+ transform="matrix(-0.3269508,0.4284061,0.4294179,0.3258262,-66.3801,755.3341)" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="m 403.6515,807.22893 c 4.8769,-21.36582 3.6795,-42.00677 -5.9103,-37.58394 -9.3798,5.744 14.3963,0.50622 3.457,36.74054"
+ id="path31829-4-0-8-7-5-7-2-8-5-3-4-4-2-08-69"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="m 419.6485,817.73187 c 29.9933,-4.06092 35.6777,14.47925 29.712,18.72347 -10.4916,4.84728 6.6624,-20.88918 -28.6953,-16.78958"
+ id="path31831-9-6-0-8-3-4-2-7-2-2-0-6-2-1-7"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc"
+ id="path31833-8-1-2-3-1-0-1-3-1-6-2-0-1-4-85"
+ d="m 387.5629,806.82735 c 11.4695,-5.934 22.233,-4.98938 29.8882,4.34615 5.269,6.42552 6.1062,17.31873 1.8465,24.83045"
+ style="fill:url(#linearGradient6976);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 322.33167,903.42245 c 12.67105,12.78564 38.93652,7.00773 60.47809,-13.53159 21.54164,-20.53945 28.7411,-47.58562 16.06996,-60.37124 -12.67102,-12.78555 -40.43792,-6.49256 -61.97952,14.04667 -21.54164,20.53945 -27.23952,47.0707 -14.56853,59.85616 z"
+ id="path31839-4-8-0-5-0-0-6-0-6-0-8-6-6-6-3"
+ sodipodi:nodetypes="csssc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path31841-3-9-89-1-6-5-8-7-9-5-6-6-8-9-7"
+ d="m 371.59727,896.92706 c -3.47736,-9.21403 -8.57207,-19.46387 -15.61908,-26.52897 -6.76598,-6.7833 -13.77477,-10.13525 -24.86636,-14.55863 -2.20318,2.83561 -4.30174,4.49058 -6.27747,9.69804 10.97358,1.44997 17.40509,5.90908 23.41323,12.24839 5.13963,5.47252 12.29188,18.03951 14.02496,24.24369 4.33655,-1.59806 6.46822,-2.25203 9.32472,-5.10252 z"
+ style="fill:url(#radialGradient6978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21157539px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:nodetypes="csccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc"
+ style="fill:url(#radialGradient6980);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.21157539px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 381.76949,885.70821 c 2.01667,-2.42492 2.15476,-1.6828 3.30859,-3.92851 -3.70524,-10.21708 -8.20562,-17.76114 -13.42697,-23.95742 -5.82926,-6.39128 -20.70837,-11.46372 -26.48217,-13.09348 -2.27057,3.0889 -5.16758,3.95334 -7.79501,7.74339 13.65528,3.43113 22.49334,10.09941 26.51791,15.51777 6.15359,7.20704 10.50491,15.85831 12.42198,22.72097 1.44053,-1.06451 3.78109,-3.18361 5.45567,-5.00272 z"
+ id="path31843-2-8-2-2-7-9-5-6-8-7-8-1-5-1-0" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csssccsccc"
+ style="fill:#f8d322;fill-opacity:1;fill-rule:evenodd;stroke:#f8d21d;stroke-width:2.51979494;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 393.04964,868.58006 c 3.87373,-9.64993 4.03347,-18.95411 0.44168,-25.72664 -3.12918,-5.90008 -8.79496,-9.6644 -16.07734,-10.68135 -4.8191,-0.67312 -9.81743,-0.19981 -15.5154,1.46879 -1.31707,0.38564 -4.46182,1.52592 -5.44827,1.97566 l -6.05915,2.93258 c 12.91584,3.62381 21.2697,8.1378 26.8886,13.44274 6.96705,6.57795 9.92587,12.0571 12.98616,22.33601 0.0176,0.003 2.5142,-5.07611 2.78372,-5.74779 l 0,0 z"
+ id="path31845-5-4-8-0-5-9-7-4-8-4-1-8-7-4-5" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccz"
+ style="fill:url(#radialGradient6982);fill-opacity:1;fill-rule:evenodd;stroke:#f8d21d;stroke-width:2.51979494;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 344.54879,886.61998 c -3.65844,-4.81893 -9.19599,-10.49852 -23.26997,-13.3669 -0.8959,2.34339 -2.21405,7.40754 -2.48512,10.85931 -0.50721,9.20841 2.86629,16.59336 10.64281,20.78675 7.8533,3.37872 16.23831,1.37785 24.22082,-0.40464 -3.88277,-10.03414 -5.36165,-12.93902 -9.10854,-17.87452 z"
+ id="path31847-3-1-2-1-0-5-6-2-4-4-4-4-6-2-5" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ id="path31849-8-4-0-6-0-3-1-1-1-9-7-9-1-2-9"
+ d="m 402.64631,847.37507 c 0.83851,-7.00989 -1.11887,-12.26618 -6.19291,-17.06306 -7.0176,-4.91169 -10.9609,-6.46563 -17.98385,-4.2166 l 24.17676,21.27966 z"
+ style="fill:url(#linearGradient6984);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ transform="matrix(0.4365031,0.5074215,-0.511106,0.4316024,918.96609,874.82679)"
+ d="m -522,639.86218 c 0,31.20409 -12.31217,56.5 -27.5,56.5 -15.18783,0 -27.5,-25.29591 -27.5,-56.5 0,-31.20409 12.31217,-56.5 27.5,-56.5 15.18783,0 27.5,25.29591 27.5,56.5 z"
+ sodipodi:ry="56.5"
+ sodipodi:rx="27.5"
+ sodipodi:cy="639.86218"
+ sodipodi:cx="-549.5"
+ id="path31851-3-3-55-4-4-0-8-9-4-0-6-6-8-2-9"
+ style="fill:url(#radialGradient6986);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc"
+ id="path31857-2-9-2-0-5-9-9-1-5-6-4-3-9-0-8"
+ d="m 386.76927,844.27467 c -1.25094,14.01812 32.14216,83.90118 60.65148,53.2544 27.40968,-34.16784 -50.38575,-56.06772 -60.65148,-53.2544 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 386.54768,843.97782 c -7.96708,8.37474 -22.73516,66.42971 10.9094,58.72537 34.75562,-10.38974 -3.00555,-56.28564 -10.9094,-58.72537 z"
+ id="path31859-7-8-7-6-4-9-2-6-7-1-9-7-2-1-19"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 383.19381,841.28796 c -14.03218,1.0818 -83.50737,-33.15181 -52.51899,-61.28945 34.49602,-26.99549 55.45596,51.05841 52.51899,61.28945 z"
+ id="path31863-0-8-6-1-9-5-7-0-3-1-8-8-7-0-4"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc"
+ id="path31865-6-0-7-8-5-1-9-3-0-9-7-8-9-5-4"
+ d="m 383.48793,841.51311 c -8.47021,7.8655 -66.6991,21.93223 -58.58947,-11.61695 10.80825,-34.62773 56.24532,3.68426 58.58947,11.61695 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/freeplane_framework/script/init.xargs b/freeplane_framework/script/init.xargs
new file mode 100644
index 0000000..806bc31
--- /dev/null
+++ b/freeplane_framework/script/init.xargs
@@ -0,0 +1,2 @@
+# -istart org.freeplane.plugin.help
+-istart org.freeplane.core
diff --git a/freeplane_framework/script/props.xargs b/freeplane_framework/script/props.xargs
new file mode 100644
index 0000000..7f1491d
--- /dev/null
+++ b/freeplane_framework/script/props.xargs
@@ -0,0 +1,44 @@
+#
+# Properties used by both init.xargs and restart.xargs
+#
+
+# The Service Platform ID should be used by bundles needing to
+# a unique ID for the platform itself
+-Dorg.osgi.provisioning.spid=knopflerfish
+
+
+# Security
+#-Djava.security.manager=
+#-Djava.security.policy=file:framework.policy
+
+# URL to bundle repository
+#-Doscar.repository.url=http://www.knopflerfish.org/releases/current/repository.xml
+
+# Initial startup verbosity, 0 is low verbosity
+-Dorg.knopflerfish.verbosity=0
+# Various debug flags
+-Dorg.knopflerfish.framework.debug.packages=false
+-Dorg.knopflerfish.framework.debug.errors=true
+-Dorg.knopflerfish.framework.debug.classloader=false
+-Dorg.knopflerfish.framework.debug.startlevel=false
+-Dorg.knopflerfish.framework.debug.ldap=false
+-Dorg.knopflerfish.framework.debug.service_reference=false
+-Dorg.knopflerfish.framework.debug.bundle_resource=false
+
+# Add all standard packages for the currently running JRE version to
+# the set of packages exported by the system classloader.
+#-Dorg.knopflerfish.framework.system.export.all=true
+-Dorg.knopflerfish.framework.system.export.all_15=true
+
+# Comma-separated list of packages to be added to the set of packages
+# exported by system classloader.
+#-Dorg.osgi.framework.system.packages=
+
+# Comma-separated list of packages that must be loaded by system classloader
+-Dorg.osgi.framework.bootdelegation=*
+#-Dorg.osgi.framework.bootdelegation=sun.*,com.sun.*,apple.laf.*
+
+
+-Dorg.knopflerfish.startlevel.use=true
+
+
diff --git a/freeplane_framework/src/org/freeplane/launcher/Launcher.java b/freeplane_framework/src/org/freeplane/launcher/Launcher.java
new file mode 100644
index 0000000..e0e5892
--- /dev/null
+++ b/freeplane_framework/src/org/freeplane/launcher/Launcher.java
@@ -0,0 +1,98 @@
+/*
+ * 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.bundlestorage", "memory");
+ 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_framework/windows-icons/Freeplane_doc.ico b/freeplane_framework/windows-icons/Freeplane_doc.ico
new file mode 100644
index 0000000..fb9789e
Binary files /dev/null and b/freeplane_framework/windows-icons/Freeplane_doc.ico differ
diff --git a/freeplane_framework/windows-icons/MMIcon.rc b/freeplane_framework/windows-icons/MMIcon.rc
new file mode 100644
index 0000000..bcc08ce
--- /dev/null
+++ b/freeplane_framework/windows-icons/MMIcon.rc
@@ -0,0 +1,3 @@
+#include <windows.h>
+
+101 ICON "Freeplane_doc.ico"
diff --git a/freeplane_framework/windows-icons/freeplaneIcons.dev b/freeplane_framework/windows-icons/freeplaneIcons.dev
new file mode 100644
index 0000000..02e7b80
--- /dev/null
+++ b/freeplane_framework/windows-icons/freeplaneIcons.dev
@@ -0,0 +1,97 @@
+[Project]
+FileName=freeplaneIcons.dev
+Name=freeplaneIcons
+UnitCount=1
+PchHead=-1
+PchSource=-1
+Ver=3
+IsCpp=1
+ProfilesCount=2
+ProfileIndex=0
+Folders=
+
+[Unit1]
+FileName=MMIcon.rc
+Folder=freeplaneIcons
+Compile=1
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNrOnRebuild=0
+AutoIncBuildNrOnCompile=0
+UnitCount=1
+
+[Profile1]
+ProfileName=MingW gcc
+Type=3
+ObjFiles=
+Includes=
+Libs=
+ResourceIncludes=
+MakeIncludes=
+Compiler=-DBUILDING_DLL=1_@@_
+CppCompiler=-DBUILDING_DLL=1_@@_
+Linker=
+PreprocDefines=
+CompilerSettings=0000000000000000000000
+Icon=
+ExeOutput=
+ImagesOutput=Images\
+ObjectOutput=Objects\MingW
+OverrideOutput=0
+OverrideOutputName=freeplaneIcons.dll
+HostApplication=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerType=0
+
+[Profile2]
+ProfileName=MS Visual C++
+Type=3
+ObjFiles=
+Includes=
+Libs=
+ResourceIncludes=
+MakeIncludes=
+Compiler=/DBUILDING_DLL=1
+CppCompiler=/DBUILDING_DLL=1
+Linker=
+PreprocDefines=
+CompilerSettings=000000000000010000000000000000000000
+Icon=
+ExeOutput=Output\Visual C++
+ImagesOutput=Images\
+ObjectOutput=Objects\Visual C++
+OverrideOutput=0
+OverrideOutputName=
+HostApplication=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=9
+CompilerType=9
+
diff --git a/freeplane_framework/windows-icons/freeplaneIcons.dll b/freeplane_framework/windows-icons/freeplaneIcons.dll
new file mode 100644
index 0000000..16c8243
Binary files /dev/null and b/freeplane_framework/windows-icons/freeplaneIcons.dll differ
diff --git a/freeplane_framework/windows-installer/Freeplane_bee.bmp b/freeplane_framework/windows-installer/Freeplane_bee.bmp
new file mode 100644
index 0000000..5faf974
Binary files /dev/null and b/freeplane_framework/windows-installer/Freeplane_bee.bmp differ
diff --git a/freeplane_framework/windows-installer/Freeplane_without_Java.iss b/freeplane_framework/windows-installer/Freeplane_without_Java.iss
new file mode 100644
index 0000000..fe590ad
--- /dev/null
+++ b/freeplane_framework/windows-installer/Freeplane_without_Java.iss
@@ -0,0 +1,104 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+;****************************************************************************
+;* Install Script for FreeMind
+;****************************************************************************
+;* Before using this be sure to download and install Inno Setup from
+;* www.jrsoftware.org and ISTool from www.istool.org. These are required to
+;* make changes and compile this script. To use the billboard feature please
+;* dowload and install the ISX BillBoard DLL.
+;****************************************************************************
+; Predrag Cuklin 18/06/2009 - Universial Version
+;****************************************************************************
+
+#define MyVersion "1.2.20"
+#define MyAppName "Freeplane"
+#define MyAppPublisher "Open source"
+#define MyAppURL "http://sourceforge.net/projects/freeplane/"
+#define MyAppExeName "freeplane.exe"
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; 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-2012 Freeplane team and others
+AppName={#MyAppName}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppName}
+DefaultGroupName={#MyAppName}
+ArchitecturesInstallIn64BitMode=x64 ia64
+OutputDir=..\dist
+OutputBaseFilename=Freeplane-Setup-{#MyVersion}
+SetupIconFile=Setup.ico
+VersionInfoDescription=Free mind mapping software. Fast. Simple. Streamlined.
+ChangesAssociations=true
+PrivilegesRequired=none
+AllowNoIcons=true
+ShowTasksTreeLines=true
+WindowVisible=true
+WizardSmallImageFile=Freeplane_bee.bmp
+WizardImageStretch=false
+AppVersion={#MyVersion}
+UninstallDisplayIcon={app}\freeplane.exe
+UninstallDisplayName=Freeplane
+DiskSpanning=false
+MergeDuplicateFiles=true
+Compression=lzma
+SolidCompression=true
+LanguageDetectionMethod=locale
+WizardImageFile=WizModernImage-IS.bmp
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl,messages_en.txt; LicenseFile: gpl-2.0_english.txt
+Name: croatian; MessagesFile: compiler:Languages\Croatian.isl,messages_hr.txt; LicenseFile: gpl-2.0_croatian.txt
+Name: french; MessagesFile: compiler:Languages\French.isl,messages_fr.txt; LicenseFile: gpl-2.0_french.txt
+Name: german; MessagesFile: compiler:Languages\German.isl,messages_de.txt; LicenseFile: gpl-2.0_german.txt
+Name: russian; MessagesFile: compiler:Languages\Russian.isl,messages_ru.txt; LicenseFile: gpl-2.0_russian.txt
+
+[Tasks]
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
+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\*
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks:
+Name: {group}\Uninstall Freeplane; Filename: {uninstallexe}; Tasks:
+Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon
+
+[Run]
+Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent
+
+[Registry]
+;".myp" is the extension we're associating. "MyProgramFile" is the internal name for the file type as stored in the registry. Make sure you use a unique name for this so you don't inadvertently overwrite another application's registry key.
+;"My Program File" above is the name for the file type as shown in Explorer.
+;"DefaultIcon" is the registry key that specifies the filename containing the icon to associate with the file type. ",0" tells Explorer to use the first icon from MYPROG.EXE. (",1" would mean the second icon.)
+Root: "HKLM"; Subkey: "Software\JavaSoft\Prefs"
+Root: "HKCR"; Subkey: "Applications\freeplane.exe"; Flags: deletekey; Tasks: associate
+Root: "HKCR"; Subkey: ".mm"; Flags: deletekey; Tasks: associate
+Root: "HKLM"; Subkey: "SOFTWARE\Classes\.mm"; Flags: deletekey; Tasks: associate
+Root: "HKCU"; Subkey: "Software\Classes\Applications\freeplane.exe"; Flags: deletekey; Tasks: associate
+Root: "HKCU"; Subkey: "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mm"; Flags: deletekey; Tasks: associate
+Root: "HKCR"; Subkey: ".mm"; ValueType: string; ValueData: "Freeplane"; Flags: uninsdeletekey; Tasks: associate
+Root: "HKCR"; Subkey: "Freeplane"; ValueType: string; ValueData: "Freeplane mind map"; Flags: uninsdeletekey; Tasks: associate
+Root: "HKCR"; Subkey: "Freeplane\Shell\Open\Command"; ValueType: string; ValueData: """{app}\freeplane.exe"" ""%1"""; Flags: uninsdeletevalue; Tasks: associate
+Root: "HKCR"; Subkey: "Freeplane\DefaultIcon"; ValueType: string; ValueData: "{app}\freeplaneIcons.dll,0"; Flags: uninsdeletevalue; Tasks: associate
+
+[InstallDelete]
+Name: {app}\core; Type: filesandordirs
+Name: {app}\plugins; Type: filesandordirs; Tasks: ; Languages:
+
+
+[UninstallDelete]
+
+[Dirs]
+Name: {userappdata}\Freeplane; Flags: uninsneveruninstall; Tasks: ; Languages:
+
diff --git a/freeplane_framework/windows-installer/Setup.ico b/freeplane_framework/windows-installer/Setup.ico
new file mode 100644
index 0000000..228e50b
Binary files /dev/null and b/freeplane_framework/windows-installer/Setup.ico differ
diff --git a/freeplane_framework/windows-installer/WizModernImage-IS.bmp b/freeplane_framework/windows-installer/WizModernImage-IS.bmp
new file mode 100644
index 0000000..922ad08
Binary files /dev/null and b/freeplane_framework/windows-installer/WizModernImage-IS.bmp differ
diff --git a/freeplane_framework/windows-installer/gpl-2.0_croatian.txt b/freeplane_framework/windows-installer/gpl-2.0_croatian.txt
new file mode 100644
index 0000000..ee84af8
--- /dev/null
+++ b/freeplane_framework/windows-installer/gpl-2.0_croatian.txt
@@ -0,0 +1,142 @@
+GNU OPÆA JAVNA LICENCA
+verzija 2, lipanj 1991.
+
+ Ovo je neslubeni prijevod GNU Opæe javne licence na hrvatski jezik. Nije ga objavio Free Software Foundation i zakonito ne izrièe uvjete distribucije programa koji koriste GNU GPL -- to èini samo izvorni, engleski tekst GNU GPL-a. Meðutim, nadamo se da æe ovaj prijevod pomoæi hrvatskim èitateljima u boljem razumijevanju GPL-a.
+
+This is an unofficial translation of the GNU General Public License into Croatian. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help Croatian speakers understand the GNU GPL better.
+
+
+Copyright (C) 1989., 1991. Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+Umnaanje i distribuiranje primjeraka ove licence jednakih izvorniku doputeno je svakomu, no njeno je mijenjanje zabranjeno.
+
+Predgovor
+
+Licence veæine programa nastoje vam oduzeti slobodu da ih dijelite i mijenjate. Tomu nasuprot, GNU Opæa javna licenca jamèi vam slobodu dijeljenja i mijenjanja slobodnih programa -- kako bi program bio slobodan za sve svoje korisnike. Ova Opæa javna licenca vrijedi za veæi dio programa Free Software Foundationa i bilo koji drugi program èiji se autor obvee na njeno koritenje. (Neke druge programe Free Software Foundationa pokriva GNU Opæa javna licenca za knjinice.) I vi je moete primjeniti na svoje programe.
+
+Kada govorimo o slobodnim programima, govorimo o slobodi, a ne cijeni. Naa Opæa javna licenca je stvorena kako bi vam zajamèila slobodu distribuiranja primjeraka slobodnih programa (i, ako elite, naplaæivanje toga), primanje izvornog koda ili moguænost da ga dobijete, moguænost mijenjanja programa ili koritenja njegovih dijelova u novim slobodnim programima; te saznanje da to moete uèiniti.
+
+Kako bi zatitili vaa prava, moramo postaviti ogranièenja koja zabranjuju bilo kome poricanje ovih prava ili zahtjev da ih se odreknete. Ova ogranièenja predstavljaju odreðene odgovornosti za vas ako distribuirate ili mijenjate primjerke programa.
+
+Na primjer, ako distribuirate primjerke takvog programa, besplatno ili ne, primateljima morate dati sva prava koja imate i sami. Takoðer, oni moraju dobiti izvorni kod ili moguænost njegova dobivanja. A vi ih morate obavijestiti o ovim uvjetima kako bi znali svoja prava.
+
+Vaa prava titimo u dva koraka: 1. stavljajuæi autorska prava na program, te 2. nudeæi vam ovu licencu koja vam omoguæava zakonito umnaanje, distribuiranje i/ili mijenjanje programa.
+
+Takoðer, zbog zatite svakog autora i nas, elimo biti sigurni da svi razumiju da za ovakve slobodne programe nema jamstva. Ako program netko promijeni i poalje dalje, elimo da njegovi primatelji znaju kako ono to su dobili nije izvornik, kako bilo kakvi problemi u takvoj verziji ne bi utjecali na ugled izvornog autora.
+
+Na kraju, svakom slobodnom programu stalno prijete patenti. elimo izbjeæi opasnost individualnog licenciranja od strane redistributora slobodnog programa, to bi program uèinilo vlasnitvom. Da to sprijeèimo, razjasnili smo kako svaki patent mora biti licenciran za svaèiju slobodnu uporabu ili uopæe ne biti licenciran.
+
+Slijede toène obveze i uvjeti za umnaanje, distribuiranje i mijenjanje.
+
+GNU OPÆA JAVNA LICENCA
+OBVEZE I UVJETI ZA UMNAANJE, DISTRIBUIRANJE I MIJENJANJE
+
+0. Ova Licenca vrijedi za svaki program ili drugo djelo koje sadri obavijest vlasnika autorskog prava prema kojoj se ono moe distribuirati pod uvjetima ove Opæe javne licence. Pojam "Program" nadalje se odnosi na svaki takav program ili djelo, a "djelo zasnovano na Programu" odnosi se na Program ili bilo koji rad izveden iz njega po zakonu o autorskim pravima: dakle, djelo koje sadri program ili njegov dio, toèan ili s promjenama i/ili preveden na drugi jezik. (Nadalje, prijevod je bez ogranièenja ukljuèen u pojam "promjena".) Svakom korisniku licence obraæamo se kao "vama".
+
+O aktivnostima osim umnaanja, distribucije i mijenjanja ova Licenca ne govori; one su izvan njenog dosega. Èin pokretanja Programa nije ogranièen, a o njegovom rezultatu govorimo samo ako je sadraj rezultata takoðer djelo zasnovano na Programu (bez obzira to ga je stvorio Program). Je li to istina ovisi o funkciji Programa.
+
+1. Smijete umnaati i distribuirati toène kopije izvornog koda Programa kakvog ga dobijete, na bilo kakvom mediju, ako oèigledno i prikladno na svakoj kopiji istaknete odgovarajuæu poruku o autorskim pravima i odricanje jamstava; ostavite nepromijenjenim sve obavijesti koje se odnose na ovu Licencu i na nepostojanje jamstava; i dajte svakom primatelju Programa primjerak ove Licence zajedno s Programom.
+
+Smijete naplatiti fizièki èin prenoenja kopije i moete po svom izboru ponuditi jamstvo za naplatu.
+
+2. Smijete mijenjati svoj primjerak ili primjerke Programa ili bilo kojeg njegovog dijela, tako oblikovajuæi djelo zasnovano na Programu, i umnaati i distribuirati takve promjene ili djelo pod uvjetima prethodnog Dijela 1., ako zadovoljavate ove uvjete:
+
+ a) Promijenjene datoteke moraju nositi istaknute obavijesti da ste promijenili datoteke i datum svake promjene.
+
+ b) Svako djelo koje distribuirate ili objavite, a koje u cjelosti ili djelomièno sadri ili je izvedeno iz Programa ili njegovog dijela, mora biti licencirano u cjelosti bez naplate svima pod uvjetima ove Licence.
+
+ c) Ako promijenjeni program, kada je normalno pokrenut, èita naredbe interaktivno, on mora, pokrenut za takvu interaktivnu uporabu u najuobièajenijem naèinu, ispisati ili prikazati obavijest koja ukljuèuje odgovarajuæu poruku o autorskim pravima i obavijest da nema jamstva (ili drugaèiju, koja kae da vi jamèite) i da korisnici mogu ponovno distribuirati program pod ovim uvjetima, i objasniti korisniku kako da proèita primjerak ove Licence. (Iznimka: ako je sam Program interaktivan, ali obièno ne ispisuje takvu obavijest, vae djelo zasnovano na Programu ne mora ispisati obavijest.)
+
+Ove potrebe vrijede za promijenjeno djelo u cjelini. Ako raspoznatljivi dijelovi tog djela nisu izvedeni iz Programa, i mogu se sami razumno smatrati nezavisnim i odvojenim djelima, onda ova Licenca, i njeni uvjeti, ne vrijede za te dijelove kada ih distribuirate kao zasebna djela. Ali ako distribuirate iste dijelove kao dio cjeline koja je djelo zasnovano na Programu, distribucija te cjeline mora zadovoljavati uvjete ove Licence, èije dozvole drugima koji su je licencirali vrijede za cjelinu, odnosno svaki njen dio bez obzira tko ga je napisao.
+
+Dakle, ovom dijelu nije namjera da dobije prava ili da pobija vaa prava na djelo koje ste vi napisali u cjelini; namjera mu je poboljati pravo nadzora distribucije izvedenih ili skupljenih djela zasnovanih na Programu.
+
+Takoðer, sama integracija drugog djela nezasnovanog na Programu s Programom (ili djelom zasnovanim na Programu) na mediju pohranjivanja ili distribucije ne dovodi to drugo djelo u doseg ove Licence.
+
+3. Smijete umnaati i distribuirati Program (ili djelo na njemu zasnovano, po Dijelu 2.) u objektnom kodu ili izvrnom obliku pod uvjetima Dijela 1. i 2. ako uèinite jedno od sljedeæeg:
+
+ a) Popratite ga potpunim odgovarajuæim strojno èitljivim izvornim kodom, koji mora biti distribuiran pod uvjetima Dijela 1. i 2. na mediju po izboru koritenom za razmjenu programa; ili
+
+ b) Popratite ga pisanom ponudom, koja vrijedi barem tri godine, da æete svakoj treæoj stranci dati, za cijenu ne veæu od vaeg troka fizièkog vrenja distribucije izvornog koda, potpunu strojno èitljivu kopiju odgovarajuæeg izvornog koda, koju æe se distribuirati pod uvjetima Dijela 1. i 2. na mediju po izboru koritenom za razmjenu programa; ili
+
+ c) Popratite ga informacijama koje ste vi primili o ponudi za distribuciju odgovarajuæeg izvornog koda. (Ova moguænost vrijedi samo za nekomercijalnu distribuciju i samo ako ste primili program u objektnom kodu ili izvrnom obliku s takvom ponudom, prema prethodnom Odlomku b.)
+
+Pod izvornim kodom za djelo mislimo na eljeni oblik djela za njegovo mijenjanje. Za izvrno djelo, potpuni izvorni kod odnosi se na izvorni kod svih modula koje ono sadri, uz datoteke koje definiraju svako ukljuèeno suèelje, uz skripte za nadzor prevoðenja i instalacije izvrne datoteke. Meðutim, kao posebna iznimka, distribuirani izvorni kod ne mora ukljuèiti bilo to to se obièno distribuira (bilo u izvornom kodu, bilo u izvrnom obliku) s glavnim dijelovima (prevodioc, jezgra, itd.) operacijskog sustava na kojem izvrna datoteka radi, osim ako sam taj dio prati izvrnu datoteku.
+
+Ako se izvrna datoteka ili objektni kod distribuira omoguæavanjem pristupa kopiji na odreðenom mjestu, onda se omoguæavanje jednakog pristupa izvornom kodu smatra distribucijom izvornog koda, iako se drugi ne prisiljavaju na umnaanje izvornog koda zajedno s objektnim.
+
+4. Ne smijete umnaati, mijenjati, podlicencirati ili distribuirati Program osim kako je izraeno u ovoj Licenci. Bilo kakav pokuaj umnaanja, mijenjanja, podlicenciranja ili distribuiranja Programa je nezakonit, i odmah ponitava vaa prava prema ovoj Licenci. Meðutim, strankama koje su od vas dobile kopije ili prava pod ovom Licencom neæe biti ponitene licence, dok zadovoljavaju sve uvjete.
+
+5. Ne morate prihvatiti ovu Licencu, poto ju niste potpisali. Meðutim, nita vam drugo ne jamèi dozvolu za mijenjanje ili distribuciju Programa ili iz njega izvedenih djela. Te su radnje zakonom zabranjene ako ne prihvatite ovu Licencu. Prema tome, mijenjanjem ili distribuiranjem Programa (ili djela na njemu zasnovanog), pokazujete svoj pristanak na ovu Licencu, i sve njene obveze i uvjete za umnaanje, distribuiranje i mijenjanje Programa ili djela na njemu zasnovanih.
+
+6. Svaki put kada ponovo distribuirate Program (ili bilo koje djelo zasnovano na Programu), primatelj automatski prima licencu od izvornog vlasnika za umnaanje, distribuiranje ili mijenjanje Programa prema ovim obvezama i uvjetima. Ne smijete nametnuti bilo kakva daljnja ogranièenja na primateljevo koritenje ovdje zajamèenih prava. Niste odgovorni za traenje zadovoljavanja ove Licence od drugih stranaka.
+
+7. Ako vam se, kao posljedicu sudske presude ili tube za krenje patenta ili iz bilo kojeg drugog razloga (ne samo to se tièe patenata), nameæu obveze (bilo sudskim nalogom, nagodbom, ili drukèije) u kontradikciji s uvjetima ove Licence, to ne znaèi da smijete kriti uvjete ove Licence. Ako ne moete distribuirati tako da zadovoljavate istodobno i svoje obveze pod ovom Licencom i sve ostale odgovarajuæe obveze, onda kao posljedicu uopæe ne smijete distribuirati Program. Na primjer, ako patentna licenca ne doputa slobodnu redistribuciju Programa svima koji njegove kopije dobiju izravno ili neizravno od vas, onda je jedini naèin na koji moete zadovoljiti i nju i ovu Licencu prestanak distribuiranja Programa.
+
+Ako se bilo koji dio ovog Dijela dri nevaeæim ili neprovedivim pod bilo kakvim okolnostima, namjena je Dijela da vrijedi i Dio u cjelini namijenjen je da vrijedi u drugim okolnostima.
+
+Ovom Dijelu nije svrha da vas potakne na krenje patenata ili drugih prava na vlasnitvo ili na njihovo pobijanje; jedina mu je svrha zatita integriteta distribucijskog sustava slobodnih programa, kojeg implementira javna praksa. Mnogi ljudi su velikoduno pridonijeli velikom broju programa distribuiranim kroz taj sustav pouzdajuæi se u dosljednu primjenu tog sustava; na autoru/donatoru je odluka da li æe programe distribuirati nekim drugim sustavom i korisnik licence ne moe mu nametati svoj izbor.
+
+Namjera ovog Dijela je razjanjavanje onoga za to se vjeruje da su posljedice ostatka Licence.
+
+8. Ako je distribucija i/ili koritenje Programa u nekim dravama ogranièeno bilo patentima bilo suèeljima na koje se polau autorska prava, izvorni vlasnik autorskih prava koji je Program stavio pod ovu Licencu moe dodati eksplicitno zemljopisno ogranièenje distribucije izuzimajuæi takve drave, i èineæi distribuciju dozvoljenom samo u ili meðu dravama koje nisu izuzete. U tom sluèaju, ova Licenca ukljuèuje ogranièenje kao da je napisano u tijelu ove Licence.
+
+9. Free Software Foundation s vremena na vrijeme moe objaviti promijenjene i/ili nove verzije Opæe javne licence. Takve nove verzije bit æe duhom sliène sadanjoj, no mogu se razlikovati u detaljima kako bi se rijeili novi problemi ili brige.
+
+Svakoj verziji se daje razlièit broj verzije. Ako Program navodi broj verzije ove Licence koja za njega vrijedi i "bilo koja kasnija verzija", smijete potovati obveze i uvjete te verzije ili bilo koje kasnije verzije koju je objavio Free Software Foundation. Ako Program ne odreðuje broj verzije ove Licence, smijete odabrati bilo koju verziju ikad izdanu od strane Free Software Foundationa.
+
+10. Ako elite ukljuèiti dijelove Programa u druge besplatne programe èiji se uvjeti distribucije razlikuju, piite autoru i traite njegovu dozvolu. Za programe èija autorska prava ima Free Software Foundation, piite Free Software Foundationu; ponekad radi toga radimo iznimke. U odluèivanju æe nas voditi dva cilja èuvanja slobode svih izvedenica iz naeg programa i promicanje dijeljenja i ponovnog koritenja programa opæenito.
+
+NEMA JAMSTVA
+
+11. POTO JE PROGRAM LICENCIRAN BESPLATNO, ZA PROGRAM NEMA JAMSTVA, U MJERI DOPUTENOJ PRIMJENJIVIM ZAKONOM. OSIM AKO JE DRUKÈIJE IZRAENO NAPISMENO, VLASNICI AUTORSKIH PRAVA I/ILI DRUGE STRANKE PROGRAM DAJU "KAKAV JEST" BEZ JAMSTVA BILO KOJE VRSTE, IZRAENOG ILI PODRAZUMIJEVANOG, UKLJUÈUJUÆI, ALI NE SAMO NJIH, PODRAZUMIJEVANA JAMSTVA TRGOVINSKE PRIKLADNOSTI I ODGOVARANJA ODREÐENOJ SVRSI. SVI RIZICI VEZANI ZA KVALITETU I BRZINU PROGRAMA OSTAJU NA VAMA. AKO SE PROGRAM POKAE NEVALJANIM, VI SNOSITE SVE TROKOVE POTREBNOG ODRAVANJA, POPRAVLJANJA I ISPRAVLJANJA.
+
+12. NI U KOJEM SLUÈAJU, OSIM NUNO PO PRIMJENJIVOM ZAKONU ILI NAGODBOM NAPISMENO, BILO KOJI VLASNIK AUTORSKIH PRAVA, ILI BILO KOJA DRUGA STRANKA KOJA SMIJE MIJENJATI I/ILI REDISTRIBUIRATI PROGRAM KAKO JE DOZVOLJENO GORE, NEÆE BITI VAMA ODGOVORAN ZA TETE, UKLJUÈUJUÆI OPÆE, POSEBNE, SLUÈAJNE ILI POSLJEDIÈNE TETE PROIZALE IZ KORITENJA ILI NEMOGUÆNOSTI KORITENJA PROGRAMA (UKLJUÈUJUÆI, ALI NE SAMO NJIH, GUBITAK PODATAKA ILI ÈINJENJE PODATAKA NETOÈNIM ILI GUBITKE VAS ILI DRUGIH STRANAKA ILI NEUSPJEH PROGRAMA DA RADI S BILO KOJIM DRUGIM PROGRAMOM), ÈAK I AKO JE TAKAV VLASNIK ILI DRUGA STRANKA UPOZORENA NA MOGUÆNOST TAKVIH TETA.
+
+KRAJ OBVEZA I UVJETA
+
+Kako ove obveze primjeniti na vae nove programe
+
+Ako razvijete novi program i elite da bude od najveæe moguæe koristi javnosti, najbolji je naèin da to postignete uèiniti ga slobodnim programom, kojeg svatko moe distribuirati i mijenjati pod ovim uvjetima.
+
+Kako biste to uèinili, programu dodajte sljedeæe obavijesti. Najsigurnije je dodati ih na poèetku svake datoteke s izvornim kodom, da naglasite nepostojanje jamstva; svaka bi datoteka trebala imati barem i "copyright" red i upustvo kako doæi do cijele obavijesti.
+
+<jedan red za ime programa i poruku o njegovoj svrsi.>
+Copyright (C) 19gg <ime autora>
+
+Ovaj program je slobodan; moete ga distribuirati i/ili
+mijenjati pod uvjetima GNU Opæe javne licence kako ju je
+objavio Free Software Foundation; ili verzije 2 Licence,
+ili (po vaem izboru) bilo koje novije verzije.
+
+Ovaj program se distribuira u nadi da æe biti koristan, ali
+BEZ IKAKVOG JAMSTVA; èak i bez podrazumijevanog jamstva
+TRGOVINSKE PRIKLADNOSTI ili ODGOVARANJA ODREÐENOJ SVRSI. Za
+detalje proèitajte GNU Opæu javnu licencu.
+
+Trebali ste dobiti primjerak GNU Opæe javne licence uz ovaj
+program; ako niste, piite na adresu:
+Free Software Foundation, Inc.,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Takoðer dodajte informacije kako vas kontaktirati elektronski i potom.
+
+Ako je program interaktivan, neka ispie kratku poruku poput ove kada se pokreæe u interaktivnom naèinu:
+
+Gnomovizija verzija 69, Copyright (C) 19gg ime autora
+Gnomovizija dolazi BEZ IKAKVOG JAMSTVA; za detalje napiite
+"pokai j". Ovo je slobodan program, i slobodno ga
+moete distribuirati pod odreðenim uvjetima; za detalje
+napiite "pokai u".
+
+Hipotetske naredbe "pokai j" i "pokai u" trebale bi pokazati odgovarajuæe dijelove Opæe javne licence. Naravno, naredbe koje æete vi koristiti mogu se zvati drukèije; to èak mogu biti klikovi miem ili dijelovi izbornika -- to god odgovara vaem programu.
+
+Takoðer biste trebali zamoliti svog poslodavca (ako radite kao programer) ili kolu, ako je ima, da, ako je potrebno, potpie "odricanje od autorskih prava" za program. Evo primjera; promijenite imena:
+
+MM, d. o. o., odrièe se svih autorskih prava na program "Gnomoviziju"
+(koji se upucava kompajlerima) koji je napisao Hrvoje Haker.
+
+<potpis Miroslava Moænika>, 1. travnja 1989.
+Miroslav Moænik, predsjednik MM d. o. o.
+
+Ova Opæa javna licenca ne dozvoljava ukljuèivanje vaeg programa u vlasnièke programe. Ako je va program knjinica podrutina, moda æete smatrati korisnijim ako dopustite vezanje vlasnièkih aplikacija s njom. Ako to elite uèiniti, umjesto ove Licence koristite GNU Opæu javnu licencu za knjinice.
diff --git a/freeplane_framework/windows-installer/gpl-2.0_english.txt b/freeplane_framework/windows-installer/gpl-2.0_english.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/freeplane_framework/windows-installer/gpl-2.0_english.txt
@@ -0,0 +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.
diff --git a/freeplane_framework/windows-installer/gpl-2.0_french.txt b/freeplane_framework/windows-installer/gpl-2.0_french.txt
new file mode 100644
index 0000000..8898594
--- /dev/null
+++ b/freeplane_framework/windows-installer/gpl-2.0_french.txt
@@ -0,0 +1,148 @@
+
+Licence Publique Générale GNU
+
+Benjamin Drieu, APRIL (bdrieu at april.org), Mélanie Clément-Fontaine (melanie at amberlab.net), Arnaud Fontaine (arnaud at crao.net), Loïc Dachary (loic at gnu.org), Frédéric Couchet (fcouchet at fsffrance.org).
+
+This is an unofficial translation of the GNU General Public License into French. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help French speakers understand the GNU GPL better.
+
+Ceci est une traduction non officielle de la GNU General Public License en français. Elle n'a pas été publiée par la Free Software Foundation, et ne détermine pas les termes de distribution pour les logiciels qui utilisent la GNU GPL, seul le texte anglais original de la GNU GPL déterminent ces termes. Cependant, nous espérons que cette traduction aidera les francophones à mieux comprendre la GNU GPL.
+
+Licence Publique Générale GNU
+
+Les licences de la plupart des logiciels sont conçues pour vous enlever toute liberté de les partager et de les modifier.
+
+A contrario, la Licence Publique Générale est destinée à garantir votre liberté de partager et de modifier les logiciels libres, et à assurer que ces logiciels soient libres pour tous leurs utilisateurs.
+
+La présente Licence Publique Générale s'applique à la plupart des logiciels de la Free Software Foundation, ainsi qu'à tout autre programme pour lequel ses auteurs s'engagent à l'utiliser.
+
+(Certains autres logiciels de la Free Software Foundation sont couverts par la GNU Lesser General Public License à la place.)
+
+Vous pouvez aussi l'appliquer aux programmes qui sont les vôtres.
+
+Quand nous parlons de logiciels libres, nous parlons de liberté, non de prix.
+
+Nos licences publiques générales sont conçues pour vous donner l'assurance d'être libres de distribuer des copies des logiciels libres (et de facturer ce service, si vous le souhaitez), de recevoir le code source ou de pouvoir l'obtenir si vous le souhaitez, de pouvoir modifier les logiciels ou en utiliser des éléments dans de nouveaux programmes libres et de savoir que vous pouvez le faire.
+
+Pour protéger vos droits, il nous est nécessaire d'imposer des limitations qui interdisent à quiconque de vous refuser ces droits ou de vous demander d'y renoncer.
+
+Certaines responsabilités vous incombent en raison de ces limitations si vous distribuez des copies de ces logiciels, ou si vous les modifiez.
+
+Par exemple, si vous distribuez des copies d'un tel programme, à titre gratuit ou contre une rémunération, vous devez accorder aux destinataires tous les droits dont vous disposez.
+
+Vous devez vous assurer qu'eux aussi reçoivent ou puissent disposer du code source.
+
+Et vous devez leur montrer les présentes conditions afin qu'ils aient connaissance de leurs droits.
+
+Nous protégeons vos droits en deux étapes : (1) nous sommes titulaires des droits d'auteur du logiciel, et (2) nous vous délivrons cette licence, qui vous donne l'autorisation légale de copier, distribuer et/ou modifier le logiciel.
+
+En outre, pour la protection de chaque auteur ainsi que la nôtre, nous voulons nous assurer que chacun comprenne que ce logiciel libre ne fait l'objet d'aucune garantie.
+
+Si le logiciel est modifié par quelqu'un d'autre puis transmis à des tiers, nous voulons que les destinataires soient mis au courant que ce qu'ils ont reçu n'est pas le logiciel d'origine, de sorte que tout problème introduit par d'autres ne puisse entacher la réputation de l'auteur originel.
+
+En définitive, un programme libre restera à la merci des brevets de logiciels.
+
+Nous souhaitons éviter le risque que les redistributeurs d'un programme libre fassent des demandes individuelles de licence de brevet, ceci ayant pour effet de rendre le programme propriétaire.
+
+Pour éviter cela, nous établissons clairement que toute licence de brevet doit être concédée de façon à ce que l'usage en soit libre pour tous ou bien qu'aucune licence ne soit concédée.
+
+Les termes exacts et les conditions de copie, distribution et modification sont les suivants:
+Conditions de copie, distribution et modification de la Licence Publique Générale GNU.
+
+0. La présente Licence s'applique à tout programme ou tout autre ouvrage contenant un avis, apposé par le titulaire des droits d'auteur, stipulant qu'il peut être distribué au titre des conditions de la présente Licence Publique Générale.
+
+Ci-après, le "Programme" désigne l'un quelconque de ces programmes ou ouvrages, et un "ouvrage fondé sur le Programme" désigne soit le Programme, soit un ouvrage qui en dérive au titre des lois sur le droit d'auteur : en d'autres termes, un ouvrage contenant le Programme ou une partie de ce dernier, soit à l'identique, soit avec des modifications et/ou traduit dans un autre langage.
+
+(Ci-après, le terme "modification" implique, sans s'y réduire, le terme traduction)
+
+Chaque concessionaire sera désigné par "vous".
+
+Les activités autres que la copie, la distribution et la modification ne sont pas couvertes par la présente Licence ; elles sont hors de son champ d'application.
+
+L'opération consistant à exécuter le Programme n'est soumise à aucune limitation et les sorties du programme ne sont couvertes que si leur contenu constitue un ouvrage fondé sur le Programme (indépendamment du fait qu'il ait été réalisé par l'exécution du Programme).
+
+La validité de ce qui précède dépend de ce que fait le Programme.
+
+1. Vous pouvez copier et distribuer des copies à l'identique du code source du Programme tel que vous l'avez reçu, sur n'importe quel support, du moment que vous apposiez sur chaque copie, de manière ad hoc et parfaitement visible, l'avis de droit d'auteur adéquat et une exonération de garantie ; que vous gardiez intacts tous les avis faisant référence à la présente Licence et à l'absence de toute garantie ; et que vous fournissiez à tout destinataire du Programme autre que vous-même un exemplaire de la présente Licence en même temps que le Programme.
+
+Vous pouvez faire payer l'acte physique de transmission d'une copie, et vous pouvez, à votre discrétion, proposer une garantie contre rémunération.
+
+2. Vous pouvez modifier votre copie ou des copies du Programme ou n'importe quelle partie de celui-ci, créant ainsi un ouvrage fondé sur le Programme, et copier et distribuer de telles modifications ou ouvrage selon les termes de l'Article 1 ci-dessus, à condition de vous conformer également à chacune des obligations suivantes :
+
+a) Vous devez munir les fichiers modifiés d'avis bien visibles stipulants que vous avez modifié ces fichiers, ainsi que la date de chaque modification ;
+
+b) Vous devez prendre les dispositions nécessaires pour que tout ouvrage que vous distribuez ou publiez, et qui, en totalité ou en partie, contient ou est fondé sur le Programme - ou une partie quelconque de ce dernier - soit concédé comme un tout, à titre gratuit, à n'importe quel tiers, au titre des conditions de la présente Licence.
+
+c) Si le programme modifié lit habituellement des instructions de façon interactive lorsqu'on l'exécute, vous devez, quand il commence son exécution pour ladite utilisation interactive de la manière la plus usuelle, faire en sorte qu'il imprime ou affiche une annonce comprenant un avis de droit d'auteur ad hoc, et un avis stipulant qu'il n'y a pas de garantie (ou bien indiquant que c'est vous qui fournissez la garantie), et que les utilisateurs peuvent redistribuer le programme en respectant les présentes obligations, et expliquant à l'utilisateur comment voir une copie de la présente Licence.
+
+(Exception : si le Programme est lui-même interactif mais n'imprime pas habituellement une telle annonce, votre ouvrage fondé sur le Programme n'est pas obligé d'imprimer une annonce).
+
+Ces obligations s'appliquent à l'ouvrage modifié pris comme un tout.
+
+Si des éléments identifiables de cet ouvrage ne sont pas fondés sur le Programme et peuvent raisonnablement être considérés comme des ouvrages indépendants distincts en eux mêmes, alors la présente Licence et ses conditions ne s'appliquent pas à ces éléments lorsque vous les distribuez en tant qu'ouvrages distincts.
+
+Mais lorsque vous distribuez ces mêmes éléments comme partie d'un tout, lequel constitue un ouvrage fondé sur le Programme, la distribution de ce tout doit être soumise aux conditions de la présente Licence, et les autorisations qu'elle octroie aux autres concessionnaires s'étendent à l'ensemble de l'ouvrage et par conséquent à chaque et toute partie indifférement de qui l'a écrite.
+
+Par conséquent, l'objet du présent article n'est pas de revendiquer des droits ou de contester vos droits sur un ouvrage entièrement écrit par vous; son objet est plutôt d'exercer le droit de contrôler la distribution d'ouvrages dérivés ou d'ouvrages collectifs fondés sur le Programme.
+
+De plus, la simple proximité du Programme avec un autre ouvrage qui n'est pas fondé sur le Programme (ou un ouvrage fondé sur le Programme) sur une partition d'un espace de stockage ou un support de distribution ne place pas cet autre ouvrage dans le champ d'application de la présente Licence.
+
+3. Vous pouvez copier et distribuer le Programme (ou un ouvrage fondé sur lui, selon l'Article 2) sous forme de code objet ou d'exécutable, selon les termes des Articles 1 et 2 ci-dessus, à condition que vous accomplissiez l'un des points suivants :
+
+a) L'accompagner de l'intégralité du code source correspondant, sous une forme lisible par un ordinateur, lequel doit être distribué au titre des termes des Articles 1 et 2 ci-dessus, sur un support habituellement utilisé pour l'échange de logiciels; ou,
+
+b) L'accompagner d'une proposition écrite, valable pendant au moins trois ans, de fournir à tout tiers, à un tarif qui ne soit pas supérieur à ce que vous coûte l'acte physique de réaliser une distribution source, une copie intégrale du code source correspondant sous une forme lisible par un ordinateur, qui sera distribuée au titre des termes des Articles 1 et 2 ci-dessus, sur un support habituellement utilisé pour l'échange de logiciels; ou,
+
+c) L'accompagner des informations reçues par vous concernant la proposition de distribution du code source correspondant. (Cette solution n'est autorisée que dans le cas d'une distribution non commerciale et seulement si vous avez reçu le programme sous forme de code objet ou d'exécutable accompagné d'une telle proposition - en conformité avec le sous-Article b ci-dessus.)
+
+Le code source d'un ouvrage désigne la forme favorite pour travailler à des modifications de cet ouvrage. Pour un ouvrage exécutable, le code source intégral désigne la totalité du code source de la totalité des modules qu'il contient, ainsi que les éventuels fichiers de définition des interfaces qui y sont associés, ainsi que les scripts utilisés pour contrôler la compilation et l'installation de l'exécutable. Cependant, par exception spéciale, le code source distribué n'est pas censé inclure quoi que ce soit de normalement distribué (que ce soit sous forme source ou binaire) avec les composants principaux (compilateur, noyau, et autre) du système d'exploitation sur lequel l'exécutable tourne, à moins que ce composant lui-même n'accompagne l'exécutable.
+
+Si distribuer un exécutable ou un code objet consiste à offrir un accès permettant leur copie depuis un endroit particulier, alors l'offre d'un accès équivalent pour copier le code source depuis le même endroit compte comme une distribution du code source - même si les tiers ne sont pas contraints de copier le source en même temps que le code objet.
+
+4. Vous ne pouvez copier, modifier, concéder en sous-licence, ou distribuer le Programme, sauf tel qu'expressément prévu par la présente Licence. Toute tentative de copier, modifier, concéder en sous-licence, ou distribuer le Programme d'une autre manière est réputée non valable, et met immédiatement fin à vos droits au titre de la présente Licence. Toutefois, les tiers ayant reçu de vous des copies, ou des droits, au titre de la présente Licence ne verront pas leurs autorisations résiliées aussi longtemps que ledits tiers se conforment pleinement à elle.
+
+5. Vous n'êtes pas obligé d'accepter la présente Licence étant donné que vous ne l'avez pas signée. Cependant, rien d'autre ne vous accorde l'autorisation de modifier ou distribuer le Programme ou les ouvrages fondés sur lui. Ces actions sont interdites par la loi si vous n'acceptez pas la présente Licence. En conséquence, en modifiant ou distribuant le Programme (ou un ouvrage quelconque fondé sur le Programme), vous signifiez votre acceptation de la présente Licence en le faisant, et de toutes ses conditions concernant la copie, la distribution ou la modification du Programme ou d'ouvrages fondés sur lui.
+
+6. Chaque fois que vous redistribuez le Programme (ou n'importe quel ouvrage fondé sur le Programme), une licence est automatiquement concédée au destinataire par le concédant originel de la licence, l'autorisant à copier, distribuer ou modifier le Programme, sous réserve des présentes conditions. Vous ne pouvez imposer une quelconque limitation supplémentaire à l'exercice des droits octroyés au titre des présentes par le destinataire. Vous n'avez pas la responsabilité d'imposer le respect de la présente Licence à des tiers.
+
+7. Si, conséquement à une décision de justice ou l'allégation d'une transgression de brevet ou pour toute autre raison (non limitée à un probleme de brevet), des obligations vous sont imposées (que ce soit par jugement, conciliation ou autre) qui contredisent les conditions de la présente Licence, elles ne vous excusent pas des conditions de la présente Licence. Si vous ne pouvez distribuer de manière à satisfaire simultanément vos obligations au titre de la présente Licence et toute autre obligation pertinente, alors il en découle que vous ne pouvez pas du tout distribuer le Programme. Par exemple, si une licence de brevet ne permettait pas une redistribution sans redevance du Programme par tous ceux qui reçoivent une copie directement ou indirectement par votre intermédiaire, alors la seule façon pour vous de satisfaire à la fois à la licence du brevet et à la présente Licence serait de vous abstenir totalement de toute distribution du Programme.
+
+Si une partie quelconque de cet article est tenue pour nulle ou inopposable dans une circonstance particulière quelconque, l'intention est que le reste de l'article s'applique. La totalité de la section s'appliquera dans toutes les autres circonstances.
+
+Cet article n'a pas pour but de vous induire à transgresser un quelconque brevet ou d'autres revendications à un droit de propriété ou à contester la validité de la moindre de ces revendications ; cet article a pour seul objectif de protéger l'intégrité du système de distribution du logiciel libre, qui est mis en oeuvre par la pratique des licenses publiques. De nombreuses personnes ont fait de généreuses contributions au large spectre de logiciels distribués par ce système en se fiant à l'application cohérente de ce système ; il appartient à chaque auteur/donateur de décider si il ou elle veut distribuer du logiciel par l'intermédiaire d'un quelconque autre système et un concessionaire ne peut imposer ce choix.
+
+Cet article a pour but de rendre totalement limpide ce que l'on pense être une conséquence du reste de la présente Licence.
+
+8. Si la distribution et/ou l'utilisation du Programme est limitée dans certains pays que ce soit par des brevets ou par des interfaces soumises au droit d'auteur, le titulaire originel des droits d'auteur qui décide de couvrir le Programme par la présente Licence peut ajouter une limitation géographique de distribution explicite qui exclue ces pays afin que la distribution soit permise seulement dans ou entre les pays qui ne sont pas ainsi exclus. Dans ce cas, la présente Licence incorpore la limitation comme si elle était écrite dans le corps de la présente Licence.
+
+9. La Free Software Foundation peut, de temps à autre, publier des versions révisées et/ou nouvelles de la Licence Publique Générale. De telles nouvelles versions seront similaires à la présente version dans l'esprit mais pourront différer dans le détail pour prendre en compte de nouvelles problématiques ou inquiétudes.
+
+Chaque version possède un numéro de version la distinguant. Si le Programme précise le numéro de version de la présente Licence qui s'y applique et "une version ultérieure quelconque", vous avez le choix de suivre les conditions de la présente version ou de toute autre version ultérieure publiée par la Free Software Foundation. Si le Programme ne spécifie aucun numéro de version de la présente Licence, vous pouvez choisir une version quelconque publiée par la Free Software Foundation à quelque moment que ce soit.
+
+10. Si vous souhaitez incorporer des parties du Programme dans d'autres programmes libres dont les conditions de distribution sont différentes, écrivez à l'auteur pour lui en demander l'autorisation. Pour les logiciels dont la Free Software Foundation est titulaire des droits d'auteur, écrivez à la Free Software Foundation ; nous faisons parfois des exceptions dans ce sens. Notre décision sera guidée par le double objectif de préserver le statut libre de tous les dérivés de nos logiciels libres et de promouvoir le partage et la réutilisation des logiciels en général.
+ABSENCE DE GARANTIE
+
+11. COMME LA LICENCE DU PROGRAMME EST CONCEDEE A TITRE GRATUIT, AUCUNE GARANTIE NE S'APPLIQUE AU PROGRAMME, DANS LES LIMITES AUTORISEES PAR LA LOI APPLICABLE. SAUF MENTION CONTRAIRE ECRITE, LES TITULAIRES DU DROIT D'AUTEUR ET/OU LES AUTRES PARTIES FOURNISSENT LE PROGRAMME "EN L'ETAT", SANS AUCUNE GARANTIE DE QUELQUE NATURE QUE CE SOIT, EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS Y ETRE LIMITE, LES GARANTIES IMPLICITES DE COMMERCIABILITE ET DE LA CONFORMITE A UNE UTILISATION PARTICULIERE. VOUS ASSUMEZ LA TOTALITE DES RISQUES LIES A LA QUALITE ET AUX PERFORMANCES DU PROGRAMME. SI LE PROGRAMME SE REVELAIT DEFECTUEUX, LE COUT DE L'ENTRETIEN, DES REPARATIONS OU DES CORRECTIONS NECESSAIRES VOUS INCOMBENT INTEGRALEMENT.
+
+12. EN AUCUN CAS, SAUF LORSQUE LA LOI APPLICABLE OU UNE CONVENTION ECRITE L'EXIGE, UN TITULAIRE DE DROIT D'AUTEUR QUEL QU'IL SOIT, OU TOUTE PARTIE QUI POURRAIT MODIFIER ET/OU REDISTRIBUER LE PROGRAMME COMME PERMIS CI-DESSUS, NE POURRAIT ETRE TENU POUR RESPONSABLE A VOTRE EGARD DES DOMMAGES, INCLUANT LES DOMMAGES GENERIQUES, SPECIFIQUES, SECONDAIRES OU CONSECUTIFS, RESULTANT DE L'UTILISATION OU DE L'INCAPACITE D'UTILISER LE PROGRAMME (Y COMPRIS, MAIS SANS Y ETRE LIMITE, LA PERTE DE DONNEES, OU LE FAIT QUE DES DONNEES SOIENT RENDUES IMPRECISES, OU LES PERTES EPROUVEES PAR VOUS OU PAR DES TIERS, OU LE FAIT QUE LE PROGRAMME ECHOUE A INTEROPERER AVEC UN AUTRE PROGRAMME QUEL QU'IL SOIT) MEME SI LE DIT TITULAIRE DU DROIT D'AUTEUR OU LE PARTIE CONCERNEE A ETE AVERTI DE L'EVENTUALITE DE TELS DOMMAGES.
+FIN DES CONDITIONS
+Comment appliquer ces conditions à vos nouveaux programmes
+
+Si vous développez un nouveau programme, et si vous voulez qu'il soit de la plus grande utilité possible pour le public, le meilleur moyen d'y parvenir est d'en faire un logiciel libre que chacun peut redistribuer et modifier au titre des présentes conditions.
+
+Pour ce faire, munissez le programme des avis qui suivent. Le plus sûr est de les ajouter au début de chaque fichier source pour véhiculer le plus efficacement possible l'absence de toute garantie ; chaque fichier devrait aussi contenir au moins la ligne "copyright" et une indication de l'endroit où se trouve l'avis complet.
+
+[Une ligne donnant le nom du programme et une courte idée de ce qu'il fait.] Copyright (C) [année] [nom de l'auteur] Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier au titre des clauses de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre discrétion) une version ultérieure quelconque. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIABILITE ou DE CONFORMITE A UNE UTILISATION PARTICULIERE. Voir la Licence Publique Générale GNU pour plus de détails. Vous devriez avoir reçu un exemplaire de la Licence Publique Générale GNU avec ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Ajoutez aussi des informations sur la manière de vous contacter par courrier électronique et courrier postal.
+
+Si le programme est interactif, faites en sorte qu'il affiche un court avis tel que celui-ci lorsqu'il démarre en mode interactif :
+
+Gnomovision version 69, Copyright (C) année nom de l'auteur Gnomovision n'est accompagné d'ABSOLUMENT AUCUNE GARANTIE ; pour plus de détails tapez "show w". Ceci est un logiciel libre et vous êtes invité à le redistribuer en respectant certaines obligations ; pour plus de détails tapez "show c".
+
+Les instructions hypothétiques "show w" et "show c" sont supposées montrer les parties ad hoc de la Licence Publique Générale. Bien entendu, les instructions que vous utilisez peuvent porter d'autres noms que "show w" et "show c" ; elles peuvent même être des clics de souris ou des éléments d'un menu ou tout ce qui convient à votre programme.
+
+Vous devriez aussi obtenir de votre employeur (si vous travaillez en tant que développeur) ou de votre école, si c'est le cas, qu'il (ou elle) signe une "renonciation aux droits d'auteur" concernant le programme, si nécessaire. Voici un exemple (changez les noms) :
+
+Yoyodyne, Inc., déclare par la présente renoncer à toute prétention sur les droits d'auteur du programme "Gnomovision" (qui fait des avances aux compilateurs) écrit par James Hacker. [signature de Ty Coon], 1er avril 1989 Ty Coon, Président du Vice
+
+La présente Licence Publique Générale n'autorise pas l'incorporation de votre programme dans des programmes propriétaires. Si votre programme est une bibliothèque de sous-programmes, vous pouvez considérer plus utile d'autoriser l'édition de liens d'applications propriétaires avec la bibliothèque. Si c'est ce que vous voulez faire, utilisez la GNU Lesser General Public License au lieu de la présente Licence.
diff --git a/freeplane_framework/windows-installer/gpl-2.0_german.txt b/freeplane_framework/windows-installer/gpl-2.0_german.txt
new file mode 100644
index 0000000..c3d1594
--- /dev/null
+++ b/freeplane_framework/windows-installer/gpl-2.0_german.txt
@@ -0,0 +1,171 @@
+Deutsche Übersetzung der Version 2, Juni 1991
+
+Den offiziellen englischen Originaltext finden Sie unter http://www.gnu.org/licenses/gpl-2.0.html.
+
+ Diese Übersetzung wurde ursprünglich erstellt von Katja Lachmann Übersetzungen im Auftrag der S.u.S.E. GmbH http://www.suse.de. Sie wurde überarbeitet von Peter Gerwinski, G-N-U GmbH http://www.g-n-u.de (31. Oktober 1996, 4. Juni 2000).
+
+ Diese Übersetzung wird mit der Absicht angeboten, das Verständnis der GNU General Public License (GNU GPL) zu erleichtern. Es handelt sich jedoch nicht um eine offizielle oder im rechtlichen Sinne anerkannte Übersetzung.
+
+ Die Free Software Foundation (FSF) ist nicht der Herausgeber dieser Übersetzung, und sie hat diese Übersetzung auch nicht als rechtskräftigen Ersatz für die Original-GNU-GPL anerkannt. Da die Übersetzung nicht sorgfältig von Anwälten überprüft wurde, können die Übersetzer nicht garantieren, daß die Übersetzung die rechtlichen Aussagen der GNU GPL exakt wiedergibt. Wenn Sie sichergehen wollen, daß von Ihnen geplante Aktivitäten im Sinne der GNU GPL gestattet sind, halten Sie sich bitte an die englischsprachige Originalversion.
+
+ Die Übersetzer und die Free Software Foundation möchten Sie darum bitten, diese Übersetzung nicht als offizielle Lizenzbedingungen für von Ihnen geschriebene Programme zu verwenden. Bitte benutzen Sie hierfür stattdessen die von der Free Software Foundation herausgegebene englischsprachige Originalversion.
+
+ This is a translation of the GNU General Public License into German. This translation is distributed in the hope that it will facilitate understanding, but it is not an official or legally approved translation.
+
+ The Free Software Foundation is not the publisher of this translation and has not approved it as a legal substitute for the authentic GNU General Public License. The translation has not been reviewed carefully by lawyers, and therefore the translator cannot be sure that it exactly represents the legal meaning of the GNU General Public License. If you wish to be sure whether your planned activities are permitted by the GNU General Public License, please refer to the authentic English version.
+
+ The translators and the Free Software Foundation strongly urge you not to use this translation as the official distribution terms for your programs; instead, please use the authentic English version published by the Free Software Foundation.
+
+GNU General Public License
+
+Deutsche Übersetzung der Version 2, Juni 1991
+
+Copyright © 1989, 1991 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110, USA
+
+Es ist jedermann gestattet, diese Lizenzurkunde zu vervielfältigen und unveränderte Kopien zu verbreiten; Änderungen sind jedoch nicht erlaubt.
+
+Diese Übersetzung ist kein rechtskräftiger Ersatz für die englischsprachige Originalversion!
+Vorwort
+
+Die meisten Softwarelizenzen sind daraufhin entworfen worden, Ihnen die Freiheit zu nehmen, die Software weiterzugeben und zu verändern. Im Gegensatz dazu soll Ihnen die GNU General Public License, die Allgemeine Öffentliche GNU-Lizenz, ebendiese Freiheit garantieren. Sie soll sicherstellen, daß die Software für alle Benutzer frei ist. Diese Lizenz gilt für den Großteil der von der Free Software Foundation herausgegebenen Software und für alle anderen Programme, deren Autoren ihr Werk dieser Lizenz unterstellt haben. Auch Sie können diese Möglichkeit der Lizenzierung für Ihre Programme anwenden. (Ein anderer Teil der Software der Free Software Foundation unterliegt stattdessen der GNU Lesser General Public License, der Kleineren Allgemeinen Öffentlichen GNU-Lizenz.)
+
+Die Bezeichnung freie Software bezieht sich auf Freiheit, nicht auf den Preis. Unsere Lizenzen sollen Ihnen die Freiheit garantieren, Kopien freier Software zu verbreiten (und etwas für diesen Service zu berechnen, wenn Sie möchten), die Möglichkeit, die Software im Quelltext zu erhalten oder den Quelltext auf Wunsch zu bekommen. Die Lizenzen sollen garantieren, daß Sie die Software ändern oder Teile davon in neuen freien Programmen verwenden dürfen und daß Sie wissen, daß Sie dies alles tun dürfen.
+
+Um Ihre Rechte zu schützen, müssen wir Einschränkungen machen, die es jedem verbieten, Ihnen diese Rechte zu verweigern oder Sie aufzufordern, auf diese Rechte zu verzichten. Aus diesen Einschränkungen folgen bestimmte Verantwortlichkeiten für Sie, wenn Sie Kopien der Software verbreiten oder sie verändern.
+
+Beispielsweise müssen Sie den Empfängern alle Rechte gewähren, die Sie selbst haben, wenn Sie kostenlos oder gegen Bezahlung Kopien eines solchen Programms verbreiten. Sie müssen sicherstellen, daß auch die Empfänger den Quelltext erhalten bzw. erhalten können. Und Sie müssen ihnen diese Bedingungen zeigen, damit sie ihre Rechte kennen.
+
+Wir schützen Ihre Rechte in zwei Schritten: (1) Wir stellen die Software unter ein Urheberrecht (Copyright), und (2) wir bieten Ihnen diese Lizenz an, die Ihnen das Recht gibt, die Software zu vervielfältigen, zu verbreiten und/oder zu verändern.
+
+Um die Autoren und uns zu schützen, wollen wir darüberhinaus sicherstellen, daß jeder erfährt, daß für diese freie Software keinerlei Garantie besteht. Wenn die Software von jemand anderem modifiziert und weitergegeben wird, möchten wir, daß die Empfänger wissen, daß sie nicht das Original erhalten haben, damit irgendwelche von anderen verursachte Probleme nicht den Ruf des ursprünglichen Autors schädigen.
+
+Schließlich und endlich ist jedes freie Programm permanent durch Software-Patente bedroht. Wir möchten die Gefahr ausschließen, daß Distributoren eines freien Programms individuell Patente lizensieren mit dem Ergebnis, daß das Programm proprietär würde. Um dies zu verhindern, haben wir klargestellt, daß jedes Patent entweder für freie Benutzung durch jedermann lizenziert werden muß oder überhaupt nicht lizenziert werden darf.
+
+Es folgen die genauen Bedingungen für die Vervielfältigung, Verbreitung und Bearbeitung:
+Allgemeine Öffentliche GNU-Lizenz
+Bedingungen für die Vervielfältigung, Verbreitung und Bearbeitung
+
+§0. Diese Lizenz gilt für jedes Programm und jedes andere Werk, in dem ein entsprechender Vermerk des Copyright-Inhabers darauf hinweist, daß das Werk unter den Bestimmungen dieser General Public License verbreitet werden darf. Im folgenden wird jedes derartige Programm oder Werk als das Programm bezeichnet; die Formulierung auf dem Programm basierendes Werk bezeichnet das Programm sowie jegliche Bearbeitung des Programms im urheberrechtlichen Sinne, also ein Werk, welches das Programm, auch auszugsweise, sei es unverändert oder verändert und/oder in eine andere Sprache übersetzt, enthält. (Im folgenden wird die Übersetzung ohne Einschränkung als Bearbeitung eingestuft.) Jeder Lizenznehmer wird im folgenden als Sie angesprochen.
+
+Andere Handlungen als Vervielfältigung, Verbreitung und Bearbeitung werden von dieser Lizenz nicht berührt; sie fallen nicht in ihren Anwendungsbereich. Der Vorgang der Ausführung des Programms wird nicht eingeschränkt, und die Ausgaben des Programms unterliegen dieser Lizenz nur, wenn der Inhalt ein auf dem Programm basierendes Werk darstellt (unabhängig davon, daß die Ausgabe durch die Ausführung des Programmes erfolgte). Ob dies zutrifft, hängt von den Funktionen des Programms ab.
+
+§1. Sie dürfen auf beliebigen Medien unveränderte Kopien des Quelltextes des Programms, wie sie ihn erhalten haben, anfertigen und verbreiten. Voraussetzung hierfür ist, daß Sie mit jeder Kopie einen entsprechenden Copyright-Vermerk sowie einen Haftungsausschluß veröffentlichen, alle Vermerke, die sich auf diese Lizenz und das Fehlen einer Garantie beziehen, unverändert lassen und desweiteren allen anderen Empfängern des Programms zusammen mit dem Programm eine Kopie dieser Lizenz zukommen lassen.
+
+Sie dürfen für den eigentlichen Kopiervorgang eine Gebühr verlangen. Wenn Sie es wünschen, dürfen Sie auch gegen Entgelt eine Garantie für das Programm anbieten.
+
+§2. Sie dürfen Ihre Kopie(n) des Programms oder eines Teils davon verändern, wodurch ein auf dem Programm basierendes Werk entsteht; Sie dürfen derartige Bearbeitungen unter den Bestimmungen von Paragraph 1 vervielfältigen und verbreiten, vorausgesetzt, daß zusätzlich alle im folgenden genannten Bedingungen erfüllt werden:
+
+ 1.
+
+ Sie müssen die veränderten Dateien mit einem auffälligen Vermerk versehen, der auf die von Ihnen vorgenommene Modifizierung und das Datum jeder Änderung hinweist.
+ 2.
+
+ Sie müssen dafür sorgen, daß jede von Ihnen verbreitete oder veröffentlichte Arbeit, die ganz oder teilweise von dem Programm oder Teilen davon abgeleitet ist, Dritten gegenüber als Ganzes unter den Bedingungen dieser Lizenz ohne Lizenzgebühren zur Verfügung gestellt wird.
+ 3.
+
+ Wenn das veränderte Programm normalerweise bei der Ausführung interaktiv Kommandos einliest, müssen Sie dafür sorgen, daß es, wenn es auf dem üblichsten Wege für solche interaktive Nutzung gestartet wird, eine Meldung ausgibt oder ausdruckt, die einen geeigneten Copyright-Vermerk enthält sowie einen Hinweis, daß es keine Gewährleistung gibt (oder anderenfalls, daß Sie Garantie leisten), und daß die Benutzer das Programm unter diesen Bedingungen weiter verbreiten dürfen. Auch muß der Benutzer darauf hingewiesen werden, wie er eine Kopie dieser Lizenz ansehen kann. (Ausnahme: Wenn das Programm selbst interaktiv arbeitet, aber normalerweise keine derartige Meldung ausgibt, muß Ihr auf dem Programm basierendes Werk auch keine solche Meldung ausgeben).
+
+Diese Anforderungen gelten für das bearbeitete Werk als Ganzes. Wenn identifizierbare Teile des Werkes nicht von dem Programm abgeleitet sind und vernünftigerweise als unabhängige und eigenständige Werke für sich selbst zu betrachten sind, dann gelten diese Lizenz und ihre Bedingungen nicht für die betroffenen Teile, wenn Sie diese als eigenständige Werke weitergeben. Wenn Sie jedoch dieselben Abschnitte als Teil eines Ganzen weitergeben, das ein auf dem Programm basierendes Werk darstellt, dann muß die Weitergabe des Ganzen nach den Bedingungen dieser Lizenz erfolgen, deren Bedingungen für weitere Lizenznehmer somit auf das gesamte Ganze ausgedehnt werden und somit auf jeden einzelnen Teil, unabhängig vom jeweiligen Autor.
+
+Somit ist es nicht die Absicht dieses Abschnittes, Rechte für Werke in Anspruch zu nehmen oder Ihnen die Rechte für Werke streitig zu machen, die komplett von Ihnen geschrieben wurden; vielmehr ist es die Absicht, die Rechte zur Kontrolle der Verbreitung von Werken, die auf dem Programm basieren oder unter seiner auszugsweisen Verwendung zusammengestellt worden sind, auszuüben.
+
+Ferner bringt auch das einfache Zusammenlegen eines anderen Werkes, das nicht auf dem Programm basiert, mit dem Programm oder einem auf dem Programm basierenden Werk auf ein- und demselben Speicher- oder Vertriebsmedium dieses andere Werk nicht in den Anwendungsbereich dieser Lizenz.
+
+§3. Sie dürfen das Programm (oder ein darauf basierendes Werk gemäß Paragraph 2) als Objectcode oder in ausführbarer Form unter den Bedingungen der Paragraphen 1 und 2 kopieren und weitergeben vorausgesetzt, daß Sie außerdem eine der folgenden Leistungen erbringen:
+
+ 1.
+
+ Liefern Sie das Programm zusammen mit dem vollständigen zugehörigen maschinenlesbaren Quelltext auf einem für den Datenaustausch üblichen Medium aus, wobei die Verteilung unter den Bedingungen der Paragraphen 1 und 2 erfolgen muß. Oder:
+ 2.
+
+ Liefern Sie das Programm zusammen mit einem mindestens drei Jahre lang gültigen schriftlichen Angebot aus, jedem Dritten eine vollständige maschinenlesbare Kopie des Quelltextes zur Verfügung zu stellen zu nicht höheren Kosten als denen, die durch den physikalischen Kopiervorgang anfallen , wobei der Quelltext unter den Bedingungen der Paragraphen 1 und 2 auf einem für den Datenaustausch üblichen Medium weitergegeben wird. Oder:
+ 3.
+
+ Liefern Sie das Programm zusammen mit dem schriftlichen Angebot der Zurverfügungstellung des Quelltextes aus, das Sie selbst erhalten haben. (Diese Alternative ist nur für nicht-kommerzielle Verbreitung zulässig und nur, wenn Sie das Programm als Objectcode oder in ausführbarer Form mit einem entsprechenden Angebot gemäß Absatz b erhalten haben.)
+
+Unter dem Quelltext eines Werkes wird diejenige Form des Werkes verstanden, die für Bearbeitungen vorzugsweise verwendet wird. Für ein ausführbares Programm bedeutet der komplette Quelltext: Der Quelltext aller im Programm enthaltenen Module einschließlich aller zugehörigen Modulschnittstellen-Definitionsdateien sowie der zur Compilation und Installation verwendeten Skripte. Als besondere Ausnahme jedoch braucht der verteilte Quelltext nichts von dem zu enthalten, was üblicherweise (entweder als Quelltext oder in binärer Form) zusammen mit den Hauptkomponenten des Betriebssystems (Kernel, Compiler usw.) geliefert wird, unter dem das Programm läuft es sei denn, diese Komponente selbst gehört zum ausführbaren Programm.
+
+Wenn die Verbreitung eines ausführbaren Programms oder von Objectcode dadurch erfolgt, daß der Kopierzugriff auf eine dafür vorgesehene Stelle gewährt wird, so gilt die Gewährung eines gleichwertigen Zugriffs auf den Quelltext als Verbreitung des Quelltextes, auch wenn Dritte nicht dazu gezwungen sind, den Quelltext zusammen mit dem Objectcode zu kopieren.
+
+§4. Sie dürfen das Programm nicht vervielfältigen, verändern, weiter lizenzieren oder verbreiten, sofern es nicht durch diese Lizenz ausdrücklich gestattet ist. Jeder anderweitige Versuch der Vervielfältigung, Modifizierung, Weiterlizenzierung und Verbreitung ist nichtig und beendet automatisch Ihre Rechte unter dieser Lizenz. Jedoch werden die Lizenzen Dritter, die von Ihnen Kopien oder Rechte unter dieser Lizenz erhalten haben, nicht beendet, solange diese die Lizenz voll anerkennen und befolgen.
+
+§5. Sie sind nicht verpflichtet, diese Lizenz anzunehmen, da Sie sie nicht unterzeichnet haben. Jedoch gibt Ihnen nichts anderes die Erlaubnis, das Programm oder von ihm abgeleitete Werke zu verändern oder zu verbreiten. Diese Handlungen sind gesetzlich verboten, wenn Sie diese Lizenz nicht anerkennen. Indem Sie das Programm (oder ein darauf basierendes Werk) verändern oder verbreiten, erklären Sie Ihr Einverständnis mit dieser Lizenz und mit allen ihren Bedingungen bezüglich der Vervielfältigung, Verbreitung und Veränderung des Programms oder eines darauf basierenden Werks.
+
+§6. Jedesmal, wenn Sie das Programm (oder ein auf dem Programm basierendes Werk) weitergeben, erhält der Empfänger automatisch vom ursprünglichen Lizenzgeber die Lizenz, das Programm entsprechend den hier festgelegten Bestimmungen zu vervielfältigen, zu verbreiten und zu verändern. Sie dürfen keine weiteren Einschränkungen der Durchsetzung der hierin zugestandenen Rechte des Empfängers vornehmen. Sie sind nicht dafür verantwortlich, die Einhaltung dieser Lizenz durch Dritte durchzusetzen.
+
+§7. Sollten Ihnen infolge eines Gerichtsurteils, des Vorwurfs einer Patentverletzung oder aus einem anderen Grunde (nicht auf Patentfragen begrenzt) Bedingungen (durch Gerichtsbeschluß, Vergleich oder anderweitig) auferlegt werden, die den Bedingungen dieser Lizenz widersprechen, so befreien Sie diese Umstände nicht von den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht möglich ist, das Programm unter gleichzeitiger Beachtung der Bedingungen in dieser Lizenz und Ihrer anderweitigen Verpflichtungen zu verbreiten, dann dürfen Sie als Folge das Programm überhaupt nicht verbreiten. Wenn zum Beispiel ein Patent nicht die gebührenfreie Weiterverbreitung des Programms durch diejenigen erlaubt, die das Programm direkt oder indirekt von Ihnen erhalten haben, dann besteht der einzige Weg, sowohl das Patentrecht als auch diese Lizenz zu befolgen, darin, ganz auf die Verbreitung des Programms zu verzichten.
+
+Sollte sich ein Teil dieses Paragraphen als ungültig oder unter bestimmten Umständen nicht durchsetzbar erweisen, so soll dieser Paragraph seinem Sinne nach angewandt werden; im übrigen soll dieser Paragraph als Ganzes gelten.
+
+Zweck dieses Paragraphen ist nicht, Sie dazu zu bringen, irgendwelche Patente oder andere Eigentumsansprüche zu verletzen oder die Gültigkeit solcher Ansprüche zu bestreiten; dieser Paragraph hat einzig den Zweck, die Integrität des Verbreitungssystems der freien Software zu schützen, das durch die Praxis öffentlicher Lizenzen verwirklicht wird. Viele Leute haben großzügige Beiträge zu dem großen Angebot der mit diesem System verbreiteten Software im Vertrauen auf die konsistente Anwendung dieses Systems geleistet; es liegt am Autor/Geber, zu entscheiden, ob er die Software mittels irgendeines anderen Systems verbreiten will; ein Lizenznehmer hat auf diese Entscheidung keinen Einfluß.
+
+Dieser Paragraph ist dazu gedacht, deutlich klarzustellen, was als Konsequenz aus dem Rest dieser Lizenz betrachtet wird.
+
+§8. Wenn die Verbreitung und/oder die Benutzung des Programms in bestimmten Staaten entweder durch Patente oder durch urheberrechtlich geschützte Schnittstellen eingeschränkt ist, kann der Urheberrechtsinhaber, der das Programm unter diese Lizenz gestellt hat, eine explizite geographische Begrenzung der Verbreitung angeben, in der diese Staaten ausgeschlossen werden, so daß die Verbreitung nur innerhalb und zwischen den Staaten erlaubt ist, die nicht ausgeschlossen sind. In einem solchen Fall beinhaltet diese Lizenz die Beschränkung, als wäre sie in diesem Text niedergeschrieben.
+
+§9. Die Free Software Foundation kann von Zeit zu Zeit überarbeitete und/oder neue Versionen der General Public License veröffentlichen. Solche neuen Versionen werden vom Grundprinzip her der gegenwärtigen entsprechen, können aber im Detail abweichen, um neuen Problemen und Anforderungen gerecht zu werden.
+
+Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. Wenn in einem Programm angegeben wird, daß es dieser Lizenz in einer bestimmten Versionsnummer oder jeder späteren Version (any later version) unterliegt, so haben Sie die Wahl, entweder den Bestimmungen der genannten Version zu folgen oder denen jeder beliebigen späteren Version, die von der Free Software Foundation veröffentlicht wurde. Wenn das Programm keine Versionsnummer angibt, können Sie eine beliebige Version wählen, die je von der Free Software Foundation veröffentlicht wurde.
+
+§10. Wenn Sie den Wunsch haben, Teile des Programms in anderen freien Programmen zu verwenden, deren Bedingungen für die Verbreitung anders sind, schreiben Sie an den Autor, um ihn um die Erlaubnis zu bitten. Für Software, die unter dem Copyright der Free Software Foundation steht, schreiben Sie an die Free Software Foundation; wir machen zu diesem Zweck gelegentlich Ausnahmen. Unsere Entscheidung wird von den beiden Zielen geleitet werden, zum einen den freien Status aller von unserer freien Software abgeleiteten Werke zu erhalten und zum anderen das gemeinschaftliche Nutzen und Wiederverwenden von Software im allgemeinen zu fördern.
+Keine Gewährleistung
+
+§11. Da das Programm ohne jegliche Kosten lizenziert wird, besteht keinerlei Gewährleistung für das Programm, soweit dies gesetzlich zulässig ist. Sofern nicht anderweitig schriftlich bestätigt, stellen die Copyright-Inhaber und/oder Dritte das Programm so zur Verfügung, wie es ist, ohne irgendeine Gewährleistung, weder ausdrücklich noch implizit, einschließlich aber nicht begrenzt auf Marktreife oder Verwendbarkeit für einen bestimmten Zweck. Das volle Risiko bezüglich Qualität und Leistungsfähigkeit des Programms liegt bei Ihnen. Sollte sich das Programm als fehlerhaft herausstellen, liegen die Kosten für notwendigen Service, Reparatur oder Korrektur bei Ihnen.
+
+§12. In keinem Fall, außer wenn durch geltendes Recht gefordert oder schriftlich zugesichert, ist irgendein Copyright-Inhaber oder irgendein Dritter, der das Programm wie oben erlaubt modifiziert oder verbreitet hat, Ihnen gegenüber für irgendwelche Schäden haftbar, einschließlich jeglicher allgemeiner oder spezieller Schäden, Schäden durch Seiteneffekte (Nebenwirkungen) oder Folgeschäden, die aus der Benutzung des Programms oder der Unbenutzbarkeit des Programms folgen (einschließlich aber nicht beschränkt auf Datenverluste, fehlerhafte Verarbeitung von Daten, Verluste, die von Ihnen oder anderen getragen werden müssen, oder dem Unvermögen des Programms, mit irgendeinem anderen Programm zusammenzuarbeiten), selbst wenn ein Copyright-Inhaber oder Dritter über die Möglichkeit solcher Schäden unterrichtet worden war.
+Ende der Bedingungen
+Wie Sie diese Bedingungen auf Ihre eigenen, neuen Programme anwenden können
+
+Wenn Sie ein neues Programm entwickeln und wollen, daß es vom größtmöglichen Nutzen für die Allgemeinheit ist, dann erreichen Sie das am besten, indem Sie es zu freier Software machen, die jeder unter diesen Bestimmungen weiterverbreiten und verändern kann.
+
+Um dies zu erreichen, fügen Sie die folgenden Vermerke zu Ihrem Programm hinzu. Am sichersten ist es, sie an den Anfang einer jeden Quelldatei zu stellen, um den Gewährleistungsausschluß möglichst deutlich darzustellen; zumindest aber sollte jede Datei eine Copyright-Zeile besitzen sowie einen kurzen Hinweis darauf, wo die vollständigen Vermerke zu finden sind.
+
+ [eine Zeile mit dem Programmnamen und einer kurzen Beschreibung]
+ Copyright (C) [Jahr] [Name des Autors]
+
+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 St, Fifth Floor, Boston, MA 02110, USA
+
+Auf Deutsch:
+
+ [eine Zeile mit dem Programmnamen und einer kurzen Beschreibung]
+ Copyright (C) [Jahr] [Name des Autors]
+
+ Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
+
+ Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
+
+ Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
+
+Fügen Sie auch einen kurzen Hinweis hinzu, wie Sie elektronisch und per Brief erreichbar sind.
+
+Wenn Ihr Programm interaktiv ist, sorgen Sie dafür, daß es nach dem Start einen kurzen Vermerk ausgibt:
+
+ version 69, Copyright (C) [Jahr] [Name des Autors]
+ 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.
+
+Auf Deutsch:
+
+ Version 69, Copyright (C) [Jahr] [Name des Autors] Für Gnomovision besteht KEINERLEI GARANTIE; geben Sie "show w" für Details ein. Gnonovision ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen; geben Sie "show c" für Details ein.
+
+Die hypothetischen Kommandos show w und show c sollten die entsprechenden Teile der GNU-GPL anzeigen. Natürlich können die von Ihnen verwendeten Kommandos anders heißen als show w und show c; es könnten auch Mausklicks oder Menüpunkte sein was immer am besten in Ihr Programm paßt.
+
+Soweit vorhanden, sollten Sie auch Ihren Arbeitgeber (wenn Sie als Programmierer arbeiten) oder Ihre Schule einen Copyright-Verzicht für das Programm unterschreiben lassen. Hier ein Beispiel. Die Namen müssen Sie natürlich ändern.
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program Gnomovision (which makes passes at compilers) written by James Hacker.
+
+ [Unterschrift von Ty Coon], 1 April 1989
+ Ty Coon, President of Vice
+
+Auf Deutsch:
+
+ Die Yoyodyne GmbH erhebt keinen urheberrechtlichen Anspruch auf das von James Hacker geschriebene Programm "Gnomovision" (einem Schrittmacher für Compiler).
+
+ [Unterschrift von Ty Coon], 1. April 1989
+ Ty Coon, Vizepräsident
+
+Diese General Public License gestattet nicht die Einbindung des Programms in proprietäre Programme. Ist Ihr Programm eine Funktionsbibliothek, so kann es sinnvoller sein, das Binden proprietärer Programme mit dieser Bibliothek zu gestatten. Wenn Sie dies tun wollen, sollten Sie die GNU Lesser General Public License anstelle dieser Lizenz verwenden.
\ No newline at end of file
diff --git a/freeplane_framework/windows-installer/gpl-2.0_russian.txt b/freeplane_framework/windows-installer/gpl-2.0_russian.txt
new file mode 100644
index 0000000..5cf5a78
--- /dev/null
+++ b/freeplane_framework/windows-installer/gpl-2.0_russian.txt
@@ -0,0 +1,156 @@
+GNU GENERAL PUBLIC LICENSE
+
+ÐеÑÑÐ¸Ñ 2, иÑÐ½Ñ 1991г.
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ÐаждÑй впÑаве копиÑоваÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ Ð½Ð°ÑÑоÑÑей ÐиÑензии без внеÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ее ÑекÑÑ.
+ÐÑеамбÑла
+
+ÐолÑÑинÑÑво лиÑензий на пÑогÑаммное обеÑпеÑение лиÑаeÑ Ð²Ð°Ñ Ð¿Ñава ÑаÑпÑоÑÑÑанÑÑÑ Ð¸ вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑо пÑогÑаммное обеÑпеÑение. СÑандаÑÑÐ½Ð°Ñ ÐбÑеÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÐиÑÐµÐ½Ð·Ð¸Ñ GNU, напÑоÑив, ÑазÑабоÑана Ñ ÑелÑÑ Ð³Ð°ÑанÑиÑоваÑÑ Ð²Ð°Ð¼ пÑаво ÑовмеÑÑно иÑполÑзоваÑÑ Ð¸ вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñвободное пÑогÑаммное обеÑпеÑение, Ñ.е. обеÑпеÑиÑÑ ÑвободнÑй доÑÑÑп к пÑогÑÐ°Ð¼Ð¼Ð½Ð¾Ð¼Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
полÑзоваÑелей. УÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑÑоÑÑей СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии пÑименÑÑÑÑÑ Ðº болÑÑей ÑаÑÑи пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Free Software Foundation, а Ñакже к лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ð½Ð¾Ð¼Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ авÑоÑа. (РнекоÑоÑÐ¾Ð¼Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ð½Ð¾Ð¼Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Free Software Foundation пÑименÑÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¡ÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU Ð´Ð»Ñ ÐиблиоÑек). ÐÑ Ñакже можеÑе пÑименÑÑÑ Ð¡ÑандаÑÑнÑÑ ÐбÑеÑÑвеннÑÑ ÐиÑÐµÐ½Ð·Ð¸Ñ Ðº ÑазÑабоÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð²Ð°Ð¼Ð¸ пÑогÑÐ°Ð¼Ð¼Ð½Ð¾Ð¼Ñ Ð¾Ð±ÐµÑпеÑениÑ.
+
+ÐовоÑÑ Ð¾ Ñвободном пÑогÑаммном обеÑпеÑении, Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ в Ð²Ð¸Ð´Ñ ÑвободÑ, а не безвозмездноÑÑÑ. ÐаÑÑоÑÑÐ°Ñ Ð¡ÑандаÑÑÐ½Ð°Ñ ÐбÑеÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÐиÑÐµÐ½Ð·Ð¸Ñ ÑазÑабоÑана Ñ ÑелÑÑ Ð³Ð°ÑанÑиÑоваÑÑ Ð²Ð°Ð¼ пÑаво ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ Ñвободного пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ (и пÑи желании полÑÑаÑÑ Ð·Ð° ÑÑо вознагÑаждение), пÑаво полÑÑаÑÑ Ð¸ÑÑ
однÑй ÑекÑÑ Ð¿ÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÐµÐ³Ð¾ полÑÑиÑÑ, пÑаво вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² пÑогÑаммное обеÑпеÑение или иÑполÑзоваÑÑ ÐµÐ³Ð¾ ÑаÑÑи в новом Ñвободном пÑогÑаммном обеÑпеÑении, а Ñакже пÑаво знаÑÑ, ÑÑо Ð²Ñ Ð¸Ð¼ÐµÐµÑе вÑе вÑÑепеÑеÑиÑленнÑе пÑава.
+
+ЧÑÐ¾Ð±Ñ Ð·Ð°ÑиÑиÑÑ Ð²Ð°Ñи пÑава, Ð¼Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ ÑÑд огÑаниÑений Ñ Ñем, ÑÑÐ¾Ð±Ñ Ð½Ð¸ÐºÑо не имел возможноÑÑи лиÑиÑÑ Ð²Ð°Ñ ÑÑиÑ
пÑав или обÑаÑиÑÑÑÑ Ðº вам Ñ Ð¿Ñедложением оÑказаÑÑÑÑ Ð¾Ñ ÑÑиÑ
пÑав. ÐаннÑе огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð°Ð»Ð°Ð³Ð°ÑÑ Ð½Ð° Ð²Ð°Ñ Ð¾Ð¿ÑеделеннÑе обÑзанноÑÑи в ÑлÑÑае, еÑли Ð²Ñ ÑаÑпÑоÑÑÑанÑеÑе ÑкземплÑÑÑ Ð¿ÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ модиÑиÑиÑÑеÑе пÑогÑаммное обеÑпеÑение.
+
+ÐапÑимеÑ, еÑли Ð²Ñ ÑаÑпÑоÑÑÑанÑеÑе ÑкземплÑÑÑ Ñакого пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð·Ð° плаÑÑ Ð¸Ð»Ð¸ беÑплаÑно, Ð²Ñ Ð¾Ð±ÑÐ·Ð°Ð½Ñ Ð¿ÐµÑедаÑÑ Ð½Ð¾Ð²Ñм обладаÑелÑм вÑе пÑава в Ñом же обÑеме, в каком они пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð²Ð°Ð¼. ÐÑ Ð¾Ð±ÑÐ·Ð°Ð½Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð¿Ð¾Ð»ÑÑение новÑми обладаÑелÑми пÑогÑÐ°Ð¼Ð¼Ñ ÐµÐµ иÑÑ
одного ÑекÑÑа или возможноÑÑÑ ÐµÐ³Ð¾ полÑÑиÑÑ. ÐÑ Ñакже обÑÐ·Ð°Ð½Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑ Ð¸Ñ
Ñ ÑÑловиÑми наÑÑоÑÑей ÐиÑензии.
+
+ÐÐ»Ñ Ð·Ð°ÑиÑÑ Ð²Ð°ÑиÑ
пÑав мÑ: (1) оÑÑавлÑем за Ñобой авÑоÑÑкие пÑава на пÑогÑаммное обеÑпеÑение и (2) пÑедлагаем вам иÑполÑзоваÑÑ Ð½Ð°ÑÑоÑÑÑÑ ÐиÑензиÑ, в ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми коÑоÑой Ð²Ñ Ð²Ð¿Ñаве воÑпÑоизводиÑÑ, ÑаÑпÑоÑÑÑанÑÑÑ Ð¸/или модиÑиÑиÑоваÑÑ Ð¿ÑогÑаммное обеÑпеÑение.
+
+ÐÑоме Ñого, Ð´Ð»Ñ Ð·Ð°ÑиÑÑ ÐºÐ°Ðº наÑей ÑепÑÑаÑии, Ñак и ÑепÑÑаÑии дÑÑгиÑ
авÑоÑов пÑогÑаммного обеÑпеÑениÑ, Ð¼Ñ ÑведомлÑем вÑеÑ
полÑзоваÑелей, ÑÑо на данное пÑогÑаммное обеÑпеÑение никакиÑ
гаÑанÑий не пÑедоÑÑавлÑеÑÑÑ. Те, кÑо пÑиобÑел пÑогÑаммное обеÑпеÑение, Ñ Ð²Ð½ÐµÑеннÑми в него ÑÑеÑÑими лиÑами изменениÑми, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð½Ð°ÑÑ, ÑÑо они полÑÑаÑÑ Ð½Ðµ оÑигинал, в ÑÐ¸Ð»Ñ Ñего авÑÐ¾Ñ Ð¾Ñигинала не неÑÐµÑ Ð¾ÑвеÑÑÑвенноÑÑи за оÑибки в ÑабоÑе пÑогÑаммного обеÑпеÑениÑ, допÑÑеннÑе ÑÑеÑÑими лиÑами пÑи внеÑении изменений.
+
+ÐаконеÑ, пÑогÑаммное обеÑпеÑение пеÑеÑÑÐ°ÐµÑ Ð±ÑÑÑ ÑвободнÑм в ÑлÑÑае, еÑли лиÑо пÑиобÑеÑÐ°ÐµÑ Ð½Ð° него иÑклÑÑиÑелÑнÑе пÑава [1]. ÐедопÑÑÑимо, ÑÑÐ¾Ð±Ñ Ð»Ð¸Ñа, ÑаÑпÑоÑÑÑанÑÑÑие Ñвободное пÑогÑаммное обеÑпеÑение, могли пÑиобÑеÑÑи иÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование данного пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¸ заÑегиÑÑÑиÑоваÑÑ Ð¸Ñ
в ÐаÑенÑном ведомÑÑве. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÑого, Ð¼Ñ Ð·Ð°ÑвлÑем, ÑÑо обладаÑÐµÐ»Ñ Ð¸ÑклÑÑиÑелÑнÑÑ
пÑав обÑзан пÑедоÑÑавиÑÑ Ð»ÑÐ±Ð¾Ð¼Ñ Ð»Ð¸ÑÑ Ð¿Ñава на иÑполÑзование пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð»Ð¸Ð±Ð¾ не пÑиобÑеÑаÑÑ Ð¸ÑклÑÑиÑелÑнÑÑ
пÑав вообÑе.
+
+Ðиже Ð¸Ð·Ð»Ð¾Ð¶ÐµÐ½Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð²Ð¾ÑпÑоизведениÑ, ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ модиÑикаÑии пÑогÑаммного обеÑпеÑениÑ.
+УÑÐ»Ð¾Ð²Ð¸Ñ Ð²Ð¾ÑпÑоизведениÑ, ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ модиÑикаÑии
+
+0. УÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии пÑименÑÑÑÑÑ ÐºÐ¾ вÑем видам пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ лÑÐ±Ð¾Ð¼Ñ Ð¸Ð½Ð¾Ð¼Ñ Ð¿ÑоизведениÑ, коÑоÑое ÑодеÑÐ¶Ð¸Ñ Ñказание пÑавообладаÑÐµÐ»Ñ Ð½Ð° Ñо, ÑÑо данное пÑоизведение Ð¼Ð¾Ð¶ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð° ÑÑловиÑÑ
СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии. Ðод ÑеÑмином "ÐÑогÑамма" далее понимаеÑÑÑ Ð»Ñбое подобное пÑогÑаммное обеÑпеÑение или иное пÑоизведение. Ðод ÑеÑмином "пÑоизведение, пÑоизводное Ð¾Ñ ÐÑогÑаммÑ" понимаеÑÑÑ ÐÑогÑамма или лÑбое иное пÑоизводное пÑоизведение в ÑооÑвеÑÑÑвии Ñ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°ÑелÑÑÑвом об авÑоÑÑком пÑаве [2], Ñ.е. пÑоизведение, вклÑÑаÑÑее в ÑÐµÐ±Ñ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ ее ÑаÑÑÑ, как Ñ Ð²Ð½ÐµÑеннÑми в ее ÑекÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми, Ñак и без ниÑ
и/или пеÑеведеннÑÑ Ð½Ð° дÑÑгой ÑзÑк. (ÐдеÑÑ Ð¸ далее, понÑÑие "модиÑикаÑиÑ" вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð¿Ð¾Ð½ÑÑие пеÑевода в Ñамом ÑиÑоком ÑмÑÑле). ÐаждÑй пÑиобÑеÑаÑÐµÐ»Ñ ÑкземплÑÑа ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð¼ÐµÐ½ÑеÑÑÑ Ð² далÑнейÑем "ÐиÑензиаÑ".
+
+ÐейÑÑвие наÑÑоÑÑей ÐиÑензии не ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° оÑÑÑеÑÑвление инÑÑ
пÑав, кÑоме воÑпÑоизведениÑ, ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ модиÑикаÑии пÑогÑаммного обеÑпеÑениÑ. Ðе ÑÑÑанавливаеÑÑÑ Ð¾Ð³ÑаниÑений на запÑÑк ÐÑогÑаммÑ. УÑÐ»Ð¾Ð²Ð¸Ñ ÐиÑензии ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð° вÑÑ
однÑе даннÑе из ÐÑогÑÐ°Ð¼Ð¼Ñ ÑолÑко в Ñом ÑлÑÑае, еÑли иÑ
ÑодеÑжание ÑоÑÑавлÑÐµÑ Ð¿Ñоизведение, пÑоизводное Ð¾Ñ ÐÑогÑÐ°Ð¼Ð¼Ñ (незавиÑимо Ð¾Ñ Ñого, бÑло ли Ñакое пÑоизведение Ñоздано в ÑезÑлÑÑаÑе запÑÑка ÐÑогÑаммÑ). ÐÑо завиÑÐ¸Ñ Ð¾Ñ Ñого, какие ÑÑнкÑии вÑполнÑÐµÑ ÐÑогÑамма.
+
+1. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве изгоÑовлÑÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ Ð¸ÑÑ
одного ÑекÑÑа ÐÑогÑÐ°Ð¼Ð¼Ñ Ð² Ñом виде, в каком он его полÑÑил, без внеÑÐµÐ½Ð¸Ñ Ð² него изменений на лÑбом ноÑиÑеле, пÑи ÑоблÑдении ÑледÑÑÑиÑ
ÑÑловий: на каждом ÑкземплÑÑе помеÑен знак оÑ
ÑÐ°Ð½Ñ Ð°Ð²ÑоÑÑкого пÑава и Ñведомление об оÑÑÑÑÑÑвии гаÑанÑий; оÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð±ÐµÐ· изменений вÑе ÑведомлениÑ, оÑноÑÑÑиеÑÑ Ðº наÑÑоÑÑей ÐиÑензии и оÑÑÑÑÑÑÐ²Ð¸Ñ Ð³Ð°ÑанÑий; вмеÑÑе Ñ ÑкземплÑÑом ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¿ÑиобÑеÑаÑÐµÐ»Ñ Ð¿ÐµÑедаеÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии.
+
+ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве взимаÑÑ Ð¿Ð»Ð°ÑÑ Ð·Ð° пеÑедаÑÑ ÑкземплÑÑа ÐÑогÑаммÑ, а Ñакже впÑаве за плаÑÑ Ð¾ÐºÐ°Ð·ÑваÑÑ ÑÑлÑги по гаÑанÑийной поддеÑжке ÐÑогÑаммÑ.
+
+2. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве модиÑиÑиÑоваÑÑ Ñвой ÑкземплÑÑ Ð¸Ð»Ð¸ ÑкземплÑÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¸Ð»Ð¸ лÑбÑÑ ÐµÐµ ÑаÑÑÑ. ÐаннÑе дейÑÑÐ²Ð¸Ñ ÐиÑензиаÑа влекÑÑ Ð·Ð° Ñобой Ñоздание пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве изгоÑовлÑÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ Ñакого пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ, или ÑобÑÑвенно ÑкземплÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ÑооÑвеÑÑÑвии Ñ Ð¿ÑнкÑом 1 наÑÑоÑÑей ÐиÑензии пÑи ÑоблÑдении ÑледÑÑÑиÑ
ÑÑловий:
+
+а) ÑайлÑ, измененнÑе ÐиÑензиаÑом, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑодеÑжаÑÑ Ñ
оÑоÑо замеÑнÑÑ Ð¿Ð¾Ð¼ÐµÑкÑ, ÑÑо они бÑли измененÑ, а Ñакже даÑÑ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹;
+
+b) пÑи ÑаÑпÑоÑÑÑанении или пÑбликаÑии ÐиÑензиаÑом лÑбого пÑоизведениÑ, коÑоÑое ÑодеÑÐ¶Ð¸Ñ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ ее ÑаÑÑÑ Ð¸Ð»Ð¸ ÑвлÑеÑÑÑ Ð¿ÑоизводнÑм Ð¾Ñ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ Ð¾Ñ ÐµÐµ ÑаÑÑи, ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð¾Ð±Ñзан пеÑедаваÑÑ Ð¿Ñава на иÑполÑзование данного пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑеÑÑим лиÑам на ÑÑловиÑÑ
наÑÑоÑÑей ÐиÑензии, пÑи ÑÑом ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ впÑаве ÑÑебоваÑÑ ÑплаÑÑ ÐºÐ°ÐºÐ¸Ñ
-либо лиÑензионнÑÑ
плаÑежей. РаÑпÑоÑÑÑанÑемое пÑоизведение лиÑензиÑÑеÑÑÑ ÐºÐ°Ðº одно Ñелое;
+
+c) еÑли модиÑиÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÐÑогÑамма пÑи запÑÑке обÑÑно ÑиÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² инÑеÑакÑивном Ñежиме, ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð¾Ð±Ñзан обеÑпеÑиÑÑ Ð²Ñвод на ÑкÑан диÑÐ¿Ð»ÐµÑ Ð¸Ð»Ð¸ пеÑаÑаÑÑее ÑÑÑÑойÑÑво ÑообÑениÑ, коÑоÑое должно вклÑÑаÑÑ Ð² ÑебÑ:
+знак оÑ
ÑÐ°Ð½Ñ Ð°Ð²ÑоÑÑкого пÑава;
+Ñведомление об оÑÑÑÑÑÑвии гаÑанÑий на ÐÑогÑÐ°Ð¼Ð¼Ñ (или иное, еÑли ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð³Ð°ÑанÑии);
+Ñказание на Ñо, ÑÑо полÑзоваÑели впÑаве ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð² ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми наÑÑоÑÑей ÐиÑензии, а Ñакже на Ñо, каким обÑазом полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑÑÑ Ñ ÑекÑÑом наÑÑоÑÑей ÐиÑензии. (ÐÑклÑÑение: еÑли оÑигиналÑÐ½Ð°Ñ ÐÑогÑамма ÑвлÑеÑÑÑ Ð¸Ð½ÑеÑакÑивной, но не вÑÐ²Ð¾Ð´Ð¸Ñ Ð² Ñвоем обÑÑном Ñежиме ÑабоÑÑ ÑообÑение Ñакого Ñода, Ñо вÑвод подобного ÑообÑÐµÐ½Ð¸Ñ Ð¿Ñоизведением, пÑоизводнÑм Ð¾Ñ ÐÑогÑаммÑ, в ÑÑом ÑлÑÑае не обÑзаÑелен).
+
+ÐÑÑеÑказаннÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿ÑименÑÑÑÑÑ Ðº модиÑиÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑоизведениÑ, пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¾Ñ ÐÑогÑаммÑ, в Ñелом. Ð ÑлÑÑае еÑли оÑделÑнÑе ÑаÑÑи данного пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ ÑвлÑÑÑÑÑ Ð¿ÑоизводнÑми Ð¾Ñ ÐÑогÑаммÑ, ÑвлÑÑÑÑÑ ÑезÑлÑÑаÑом ÑвоÑÑеÑкой деÑÑелÑноÑÑи и могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº ÑамоÑÑоÑÑелÑное пÑоизведение, ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве ÑаÑпÑоÑÑÑанÑÑÑ Ð¾ÑделÑно Ñакое пÑоизведение на инÑÑ
лиÑензионнÑÑ
ÑÑловиÑÑ
. Ð ÑлÑÑае еÑли ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ ÑаÑпÑоÑÑÑанÑÐµÑ Ð²ÑÑеÑказаннÑе ÑаÑÑи в ÑоÑÑаве пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ, Ñо ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии пÑименÑÑÑÑÑ Ðº пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ñелом, пÑи ÑÑом пÑава, пÑиобÑеÑаемÑе ÑÑблиÑензиаÑами на оÑновании ÐиÑензии, пеÑедаÑÑÑÑ Ð¸Ð¼ в оÑноÑении вÑего пÑоизведениÑ, вклÑÑÐ°Ñ Ð²Ñе его ÑаÑÑи, незавиÑимо Ð¾Ñ Ñого, кÑо ÑвлÑеÑÑÑ Ð¸Ñ
авÑоÑами.
+
+ЦелÑÑ Ð½Ð°ÑÑоÑÑего пÑнкÑа 2 не ÑвлÑеÑÑÑ Ð·Ð°Ñвление пÑав или оÑпаÑивание пÑав на пÑоизведение, Ñозданное иÑклÑÑиÑелÑно ÐиÑензиаÑом. ЦелÑÑ Ð½Ð°ÑÑоÑÑего пÑнкÑа ÑвлÑеÑÑÑ Ð¾Ð±ÐµÑпеÑение пÑава конÑÑолиÑоваÑÑ ÑаÑпÑоÑÑÑанение пÑоизведений, пÑоизводнÑÑ
Ð¾Ñ ÐÑогÑаммÑ, и ÑоÑÑавнÑÑ
пÑоизведений, пÑоизводнÑÑ
Ð¾Ñ ÐÑогÑаммÑ.
+
+РазмеÑение пÑоизведениÑ, коÑоÑое не ÑвлÑеÑÑÑ Ð¿ÑоизводнÑм Ð¾Ñ ÐÑогÑаммÑ, на одном ÑÑÑÑойÑÑве Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии или ноÑиÑеле вмеÑÑе Ñ ÐÑогÑаммой или пÑоизведением, пÑоизводнÑм Ð¾Ñ ÐÑогÑаммÑ, не влеÑÐµÑ Ð·Ð° Ñобой ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑÑловий наÑÑоÑÑей ÐиÑензии на Ñакое пÑоизведение.
+
+3. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве воÑпÑоизводиÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑоизведениÑ, коÑоÑое ÑвлÑеÑÑÑ Ð¿ÑоизводнÑм Ð¾Ñ ÐÑогÑаммÑ, в ÑооÑвеÑÑÑвии Ñ Ð¿ÑнкÑом 2 наÑÑоÑÑей ÐиÑензии, в виде обÑекÑного кода или в иÑполнÑемой ÑоÑме в ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми п.п.1 и 2 наÑÑоÑÑей ÐиÑензии пÑи ÑоблÑдении одного из пеÑеÑиÑленнÑÑ
ниже ÑÑловий:
+
+а) к ÑкземплÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑилагаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий полнÑй иÑÑ
однÑй ÑекÑÑ Ð² маÑиноÑиÑаемой ÑоÑме, коÑоÑÑй должен ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми п.п. 1 и 2 наÑÑоÑÑей ÐиÑензии на ноÑиÑеле, обÑÑно иÑполÑзÑемом Ð´Ð»Ñ Ð¿ÐµÑедаÑи пÑогÑаммного обеÑпеÑениÑ, либо
+
+b) к ÑкземплÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ пÑилагаÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑное в ÑеÑение ÑÑеÑ
Ð»ÐµÑ Ð¿Ñедложение в пиÑÑменной ÑоÑме к лÑÐ±Ð¾Ð¼Ñ ÑÑеÑÑÐµÐ¼Ñ Ð»Ð¸ÑÑ Ð¿ÐµÑедаÑÑ Ð·Ð° плаÑÑ, не пÑевÑÑаÑÑÑÑ ÑÑоимоÑÑÑ Ð¾ÑÑÑеÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑобÑÑвенно пеÑедаÑи, ÑкземплÑÑ ÑооÑвеÑÑÑвÑÑÑего полного иÑÑ
одного ÑекÑÑа в маÑиноÑиÑаемой ÑоÑме в ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми п.п. 1 и 2 наÑÑоÑÑей ÐиÑензии на ноÑиÑеле, обÑÑно иÑполÑзÑемом Ð´Ð»Ñ Ð¿ÐµÑедаÑи пÑогÑаммного обеÑпеÑениÑ, либо
+
+c) к ÑкземплÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑилагаÑÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð½Ð°Ñ ÐиÑензиаÑом инÑоÑмаÑÐ¸Ñ Ð¾ пÑедложении, в ÑооÑвеÑÑÑвии Ñ ÐºÐ¾ÑоÑÑм можно полÑÑиÑÑ ÑооÑвеÑÑÑвÑÑÑий иÑÑ
однÑй ÑекÑÑ. (Ðанное положение пÑименÑеÑÑÑ Ð¸ÑклÑÑиÑелÑно в Ñом ÑлÑÑае, еÑли ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð¾ÑÑÑеÑÑвлÑÐµÑ Ð½ÐµÐºÐ¾Ð¼Ð¼ÐµÑÑеÑкое ÑаÑпÑоÑÑÑанение пÑогÑаммÑ, пÑи ÑÑом пÑогÑамма бÑла полÑÑена Ñамим ÐиÑензиаÑом в виде обÑекÑного кода или в иÑполнÑемой ÑоÑме и ÑопÑовождалаÑÑ Ð¿Ñедложением, ÑооÑвеÑÑÑвÑÑÑим ÑÑловиÑм пп.b п.3 наÑÑоÑÑей ÐиÑензии).
+
+Ðод иÑÑ
однÑм ÑекÑÑом пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑÑÑ ÑÐ°ÐºÐ°Ñ ÑоÑма пÑоизведениÑ, коÑоÑÐ°Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ Ñдобна Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. Ðод полнÑм иÑÑ
однÑм ÑекÑÑом иÑполнÑемого пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑÑÑ Ð¸ÑÑ
однÑй ÑекÑÑ Ð²ÑеÑ
ÑоÑÑавлÑÑÑиÑ
пÑоизведение модÑлей, а Ñакже вÑеÑ
Ñайлов, ÑвÑзаннÑÑ
Ñ Ð¾Ð¿Ð¸Ñанием инÑеÑÑейÑа, и ÑÑенаÑиев, пÑедназнаÑеннÑÑ
Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑией и ÑÑÑановкой иÑполнÑемого пÑоизведениÑ. Ðднако, в каÑеÑÑве оÑобого иÑклÑÑениÑ, ÑаÑпÑоÑÑÑанÑемÑй иÑÑ
однÑй ÑекÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ вклÑÑаÑÑ Ñого, ÑÑо обÑÑно ÑаÑпÑоÑÑÑанÑеÑÑÑ (в виде иÑÑ
одного ÑекÑÑа или в бинаÑной ÑоÑме) Ñ Ð¾ÑновнÑми компоненÑами (компилÑÑоÑ, ÑдÑо и Ñ.д.) опеÑаÑионной ÑиÑÑемÑ, в коÑоÑой ÑабоÑÐ°ÐµÑ Ð¸ÑполнÑемое пÑоизведение, за иÑклÑÑением ÑлÑÑаев, когда иÑполнÑемое пÑоизведение ÑопÑовождаеÑÑÑ Ñаким компоненÑом.
+
+Ð ÑлÑÑае еÑли пÑоизведение в виде обÑекÑного кода или в иÑполнÑемой ÑоÑме ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¿ÑÑем пÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ из опÑеделенного меÑÑа, обеÑпеÑение ÑавноÑенного доÑÑÑпа Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑÑ
одного ÑекÑÑа из ÑÑого же меÑÑа ÑдовлеÑвоÑÑÐµÑ ÑÑебованиÑм ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ÑÑ
одного ÑекÑÑа, даже еÑли ÑÑеÑÑи лиÑа пÑи ÑÑом не обÑÐ·Ð°Ð½Ñ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð¸ÑÑ
однÑй ÑекÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð¾Ð±ÑекÑнÑм кодом пÑоизведениÑ.
+
+4. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве воÑпÑоизводиÑÑ, модиÑиÑиÑоваÑÑ, ÑаÑпÑоÑÑÑанÑÑÑ Ð¸Ð»Ð¸ пеÑедаваÑÑ Ð¿Ñава на иÑполÑзование ÐÑогÑÐ°Ð¼Ð¼Ñ ÑолÑко на ÑÑловиÑÑ
наÑÑоÑÑей ÐиÑензии. ÐÑбое воÑпÑоизведение, модиÑикаÑиÑ, ÑаÑпÑоÑÑÑанение или пеÑедаÑа пÑав на инÑÑ
ÑÑловиÑÑ
ÑвлÑÑÑÑÑ Ð½ÐµÐ´ÐµÐ¹ÑÑвиÑелÑнÑми и авÑомаÑиÑеÑки ведÑÑ Ðº ÑаÑÑоÑÐ¶ÐµÐ½Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии и пÑекÑаÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
пÑав ÐиÑензиаÑа, пÑедоÑÑавленнÑÑ
ÐµÐ¼Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензией. ÐÑи ÑÑом пÑава ÑÑеÑÑиÑ
лиÑ, коÑоÑÑм ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð² ÑооÑвеÑÑÑвии Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензией пеÑедал ÑкземплÑÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑава на нее, ÑоÑ
ÑанÑÑÑÑÑ Ð² Ñиле пÑи ÑÑловии полного ÑоблÑÐ´ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸ наÑÑоÑÑей ÐиÑензии.
+
+5. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ обÑзан пÑиÑоединÑÑÑÑÑ Ðº наÑÑоÑÑей ÐиÑензии, поÑколÑÐºÑ Ð¾Ð½ ее не подпиÑал. Ðднако ÑолÑко наÑÑоÑÑÐ°Ñ ÐиÑÐµÐ½Ð·Ð¸Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð¿Ñаво ÑаÑпÑоÑÑÑанÑÑÑ Ð¸Ð»Ð¸ модиÑиÑиÑоваÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑоизведение, пÑоизводное Ð¾Ñ ÐÑогÑаммÑ. ÐодобнÑе дейÑÑÐ²Ð¸Ñ Ð½Ð°ÑÑÑаÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑее законодаÑелÑÑÑво, еÑли они не оÑÑÑеÑÑвлÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензией. ÐÑли ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð½ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ оÑÑÑеÑÑвил ÑаÑпÑоÑÑÑанение ÑкземплÑÑов ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ, ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ñем ÑамÑм подÑвеÑдил Ñвое пÑиÑоединение к наÑÑоÑÑей ÐиÑензии в Ñелом, вклÑÑÐ°Ñ ÑÑловиÑ, опÑеделÑÑÑие поÑÑдок воÑпÑоизведениÑ, ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ модиÑикаÑии ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ.
+
+6. ÐÑи ÑаÑпÑоÑÑÑанении ÑкземплÑÑов ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ пÑоизведениÑ, пÑоизводного Ð¾Ñ ÐÑогÑаммÑ, пеÑвонаÑалÑнÑй лиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð°Ð²ÑомаÑиÑеÑки пеÑÐµÐ´Ð°ÐµÑ Ð¿ÑиобÑеÑаÑÐµÐ»Ñ Ñакого ÑкземплÑÑа пÑаво воÑпÑоизводиÑÑ, ÑаÑпÑоÑÑÑанÑÑÑ Ð¸ модиÑиÑиÑоваÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð² ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми наÑÑоÑÑей ÐиÑензии. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ впÑаве огÑаниÑиваÑÑ ÐºÐ°ÐºÐ¸Ð¼-либо ÑпоÑобом оÑÑÑеÑÑвление пÑиобÑеÑаÑелÑми полÑÑеннÑÑ
ими пÑав. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ неÑÐµÑ Ð¾ÑвеÑÑÑвенноÑÑи за неÑоблÑдение ÑÑловий наÑÑоÑÑей ÐиÑензии ÑÑеÑÑими лиÑами.
+
+7. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ оÑвобождаеÑÑÑ Ð¾Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑзаÑелÑÑÑв в ÑооÑвеÑÑÑвии Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензией в ÑлÑÑае, еÑли в ÑезÑлÑÑаÑе ÑеÑÐµÐ½Ð¸Ñ ÑÑда или заÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾ наÑÑÑении иÑклÑÑиÑелÑнÑÑ
пÑав или в ÑвÑзи Ñ Ð½Ð°ÑÑÑплением инÑÑ
обÑÑоÑÑелÑÑÑв, не ÑвÑзаннÑÑ
непоÑÑедÑÑвенно Ñ Ð½Ð°ÑÑÑением иÑклÑÑиÑелÑнÑÑ
пÑав, на ÐиÑензиаÑа на оÑновании ÑеÑÐµÐ½Ð¸Ñ ÑÑда, договоÑа или ином оÑновании Ð²Ð¾Ð·Ð»Ð¾Ð¶ÐµÐ½Ñ Ð¾Ð±ÑзаÑелÑÑÑва, коÑоÑÑе пÑоÑивоÑеÑÐ°Ñ ÑÑловиÑм наÑÑоÑÑей ÐиÑензии. Ð ÑÑом ÑлÑÑае ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ впÑаве ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ ÐÑогÑаммÑ, еÑли он не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно иÑполниÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии и возложеннÑе на него ÑказаннÑм вÑÑе ÑпоÑобом обÑзаÑелÑÑÑва. ÐапÑимеÑ, еÑли по ÑÑловиÑм лиÑензионного ÑоглаÑÐµÐ½Ð¸Ñ ÑÑблиÑензиаÑам не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедоÑÑавлено пÑаво беÑплаÑного ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑкземплÑÑов ÐÑогÑаммÑ, коÑоÑÑе они пÑиобÑели напÑÑмÑÑ Ð¸Ð»Ð¸ ÑеÑез ÑÑеÑÑиÑ
Ð»Ð¸Ñ Ñ ÐиÑензиаÑа, Ñо в ÑÑом ÑлÑÑае ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð¾Ð±Ñзан оÑказаÑÑÑÑ Ð¾Ñ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑкземплÑÑов ÐÑогÑаммÑ.
+
+ÐÑли лÑбое положение наÑÑоÑÑего пÑнкÑа пÑи наÑÑÑплении конкÑеÑнÑÑ
обÑÑоÑÑелÑÑÑв бÑÐ´ÐµÑ Ð¿Ñизнано недейÑÑвиÑелÑнÑм или непÑименимÑм, наÑÑоÑÑий пÑÐ½ÐºÑ Ð¿ÑименÑеÑÑÑ Ð·Ð° иÑклÑÑением Ñакого положениÑ. ÐаÑÑоÑÑий пÑÐ½ÐºÑ Ð¿ÑименÑеÑÑÑ Ð² Ñелом пÑи пÑекÑаÑении вÑÑеÑказаннÑÑ
обÑÑоÑÑелÑÑÑв или иÑ
оÑÑÑÑÑÑвии.
+
+ЦелÑÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ пÑнкÑа не ÑвлÑеÑÑÑ Ð¿ÑинÑждение ÐиÑензиаÑа к наÑÑÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑенÑа или заÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° инÑе пÑава ÑобÑÑвенноÑÑи или к оÑпаÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑи Ñакого заÑвлениÑ. ÐдинÑÑвенной ÑелÑÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ пÑнкÑа ÑвлÑеÑÑÑ Ð·Ð°ÑиÑа непÑикоÑновенноÑÑи ÑиÑÑÐµÐ¼Ñ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñвободного пÑогÑаммного обеÑпеÑениÑ, коÑоÑÐ°Ñ Ð¾Ð±ÐµÑпеÑиваеÑÑÑ Ð·Ð° ÑÑÐµÑ Ð¾Ð±ÑеÑÑвенного лиÑензиÑованиÑ. Ðногие лÑди внеÑли Ñвой ÑедÑÑй вклад в Ñоздание болÑÑого колиÑеÑÑва пÑогÑаммного обеÑпеÑениÑ, коÑоÑое ÑаÑпÑоÑÑÑанÑеÑÑÑ ÑеÑез даннÑÑ ÑиÑÑÐµÐ¼Ñ Ð² надежде на ее длиÑелÑное и поÑледоваÑелÑное пÑименение. ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ðµ впÑаве вÑнÑждаÑÑ Ð°Ð²ÑоÑа ÑаÑпÑоÑÑÑанÑÑÑ Ð¿ÑогÑаммное обеÑпеÑение ÑеÑез даннÑÑ ÑиÑÑемÑ. ÐÑаво вÑбоÑа ÑиÑÑÐµÐ¼Ñ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð¸ÑклÑÑиÑелÑно его авÑоÑÑ.
+
+ÐаÑÑоÑÑий пÑÐ½ÐºÑ 7 Ð¸Ð¼ÐµÐµÑ ÑелÑÑ ÑеÑко опÑеделиÑÑ Ñе Ñели, коÑоÑÑе пÑеÑледÑÑÑ Ð²Ñе оÑÑалÑнÑе Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°ÑÑоÑÑей ÐиÑензии.
+
+8. Ð Ñом ÑлÑÑае еÑли ÑаÑпÑоÑÑÑанение и/или иÑполÑзование ÐÑогÑÐ°Ð¼Ð¼Ñ Ð² оÑделÑнÑÑ
гоÑÑдаÑÑÑваÑ
огÑаниÑено ÑоглаÑениÑми в облаÑÑи паÑенÑнÑÑ
или авÑоÑÑкиÑ
пÑав, пеÑвонаÑалÑнÑй пÑавообладаÑелÑ, ÑаÑпÑоÑÑÑанÑÑÑий ÐÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° ÑÑловиÑÑ
наÑÑоÑÑей ÐиÑензии, впÑаве огÑаниÑиÑÑ ÑеÑÑиÑоÑÐ¸Ñ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÐÑогÑаммÑ, Ñказав ÑолÑко Ñе гоÑÑдаÑÑÑва, на ÑеÑÑиÑоÑии коÑоÑÑÑ
допÑÑкаеÑÑÑ ÑаÑпÑоÑÑÑанение ÐÑогÑÐ°Ð¼Ð¼Ñ Ð±ÐµÐ· огÑаниÑений, обÑÑловленнÑÑ
Ñакими ÑоглаÑениÑми. Ð ÑÑом ÑлÑÑае Ñакое Ñказание в оÑноÑении ÑеÑÑиÑоÑий опÑеделеннÑÑ
гоÑÑдаÑÑÑв пÑизнаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ÑÑловий наÑÑоÑÑей ÐиÑензии.
+
+9. Free Software Foundation Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑбликоваÑÑ Ð¸ÑпÑавленнÑе и/или новÑе веÑÑии наÑÑоÑÑей СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии. Такие веÑÑии могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ ÑазлиÑнÑми ноÑмами, ÑегÑлиÑÑÑÑими пÑавооÑноÑениÑ, коÑоÑÑе возникли поÑле опÑÐ±Ð»Ð¸ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑедÑдÑÑиÑ
веÑÑий, однако в ниÑ
бÑдÑÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ñ Ð¾ÑновнÑе пÑинÑипÑ, закÑепленнÑе в наÑÑоÑÑей веÑÑии.
+
+Ðаждой веÑÑии пÑиÑваиваеÑÑÑ Ñвой ÑобÑÑвеннÑй номеÑ. ÐÑли Ñказано, ÑÑо ÐÑогÑамма ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ Ð¾Ð¿Ñеделенной веÑÑией, Ñ.е. Ñказан ее номеÑ, или лÑбой более поздней веÑÑией наÑÑоÑÑей ÐиÑензии, ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве пÑиÑоединиÑÑÑÑ Ðº лÑбой из ÑÑиÑ
веÑÑий ÐиÑензии, опÑбликованнÑÑ
Free Software Foundation. ÐÑли ÐÑогÑамма не ÑодеÑÐ¶Ð¸Ñ Ñакого ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии ÐиÑензии ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð²Ð¿Ñаве пÑиÑоединиÑÑÑÑ Ðº лÑбой из веÑÑий ÐиÑензии, опÑбликованнÑÑ
когда-либо Free Software Foundation.
+
+10. Ð ÑлÑÑае еÑли ÐиÑÐµÐ½Ð·Ð¸Ð°Ñ Ð½Ð°Ð¼ÐµÑен вклÑÑиÑÑ ÑаÑÑÑ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð² дÑÑгое Ñвободное пÑогÑаммное обеÑпеÑение, коÑоÑое ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° инÑÑ
ÑÑловиÑÑ
, Ñем в наÑÑоÑÑей ÐиÑензии, ÐµÐ¼Ñ ÑледÑÐµÑ Ð¸ÑпÑоÑиÑÑ Ð¿Ð¸ÑÑменное ÑазÑеÑение на ÑÑо Ñ Ð°Ð²ÑоÑа пÑогÑаммного обеÑпеÑениÑ. РазÑеÑение в оÑноÑении пÑогÑаммного обеÑпеÑениÑ, пÑава на коÑоÑое пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Free Software Foundation, ÑледÑÐµÑ Ð¸ÑпÑаÑиваÑÑ Ñ Free Software Foundation. РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
Free Software Foundation Ð´ÐµÐ»Ð°ÐµÑ Ð¸ÑклÑÑениÑ. ÐÑи пÑинÑÑии ÑеÑÐµÐ½Ð¸Ñ Free Software Foundation бÑÐ´ÐµÑ ÑÑководÑÑвоваÑÑÑÑ Ð´Ð²ÑÐ¼Ñ ÑелÑми: ÑоÑ
Ñанение ÑÑаÑÑÑа Ñвободного Ð´Ð»Ñ Ð»Ñбого пÑоизведениÑ, пÑоизводного Ð¾Ñ Ñвободного пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Free Software Foundation и обеÑпеÑение наиболее ÑиÑокого ÑовмеÑÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑогÑаммного обеÑпеÑениÑ.
+
+ÐТСУТСТÐÐÐ ÐÐÐ ÐÐТÐÐÐЫХ ÐÐЯÐÐТÐÐЬСТÐ
+
+11. ÐÐСÐÐÐЬÐУ ÐÐСТÐЯЩÐЯ ÐÐ ÐÐÐ ÐÐÐÐ Ð ÐСÐÐ ÐСТРÐÐЯÐТСЯ ÐÐСÐÐÐТÐÐ, ÐÐÐ ÐÐТÐÐ ÐÐ ÐÐÐ ÐÐ ÐÐ ÐÐÐСТÐÐÐЯЮТСЯ РТÐРСТÐÐÐÐÐ, Ð ÐÐÐÐÐ ÐТРÐÐÐУСÐÐÐТСЯ ÐÐ ÐÐÐÐÐÐЫРÐÐ ÐÐÐÐ. ÐÐСТÐЯЩÐЯ ÐÐ ÐÐÐ ÐÐÐÐ ÐÐСТÐÐÐЯÐТСЯ ÐРУСÐÐÐÐЯХ "ÐÐÐ ÐСТЬ". ÐСÐÐ ÐÐÐÐ ÐРУÐÐÐÐÐÐ Ð ÐÐСЬÐÐÐÐÐРФÐÐ ÐÐ, ÐÐТÐÐ Ð/ÐÐÐ ÐÐÐÐ ÐÐ ÐÐÐÐÐÐÐÐÐТÐÐЬ ÐÐ ÐÐ ÐÐÐÐÐÐТ ÐРСÐÐЯ ÐÐÐÐÐÐÐ¥ ÐÐÐ ÐÐТÐÐÐЫХ ÐÐЯÐÐТÐÐЬСТÐ, ÐÐРЯÐÐÐ ÐЫРÐÐÐÐÐЫХ, ТÐÐ Ð ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫХ, Ð ÐТÐÐШÐÐÐÐ ÐÐ ÐÐÐ ÐÐÐЫ, РТÐРЧÐСÐÐ ÐÐÐÐ ÐÐУÐÐÐÐÐÐУЮ ÐÐÐ ÐÐТÐЮ ТÐÐÐÐ ÐÐÐРСÐСТÐЯÐÐЯ ÐÐ Ð ÐÐ ÐÐÐÐÐ Ð ÐÐ ÐÐÐÐÐÐСТРÐÐЯ ÐСÐÐÐЬÐÐÐÐÐÐЯ Ð ÐÐÐÐÐ ÐТÐЫХ ЦÐÐЯХ, РТÐÐÐÐ ÐЮÐЫРÐÐЫРÐÐÐ ÐÐТÐÐ. ÐСРРÐСÐÐ, СÐЯÐÐÐÐЫРС ÐÐЧÐСТÐÐÐ Ð ÐÐ ÐÐÐÐÐÐÐТÐÐЬÐÐСТЬЮ ÐÐ ÐÐÐ ÐÐÐЫ, ÐÐСÐТ ÐÐЦÐÐÐÐÐТ. РСÐУЧÐÐ ÐСÐÐ Ð ÐÐ ÐÐÐ ÐÐÐÐ ÐУÐУТ ÐÐÐÐРУÐÐÐЫ ÐÐÐÐСТÐТÐÐ, ÐСРРÐСХÐÐЫ, СÐЯÐÐÐÐЫРС ТÐÐ¥ÐÐЧÐСÐÐÐ ÐÐСÐУÐÐÐÐÐÐÐÐ, Ð ÐÐÐÐТÐÐ ÐÐÐ ÐСÐÐ ÐÐÐÐÐÐÐÐ ÐÐ ÐÐÐ ÐÐÐЫ, ÐÐСÐТ ÐÐЦÐÐÐÐÐТ.
+
+12. ÐСÐÐ ÐÐÐÐ ÐÐ ÐÐ ÐÐУСÐÐТРÐÐÐ ÐÐ ÐÐÐÐЯÐÐЫРÐÐ ÐÐÐÐ ÐÐÐ ÐРСÐÐÐÐСÐÐÐÐРСТÐÐ ÐÐÐÐÐ Ð ÐÐÐÐÐÐÐ Ð Ð ÐÐСЬÐÐÐÐÐРФÐÐ ÐÐ, ÐÐТÐÐ Ð/ÐÐÐ ÐÐÐÐ ÐÐ ÐÐÐÐÐÐÐÐÐТÐÐЬ, ÐÐТÐРЫРÐÐÐÐФÐЦÐРУÐТ Ð/ÐÐÐ Ð ÐСÐÐ ÐСТРÐÐЯÐТ ÐÐ ÐÐÐ ÐÐÐУ ÐРУСÐÐÐÐЯХ ÐÐСТÐЯЩÐÐ ÐÐЦÐÐÐÐÐ, ÐÐ ÐÐСÐТ ÐТÐÐТСТÐÐÐÐÐСТРÐÐÐ ÐÐ ÐÐЦÐÐÐÐÐТÐÐ ÐРУÐЫТÐÐ, ÐÐÐЮЧÐЯ ÐÐЩÐÐ, Ð ÐÐÐЬÐЫÐ, ÐÐ ÐÐÐÐÐÐÐЫРРÐÐСÐÐÐÐЫРУÐЫТÐÐ (РТÐРЧÐСÐРУТРÐТУ ÐÐÐ ÐСÐÐÐÐÐÐÐ ÐÐФÐÐ ÐÐЦÐÐ, УÐЫТÐÐ, ÐÐÐÐСÐÐÐЫРÐÐЦÐÐÐÐÐТÐÐ ÐÐРТРÐТЬÐÐÐ ÐÐЦÐÐÐ, ÐÐÐÐÐÐÐÐÐÐСТЬ Ð ÐÐÐТЫ ÐÐ ÐÐÐ ÐÐÐЫ С ÐЮÐÐÐ ÐРУÐÐÐ ÐÐ ÐÐÐ ÐÐÐÐÐ Ð ÐÐЫРУÐЫТÐÐ). ÐÐТÐÐ Ð/ÐÐÐ ÐÐÐÐ ÐÐ ÐÐÐÐÐÐÐÐÐТÐÐЬ РСÐÐТÐÐТСТÐÐРС ÐÐСТÐЯЩÐÐ ÐУÐÐТÐÐ ÐÐ ÐÐСУТ ÐТÐÐТСТÐÐÐÐÐСТРÐÐÐРРТÐРСÐУЧÐÐ, ÐСÐÐ ÐÐÐ ÐЫÐÐ ÐÐ ÐÐУÐÐ ÐÐÐÐÐЫ Ð ÐÐÐÐÐÐÐÐСТРÐÐÐÐÐÐÐÐÐÐÐÐЯ ТÐÐÐÐ¥ УÐЫТÐÐÐ.
+ÐоÑÑдок пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑловий СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии к Ñозданной вами пÑогÑамме
+
+ÐÑли Ð²Ñ Ñоздали новÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð¸ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° пÑинеÑла наиболÑÑÑÑ Ð¿Ð¾Ð»ÑÐ·Ñ Ð¾Ð±ÑеÑÑвÑ, лÑÑÑий ÑпоÑоб доÑÑиÑÑ ÑÑого - ÑделаÑÑ Ð²Ð°ÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ñвободной, когда каждÑй ÑÐ¼Ð¾Ð¶ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑ ÐµÐµ и вноÑиÑÑ Ð² нее Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми наÑÑоÑÑей ÐиÑензии.
+
+Ð ÑÑиÑ
ÑелÑÑ
ÐÑогÑамма должна ÑодеÑжаÑÑ Ð¿Ñиведенное ниже Ñведомление. Ðаиболее пÑавилÑнÑм бÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑÑиÑÑ ÐµÐ³Ð¾ в наÑале иÑÑ
одного ÑекÑÑа каждого Ñайла Ð´Ð»Ñ Ð¼Ð°ÐºÑималÑно ÑÑного ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° Ñо, ÑÑо гаÑанÑии на даннÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð½Ðµ пÑедоÑÑавлÑÑÑÑÑ. ÐаждÑй Ñайл в лÑбом ÑлÑÑае должен ÑодеÑжаÑÑ Ð·Ð½Ð°Ðº оÑ
ÑÐ°Ð½Ñ Ð°Ð²ÑоÑÑкого пÑава и поÑÑнение, где можно ознакомиÑÑÑÑ Ñ Ð¿Ð¾Ð»Ð½Ñм ÑекÑÑом ÑведомлениÑ.
+
+[одна ÑÑÑока Ñ Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ ÐÑогÑÐ°Ð¼Ð¼Ñ Ð¸ кÑаÑким опиÑанием ее назнаÑениÑ]
+© Ð¸Ð¼Ñ (наименование) авÑоÑа или иного пÑавообладаÑелÑ, год пеÑвого опÑÐ±Ð»Ð¸ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑогÑаммÑ
+
+ÐÐ°Ð½Ð½Ð°Ñ Ð¿ÑогÑамма ÑвлÑеÑÑÑ ÑвободнÑм пÑогÑаммнÑм обеÑпеÑением. ÐÑ Ð²Ð¿Ñаве ÑаÑпÑоÑÑÑанÑÑÑ ÐµÐµ и/или модиÑиÑиÑоваÑÑ Ð² ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми веÑÑии 2 либо по ваÑÐµÐ¼Ñ Ð²ÑбоÑÑ Ñ ÑÑловиÑми более поздней веÑÑии СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU, опÑбликованной Free Software Foundation.
+
+ÐÑ ÑаÑпÑоÑÑÑанÑем даннÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² надежде на Ñо, ÑÑо она бÑÐ´ÐµÑ Ð²Ð°Ð¼ полезной, однако ÐÐ ÐÐ ÐÐÐСТÐÐÐЯÐÐ ÐÐ ÐÐÐ ÐÐÐÐÐÐÐ¥ ÐÐÐ ÐÐТÐÐ, в Ñом ÑиÑле ÐÐÐ ÐÐТÐРТÐÐÐÐ ÐÐÐРСÐСТÐЯÐÐЯ ÐÐ Ð ÐÐ ÐÐÐÐРи ÐÐ ÐÐÐÐÐÐСТРÐÐЯ ÐСÐÐÐЬÐÐÐÐÐÐЯ Ð ÐÐÐÐÐ ÐТÐЫХ ЦÐÐЯХ. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подÑобной инÑоÑмаÑии ознакомÑÑеÑÑ Ñо СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензией GNU.
+
+ÐмеÑÑе Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ пÑогÑаммой Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли полÑÑиÑÑ ÑкземплÑÑ Ð¡ÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU. ÐÑли Ð²Ñ ÐµÐ³Ð¾ не полÑÑили, ÑообÑиÑе об ÑÑом в Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Также ÑкажиÑе, как можно ÑвÑзаÑÑÑÑ Ñ Ð²Ð°Ð¼Ð¸ по ÑлекÑÑонной или обÑÑной поÑÑе.
+
+ÐÑли пÑогÑамма ÑабоÑÐ°ÐµÑ Ð² инÑеÑакÑивном Ñежиме, ÑделайÑе Ñак, ÑÑÐ¾Ð±Ñ Ð¿Ñи запÑÑке в инÑеÑакÑивном Ñежиме вÑводилоÑÑ ÐºÐ¾ÑоÑкое ÑообÑение в ÑооÑвеÑÑÑвии Ñ Ð¾Ð±ÑазÑом:
+
+Gnomovision version 69, © Ð¸Ð¼Ñ Ð°Ð²ÑоÑа, год пеÑвого опÑÐ±Ð»Ð¸ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑогÑаммÑ
+Gnomovision ÑаÑпÑоÑÑÑанÑеÑÑÑ ÐÐÐ ÐСЯÐÐÐ¥ ÐÐÐ ÐÐТÐÐ; ÑÑÐ¾Ð±Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑÑÑ Ñ Ð±Ð¾Ð»ÐµÐµ подÑобной инÑоÑмаÑией, набеÑиÑе "show w". ÐÐ°Ð½Ð½Ð°Ñ Ð¿ÑогÑамма ÑвлÑеÑÑÑ ÑвободнÑм пÑогÑаммнÑм обеÑпеÑением и Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑаÑпÑоÑÑÑанÑÑÑ ÐµÐµ в ÑооÑвеÑÑÑвии Ñ ÑÑловиÑми СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подÑобной инÑоÑмаÑии, набеÑиÑе "show c".
+
+ÐÑи введении пÑедлагаемÑÑ
команд "show w" и "show c" на ÑкÑан Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑводиÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑие пÑнкÑÑ Ð¡ÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии. Ðе обÑзаÑелÑно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "show w" и "show c". РзавиÑимоÑÑи Ð¾Ñ ÑÑнкÑий пÑогÑаммÑ, ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑÑÑ Ð½Ð°Ð¶Ð°Ñием кнопки мÑÑи или бÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð² Ð¼ÐµÐ½Ñ Ð¿ÑогÑаммÑ.
+
+ÐÑли Ð²Ñ Ñоздали пÑогÑÐ°Ð¼Ð¼Ñ Ð² поÑÑдке вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑлÑжебнÑÑ
обÑзанноÑÑей или ÑлÑжебного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÑабоÑодаÑÐµÐ»Ñ Ð»Ð¸Ð±Ð¾ Ð´Ð»Ñ Ð¾Ð±ÑазоваÑелÑного ÑÑÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ (ÑколÑ, ÐУÐа и Ñ.д.) в пеÑиод обÑÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑабоÑÑ Ð² данном обÑазоваÑелÑном ÑÑÑеждении, вам ÑледÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð² ÑлÑÑае необÑ
одимоÑÑи пиÑÑменнÑй оÑказ Ð¾Ñ Ð¸ÑклÑÑиÑелÑнÑÑ
пÑав на иÑполÑзование данной пÑогÑÐ°Ð¼Ð¼Ñ [3 ]. ÐижепÑиведеннÑй ÑекÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð² каÑеÑÑве обÑазÑа, заменив ÑооÑвеÑÑÑвÑÑÑие имена и наименованиÑ:
+
+ÐÐÐ "ÐÐÐ" наÑÑоÑÑим оÑказÑваеÑÑÑ Ð¾Ñ Ð²ÑеÑ
иÑклÑÑиÑелÑнÑÑ
пÑав на иÑполÑзование пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ "Gnomovision", авÑоÑом коÑоÑой ÑвлÑеÑÑÑ Ðванов ÐлекÑей ÐеÑÑовиÑ, и пеÑÐµÐ´Ð°ÐµÑ Ð²Ñе иÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование Ñказанной пÑогÑÐ°Ð¼Ð¼Ñ ÐµÐµ авÑоÑÑ, ÐÐ²Ð°Ð½Ð¾Ð²Ñ ÐлекÑÐµÑ ÐеÑÑовиÑÑ.
+
+ÐодпиÑÑ ÑÑководиÑÐµÐ»Ñ Ð¾ÑганизаÑии, пеÑаÑÑ, 1 ÑнваÑÑ 2001г.
+[ФамилиÑ, ÐмÑ, ÐÑÑеÑÑво], ÐенеÑалÑнÑй диÑекÑоÑ
+
+СÑандаÑÑÐ½Ð°Ñ ÐбÑеÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÐиÑÐµÐ½Ð·Ð¸Ñ GNU запÑеÑÐ°ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð²Ð°ÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² пÑогÑаммÑ, иÑполÑзование коÑоÑÑÑ
огÑаниÑено иÑ
пÑавообладаÑелÑми. ÐÑли ваÑа пÑогÑамма ÑвлÑеÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой подпÑогÑамм, веÑоÑÑно, более полезнÑм бÑÐ´ÐµÑ ÑазÑеÑиÑÑ ÑвÑзÑвание пÑогÑамм, иÑполÑзование коÑоÑÑÑ
огÑаниÑено иÑ
пÑавообладаÑелÑми, Ñ Ð²Ð°Ñей библиоÑекой. Ð ÑÑом ÑлÑÑае вам ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¡ÑандаÑÑнÑÑ ÐбÑеÑÑвеннÑÑ ÐиÑÐµÐ½Ð·Ð¸Ñ GNU Ð´Ð»Ñ ÐиблиоÑек вмеÑÑо наÑÑоÑÑей ÐиÑензии.
+
+ÐÑимеÑÐ°Ð½Ð¸Ñ Ð¿ÐµÑеводÑика
+
+[1] - в паÑагÑаÑе 7 ÐÑеамбÑÐ»Ñ Ð² английÑком ÑекÑÑе СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU ÑпоминаеÑÑÑ Ð¿Ð°ÑÐµÐ½Ñ Ð½Ð° пÑогÑаммное обеÑпеÑение (Software Patents). РнаÑале 90Ñ
годов XX века ÐпеллÑÑионнÑй ÑÑд ФедеÑалÑного окÑÑга СШРпÑедпÑинÑл попÑÑÐºÑ ÑÑÑановиÑÑ, когда изобÑеÑение, ÑаÑÑÑÑ ÐºÐ¾ÑоÑого ÑвлÑеÑÑÑ Ð¿ÑогÑаммное обеÑпеÑение, ÑвлÑеÑÑÑ Ð¿Ð°ÑенÑоÑпоÑобнÑм. СÑд поÑÑановил, ÑÑо в ÑÑом ÑлÑÑае ÑледÑÐµÑ Ð¿ÑовеÑÑи ÑкÑпеÑÑÐ¸Ð·Ñ Ð² оÑноÑении пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ñелом. ÐзобÑеÑение не бÑÐ´ÐµÑ Ð¿Ñизнано паÑенÑоÑпоÑобнÑм, еÑли оно пÑедÑÑавлÑÐµÑ Ñобой иÑклÑÑиÑелÑно маÑемаÑиÑеÑкий алгоÑиÑм. Ðднако, еÑли положеннÑй в оÑÐ½Ð¾Ð²Ñ Ð¸Ð·Ð¾Ð±ÑеÑÐµÐ½Ð¸Ñ ÑпоÑоб пÑи помоÑи пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе, пÑомÑÑленно пÑименимÑе ÑезÑлÑÑаÑÑ, в ÑÑом ÑлÑÑае изобÑеÑение ÑвлÑеÑÑÑ Ð¿Ð°ÑенÑоÑпоÑобнÑм. РоÑлиÑие Ð¾Ñ Ð¡Ð¨Ð, в РФ в ÑооÑвеÑÑÑвии Ñ ÐаÑенÑнÑм законом Ð¾Ñ 23.09.1992г. не пÑизнаÑÑÑÑ Ð¿Ð°ÑенÑоÑпоÑобнÑми изобÑеÑениÑми пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ Ð²ÑÑиÑлиÑелÑнÑÑ
маÑин. ÐаÑиÑа пÑогÑамм Ð´Ð»Ñ ÐÐРоÑÑÑеÑÑвлÑеÑÑÑ Ð½Ð° оÑновании ноÑм законодаÑелÑÑÑва об авÑоÑÑком пÑаве. ÐÑклÑÑиÑелÑнÑе пÑава на пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐРпÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð°Ð²ÑоÑÑ Ð¸Ð»Ð¸ Ð¸Ð½Ð¾Ð¼Ñ Ð¿ÑавообладаÑелÑ, коÑоÑÑй пÑиобÑел иÑ
на оÑновании договоÑа или ином оÑновании, пÑедÑÑмоÑÑенном законом. ÐÑавообладаÑÐµÐ»Ñ Ð²ÑеÑ
имÑÑеÑÑвеннÑÑ
пÑав на пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐРв ÑеÑение ÑÑока дейÑÑÐ²Ð¸Ñ Ð°Ð²ÑоÑÑкого пÑава Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐРпÑÑем подаÑи заÑвки в ÐаÑенÑное ведомÑÑво РФ
+
+[2] - ÐдеÑÑ Ð¸Ð¼ÐµÐµÑÑÑ Ð² Ð²Ð¸Ð´Ñ Ð½Ð°ÑионалÑное законодаÑелÑÑÑво ÑÑÑÐ°Ð½Ñ Ð»Ð¸ÑензиаÑа.
+
+[3] - Ð ÑооÑвеÑÑÑвии Ñ Ðаконом РФ "Ðб авÑоÑÑком пÑаве и ÑмежнÑÑ
пÑаваÑ
" авÑоÑÑкое пÑаво на пÑоизведение, Ñозданное в поÑÑдке вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑлÑжебнÑÑ
обÑзанноÑÑей или ÑлÑжебного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÑабоÑодаÑÐµÐ»Ñ (ÑлÑжебное пÑоизведение), пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð°Ð²ÑоÑÑ ÑлÑжебного пÑоизведениÑ. ÐÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование ÑлÑжебного пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ (в Ñом ÑиÑле пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ) пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð»Ð¸ÑÑ, Ñ ÐºÐ¾ÑоÑÑм авÑÐ¾Ñ ÑоÑÑÐ¾Ð¸Ñ Ð² ÑÑÑдовÑÑ
оÑноÑениÑÑ
(ÑабоÑодаÑелÑ), еÑли в договоÑе Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ и авÑоÑом не пÑедÑÑмоÑÑено иное. Ðанное положение не ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° Ñоздание в поÑÑдке вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑлÑжебнÑÑ
обÑзанноÑÑей или ÑлÑжебного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÑабоÑодаÑÐµÐ»Ñ ÑнÑиклопедий, ÑнÑиклопедиÑеÑкиÑ
ÑловаÑей, пеÑиодиÑеÑкиÑ
и пÑодолжаÑÑиÑ
ÑÑ ÑбоÑников наÑÑнÑÑ
ÑÑÑдов, газеÑ, жÑÑналов и дÑÑгиÑ
пеÑиодиÑеÑкиÑ
изданий. ÐздаÑÐµÐ»Ñ ÑнÑиклопедий, ÑнÑиклопедиÑеÑкиÑ
ÑловаÑей, пеÑиодиÑеÑкиÑ
и пÑодолжаÑÑиÑ
ÑÑ Ð¸Ð·Ð´Ð°Ð½Ð¸Ð¹ пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð¸ÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование ÑакиÑ
изданий. ÐвÑоÑÑ Ð¿Ñоизведений, вклÑÑеннÑÑ
в Ñакие изданиÑ, ÑоÑ
ÑанÑÑÑ Ð¸ÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование ÑвоиÑ
пÑоизведений незавиÑимо Ð¾Ñ Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ Ð² Ñелом.
+Ð ÑооÑвеÑÑÑвии Ñ Ð¿.7 ÑÑ. 39 Ðакона РФ "Ðб обÑазовании" обÑазоваÑелÑÐ½Ð¾Ð¼Ñ ÑÑÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð¿Ñаво ÑобÑÑвенноÑÑи в Ñом ÑиÑле на пÑодÑкÑÑ Ð¸Ð½ÑеллекÑÑалÑного и ÑвоÑÑеÑкого ÑÑÑда, ÑвлÑÑÑиеÑÑ ÑезÑлÑÑаÑом деÑÑелÑноÑÑи обÑазоваÑелÑного ÑÑÑеждениÑ. ÐналогиÑÐ½Ð°Ñ Ð½Ð¾Ñма ÑодеÑжиÑÑÑ Ð² ФедеÑалÑном законе РФ "РвÑÑÑем и поÑлевÑзовÑком пÑоÑеÑÑионалÑном обÑазовании" (Ð¤Ð Ð¾Ñ 22 авгÑÑÑа 1996г. â 125-ФÐ).
+
+
+
+My goal was not just a verbal translation of English text of GNU General Public License in Russian, but a translation, which will follow the rules of current legislation of Russian Federation on copyrights. I hope that this will help to use GNU General Public License when distributing free software in Russian Federation. Below you may find some comments (in Russian) on current legislation of Russian Federation.
+
+Ðоей ÑелÑÑ Ð±Ñл не пÑоÑÑо пеÑевод СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU, коÑоÑÑй Ð±Ñ Ð¼Ð°ÐºÑималÑно ÑоÑно ÑооÑвеÑÑÑвовал аÑÑенÑиÑÐ½Ð¾Ð¼Ñ ÑекÑÑÑ Ð½Ð° английÑком ÑзÑке, но Ñакже ÑÑиÑÑвал ноÑÐ¼Ñ Ð´ÐµÐ¹ÑÑвÑÑÑего законодаÑелÑÑÑва РФ об авÑоÑÑком пÑаве, ÑÑо ÑвелиÑило Ð±Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¡ÑандаÑÑнÑÑ ÐбÑеÑÑвеннÑÑ ÐиÑÐµÐ½Ð·Ð¸Ñ GPL Ð´Ð»Ñ ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñвободного пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð½Ð° ÑеÑÑиÑоÑии РФ. Ðиже ÐÑ Ð¼Ð¾Ð¶ÐµÑе ознакомиÑÑÑÑ Ñ Ð½ÐµÐºÐ¾ÑоÑÑми комменÑаÑиÑми оÑноÑиÑелÑно дейÑÑвÑÑÑего законодаÑелÑÑÑва РФ.
+
+РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ð° ÑеÑÑиÑоÑии РоÑÑийÑкой ФедеÑаÑии поÑÑдок воÑпÑоизведениÑ, ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ модиÑикаÑии пÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ ÑегÑлиÑÑеÑÑÑ Ðаконом РФ "РпÑавовой оÑ
Ñане пÑогÑамм Ð´Ð»Ñ ÐÐРи баз даннÑÑ
" Ð¾Ñ 23.09.1992г. â3523-1 и Ðаконом РФ "Ðб авÑоÑÑком пÑаве и ÑмежнÑÑ
пÑаваÑ
" Ð¾Ñ 09.07.1993г. â5351-1.
+
+С ÑелÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑего ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð½Ð°ÑÑоÑÑего неоÑиÑиалÑного пеÑевода СÑандаÑÑной ÐбÑеÑÑвенной ÐиÑензии GNU на ÑÑÑÑкий ÑзÑк ноÑмам дейÑÑвÑÑÑего законодаÑелÑÑÑва РФ об авÑоÑÑком пÑаве, ниже пÑиводÑÑÑÑ Ð¾ÑновнÑе понÑÑие, иÑполÑзÑемÑе в ÑекÑÑе пеÑевода, и иÑ
опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ ÑказаннÑми вÑÑе Ðаконами РФ:
+
+ÐÑогÑаммное обеÑпеÑение - данное понÑÑие не пÑименÑеÑÑÑ Ð² ÑказаннÑÑ
ÐаконаÑ
, однако оно ÑвлÑеÑÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ обÑепÑинÑÑÑм пÑи обознаÑении пÑогÑамм Ð´Ð»Ñ ÐÐРв пеÑеводаÑ
лиÑензионнÑÑ
ÑоглаÑений, в ÑаÑÑноÑÑи ÐиÑензионнÑÑ
ÑоглаÑений Ñ ÐºÐ¾Ð½ÐµÑнÑм полÑзоваÑелем (EULA), на ÑÑÑÑкий ÑзÑк. Ð ÑÐ¸Ð»Ñ ÑÑого понÑÑие "ÐÑогÑаммное обеÑпеÑение" иÑполÑзÑеÑÑÑ Ð² ÑекÑÑе пеÑевода Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð½ÑÑÐ¸Ñ "пÑогÑамма Ð´Ð»Ñ ÐÐÐ". Ðод пÑогÑаммой Ð´Ð»Ñ ÐÐРв Ðаконе РФ понимаеÑÑÑ Ð¾Ð±ÑекÑÐ¸Ð²Ð½Ð°Ñ ÑоÑма пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑовокÑпноÑÑи даннÑÑ
и команд, пÑедназнаÑеннÑÑ
Ð´Ð»Ñ ÑÑнкÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑлекÑÑоннÑÑ
вÑÑиÑлиÑелÑнÑÑ
маÑин (ÐÐÐ) и дÑÑгиÑ
компÑÑÑеÑнÑÑ
ÑÑÑÑойÑÑв Ñ ÑелÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿Ñеделенного ÑезÑлÑÑаÑа, вклÑÑÐ°Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑелÑнÑе маÑеÑиалÑ, полÑÑеннÑе в Ñ
оде ÑазÑабоÑки пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ, и поÑождаемÑе ÐµÑ Ð°ÑдиовизÑалÑнÑе оÑобÑажениÑ.
+
+ÐÑклÑÑиÑелÑнÑе пÑава на иÑполÑзование пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ - ознаÑÐ°ÐµÑ Ð¿Ñаво оÑÑÑеÑÑвлÑÑÑ Ð¸Ð»Ð¸ ÑазÑеÑаÑÑ ÑледÑÑÑие дейÑÑвиÑ: воÑпÑоизводиÑÑ Ð¿Ñоизведение (пÑаво на воÑпÑоизведение); ÑаÑпÑоÑÑÑанÑÑÑ ÑкземплÑÑÑ Ð¿ÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð»ÑбÑм ÑпоÑобом: пÑодаваÑÑ, ÑдаваÑÑ Ð² пÑÐ¾ÐºÐ°Ñ Ð¸ Ñак далее (пÑаво на ÑаÑпÑоÑÑÑанение); пÑблиÑно показÑваÑÑ Ð¿Ñоизведение (пÑаво на пÑблиÑнÑй показ), пеÑеводиÑÑ Ð¿Ñоизведение (пÑаво на пеÑевод); пеÑеделÑваÑÑ, аÑанжиÑоваÑÑ Ð¸Ð»Ð¸ дÑÑгим обÑазом пеÑеÑабаÑÑваÑÑ Ð¿Ñоизведение (пÑаво на пеÑеÑабоÑкÑ), а Ñакже инÑе пÑава в ÑооÑвеÑÑÑвии Ñ Ðаконом РФ "Ðб авÑоÑÑком пÑаве и ÑмежнÑÑ
пÑаваÑ
".
+
+ÐÑклÑÑиÑелÑнÑе (или имÑÑеÑÑвеннÑе) пÑава на иÑполÑзование пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ - ознаÑÐ°ÐµÑ Ð¸ÑклÑÑиÑелÑное пÑаво оÑÑÑеÑÑвлÑÑÑ Ð¸ (или) ÑазÑеÑаÑÑ Ð¾ÑÑÑеÑÑвление ÑледÑÑÑиÑ
дейÑÑвий: вÑпÑÑк в ÑÐ²ÐµÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ, воÑпÑоизведение пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ (полное или ÑаÑÑиÑное) в лÑбой ÑоÑме, лÑбÑми ÑпоÑобами, ÑаÑпÑоÑÑÑанение пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ, модиÑикаÑÐ¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ, в Ñом ÑиÑле пеÑевод пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÐÐÐ Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑзÑка на дÑÑгой, а Ñакже иное иÑполÑзование в ÑооÑвеÑÑÑвии Ñ Ðаконом РФ "РпÑавовой оÑ
Ñане пÑогÑамм Ð´Ð»Ñ ÐÐРи баз даннÑÑ
".
+
+ÐоÑпÑоизведение ÐÑогÑаммного ÐбеÑпеÑÐµÐ½Ð¸Ñ - ÑÑо изгоÑовление одного или более ÑкземплÑÑов ÐÑогÑаммного обеÑпеÑÐµÐ½Ð¸Ñ Ð² лÑбой маÑеÑиалÑной ÑоÑме, а Ñакже его запиÑÑ Ð² памÑÑÑ ÐÐÐ.
+
+ÐодиÑикаÑÐ¸Ñ (пеÑеÑабоÑка) ÐÑогÑаммного ÐбеÑпеÑÐµÐ½Ð¸Ñ - лÑбÑе его изменениÑ, не ÑвлÑÑÑиеÑÑ Ð°Ð´Ð°Ð¿ÑаÑией.
+
+РаÑпÑоÑÑÑанение ÐÑогÑаммного ÐбеÑпеÑÐµÐ½Ð¸Ñ - ÑÑо пÑедоÑÑавление доÑÑÑпа Ð´Ð»Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² лÑбой маÑеÑиалÑной ÑоÑме ÐÑогÑаммного ÐбеÑпеÑениÑ, в Ñом ÑиÑле ÑеÑевÑми и инÑми ÑпоÑобами, а Ñакже пÑÑем пÑодажи, пÑокаÑа, ÑдаÑи в наем, пÑедоÑÑавление взаймÑ, вклÑÑÐ°Ñ Ð¸Ð¼Ð¿Ð¾ÑÑ Ð´Ð»Ñ Ð»Ñбой из ÑÑиÑ
Ñелей.
+
+© Ðлена ТÑпкина, 2001г.
diff --git a/freeplane_framework/windows-installer/messages_de.txt b/freeplane_framework/windows-installer/messages_de.txt
new file mode 100644
index 0000000..60b4500
--- /dev/null
+++ b/freeplane_framework/windows-installer/messages_de.txt
@@ -0,0 +1,3 @@
+[CustomMessages]
+JavaNotFound=Java 1.5 or greater not detected. - You have to download and install Java from http://java.sun.com/ - \nContinue with installation?
+
diff --git a/freeplane_framework/windows-installer/messages_en.txt b/freeplane_framework/windows-installer/messages_en.txt
new file mode 100644
index 0000000..60b4500
--- /dev/null
+++ b/freeplane_framework/windows-installer/messages_en.txt
@@ -0,0 +1,3 @@
+[CustomMessages]
+JavaNotFound=Java 1.5 or greater not detected. - You have to download and install Java from http://java.sun.com/ - \nContinue with installation?
+
diff --git a/freeplane_framework/windows-installer/messages_fr.txt b/freeplane_framework/windows-installer/messages_fr.txt
new file mode 100644
index 0000000..60b4500
--- /dev/null
+++ b/freeplane_framework/windows-installer/messages_fr.txt
@@ -0,0 +1,3 @@
+[CustomMessages]
+JavaNotFound=Java 1.5 or greater not detected. - You have to download and install Java from http://java.sun.com/ - \nContinue with installation?
+
diff --git a/freeplane_framework/windows-installer/messages_hr.txt b/freeplane_framework/windows-installer/messages_hr.txt
new file mode 100644
index 0000000..1122aee
--- /dev/null
+++ b/freeplane_framework/windows-installer/messages_hr.txt
@@ -0,0 +1,4 @@
+[CustomMessages]
+JavaNotFound=Java 1.5 or greater not detected. - You have to download and install Java from http://java.sun.com/ - \nContinue with installation?
+
+
diff --git a/freeplane_framework/windows-installer/messages_ru.txt b/freeplane_framework/windows-installer/messages_ru.txt
new file mode 100644
index 0000000..60b4500
--- /dev/null
+++ b/freeplane_framework/windows-installer/messages_ru.txt
@@ -0,0 +1,3 @@
+[CustomMessages]
+JavaNotFound=Java 1.5 or greater not detected. - You have to download and install Java from http://java.sun.com/ - \nContinue with installation?
+
diff --git a/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm.ico b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm.ico
new file mode 100644
index 0000000..fb9789e
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm.ico differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_16.png b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_16.png
new file mode 100644
index 0000000..e24fb34
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_16.png differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_32.png b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_32.png
new file mode 100644
index 0000000..423d196
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/FileTypeIcons/mm_32.png differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/Launcher/FreeplanePortable.ini b/freeplane_framework/windows-portable/App/AppInfo/Launcher/FreeplanePortable.ini
new file mode 100644
index 0000000..5636b98
--- /dev/null
+++ b/freeplane_framework/windows-portable/App/AppInfo/Launcher/FreeplanePortable.ini
@@ -0,0 +1,10 @@
+[Launch]
+ProgramExecutable=Freeplane\freeplane.exe
+WorkingDirectory=%PAL:AppDir%\Freeplane
+
+[Activate]
+Java=require
+
+[Environment]
+FREEPLANE_JAVA_HOME=%JAVA_HOME%
+
diff --git a/freeplane_framework/windows-portable/App/AppInfo/appicon.ico b/freeplane_framework/windows-portable/App/AppInfo/appicon.ico
new file mode 100644
index 0000000..212f57e
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/appicon.ico differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/appicon_16.png b/freeplane_framework/windows-portable/App/AppInfo/appicon_16.png
new file mode 100644
index 0000000..87d1b9b
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/appicon_16.png differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/appicon_32.png b/freeplane_framework/windows-portable/App/AppInfo/appicon_32.png
new file mode 100644
index 0000000..f25d915
Binary files /dev/null and b/freeplane_framework/windows-portable/App/AppInfo/appicon_32.png differ
diff --git a/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini b/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini
new file mode 100644
index 0000000..483e9e4
--- /dev/null
+++ b/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini
@@ -0,0 +1,40 @@
+[Format]
+Type=PortableApps.comFormat
+Version=3.0
+
+[Details]
+Name=Freeplane Portable
+AppId=FreeplanePortable
+Publisher=Freeplane team
+Homepage=www.freeplane.org
+Category=Editor
+Description=Freeplane Portable Edition is a free mind-mapping software written in Java, packaged with a PortableApps.com Launcher as a portable app, so you can take your mindmaps with you.
+Language=Multilingual
+Trademarks=
+InstallType=
+
+[License]
+Shareable=true
+OpenSource=true
+Freeware=true
+CommercialUse=true
+EULAVersion=1
+
+[Version]
+PackageVersion=1.2.20.1
+DisplayVersion=1.2.20
+
+[SpecialPaths]
+Plugins=NONE
+
+[Dependencies]
+UsesJava=yes
+
+[Control]
+Icons=1
+Start=FreeplanePortable.exe
+
+[Associations]
+FileTypes=mm
+[FileTypeIcons]
+mm=custom
diff --git a/freeplane_framework/windows-portable/App/Readme.txt b/freeplane_framework/windows-portable/App/Readme.txt
new file mode 100644
index 0000000..8681d7c
--- /dev/null
+++ b/freeplane_framework/windows-portable/App/Readme.txt
@@ -0,0 +1,3 @@
+The files in this directory are necessary for the portable application to
+function. There is normally no need to directly access or alter any of the
+files within these directories.
diff --git a/freeplane_framework/windows-portable/Other/Help/Images/Donation_Button.png b/freeplane_framework/windows-portable/Other/Help/Images/Donation_Button.png
new file mode 100644
index 0000000..f19dea7
Binary files /dev/null and b/freeplane_framework/windows-portable/Other/Help/Images/Donation_Button.png differ
diff --git a/freeplane_framework/windows-portable/Other/Help/Images/Favicon.ico b/freeplane_framework/windows-portable/Other/Help/Images/Favicon.ico
new file mode 100644
index 0000000..ed849b2
Binary files /dev/null and b/freeplane_framework/windows-portable/Other/Help/Images/Favicon.ico differ
diff --git a/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Footer.png b/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Footer.png
new file mode 100644
index 0000000..5ebdc02
Binary files /dev/null and b/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Footer.png differ
diff --git a/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Header.png b/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Header.png
new file mode 100644
index 0000000..cf1ebf7
Binary files /dev/null and b/freeplane_framework/windows-portable/Other/Help/Images/Help_Background_Header.png differ
diff --git a/freeplane_framework/windows-portable/Other/Help/Images/Help_Logo_Top.png b/freeplane_framework/windows-portable/Other/Help/Images/Help_Logo_Top.png
new file mode 100644
index 0000000..1a70505
Binary files /dev/null and b/freeplane_framework/windows-portable/Other/Help/Images/Help_Logo_Top.png differ
diff --git a/freeplane_framework/windows-portable/Other/Source/FreeplanePortable.ini b/freeplane_framework/windows-portable/Other/Source/FreeplanePortable.ini
new file mode 100644
index 0000000..e85e60f
--- /dev/null
+++ b/freeplane_framework/windows-portable/Other/Source/FreeplanePortable.ini
@@ -0,0 +1,6 @@
+AdditionalParameters=
+DisableSplashScreen=false
+RunLocally=false
+
+# The above options are explained in the included readme.txt
+# This INI file is an example only and is not used unless it is placed as described in the included readme.txt
diff --git a/freeplane_framework/windows-portable/Other/Source/LauncherLicense.txt b/freeplane_framework/windows-portable/Other/Source/LauncherLicense.txt
new file mode 100644
index 0000000..89e08fb
--- /dev/null
+++ b/freeplane_framework/windows-portable/Other/Source/LauncherLicense.txt
@@ -0,0 +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.
diff --git a/freeplane_framework/windows-portable/Other/Source/Readme.txt b/freeplane_framework/windows-portable/Other/Source/Readme.txt
new file mode 100644
index 0000000..75d48a8
--- /dev/null
+++ b/freeplane_framework/windows-portable/Other/Source/Readme.txt
@@ -0,0 +1,47 @@
+The base application's source code is available from the portable app's
+homepage listed in the help.html file (if applicable).
+
+Details of most other things are available there as well.
+
+LICENSE
+=======
+
+This package's installer and launcher are released under the GPL. The launcher
+is the PortableApps.com Launcher, available with full source and documentation
+from http://portableapps.com/development. We request that developers using the
+PortableApps.com Launcher please leave this directory intact and unchanged.
+
+USER CONFIGURATION
+==================
+
+Some configuration in the PortableApps.com Launcher can be overridden by the
+user in an INI file next to FreeplanePortable.exe called FreeplanePortable.ini.
+If you are happy with the default options, it is not necessary, though. There
+is an example INI included with this package to get you started. To use it,
+copy AppNamePortable.ini from this directory to FreeplanePortable.ini next to
+FreeplanePortable.exe. The options in the INI file are as follows:
+
+ AdditionalParameters=
+ DisableSplashScreen=false
+ RunLocally=false
+
+(There is no need for an INI header in this file; if you have one, though, it
+won't damage anything.)
+
+The AdditionalParameters entry allows you to pass additional command-line
+parameters to the application.
+
+The DisableSplashScreen entry allows you to run the launcher without the splash
+screen showing up. The default is false.
+
+The RunLocally entry allows you to run the portable application from a read-
+only medium. This is known as Live mode. It copies what it needs to to a
+temporary directory on the host computer, runs the application, and then
+deletes it afterwards, leaving nothing behind. This can be useful for running
+the application from a CD or if you work on a computer that may have spyware or
+viruses and you'd like to keep your device set to read-only. As a consequence
+of this technique, any changes you make during the Live mode session aren't
+saved back to your device. The default is false.
+
+There may be other values also permitted in the user configuration file by the
+portable application; refer to help.html for any details of them.
diff --git a/freeplane_framework/windows-portable/help.html b/freeplane_framework/windows-portable/help.html
new file mode 100644
index 0000000..e449e5b
--- /dev/null
+++ b/freeplane_framework/windows-portable/help.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<head>
+<meta charset="UTF-8">
+<title>Freeplane Portable Help</title>
+<link rel="alternate" href="http://portableapps.com/feeds/general" type="application/rss+xml" title="PortableApps.com">
+<link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
+<style type="text/css">
+ body {
+ font-family : Verdana,Arial,Helvetica,sans-serif;
+ font-size : 76%;
+ color : black;
+ margin : 20px;
+ background : #e6e8ea;
+ text-align : center;
+ }
+ a {
+ color : #b31616;
+ font-weight : bold;
+ }
+ a:link, a:visited, a:active {}
+ a:hover {
+ color : red;
+ }
+ h1, h2, h3, h4, h5, h6 {
+ font-family : Arial, sans-serif;
+ font-weight : normal;
+ }
+ h1 {
+ color : #b31616;
+ font-weight : bold;
+ letter-spacing : -2px;
+ font-size : 2.2em;
+ border-bottom : 1px solid silver;
+ padding-bottom : 5px;
+ }
+ h2 {
+ font-size : 1.5em;
+ border-bottom : 1px solid silver;
+ padding-bottom : 3px;
+ clear : both;
+ }
+ h3 { font-size : 1.2em; }
+ h4 { font-size : 1.1em; }
+ h5 { font-size : 1.0em; }
+ h6 { font-size : 0.8em; }
+ img { border : 0; }
+ ol, ul, li, p, pre, table, tr, td, th { font-size : 1.0em; }
+ pre { font-family : monospace; }
+ strong, b { font-weight : bold; }
+ td, th {
+ border : 1px solid #aaaaaa;
+ border-collapse : collapse;
+ padding : 3px;
+ }
+ th {
+ background : #3667a8;
+ color : white;
+ }
+ ol ol { list-style-type : lower-alpha; }
+ .content {
+ text-align : left;
+ margin-left : auto;
+ margin-right : auto;
+ width : 780px;
+ background-color : white;
+ border-left : 1px solid black;
+ border-right : 1px solid black;
+ padding : 12px 30px;
+ line-height : 150%;
+ }
+ .logo {
+ background : white url("Other/Help/Images/Help_Background_Header.png") repeat-x;
+ width : 840px;
+ margin-top : 20px;
+ margin-left : auto;
+ margin-right : auto;
+ text-align : left;
+ border-right : 1px solid black;
+ border-left : 1px solid black;
+ }
+ .footer {
+ background : white url("Other/Help/Images/Help_Background_Footer.png") repeat-x;
+ width : 840px;
+ height : 16px;
+ margin-left : auto;
+ margin-right : auto;
+ text-align : left;
+ border-right : 1px solid black;
+ border-left : 1px solid black;
+ }
+ .logo img {
+ padding-left : 0px;
+ border : none;
+ position : relative;
+ top : -4px;
+ }
+ * html .content { width : 760px; }
+ * html .logo, * html .footer { width : 820px; }
+ .content h1 { margin : 0px; }
+ h1.hastagline { border : 0; }
+ h2.tagline {
+ color : #747673;
+ clear : none;
+ margin-top : 0em;
+ }
+
+ /* printer styles */
+ @media print {
+ body, .content {
+ margin : 0;
+ padding : 0;
+ }
+ .navigation, .locator, .footer a, .message, .footer-links { display : none; }
+ .footer, .content, .header { border : none; }
+ a {
+ text-decoration : none;
+ font-weight : normal;
+ color : black;
+ }
+ }
+</style>
+</head>
+
+<body>
+<div class="logo"><a href="http://portableapps.com/"><img src="Other/Help/Images/Help_Logo_Top.png" alt="PortableApps.com - Your Digital Life, Anywhere"></a></div>
+<div class="content">
+<h1 class="hastagline">Freeplane Portable Help</h1>
+<h2 class="tagline">Mind Mapping Software</h2>
+<p>Freeplane Portable is the Freeplane software packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app">portable app</a>, so you can take your mind maps with you on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as Freeplane, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://freeplane.org">Learn more about Freeplane...</a></p>
+
+<p><a href="http://portableapps.com/donate"><img src="Other/Help/Images/Donation_Button.png" style="vertical-align:middle" alt="Make a Donation"></a> - Support PortableApps.com's Hosting and Development</p>
+
+<!-- <p><a href="http://portableapps.com/node/*Node ID*">Go to the Freeplane Portable Homepage >></a></p> --!>
+<p><a href="http://portableapps.com/">Get more portable apps at PortableApps.com</a></p>
+
+<!-- If the software being packaged is open source under an OSI approved license, delete the second paragraph below. If the software being packaged is freeware or not OSI certified, delete the first paragraph below. -->
+<p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>
+<p>The PortableApps.com Launcher that portablizes this application and the PortableApps.com Installer used to package this application are OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. The base application is under a different license.</p>
+
+<h2>Portable App Issues</h2>
+<ul>
+ <li><a href="http://portableapps.com/support/portable_app#downloading">Downloading a Portable App</a></li>
+ <li><a href="http://portableapps.com/support/portable_app#installing">Installing a Portable App</a></li>
+ <li><a href="http://portableapps.com/support/portable_app#using">Using a Portable App</a></li>
+ <li><a href="http://portableapps.com/support/portable_app#upgrading">Upgrading a Portable App</a></li>
+</ul>
+<p>You can read about advanced configuration options for the PortableApps.com Launcher in its <a href="Other/Source/Readme.txt">readme file</a>.</p>
+</div>
+<div class="footer"></div>
+</body>
+</html>
diff --git a/freeplane_mac/.classpath b/freeplane_mac/.classpath
new file mode 100644
index 0000000..f453f3d
--- /dev/null
+++ b/freeplane_mac/.classpath
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..e923848
--- /dev/null
+++ b/freeplane_mac/.project
@@ -0,0 +1,17 @@
+<?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
new file mode 100644
index 0000000..546e393
--- /dev/null
+++ b/freeplane_mac/ant/build.xml
@@ -0,0 +1,36 @@
+<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.properties b/freeplane_mac/build.properties
new file mode 100644
index 0000000..e69de29
diff --git a/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java b/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java
new file mode 100644
index 0000000..92131c3
--- /dev/null
+++ b/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java
@@ -0,0 +1,107 @@
+/*
+ * 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 org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.ViewController;
+
+import com.apple.eawt.Application;
+import com.apple.eawt.ApplicationAdapter;
+import com.apple.eawt.ApplicationEvent;
+
+/** This plugin changes some things for mac users.
+ * @author foltin
+ */
+public class MacChanges extends ApplicationAdapter {
+
+ 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.addApplicationListener(this);
+ fmMacApplication.addPreferencesMenuItem();
+ fmMacApplication.addAboutMenuItem();
+ fmMacApplication.setEnabledPreferencesMenu(true);
+ // wait until handleOpenFile finishes if it was called in event thread
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ };
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ public void handleQuit(ApplicationEvent event) {
+ getModeController().getController().quit();
+ event.setHandled(false);
+ }
+
+ public void handleAbout(ApplicationEvent event) {
+ getModeController().getController().getAction("AboutAction").actionPerformed(null);
+ event.setHandled(true);
+ }
+
+
+ public void handleOpenFile(final ApplicationEvent event) {
+ try {
+ ViewController viewController = controller.getViewController();
+ if(viewController == null) {
+ // restore at startup:
+ loadedMapCounter++;
+ System.setProperty("org.freeplane.param" + loadedMapCounter, event.getFilename());
+ } else {
+ // Direct loading
+ getModeController().getMapController().newMap(Compat.fileToUrl(new File(event.getFilename())));
+ }
+ event.setHandled(true);
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ public void handlePreferences(ApplicationEvent event) {
+ getModeController().getAction("PropertyAction").actionPerformed(null);
+ event.setHandled(true);
+ }
+
+ private MModeController getModeController() {
+ return (MModeController) controller.getModeController(MModeController.MODENAME);
+ }
+}
\ No newline at end of file
diff --git a/freeplane_plugin_bugreport/.classpath b/freeplane_plugin_bugreport/.classpath
new file mode 100644
index 0000000..64ed6b3
--- /dev/null
+++ b/freeplane_plugin_bugreport/.classpath
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..42c0c53
--- /dev/null
+++ b/freeplane_plugin_bugreport/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..9d60dc3
--- /dev/null
+++ b/freeplane_plugin_bugreport/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..0963ed3
--- /dev/null
+++ b/freeplane_plugin_bugreport/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..284f0f4
--- /dev/null
+++ b/freeplane_plugin_bugreport/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#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
new file mode 100644
index 0000000..33ef18e
--- /dev/null
+++ b/freeplane_plugin_bugreport/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..48952f9
--- /dev/null
+++ b/freeplane_plugin_bugreport/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+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
new file mode 100644
index 0000000..4886301
--- /dev/null
+++ b/freeplane_plugin_bugreport/ant/ant.properties
@@ -0,0 +1 @@
+plugin.ext.lib = lib
diff --git a/freeplane_plugin_bugreport/ant/build.xml b/freeplane_plugin_bugreport/ant/build.xml
new file mode 100644
index 0000000..e1e6c05
--- /dev/null
+++ b/freeplane_plugin_bugreport/ant/build.xml
@@ -0,0 +1,61 @@
+<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/src/org/freeplane/plugin/bugreport/Activator.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/Activator.java
new file mode 100644
index 0000000..e0fbbf6
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/Activator.java
@@ -0,0 +1,36 @@
+package org.freeplane.plugin.bugreport;
+
+import java.util.logging.Logger;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.main.osgi.IControllerExtensionProvider;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+ private ReportGenerator handler;
+ private Logger parentLogger;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception {
+ parentLogger = Logger.getAnonymousLogger().getParent();
+ handler = new ReportGenerator();
+ parentLogger.addHandler(handler);
+ context.registerService(IControllerExtensionProvider.class.getName(), new IControllerExtensionProvider() {
+ public void installExtension(Controller controller) {
+ handler.setBugReportListener(new ManualBugReporter());
+ }
+ }, null);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception {
+ parentLogger.removeHandler(handler);
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugFormatter.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugFormatter.java
new file mode 100644
index 0000000..17df756
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugFormatter.java
@@ -0,0 +1,51 @@
+/*
+ * 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.plugin.bugreport;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.logging.Formatter;
+import java.util.logging.LogRecord;
+
+/**
+ * @author Dimitry Polivaev
+ * 13.06.2009
+ */
+public class BugFormatter extends Formatter {
+ @Override
+ public String format(final LogRecord record) {
+ final String message = record.getMessage();
+ final StringBuilder sb = new StringBuilder();
+ sb.append(message);
+ sb.append('\n');
+ if (record.getThrown() != null) {
+ try {
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new PrintWriter(sw);
+ record.getThrown().printStackTrace(pw);
+ pw.close();
+ sb.append(sw.toString());
+ }
+ catch (final Exception ex) {
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugReportDialogManager.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugReportDialogManager.java
new file mode 100644
index 0000000..6267cec
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/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.getFrame(), 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/org/freeplane/plugin/bugreport/IBugReportListener.java
new file mode 100644
index 0000000..3514632
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/IBugReportListener.java
@@ -0,0 +1,7 @@
+package org.freeplane.plugin.bugreport;
+
+import java.util.Map;
+
+public interface IBugReportListener {
+ void onReportSent(Map<String, String> report, String status);
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ManualBugReporter.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ManualBugReporter.java
new file mode 100644
index 0000000..69cdcdc
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ManualBugReporter.java
@@ -0,0 +1,97 @@
+package org.freeplane.plugin.bugreport;
+
+import java.awt.EventQueue;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.ResourceController;
+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.mode.Controller;
+
+class ManualBugReporter implements IBugReportListener {
+// // final private Controller controller;
+
+ public ManualBugReporter() {
+ super();
+// this.controller = controller;
+ }
+
+ public void onReportSent(final Map<String, String> report, final String status) {
+ if (!status.equals("wanted")) {
+ return;
+ }
+ final String log = report.get("log");
+ final String hash = report.get("hash");
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ openBugTracker(log, hash);
+ }
+ });
+ }
+
+ static final private String OPTION = "org.freeplane.plugin.manualbugreport";
+
+ private void openBugTracker(final String log, final String hash) {
+ final String option = showBugReportDialog(log, hash);
+ if (!BugReportDialogManager.ALLOWED.equals(option)) {
+ return;
+ }
+ try {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String location = resourceController.getProperty("bugTrackerLocation");
+ final Controller controller = Controller.getCurrentController();
+ controller.getViewController().openDocument(new URL(location));
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.getText("url_error") + "\n" + ex);
+ LogUtils.warn(ex);
+ }
+ catch (final Exception ex) {
+ UITools.errorMessage(ex);
+ LogUtils.warn(ex);
+ }
+ }
+
+ private String showBugReportDialog(final String log, final String hash) {
+ final String title = TextUtils.getText("org.freeplane.plugin.bugreport.freeplane_team").replaceAll("\\n", "\n");
+ String option = ResourceController.getResourceController().getProperty(OPTION, BugReportDialogManager.ASK);
+ if (option.equals(BugReportDialogManager.ASK)) {
+ String question = TextUtils.getText("org.freeplane.plugin.bugreport.wanted_bug");
+ if (!question.startsWith("<html>")) {
+ question = HtmlUtils.plainToHTML(question);
+ }
+ final Object[] options = new Object[] { TextUtils.getText("ok"),
+ TextUtils.getText("cancel"),
+ TextUtils.getText("org.freeplane.plugin.bugreport.never") };
+ final String reportName = TextUtils.getText("org.freeplane.plugin.bugreport.lastreport");
+ final int choice = BugReportDialogManager.showBugReportDialog(title, question,
+ JOptionPane.QUESTION_MESSAGE, options, options[0], reportName, log);
+ final ReportRegistry register = ReportRegistry.getInstance();
+ if (choice != 2) {
+ register.unregisterReport(hash);
+ }
+ switch (choice) {
+ case 0:
+ option = BugReportDialogManager.ALLOWED;
+ break;
+ case 1:
+ option = BugReportDialogManager.DENIED;
+ break;
+ case 2:
+ option = BugReportDialogManager.DENIED;
+ ResourceController.getResourceController().setProperty(OPTION, option);
+ break;
+ default:
+ option = BugReportDialogManager.DENIED;
+ break;
+ }
+ }
+ return option;
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java
new file mode 100644
index 0000000..86ad653
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java
@@ -0,0 +1,409 @@
+package org.freeplane.plugin.bugreport;
+
+import java.awt.Dimension;
+import java.awt.EventQueue;
+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 (EventQueue.isDispatchThread()) {
+ return;
+ }
+ final Thread currentThread = Thread.currentThread();
+ EventQueue.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) {
+ if (out == null) {
+ out = new ByteArrayOutputStream();
+ setOutputStream(out);
+ }
+ if (!isLoggable(record)) {
+ return;
+ }
+ if (!(disabled || isRunning || reportCollected)) {
+ reportCollected = true;
+ EventQueue.invokeLater(new SubmitStarter());
+ }
+ EventQueue.invokeLater(new Runnable() {
+ @SuppressWarnings("serial")
+ public void run() {
+ 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);
+ Controller.getCurrentController().getViewController().addStatusComponent("internal_error", logButton);
+ }
+ logButton.setText(TextUtils.format("errornumber", errorCounter));
+
+ }
+ }
+ });
+ 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_bugreport/src/org/freeplane/plugin/bugreport/ReportRegistry.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportRegistry.java
new file mode 100644
index 0000000..0e6a30e
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportRegistry.java
@@ -0,0 +1,27 @@
+package org.freeplane.plugin.bugreport;
+
+import org.freeplane.core.resources.ResourceController;
+
+class ReportRegistry {
+ private static final String BUGREPORT = "org.freeplane.plugin.bugreport.";
+ private static final ReportRegistry instance = new ReportRegistry();
+
+ static ReportRegistry getInstance() {
+ return instance;
+ }
+
+ synchronized boolean isReportRegistered(final String hash) {
+ return null != ResourceController.getResourceController().getProperty(BUGREPORT + hash,
+ null);
+ }
+
+ synchronized void registerReport(final String hash, final String lastReportInfo) {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.setProperty(BUGREPORT + hash, "1");
+ ResourceController.getResourceController().setProperty(ReportGenerator.LAST_BUG_REPORT_INFO, lastReportInfo);
+ }
+
+ synchronized void unregisterReport(final String hash) {
+ ResourceController.getResourceController().getProperties().remove(BUGREPORT + hash);
+ }
+}
diff --git a/freeplane_plugin_formula/.classpath b/freeplane_plugin_formula/.classpath
new file mode 100644
index 0000000..64ed6b3
--- /dev/null
+++ b/freeplane_plugin_formula/.classpath
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..8d978b4
--- /dev/null
+++ b/freeplane_plugin_formula/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..02eaf6f
--- /dev/null
+++ b/freeplane_plugin_formula/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..baab3be
--- /dev/null
+++ b/freeplane_plugin_formula/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..9ee9dd7
--- /dev/null
+++ b/freeplane_plugin_formula/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#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/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_formula/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..16a669c
--- /dev/null
+++ b/freeplane_plugin_formula/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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_formula/META-INF/MANIFEST.MF b/freeplane_plugin_formula/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8f2db92
--- /dev/null
+++ b/freeplane_plugin_formula/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000..e3e1a1e
--- /dev/null
+++ b/freeplane_plugin_formula/ant/ant.properties
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..a8d28af
--- /dev/null
+++ b/freeplane_plugin_formula/ant/build.xml
@@ -0,0 +1,65 @@
+<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 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="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">
+ <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="${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_formula/src/org/freeplane/plugin/formula/Activator.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/Activator.java
new file mode 100644
index 0000000..b73afe6
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/Activator.java
@@ -0,0 +1,85 @@
+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/EvaluateAllAction.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/EvaluateAllAction.java
new file mode 100644
index 0000000..585276a
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/EvaluateAllAction.java
@@ -0,0 +1,23 @@
+package org.freeplane.plugin.formula;
+
+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.view.swing.map.MapView;
+
+class EvaluateAllAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public EvaluateAllAction() {
+ super(FormulaUtils.getFormulaKey("EvaluateAllAction"));
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ org.freeplane.plugin.script.FormulaUtils.clearCache(map);
+ MapView mapView = (MapView)Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ mapView.getRoot().updateAll();
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java
new file mode 100644
index 0000000..547ec0e
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java
@@ -0,0 +1,58 @@
+/*
+ * 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 {
+
+ 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/FormulaTextTransformer.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaTextTransformer.java
new file mode 100644
index 0000000..5ddf8dc
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaTextTransformer.java
@@ -0,0 +1,86 @@
+package org.freeplane.plugin.formula;
+
+import java.awt.Dimension;
+import java.awt.event.KeyEvent;
+
+import javax.swing.JEditorPane;
+
+import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.format.FormattedFormula;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.AbstractContentTransformer;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.EditNodeDialog;
+import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.plugin.script.ExecuteScriptException;
+import org.freeplane.plugin.script.FormulaUtils;
+
+class FormulaTextTransformer extends AbstractContentTransformer implements IEditBaseCreator{
+ FormulaTextTransformer(int priority) {
+ super(priority);
+ }
+
+ public Object transformContent(TextController textController, final Object obj, final NodeModel node,
+ Object transformedExtension) {
+ if (obj instanceof FormattedFormula) {
+ final FormattedFormula formattedFormula = (FormattedFormula) obj;
+ final Object evaluationResult = transformContent(textController, formattedFormula.getObject(), node,
+ transformedExtension);
+ return new FormattedObject(evaluationResult, formattedFormula.getPattern());
+ }
+ if (!(obj instanceof String)) {
+ return obj;
+ }
+ if (textController.isTextFormattingDisabled(node))
+ return obj;
+ final String text = obj.toString();
+ if (!FormulaUtils.containsFormulaCheckHTML(text)) {
+ return obj;
+ }
+ final String plainText = HtmlUtils.htmlToPlain(text);
+ // starting a new ScriptContext in evalIfScript
+ final Object result = FormulaUtils.evalIfScript(node, null, plainText);
+ if (result == null) {
+ throw new ExecuteScriptException("got null result from evaluating " + node.getID() + ", text='"
+ + plainText.substring(1) + "'");
+ }
+ return result;
+ }
+
+ public EditNodeBase createEditor(final NodeModel node, final EditNodeBase.IEditControl editControl,
+ String text, final boolean editLong) {
+ MTextController textController = MTextController.getController();
+ if (textController.isTextFormattingDisabled(node))
+ return null;
+ final KeyEvent firstKeyEvent = textController.getEventQueue().getFirstEvent();
+ if(firstKeyEvent != null){
+ if (firstKeyEvent.getKeyChar() == '='){
+ text = "=";
+ }
+ else{
+ return null;
+ }
+ }
+ if(text.startsWith("=")){
+ 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 FormulaEditor(node, text, firstKeyEvent, editControl, false, textEditor);
+ editNodeDialog.setTitle(TextUtils.getText("formula_editor"));
+ textEditor.setContentType("text/groovy");
+ return editNodeDialog;
+ }
+ return null;
+ }
+
+ public boolean markTransformation() {
+ return true;
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
new file mode 100644
index 0000000..fd8dff2
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
@@ -0,0 +1,72 @@
+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.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) {
+
+ }
+
+ /** 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/org/freeplane/plugin/formula/FormulaUtils.java
new file mode 100644
index 0000000..739a6a5
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUtils.java
@@ -0,0 +1,14 @@
+package org.freeplane.plugin.formula;
+
+import org.freeplane.core.util.TextUtils;
+
+public class FormulaUtils {
+
+ public static String getFormulaText(String key) {
+ return TextUtils.getText(getFormulaKey(key));
+ }
+
+ public static String getFormulaKey(String key) {
+ return "formula." + key;
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/defaults.properties b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/defaults.properties
new file mode 100644
index 0000000..7cffaeb
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/defaults.properties
@@ -0,0 +1,3 @@
+formula_disable_plugin = false
+formula_disable_caching = false
+formula.EvaluateAllAction.icon = /images/formula.png
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.xml b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.xml
new file mode 100644
index 0000000..d1477a8
--- /dev/null
+++ b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<preferences_structure>
+ <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_help/.classpath b/freeplane_plugin_help/.classpath
new file mode 100644
index 0000000..451e5c2
--- /dev/null
+++ b/freeplane_plugin_help/.classpath
@@ -0,0 +1,9 @@
+<?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
new file mode 100644
index 0000000..26f48d2
--- /dev/null
+++ b/freeplane_plugin_help/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..ef096d0
--- /dev/null
+++ b/freeplane_plugin_help/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..070af75
--- /dev/null
+++ b/freeplane_plugin_help/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..1058e94
--- /dev/null
+++ b/freeplane_plugin_help/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#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
new file mode 100644
index 0000000..16a669c
--- /dev/null
+++ b/freeplane_plugin_help/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..b85c57b
--- /dev/null
+++ b/freeplane_plugin_help/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+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
new file mode 100644
index 0000000..f1eeec0
--- /dev/null
+++ b/freeplane_plugin_help/ant/ant.properties
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..d23e08d
--- /dev/null
+++ b/freeplane_plugin_help/ant/build.xml
@@ -0,0 +1,64 @@
+<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/resources/org/freeplane/plugin/help/doc/Freeplane.map b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Freeplane.map
new file mode 100644
index 0000000..1e27771
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Freeplane.map
@@ -0,0 +1,25 @@
+ <?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
new file mode 100644
index 0000000..07577b5
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneIndex.xml
@@ -0,0 +1,233 @@
+<?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
new file mode 100644
index 0000000..f8495ec
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneTOC.xml
@@ -0,0 +1,51 @@
+<?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
new file mode 100644
index 0000000..ddc3998
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS 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
new file mode 100644
index 0000000..e4d2a2b
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS.TAB
@@ -0,0 +1,17 @@
+eÿÿÿ÷_ÿÿÿÿý×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÿÿÿÿuÿÿÿÿÿÿÿÿÿ÷_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeÿý×ÿÿÿÿÿÿÿÿÿÿÿÿ÷_ÿÿÿ÷_ÿÿÿ÷_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÿý×ÿÿÿÿÿ÷_ÿÿÿÿÿÿÿÿ÷_ÿÿý×Ýÿ÷_ÿÿÿÿÿÝÿÿÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÐòÌ,Òã
+»bÍ+£®³+2âÍ/ã
+R.³r²ó
+0ªÎ*4³
+<³Z+»è`LÒ«ûºRÍ(ò̹²ÍÊ7*ó
+/¼Ý¥óK3¢/6.50£
+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
new file mode 100644
index 0000000..8688836
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/OFFSETS
@@ -0,0 +1 @@
+JËtÄÞ¡/½Jõµ½cM·£FçleXO=!"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
new file mode 100644
index 0000000..da2f30e
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/POSITIONS 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
new file mode 100644
index 0000000..6b542e2
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/SCHEMA
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..71791e9
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/TMAP 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
new file mode 100644
index 0000000..b3cd118
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Map.jhm
@@ -0,0 +1,137 @@
+<?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
new file mode 100644
index 0000000..f3ab506
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/applet.htm
@@ -0,0 +1,59 @@
+<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
new file mode 100644
index 0000000..b3ce1b4
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/create.htm
@@ -0,0 +1,46 @@
+<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
new file mode 100644
index 0000000..e16cada
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/credits.htm
@@ -0,0 +1,105 @@
+<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
new file mode 100644
index 0000000..c71749a
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customize.htm
@@ -0,0 +1,39 @@
+<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
new file mode 100644
index 0000000..930a937
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customuser.htm
@@ -0,0 +1,211 @@
+<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
new file mode 100644
index 0000000..72a509b
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco1.gif 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
new file mode 100644
index 0000000..3b95006
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco2.gif 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
new file mode 100644
index 0000000..7329b0c
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco3.gif 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
new file mode 100644
index 0000000..091965f
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco4.gif 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
new file mode 100644
index 0000000..b02c5c0
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editcopy.htm
@@ -0,0 +1,181 @@
+<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
new file mode 100644
index 0000000..556eaec
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editdrag.htm
@@ -0,0 +1,66 @@
+<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
new file mode 100644
index 0000000..ea02d98
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editho1.gif 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
new file mode 100644
index 0000000..edeb981
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/edithome.htm
@@ -0,0 +1,102 @@
+<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
new file mode 100644
index 0000000..fb6e2dc
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeyboard.htm
@@ -0,0 +1,76 @@
+<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
new file mode 100644
index 0000000..c4fc7d2
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeychart.htm
@@ -0,0 +1,113 @@
+<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
new file mode 100644
index 0000000..e63ad2e
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnav.htm
@@ -0,0 +1,57 @@
+<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
new file mode 100644
index 0000000..00bce15
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno10.jpg 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
new file mode 100644
index 0000000..bf54518
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno11.gif 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
new file mode 100644
index 0000000..1a901a0
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno2.gif 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
new file mode 100644
index 0000000..1a6b82c
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno3.jpg 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
new file mode 100644
index 0000000..dc5afab
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno4.gif 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
new file mode 100644
index 0000000..0493ab6
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno5.gif 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
new file mode 100644
index 0000000..313f55f
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno6.gif 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
new file mode 100644
index 0000000..817353c
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno7.gif 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
new file mode 100644
index 0000000..7a0f497
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno8.gif 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
new file mode 100644
index 0000000..ddad2ac
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno9.gif 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
new file mode 100644
index 0000000..0704f32
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnode.htm
@@ -0,0 +1,135 @@
+<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
new file mode 100644
index 0000000..0e7bc2a
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editsearch.htm
@@ -0,0 +1,38 @@
+<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
new file mode 100644
index 0000000..e15917a
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.h1.gif 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
new file mode 100644
index 0000000..8e15a72
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.htm
@@ -0,0 +1,73 @@
+<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
new file mode 100644
index 0000000..5e990cc
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/fmlogosm.JPG 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
new file mode 100644
index 0000000..5e4a5b7
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/freeplane.hs
@@ -0,0 +1,57 @@
+<?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
new file mode 100644
index 0000000..de427be
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/homepage.htm
@@ -0,0 +1,28 @@
+<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
new file mode 100644
index 0000000..590e419
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/install.htm
@@ -0,0 +1,37 @@
+<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
new file mode 100644
index 0000000..579db1c
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/manifest.mf
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..9a8c511
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/mapsample.jpg 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
new file mode 100644
index 0000000..5861a16
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/patterns.htm
@@ -0,0 +1,82 @@
+<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
new file mode 100644
index 0000000..988530e
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/picture(png).jpg 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
new file mode 100644
index 0000000..dba5c56
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/pixhtml.htm
@@ -0,0 +1,38 @@
+<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
new file mode 100644
index 0000000..cddc95e
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/prefs.htm
@@ -0,0 +1,28 @@
+<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
new file mode 100644
index 0000000..936825a
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/print.htm
@@ -0,0 +1,33 @@
+<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
new file mode 100644
index 0000000..f5a39a9
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/screen.html
@@ -0,0 +1,45 @@
+<!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
new file mode 100644
index 0000000..698d29e
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/style.css
@@ -0,0 +1,17 @@
+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
new file mode 100644
index 0000000..c813e70
Binary files /dev/null and b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.h1.gif 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
new file mode 100644
index 0000000..bc72bdf
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.htm
@@ -0,0 +1,82 @@
+<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
new file mode 100644
index 0000000..4b61043
--- /dev/null
+++ b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/welcome.htm
@@ -0,0 +1,74 @@
+<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
new file mode 100644
index 0000000..598a14d
--- /dev/null
+++ b/freeplane_plugin_help/src/org/freeplane/plugin/help/Activator.java
@@ -0,0 +1,33 @@
+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
new file mode 100644
index 0000000..5d8ba41
--- /dev/null
+++ b/freeplane_plugin_help/src/org/freeplane/plugin/help/FreeplaneHelpStarter.java
@@ -0,0 +1,64 @@
+/*
+ * 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_latex/.classpath b/freeplane_plugin_latex/.classpath
new file mode 100644
index 0000000..203473e
--- /dev/null
+++ b/freeplane_plugin_latex/.classpath
@@ -0,0 +1,8 @@
+<?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-0.9.7.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/freeplane_plugin_latex/.project b/freeplane_plugin_latex/.project
new file mode 100644
index 0000000..1ce2bf2
--- /dev/null
+++ b/freeplane_plugin_latex/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..02eaf6f
--- /dev/null
+++ b/freeplane_plugin_latex/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..baab3be
--- /dev/null
+++ b/freeplane_plugin_latex/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..9ee9dd7
--- /dev/null
+++ b/freeplane_plugin_latex/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#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_latex/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_latex/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..16a669c
--- /dev/null
+++ b/freeplane_plugin_latex/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..da28d54
--- /dev/null
+++ b/freeplane_plugin_latex/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.freeplane.plugin.latex
+Bundle-SymbolicName: org.freeplane.plugin.latex
+Bundle-Version: 1.0.1
+Bundle-Activator: org.freeplane.plugin.latex.Activator
+Import-Package: org.freeplane.plugin.script,
+ 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/jlatexmath-0.9.7.jar
diff --git a/freeplane_plugin_latex/ant/ant.properties b/freeplane_plugin_latex/ant/ant.properties
new file mode 100644
index 0000000..4f644db
--- /dev/null
+++ b/freeplane_plugin_latex/ant/ant.properties
@@ -0,0 +1,2 @@
+plugin.ext.lib = lib
+jlatexmath.jar = ${plugin.ext.lib}/jlatexmath-0.9.7.jar
diff --git a/freeplane_plugin_latex/ant/build.xml b/freeplane_plugin_latex/ant/build.xml
new file mode 100644
index 0000000..6b56abb
--- /dev/null
+++ b/freeplane_plugin_latex/ant/build.xml
@@ -0,0 +1,61 @@
+<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 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="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_latex/lib/COPYING b/freeplane_plugin_latex/lib/COPYING
new file mode 100644
index 0000000..e37680c
--- /dev/null
+++ b/freeplane_plugin_latex/lib/COPYING
@@ -0,0 +1,280 @@
+ 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
diff --git a/freeplane_plugin_latex/lib/LICENSE b/freeplane_plugin_latex/lib/LICENSE
new file mode 100644
index 0000000..2851b5f
--- /dev/null
+++ b/freeplane_plugin_latex/lib/LICENSE
@@ -0,0 +1,43 @@
+JLaTeXMath Library - Displays LaTeX commands
+JLateXMath is an fork of JMathTeX with a lot of modifications to support
+many more LaTeX commands, drop of the jdom dependency and easy evolution
+capabilities.
+
+Copyright (C) 2009-2011 DENIZET Calixte
+Copyright (C) Kris Coolsaet
+Copyright (C) Nico Van Cleemput
+Copyright (C) Kurt Vermeulen
+Copyright 2004-2007 Universiteit Gent
+
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+
+
+The archive contains several fonts :
+1) the fonts eufb10.ttf, eufm10.ttf, msam10.ttf and msbm10.ttf are under OFL (Open Font License);
+
+2) the font dsrom10.ttf is under a free license;
+
+3) the font stmary10.ttf and rsfs10.ttf are in PD (Public Domain);
+
+4) the fonts cmbsy10.ttf, cmbx10.ttf, cmbxti10.ttf, cmex10.ttf, cmmi10.ttf, cmr10.ttf, cmss10.ttf, cmssbx10.ttf, cmsy10.ttf and cmtt10.ttf are under Knuth License.
+
+5) the greek fonts fcmbipg.ttf, fcmripg.tff, fcmrpg.ttf, fcsropg.ttf, fcmbpg.ttf, fcsbpg.ttf, fctrpg.ttf, fcsrpg.ttf are under GNU GPL version 2.
+
+6) the cyrillic fonts wnbx10.ttf, wnss10.ttf, wnti10.ttf, wnr10.ttf, wnssi10.ttf, wnbxti10.ttf, wnssbx10.ttf, wntt10.ttf are under Knuth License.
+
+You can find a copy of these licenses in org/scilab/forge/jlatexmath/fonts/licences.
\ No newline at end of file
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java
new file mode 100644
index 0000000..7d427fb
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java
@@ -0,0 +1,50 @@
+package org.freeplane.plugin.latex;
+
+import java.util.Hashtable;
+
+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 {
+ /*
+ * (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();
+ }
+ }, 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/org/freeplane/plugin/latex/DeleteLatexAction.java
new file mode 100644
index 0000000..f60b6d0
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/DeleteLatexAction.java
@@ -0,0 +1,61 @@
+/*
+ * 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 org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ * This class is called when a LaTeX formula is deleted
+ */
+ at EnabledAction(checkOnNodeChange = true)
+public class DeleteLatexAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+ private final LatexNodeHook nodeHook;
+
+ public DeleteLatexAction(final LatexNodeHook nodeHook) {
+ super("LatexDeleteLatexAction");
+ this.nodeHook = nodeHook;
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
+ if (latexExtension != null) {
+ nodeHook.undoableDeactivateHook(node);
+ Controller.getCurrentModeController().getMapController()
+ .nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ return;
+ }
+ }
+
+ @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/EditLatexAction.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/EditLatexAction.java
new file mode 100644
index 0000000..4739023
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/EditLatexAction.java
@@ -0,0 +1,30 @@
+package org.freeplane.plugin.latex;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This class is called when a Latex formula is edited
+ */
+public class EditLatexAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private final LatexNodeHook nodeHook;
+
+ public EditLatexAction(final LatexNodeHook nodeHook) {
+ super("LatexEditLatexAction");
+ this.nodeHook = nodeHook;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ nodeHook.editLatexInEditor(node);
+ Controller.getCurrentModeController().getMapController()
+ .nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java
new file mode 100644
index 0000000..319aadc
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java
@@ -0,0 +1,62 @@
+/*
+ * 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 org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This class is called when a LaTeX formula is inserted into
+ * (added to) a node
+ */
+ 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) {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
+ if (latexExtension == null) {
+ nodeHook.editLatexInEditor(node);
+ Controller.getCurrentModeController().getMapController()
+ .nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ return;
+ }
+ }
+
+ @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
new file mode 100644
index 0000000..73735e1
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexEditor.java
@@ -0,0 +1,110 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Stefan Ott 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.latex;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.JDialog;
+import javax.swing.JEditorPane;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.KeyStroke;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.WindowConstants;
+
+import org.freeplane.core.resources.ResourceController;
+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;
+
+/**
+ * @author Stefan Ott
+ *
+ * This class has only one static method to show the editor for Latex-fomulas
+ */
+public class LatexEditor {
+ @SuppressWarnings("serial")
+ private static final class DialogCloser extends AbstractAction {
+ private JDialog dialog;
+ private boolean closed = false;
+
+ boolean isClosed() {
+ return closed;
+ }
+
+ public DialogCloser(JDialog dialog) {
+ this.dialog = dialog;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ closed = true;
+ dialog.dispose();
+ }
+ }
+
+ /**
+ * This method shows the Latex editor and sets the equation to be rendered from Latex
+ *
+ * @param oldEquation: previous equation
+ * @param node: the node that is edited (is used to position editor window)
+ *
+ */
+ public static String editLatex(final String oldEquation, final NodeModel node) {
+ final JEditorPane textArea = new JEditorPane();
+ textArea.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
+ final JScrollPane editorScrollPane = new JScrollPane(textArea);
+ editorScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+ editorScrollPane.setPreferredSize(new Dimension(700, 200));
+ final JOptionPane editPane = new JOptionPane(editorScrollPane, JOptionPane.PLAIN_MESSAGE,
+ JOptionPane.OK_CANCEL_OPTION) {
+ private static final long serialVersionUID = 1L;
+
+ //set initial focus to textArea
+ @Override
+ public void selectInitialValue() {
+ textArea.requestFocusInWindow();
+ }
+ };
+ final JDialog edit = editPane.createDialog(null, TextUtils.getText("plugins/latex/LatexNodeHook.editorTitle"));
+ edit.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ // set content and rendering for textArea
+ textArea.setContentType("text/groovy"); /* text/groovy is from JSyntaxPane */
+ textArea.setText(oldEquation);
+ //make Alt+ Enter confirm the dialog
+ final DialogCloser dialogCloser = new DialogCloser(edit);
+ textArea.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.ALT_MASK, false), dialogCloser);
+ textArea.getActionMap().put(dialogCloser, dialogCloser);
+ //position editor below node
+ Controller.getCurrentModeController().getController().getViewController().scrollNodeToVisible(node);
+ if (ResourceController.getResourceController().getBooleanProperty("el__position_window_below_node")) {
+ UITools.setDialogLocationUnder(edit, node);
+ }
+ edit.setVisible(true);
+ if (dialogCloser.isClosed() || editPane.getValue().equals(JOptionPane.OK_OPTION)) {
+ final String eq = textArea.getText();
+ return eq;
+ }
+ return null;
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexExtension.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexExtension.java
new file mode 100644
index 0000000..0572fe4
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexExtension.java
@@ -0,0 +1,63 @@
+/*
+ * 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.util.LinkedHashSet;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.12.2008
+ */
+class LatexExtension implements IExtension {
+ private String equation;
+ final private Set<NodeView> viewers;
+
+ public LatexExtension() {
+ equation = "";
+ viewers = new LinkedHashSet<NodeView>();
+ }
+
+ public String getEquation() {
+ return equation;
+ }
+
+ Set<NodeView> getViewers() {
+ return viewers;
+ }
+
+ void removeViewers() {
+ for (final NodeView nodeView : viewers) {
+ nodeView.removeContent(LatexNodeHook.VIEWER_POSITION);
+ }
+ viewers.clear();
+ }
+
+ public void setEquation(final String equation) {
+ this.equation = equation;
+ for (final NodeView nodeView : viewers) {
+ final LatexViewer comp = (LatexViewer) nodeView.getContent(LatexNodeHook.VIEWER_POSITION);
+ comp.setModel(this);
+ }
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java
new file mode 100644
index 0000000..a45f5a6
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java
@@ -0,0 +1,207 @@
+/*
+ * 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 = LatexEditor.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 = LatexEditor.editLatex("", node);
+ }
+ //if LaTeX is present edit it
+ else {
+ equation = LatexEditor.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
new file mode 100644
index 0000000..025c2f2
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRegistration.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.plugin.latex;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @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() == "MindMap") {
+ modeController.addAction(new InsertLatexAction(nodeHook));
+ modeController.addAction(new EditLatexAction(nodeHook));
+ modeController.addAction(new DeleteLatexAction(nodeHook));
+ }
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexViewer.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexViewer.java
new file mode 100644
index 0000000..cb1e202
--- /dev/null
+++ b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexViewer.java
@@ -0,0 +1,137 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Stefan Ott 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.latex;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+
+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.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.scilab.forge.jlatexmath.TeXConstants;
+import org.scilab.forge.jlatexmath.TeXFormula;
+
+class LatexViewer extends JComponent {
+ private static final int DEFAULT_FONT_SIZE = Math.round(10 * UITools.FONT_SCALE_FACTOR);
+ static String editorTitle = null;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private float zoom = 0f;
+ @SuppressWarnings("unused")
+ final private LatexNodeHook nodeHook;
+ private LatexExtension model;
+ private TeXFormula teXFormula;
+
+ LatexViewer(final LatexNodeHook nodeHook, final LatexExtension latexExtension) {
+ this.nodeHook = nodeHook;
+ setModel(latexExtension);
+ if (LatexViewer.editorTitle == null) {
+ LatexViewer.editorTitle = TextUtils.getText("plugins/latex/LatexNodeHook.editorTitle");
+ }
+ addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
+ && Controller.getCurrentModeController().getModeName() == "MindMap") {
+ NodeModel node = null;
+ if (e.getSource().getClass() == LatexViewer.class) {
+ final LatexViewer lv = (LatexViewer) e.getSource();
+ for (int i = 0; i < lv.getParent().getComponentCount(); i++) {
+ if (lv.getParent().getComponent(i) instanceof MainView) {
+ final MainView mv = (MainView) lv.getParent().getComponent(i);
+ node = mv.getNodeView().getModel();
+ break;
+ }
+ }
+ if (node == null) {
+ node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ }
+ nodeHook.editLatexInEditor(node);
+ e.consume();
+ return;
+ }
+ }
+ }
+ });
+ }
+
+ private void calculateSize() {
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
+ final float mapZoom = mapView.getZoom();
+ if (mapZoom == zoom) {
+ return;
+ }
+ zoom = mapZoom;
+ final Icon latexIcon = teXFormula.createTeXIcon(TeXConstants.STYLE_DISPLAY, DEFAULT_FONT_SIZE * zoom);
+ final Insets insets = getInsets();
+ final Dimension dimension = new Dimension(latexIcon.getIconWidth() + insets.left + insets.right,
+ latexIcon.getIconHeight() + insets.top + insets.bottom);
+ setPreferredSize(dimension);
+ }
+
+ @Override
+ public void paint(final Graphics g) {
+ final Icon latexIcon = teXFormula.createTeXIcon(TeXConstants.STYLE_DISPLAY, DEFAULT_FONT_SIZE * zoom);
+ final Insets insets = getInsets();
+ latexIcon.paintIcon(this, g, insets.left, insets.top);
+ super.paint(g);
+ }
+
+ public void setModel(final LatexExtension latexExtension) {
+ model = latexExtension;
+ try {
+ teXFormula = new TeXFormula("\\begin{array}{l} \\raisebox{0}{ "
+ +model.getEquation()
+ +" } \\end{array}"
+ );
+ teXFormula.createTeXIcon(TeXConstants.STYLE_DISPLAY, DEFAULT_FONT_SIZE);
+ }
+ catch (final Exception e) {
+ try {
+ teXFormula = new TeXFormula("\\mbox{" + e.getMessage() + "}");
+ teXFormula.createTeXIcon(TeXConstants.STYLE_DISPLAY, DEFAULT_FONT_SIZE);
+ }
+ catch (final Exception e1) {
+ teXFormula = new TeXFormula("\\mbox{Can not parse given equation}");
+ }
+ }
+ zoom = 0;
+ revalidate();
+ repaint();
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ calculateSize();
+ return super.getPreferredSize();
+ }
+}
diff --git a/freeplane_plugin_script/.classpath b/freeplane_plugin_script/.classpath
new file mode 100644
index 0000000..73aaf82
--- /dev/null
+++ b/freeplane_plugin_script/.classpath
@@ -0,0 +1,10 @@
+<?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="lib/jsyntaxpane"/>
+ <classpathentry kind="lib" path="/freeplane/lib/forms-1.2.1.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/freeplane_plugin_script/.project b/freeplane_plugin_script/.project
new file mode 100644
index 0000000..b5f3eee
--- /dev/null
+++ b/freeplane_plugin_script/.project
@@ -0,0 +1,28 @@
+<?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.resources.prefs b/freeplane_plugin_script/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..5196fcf
--- /dev/null
+++ b/freeplane_plugin_script/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Mon Feb 15 22:57:34 CET 2010
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..3a9a089
--- /dev/null
+++ b/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..6708843
--- /dev/null
+++ b/freeplane_plugin_script/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#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
new file mode 100644
index 0000000..16a669c
--- /dev/null
+++ b/freeplane_plugin_script/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..cb44d23
--- /dev/null
+++ b/freeplane_plugin_script/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.freeplane.plugin.script
+Bundle-SymbolicName: org.freeplane.plugin.script
+Bundle-Version: 1.0.1
+Bundle-Activator: org.freeplane.plugin.script.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/groovy-all.jar,
+ lib/plugin.jar
+Export-Package: org.freeplane.plugin.script
diff --git a/freeplane_plugin_script/ant/ant.properties b/freeplane_plugin_script/ant/ant.properties
new file mode 100644
index 0000000..2b60069
--- /dev/null
+++ b/freeplane_plugin_script/ant/ant.properties
@@ -0,0 +1,3 @@
+plugin.ext.lib = lib
+groovy.jar = ${plugin.ext.lib}/groovy-all.jar
+jsyntaxpane.jar = ${plugin.ext.lib}/jsyntaxpane/jsyntaxpane-jdk5.jar
diff --git a/freeplane_plugin_script/ant/build.xml b/freeplane_plugin_script/ant/build.xml
new file mode 100644
index 0000000..8aae690
--- /dev/null
+++ b/freeplane_plugin_script/ant/build.xml
@@ -0,0 +1,116 @@
+<project name="freeplane_script" default="dist" basedir="..">
+ <property name="workspace" location=".." />
+ <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}:${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="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">
+ <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>
+ </target>
+
+ <target name="prepare-nodehighlighter">
+ <mkdir dir="build-nodehighlighter" />
+ <javac srcdir="src-jsyntaxpane" destdir="build-nodehighlighter" classpath="${classpath}" debug="${debug}"
+ source="${java_source_version}" target="${java_target_version}" encoding="utf8">
+ <exclude name="**/*Test.*" />
+ </javac>
+ <jar jarfile="lib/jsyntaxpane/nodehighlighter.jar">
+ <fileset dir="build-nodehighlighter"/>
+ <fileset dir="src-jsyntaxpane" includes="**/combocompletions.txt"/>
+ </jar>
+ </target>
+
+ <target name="dist" depends="build, prepare-nodehighlighter">
+ <jar jarfile="lib/plugin.jar">
+ <fileset dir="build"/>
+ <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>
+ <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}" access="public" classpath="${classpath}:build">
+ <sourcefiles>
+ <fileset dir="${root}">
+ <include name="**/Proxy.java" />
+ <include name="**/Convertible.java" />
+ <include name="**/FreeplaneScriptBaseClass.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>
+ </target>
+
+</project>
+
diff --git a/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1$1.class b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1$1.class
new file mode 100644
index 0000000..8161574
Binary files /dev/null and b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1$1.class differ
diff --git a/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1.class b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1.class
new file mode 100644
index 0000000..095352a
Binary files /dev/null and b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$1.class differ
diff --git a/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$Status.class b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$Status.class
new file mode 100644
index 0000000..7acadf2
Binary files /dev/null and b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter$Status.class differ
diff --git a/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter.class b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter.class
new file mode 100644
index 0000000..1fb7815
Binary files /dev/null and b/freeplane_plugin_script/build-nodehighlighter/org/freeplane/plugin/script/NodeIdHighLighter.class differ
diff --git a/freeplane_plugin_script/lib/groovy-all-LICENSE.txt b/freeplane_plugin_script/lib/groovy-all-LICENSE.txt
new file mode 100644
index 0000000..e0908d4
--- /dev/null
+++ b/freeplane_plugin_script/lib/groovy-all-LICENSE.txt
@@ -0,0 +1,15 @@
+/*
+ * 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
new file mode 100644
index 0000000..46d3aa2
--- /dev/null
+++ b/freeplane_plugin_script/scripts/apiGenerator.groovy
@@ -0,0 +1,244 @@
+// @ExecutionModes({on_single_node="/menu_bar/help[scripting_api_generator_title]"})
+// Copyright (C) 2009-2011 Dave (Dke211, initial author), Volker Boerchers (adaptation for Freeplane)
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+
+import java.lang.reflect.Method
+import org.freeplane.plugin.script.proxy.Proxy
+import org.freeplane.plugin.script.proxy.Convertible
+
+
+def makeApi(Proxy.Node node, Class clazz, String apiBase) {
+ def classNode = node.createChild(typeToString(clazz))
+ TreeMap<String, Map<String, Object>> memberMap = new TreeMap<String, Map<String, Object>>()
+ classNode.link.text = getApiLink(apiBase, clazz)
+ classNode.style.font.bold = true
+ clazz.getMethods().findAll {
+ it.declaringClass == clazz || it.declaringClass.simpleName.endsWith('RO')
+ }.sort {
+ a,b -> b.name <=> a.name
+ }.each {
+ if (!addProperty(memberMap, it))
+ addMethod(memberMap, it);
+ }
+ classNode.createChild('Package: ' + clazz.getPackage().name)
+ classNode.folded = true
+ memberMap.each { k,v ->
+ createMemberNode(k, v, classNode, apiBase)
+ }
+ // input for freeplane_plugin_script/src-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
+ boolean printCompletionList = false
+ if (printCompletionList && classNode.to.plain == 'Node')
+ printCompletions(memberMap)
+}
+
+def printCompletions(TreeMap<String, Map<String, Object>> memberMap) {
+ TreeSet completions = new TreeSet()
+ completions.addAll(['logger', 'ui', 'htmlUtils', 'textUtils', 'node', 'import', 'def', 'String'])
+ completions.addAll(['single_node', 'selected_node', 'selected_node_recursively'].collect{ "// @ExecutionModes($it)" })
+
+ memberMap.each { memberName,attribs ->
+ if (attribs['method'])
+ completions << memberName + '(|)'
+ else {
+ completions << memberName
+ if (attribs['type_read'] && Collection.class.isAssignableFrom(attribs['type_read'])) {
+ completions << memberName + '.each{ | }'
+ completions << memberName + '.collect{ | }'
+ completions << memberName + '.sum(|){ }'
+ }
+ }
+ }
+ println completions.join("\n")
+}
+
+def createMemberNode(String memberName, Map<String, Object> attribs, Proxy.Node classNode, String apiBase) {
+ Proxy.Node memberNode
+ if (attribs['method']) {
+ memberNode = classNode.createChild(attribs['method'])
+ memberNode.icons.add('bookmark')
+ }
+ else {
+ // property
+ def mode = (attribs['type_read'] ? 'r' : '') + (attribs['type_write'] ? 'w' : '')
+ def type = attribs['type_read'] ? attribs['type_read'] : attribs['type_write']
+ // if (mode == 'rw' && attribs['type_read'] != attribs['type_write']) {
+ // logger.severe("property ${memberName} has differing getter and setter types")
+ // }
+ memberNode = classNode.createChild(formatProperty(memberName, typeToString(type), mode))
+ memberNode.icons.add('wizard')
+ [ 'method_read', 'method_write' ].each {
+ if (attribs[it]) {
+ memberNode.createChild(formatMethod(attribs[it])).icons.add('bookmark')
+ }
+ }
+ }
+ attribs['types'].each {
+ if (it.declaringClass == Proxy.class || it == Convertible.class) {
+ def typeNode = memberNode.createChild(typeToString(it))
+ typeNode.link.text = getApiLink(apiBase, it)
+ }
+ }
+ memberNode.folded = true
+ return memberNode
+}
+
+def getApiLink(String apiBase, Class clazz) {
+ def path = clazz.name.replace('.', '/').replace('$', '.')
+ return apiBase + '/' + path + '.html'
+}
+
+def typeToString(Class clazz) {
+ return clazz.simpleName.replace('Proxy$', '')
+}
+
+// returns a value if this method is a getter or setter otherwise it returns null
+def addProperty(Map<String, Map<String, Object>> memberMap, Method method) {
+ if (isGetter(method) && ! method.parameterTypes) {
+ def propertyMap = getOrCreatePropertiesMap(memberMap, getPropertyName(method))
+ propertyMap['read'] = true
+ propertyMap['type_read'] = method.returnType
+ propertyMap['types'] = [ method.returnType ]
+ propertyMap['method_read'] = method
+ }
+ else if (isSetter(method) && method.parameterTypes.size() == 1) {
+ def propertyMap = getOrCreatePropertiesMap(memberMap, getPropertyName(method))
+ propertyMap['write'] = true
+ propertyMap['type_write'] = method.parameterTypes[0]
+ propertyMap['types'] = [ method.returnType ]
+ propertyMap['method_write'] = method
+ }
+}
+
+def addMethod(Map<String, Map<String, Object>> memberMap, Method method) {
+ def propertyMap = getOrCreatePropertiesMap(memberMap, method.name)
+ propertyMap['types'] = method.parameterTypes
+ propertyMap['method'] = formatMethod(method)
+}
+
+def formatProperty(String property, String type, String mode) {
+ return "<html><body><b>${property}</b>: ${type} (${mode})"
+// Plain text:
+// return "${property}: ${type} (${mode})"
+}
+
+def formatMethod(Method method) {
+ return '<html><body>' + typeToString(method.returnType) +
+ ' <b>' + method.name + '</b>' +
+ '(' + method.parameterTypes.collect{ typeToString(it) }.join(', ') + ')'
+// Plain text:
+// return typeToString(method.returnType) +
+// ' ' + method.name +
+// '(' + method.parameterTypes.collect{ typeToString(it) }.join(', ') + ')'
+}
+
+def isGetter(Method method) {
+ return method.name =~ '^(?:[gs]et|is)[A-Z].*'
+}
+
+def isSetter(Method method) {
+ return method.name =~ '^set[A-Z].*'
+}
+
+/** returns null if this is not a proper bean method name (get/set/is). */
+def getPropertyName(Method method) {
+ def name = method.name.replaceFirst('^(?:[gs]et|is)([A-Z])', '$1')
+ if (name != method.name)
+ return name.substring(0, 1).toLowerCase() + name.substring(1)
+ else
+ return null
+}
+
+private Map getOrCreatePropertiesMap(Map properties, String name) {
+ def propertyMap = properties[name]
+ if (propertyMap == null) {
+ propertyMap = [:]
+ properties[name] = propertyMap
+ }
+ return propertyMap
+}
+
+def initHeading(Proxy.Node node) {
+ node.style.font.bold = true
+}
+
+def createChild(Proxy.Node parent, text, link) {
+ def result = parent.createChild(text)
+ result.link.text = link
+ return result
+}
+
+// == MAIN ==
+def MAP_NAME = textUtils.getText('scripting_api_generator_title')
+def PROXY_NODE = textUtils.getText('scripting_api_generator_proxy')
+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()
+// FIXME: api is installed locally but is there a portable way to find it?
+def apiBase = 'http://freeplane.sourceforge.net/doc/api'
+Proxy.Map newMap = c.newMap()
+def oldName = newMap.name
+newMap.name = MAP_NAME
+newMap.root.text = MAP_NAME
+newMap.root.style.font.bold = true
+newMap.root.link.text = apiBase + '/index.html'
+initHeading(newMap.root)
+
+
+// Proxy
+def proxy = createChild(newMap.root, PROXY_NODE, apiBase + '/org/freeplane/plugin/script/proxy/Proxy.html')
+initHeading(proxy)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Attributes'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Connector'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Controller'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Edge'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$ExternalObject'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Font'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Icons'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Link'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Map'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$Node'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Proxy$NodeStyle'), apiBase)
+makeApi(proxy, Class.forName('org.freeplane.plugin.script.proxy.Convertible'), apiBase)
+
+def utils = createChild(newMap.root, UTILITES_NODE, null)
+initHeading(utils)
+makeApi(utils, Class.forName('org.freeplane.plugin.script.FreeplaneScriptBaseClass'), apiBase)
+makeApi(utils, Class.forName('org.freeplane.core.ui.components.UITools'), apiBase)
+makeApi(utils, Class.forName('org.freeplane.core.util.TextUtils'), apiBase)
+makeApi(utils, Class.forName('org.freeplane.core.util.FreeplaneVersion'), apiBase)
+makeApi(utils, Class.forName('org.freeplane.core.util.HtmlUtils'), apiBase)
+makeApi(utils, Class.forName('org.freeplane.core.util.LogUtils'), apiBase)
+
+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')
+
+def legend = newMap.root.createChild(LEGEND_NODE)
+initHeading(legend)
+def methodLegend = legend.createChild("normal methods have a 'bookmark' icon")
+methodLegend.icons.add('bookmark')
+methodLegend.folded = true
+def propertyLegend = legend.createChild("Groovy properties have a 'wizard' icon")
+propertyLegend.icons.add('wizard')
+propertyLegend.folded = true
+def propertyBasics = propertyLegend.createChild("With properties you can write simpler expressions than with getters and setters")
+propertyBasics.createChild(" node.text = 'Hello, world!'")
+propertyBasics.createChild("instead of")
+propertyBasics.createChild(" node.setText('Hello, world!')")
+propertyLegend.createChild("read-only properties are indicated by a trailing (r)").
+ createChild('if (node.leaf)\n println "the id of this leaf node is " + node.id')
+propertyLegend.createChild("write-only and read-write properties are indicated by a trailing (w) or (rw)").
+ createChild('node.text += " some suffix"')
+propertyLegend.createChild("properties with differing type of setter and getter have two nodes")
+legend.folded = true
+
+c.deactivateUndo()
+newMap.saved = true
diff --git a/freeplane_plugin_script/scripts/freeplane.dsld b/freeplane_plugin_script/scripts/freeplane.dsld
new file mode 100644
index 0000000..aae6567
--- /dev/null
+++ b/freeplane_plugin_script/scripts/freeplane.dsld
@@ -0,0 +1,58 @@
+import java.net.URI;
+
+(enclosingScript()).accept {
+ provider = 'Freeplane'
+
+ property name: 'c', type: 'org.freeplane.plugin.script.proxy.Proxy.Controller'
+ property name: 'node', type: 'org.freeplane.plugin.script.proxy.Proxy.Node'
+ property name: 'logger', type: 'org.freeplane.core.util.LogUtils'
+ property name: 'ui', type: 'org.freeplane.core.ui.components.UITools'
+ property name: 'htmlUtils', type: 'org.freeplane.core.util.HtmlUtils'
+ property name: 'textUtils', type: 'org.freeplane.core.util.TextUtils'
+ property name: 'config', type: 'org.freeplane.plugin.script.FreeplaneScriptBaseClass.ConfigProperties'
+
+ method name: 'N',
+ type: 'org.freeplane.plugin.script.proxy.Proxy.Node',
+ params: [id: 'java.lang.String'],
+ doc: 'returns the node with the given id or null if not available'
+ method name: 'T',
+ type: 'java.lang.String',
+ params: [id: 'java.lang.String'],
+ doc: 'returns the text of the node with the given id or null if the node is not available'
+ method name: 'V',
+ type: 'java.lang.Object',
+ params: [id: 'java.lang.String'],
+ doc: 'returns the value of the node with the given id or null if the node is not available'
+ method name: 'ifNull',
+ type: 'java.lang.Object',
+ params: [value: 'java.lang.String', valueIfNull: 'java.lang.Object'],
+ doc: 'returns valueIfNull if value is null and value otherwise'
+ method name: 'round',
+ type: 'java.lang.Long',
+ params: [d: 'java.lang.Double'],
+ doc: 'rounds a number to integral type'
+ method name: 'round',
+ type: 'java.lang.Double',
+ params: [d: 'java.lang.Double', precision: 'java.lang.Integer'],
+ doc: 'round to the given number of decimal places: round(0.1234, 2) -> 0.12'
+ method name: 'parse',
+ type: 'java.lang.Object',
+ params: [text: 'java.lang.String'],
+ doc: 'parses text to the proper data type, if possible, setting format to the standard.'
+ method name: 'format',
+ type: 'java.lang.Object',
+ params: [object: 'java.lang.Object', formatString: 'java.lang.String'],
+ doc: 'uses formatString to return a FormattedObject'
+ method name: 'format',
+ type: 'java.lang.Object',
+ params: [object: 'java.lang.Object'],
+ doc: 'Applies default date-time format for dates or default number format for numbers'
+ method name: 'toString',
+ type: 'java.lang.String',
+ params: [object: 'java.lang.Object'],
+ doc: 'formats according to the internal standard'
+ method name: 'loadUri',
+ type: 'void',
+ params: [object: 'java.net.URI'],
+ doc: 'opens a URI'
+}
diff --git a/freeplane_plugin_script/scripts/installScriptAddOn.groovy b/freeplane_plugin_script/scripts/installScriptAddOn.groovy
new file mode 100644
index 0000000..343226f
--- /dev/null
+++ b/freeplane_plugin_script/scripts/installScriptAddOn.groovy
@@ -0,0 +1,545 @@
+// @ExecutionModes({on_single_node="main_menu_scripting/scripts[addons.installer.title]"})
+// Copyright (C) 2011 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.
+
+import groovy.swing.SwingBuilder
+
+import java.awt.Component;
+import java.awt.Dimension
+import java.awt.FlowLayout
+import java.awt.Toolkit
+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.WordUtils
+import org.freeplane.core.resources.ResourceController
+import org.freeplane.core.ui.MenuBuilder
+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.ScriptingEngine
+import org.freeplane.plugin.script.ScriptingPermissions
+import org.freeplane.plugin.script.addons.AddOnDetailsPanel
+import org.freeplane.plugin.script.addons.ScriptAddOnProperties
+import org.freeplane.plugin.script.proxy.Proxy
+
+//
+// == script bindings (globals) ==
+//
+dialogTitle = textUtils.getText('addons.installer.title')
+installationbase = c.userDirectory
+addonsUrl = "http://freeplane.sourceforge.net/addons"
+
+// parse result
+configMap = [:]
+
+//
+// == methods ==
+//
+
+def terminate(String message) {
+ throw new Exception(textUtils.getText('addons.installer.canceled') + ': ' + message)
+}
+
+def confirm(String question) {
+ final int selection = JOptionPane.showConfirmDialog(ui.frame, question, dialogTitle, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+ return selection == JOptionPane.OK_OPTION
+}
+
+boolean yesNoOrTerminate(String question) {
+ final int selection = JOptionPane.showConfirmDialog(ui.frame, question, dialogTitle, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+ if (selection != JOptionPane.YES_OPTION)
+ throw new Exception(textUtils.getText('addons.installer.canceled'))
+ return selection == JOptionPane.YES_OPTION
+}
+
+def mapStructureAssert(check, String issue) {
+ if (! check)
+ throw new Exception(WordUtils.wrap(textUtils.format('addons.installer.map.structure', issue), 80, null, true))
+}
+
+def installationAssert(boolean check, String issue) {
+ if (! check)
+ throw new Exception(textUtils.format('addons.installer.failed', issue))
+}
+
+def parseProperties(Map childNodeMap) {
+ def property = 'properties'
+ Proxy.Node propertyNode = node.map.root
+ configMap[property] = propertyNode.attributes.map.inject([:]){ map, k, v ->
+ if (v)
+ map[k] = k.startsWith('freeplaneVersion') ? parseFreeplaneVersion(k, v) : v
+ return map
+ }
+ configMap[property]['title'] = propertyNode.plainText
+ def mandatoryPropertyNames = [
+ 'name',
+ 'version',
+ 'author',
+ 'freeplaneVersionFrom'
+ // optional: 'freeplaneVersionTo'
+ ]
+ def missingProperties = mandatoryPropertyNames.findAll {
+ ! configMap[property][it]
+ }
+ mapStructureAssert( ! missingProperties, textUtils.format('addons.installer.missing.properties', missingProperties))
+ configMap[property]['homepage'] = propertyNode.link.text ?
+ propertyNode.link.uri.toURL() : new URL(expandVariables(addonsUrl + '/${name}'))
+ println property + ': ' + configMap[property]
+}
+
+def checkFreeplaneVersion(Map configMap) {
+ FreeplaneVersion currentVersion = c.freeplaneVersion
+ def versionFrom = configMap['properties']['freeplaneVersionFrom']
+ if (currentVersion.isOlderThan(versionFrom))
+ terminate(textUtils.format('addons.installer.too.old', currentVersion, versionFrom))
+ def versionTo = configMap['properties'].get('freeplaneVersionTo')
+ if (versionTo && currentVersion.isNewerThan(versionTo))
+ terminate(textUtils.format('addons.installer.too.new', currentVersion, versionTo))
+}
+
+def parseFreeplaneVersion(String propertyName, String versionString) {
+ try {
+ if (versionString)
+ return FreeplaneVersion.getVersion(versionString.replaceFirst('^v', ''))
+ return null
+ }
+ catch (Exception e) {
+ e.printStackTrace()
+ mapStructureAssert(false, textUtils.format('addons.installer.freeplaneversion.format.error', propertyName, versionString))
+ }
+}
+
+def parseDescription(Map childNodeMap) {
+ def property = 'description'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = theOnlyChild(propertyNode).text
+ println property + ': ' + configMap[property]
+}
+
+def parseLicence(Map childNodeMap) {
+ def property = 'license'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = theOnlyChild(propertyNode).text
+ println property + ': ' + configMap[property]
+}
+
+def parseTranslations(Map childNodeMap) {
+ def property = 'translations'
+ Proxy.Node propertyNode = childNodeMap[property]
+ // a Map<locale, Map<key, translation>>
+
+ def translationsMap = propertyNode.children.inject([:]){ map, localeNode ->
+ def locale = localeNode.plainText
+ map[locale] = localeNode.attributes.map.inject([:]){ localeMap, k, v ->
+ localeMap[expandVariables(k)] = v
+ return localeMap
+ }
+ def key = ScriptAddOnProperties.getNameKey(configMap['properties']['name'])
+ def expKey = expandVariables(key)
+ mapStructureAssert(map[locale][expKey], textUtils.format('addons.installer.missing.translation', key, locale))
+ return map
+ }
+ configMap[property] = translationsMap
+ println property + ': ' + configMap[property]
+}
+
+def parsePreferencesXml(Map childNodeMap) {
+ def property = 'preferences.xml'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = propertyNode.isLeaf() ? null : propertyNode.children[0].text
+ println property + ': ' + configMap[property]
+}
+
+def parseDefaultProperties(Map childNodeMap) {
+ def property = 'default.properties'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = propertyNode.attributes.map.inject([:]){ map, k, v ->
+ map[expandVariables(k)] = expandVariables(v)
+ return map
+ }
+ println property + ': ' + configMap[property]
+}
+
+def parseZips(Map childNodeMap) {
+ def property = 'zips'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = propertyNode.children.collect{ ensureNoHtml(theOnlyChild(it)).binary }
+ println property + ': ' + configMap[property].dump()
+}
+
+def parseImages(Map childNodeMap) {
+ def property = 'images'
+ Proxy.Node propertyNode = childNodeMap[property]
+ if (!propertyNode)
+ return
+ configMap[property] = propertyNode.children.inject([:]){ map, child ->
+ map[child.plainText] = ensureNoHtml(theOnlyChild(child)).binary
+ return map
+ }
+ println property + ': ' + configMap[property].dump()
+}
+
+def installZips() {
+ File destDir = installationbase
+ configMap['zips'].each{ zipData ->
+ try {
+ unpack(destDir, zipData)
+ } catch (Exception e) {
+ e.printStackTrace()
+ installationAssert(false, e.message);
+ }
+ }
+}
+
+def installImages() {
+ File destDir = new File(installationbase, 'resources/images')
+ destDir.mkdirs()
+ configMap['images'].each{ filename, imageData ->
+ try {
+ new File(destDir, expandVariables(filename)).bytes = imageData
+ } catch (Exception e) {
+ e.printStackTrace()
+ installationAssert(false, e.message);
+ }
+ }
+}
+
+void unpack(File destDir, byte[] zipData) {
+ mapStructureAssert(zipData, textUtils.getText('addons.installer.no.zipdata'))
+ ZipInputStream result = new ZipInputStream(new ByteArrayInputStream(zipData))
+ result.withStream{
+ def entry
+ while(entry = result.nextEntry){
+ if (!entry.isDirectory()){
+ def destFile = new File(destDir, entry.name)
+ destFile.parentFile?.mkdirs()
+ def output = new FileOutputStream(destFile)
+ output.withStream{
+ int len = 0;
+ byte[] buffer = new byte[4096]
+ while ((len = result.read(buffer)) > 0){
+ output.write(buffer, 0, len);
+ }
+ }
+ }
+ }
+ }
+}
+
+/** ensures that parent has exactly one non-HTML child node. */
+Proxy.Node theOnlyChild(Proxy.Node parent) {
+ mapStructureAssert(parent.children.size() == 1,
+ textUtils.format('addons.installer.one.child.expected', parent.plainText, parent.children.size()))
+ return parent.children.first()
+}
+
+/** ensures that parent has exactly one non-HTML child node. */
+Proxy.Node ensureNoHtml(Proxy.Node first) {
+ mapStructureAssert( ! htmlUtils.isHtmlNode(first.text), textUtils.getText('addons.installer.html.script'))
+ return first
+}
+
+def parseScripts(Map childNodeMap) {
+ def property = 'scripts'
+ Proxy.Node propertyNode = childNodeMap[property]
+ configMap[property] = propertyNode.children.inject([]){ scripts, scriptNode ->
+ def script = new ScriptAddOnProperties.Script()
+ script.name = expandVariables(scriptNode.plainText)
+ script.file = new File(ScriptingEngine.getUserScriptDir(), script.name)
+ script.scriptBody = ensureNoHtml(theOnlyChild(scriptNode)).text
+ mapStructureAssert( ! htmlUtils.isHtmlNode(script.scriptBody), textUtils.getText('addons.installer.html.script'))
+ scriptNode.attributes.map.each { k,v ->
+ if (k == 'executionMode')
+ script[k] = ScriptAddOnProperties.parseExecutionMode(v)
+ else if ( ! k.toString().toLowerCase().startsWith('execute_scripts_'))
+ script[k] = expandVariables(v)
+ }
+ script.permissions = parsePermissions(scriptNode, script.name)
+ mapStructureAssert(script.name.endsWith('.groovy'), textUtils.format('addons.installer.groovy.script.name', script.name))
+ mapStructureAssert(script.menuTitleKey, textUtils.format('addons.installer.script.no.menutitle', script))
+ mapStructureAssert(script.menuLocation, textUtils.format('addons.installer.script.no.menulocation', script))
+ mapStructureAssert(script.executionMode, textUtils.format('addons.installer.script.no.execution_mode', script))
+ mapStructureAssert(script.permissions, textUtils.format('addons.installer.script.no.permissions', script))
+ scripts << script
+ return scripts
+ }
+// mapStructureAssert(configMap[property], textUtils.getText('addons.installer.no.scripts'))
+ println property + ': ' + configMap[property].dump()
+}
+
+void createKeyboardShortcut(ScriptAddOnProperties.Script script) {
+ def newShortcut = script.keyboardShortcut
+ // 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
+ }
+ }
+ }
+ println "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;
+}
+
+ScriptingPermissions parsePermissions(Proxy.Node propertyNode, String scriptName) {
+ def permissionNames = ScriptingPermissions.permissionNames.findAll { it.startsWith('execute_') }
+ def missingPermissions = permissionNames.findAll{ !propertyNode[it] }
+ mapStructureAssert( ! missingPermissions, textUtils.format('addons.installer.missing.permission.attribute', scriptName, missingPermissions))
+ def permissions = propertyNode.attributes.map.findAll { k,v -> permissionNames.contains(k) }
+ return new ScriptingPermissions(permissions as Properties)
+}
+
+// a list of [action, file] pairs
+def parseDeinstallationRules(Map childNodeMap) {
+ def property = 'deinstall'
+ Proxy.Node propertyNode = childNodeMap[property]
+ def attribs = propertyNode.attributes
+ // we can't use a simple map since most entries have the same key -> iterate over index
+ configMap[property] = (0..attribs.size()-1).collect {
+ // the right type for AddOnProperties
+ [attribs.getKey(it), expandVariables(attribs.get(it)).trim()] as String[]
+ }
+ def knownDeinstallationRules = [
+ 'delete'
+ ]
+ def unknownDeinstallationRules = attribs.names.findAll{ k -> ! knownDeinstallationRules.contains(k) }
+ mapStructureAssert( ! unknownDeinstallationRules, textUtils.format('addons.installer.unknown.deinstallation.rules', unknownDeinstallationRules))
+ println property + ': ' + configMap[property]
+}
+
+def handlePermissions() {
+ def permissionMap = configMap['permissions']
+ def nonStandardPermissions = permissionMap.keySet().findAll{
+ config.getProperty(it, 'false') == 'false' && permissionMap[it] == true
+ }.collect {
+ textUtils.getText(it)
+ }
+ if (yesNoOrTerminate(textUtils.format('addons.installer.nonstandard.permissions', nonStandardPermissions))) {
+ nonStandardPermissions.each {
+ ResourceController.resourceController.setProperty(it, 'true')
+ }
+ }
+}
+
+def scriptDir() {
+ File dir = new File(installationbase, 'scripts')
+ installationAssert(dir.exists(), null)
+ return dir
+}
+
+def addOnDir() {
+ File dir = new File(installationbase, 'addons')
+ installationAssert(dir.exists(), null)
+ return dir
+}
+
+def createScripts() {
+ List<ScriptAddOnProperties.Script> scripts = configMap['scripts']
+ scripts.each { script ->
+ File file = script.file
+ try {
+ file.text = script.scriptBody
+ }
+ catch (Exception e) {
+ terminate(e.message)
+ }
+ if (script.keyboardShortcut)
+ createKeyboardShortcut(script)
+ }
+}
+
+def expandVariables(String string) {
+ Map variableMap = configMap['properties']
+ // expands strings like "${name}.groovy"
+ string.replaceAll(/\$\{([^}]+)\}/, { match, key -> variableMap[key] ? variableMap[key] : match })
+}
+
+AddOnProperties parse() {
+ def propertyNames = [
+ 'description',
+ 'license',
+ 'translations',
+ 'preferences.xml',
+ 'default.properties',
+ 'scripts',
+ 'zips',
+ 'deinstall',
+ 'images',
+ ]
+ Map<String, Proxy.Node> childNodeMap = propertyNames.inject([:]) { map, key ->
+ map[key] = node.map.root.find{ it.plainText == key }[0]
+ return map
+ }
+ def Map<String, Proxy.Node> missingChildNodes = childNodeMap.findAll{ k,v->
+ v == null
+ }
+ // note: images came after the first beta
+ missingChildNodes.remove('images')
+ mapStructureAssert( ! missingChildNodes, textUtils.format('addons.installer.missing.child.nodes', missingChildNodes.keySet()))
+
+ parseProperties(childNodeMap)
+ checkFreeplaneVersion(configMap)
+ parseDescription(childNodeMap)
+ parseLicence(childNodeMap)
+ parseTranslations(childNodeMap)
+ parsePreferencesXml(childNodeMap)
+ parseDefaultProperties(childNodeMap)
+ parseScripts(childNodeMap)
+ parseZips(childNodeMap)
+ parseImages(childNodeMap)
+ parseDeinstallationRules(childNodeMap)
+
+ def addOn = new ScriptAddOnProperties(configMap['properties']['name'])
+ configMap['properties'].each { k,v ->
+ if (addOn.hasProperty(k))
+ addOn[k] = v
+ else if (k != "title")
+ logger.warn("add-on has no property $k (hopefully that's not bad)")
+ }
+ addOn.description = configMap['description']
+ addOn.license = configMap['license']
+ addOn.translations = configMap['translations']
+ addOn.preferencesXml = configMap['preferences.xml']
+ addOn.defaultProperties = configMap['default.properties']
+ addOn.deinstallationRules = configMap['deinstall']
+ addOn.images = configMap['images'] ? configMap['images'].keySet() : []
+ addOn.scripts = configMap['scripts']
+
+ return addOn
+}
+
+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 warning = textUtils.removeTranslateComment(textUtils.getText('addons.installer.warning'))
+ def addOnDetailsPanel = new AddOnDetailsPanel(addOn, warning)
+ addOnDetailsPanel.maxWidth = 600
+ def installButtonText = installedAddOn ? textUtils.format('addons.installer.update', installedAddOn.version)
+ : textUtils.getText('addons.installer.install')
+
+ def s = new SwingBuilder()
+ s.setVariable('myDialog-properties',[:])
+ def vars = s.variables
+ def dial = s.dialog(title:dialogTitle, id:'myDialog', modal:true,
+ locationRelativeTo:ui.frame, owner:ui.frame, pack:true, preferredSize:dialogPrefSize) {
+ scrollPane() {
+ panel() {
+ boxLayout(axis:BoxLayout.Y_AXIS)
+ widget(addOnDetailsPanel)
+ panel(alignmentX:0f) {
+ flowLayout(alignment:FlowLayout.RIGHT)
+ button(action: action(name: textUtils.getText('cancel'), mnemonic: 'C', closure: {dispose()}))
+ defaultButton = button(id:'defBtn', action: action(name: installButtonText,
+ mnemonic: 'I', defaultButton:true, selected:true, closure: {vars.ok = true; dispose()}))
+ }
+ }
+ }
+ }
+ defaultButton.requestFocusInWindow()
+ ui.addEscapeActionToDialog(dial)
+ ui.setDialogLocationRelativeTo(dial, ui.frame)
+ dial.visible = true
+ if (!vars.ok)
+ return false
+ // 2. license
+ boolean licenseUnchanged = addOn.license && installedAddOn?.license && addOn.license.equals(installedAddOn.license)
+ def license = addOn.license.replaceAll('</?(html|body|head)>', '').trim()
+ def question = textUtils.removeTranslateComment(textUtils.format('addons.installer.confirm.licence', license)).replace("\n", "<p>")
+ if (licenseUnchanged)
+ c.statusInfo = textUtils.getText('addons.installer.licence.unchanged')
+ if (addOn.license && !licenseUnchanged && !confirm(question))
+ return false
+ // really bother the user with such details?
+ // 3. permissions
+ // handlePermissions()
+ return true
+}
+
+def install(AddOnProperties addOn) {
+ createScripts()
+ installZips()
+ installImages()
+ new File(addOnDir(), expandVariables('${name}.script.xml')).text = addOn.toXmlString()
+}
+
+// == main ==
+try {
+ def addOn = parse()
+ AddOnsController.registerAddOnResources(addOn, ResourceController.resourceController)
+ def installedAddOn = AddOnsController.getController().getInstalledAddOn(addOn.name)
+ def isUpdate = installedAddOn != null
+ if (confirmInstall(addOn, installedAddOn)) {
+ def message
+ if (isUpdate) {
+ AddOnsController.getController().deinstall(installedAddOn)
+ message = textUtils.format('addons.installer.success.update', installedAddOn.version, addOn.version)
+ }
+ else {
+ message = textUtils.getText('addons.installer.success')
+ }
+ install(addOn)
+ JOptionPane.showMessageDialog(ui.frame, message, dialogTitle, JOptionPane.INFORMATION_MESSAGE)
+ return addOn
+ }
+ return null
+} catch (Exception e) {
+ JOptionPane.showMessageDialog(ui.frame, e.message, dialogTitle, JOptionPane.ERROR_MESSAGE)
+ logger.warn("installation failure", e)
+ return null
+}
\ No newline at end of file
diff --git a/freeplane_plugin_script/src-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt b/freeplane_plugin_script/src-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
new file mode 100644
index 0000000..315297a
--- /dev/null
+++ b/freeplane_plugin_script/src-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
@@ -0,0 +1,68 @@
+// @ExecutionModes(on_single_node)
+// @ExecutionModes(on_selected_node)
+// @ExecutionModes(on_selected_node_recursively)
+addConnectorTo(|)
+appendBranch(|)
+appendChild(|)
+attributes
+children
+children.collect{ | }
+children.each{ | }
+children.sum(|){ }
+connectorsIn
+connectorsIn.collect{ | }
+connectorsIn.each{ | }
+connectorsIn.sum(|){ }
+connectorsOut
+connectorsOut.collect{ | }
+connectorsOut.each{ | }
+connectorsOut.sum(|){ }
+createChild(|)
+createdAt
+dateTime
+def
+delete(|)
+details
+detailsText
+externalObject
+find(|)
+findAll(|)
+findAllDepthFirst(|)
+folded
+format
+getAt(|)
+getChildPosition(|)
+getNodeLevel(|)
+hasStyle(|)
+hideDetails
+htmlUtils
+icons
+id
+import
+isDescendantOf(|)
+lastModifiedAt
+leaf
+left
+link
+logger
+map
+moveTo(|)
+node
+nodeID
+note
+noteText
+object
+parent
+parentNode
+plainText
+plainTextContent
+putAt(|)
+removeConnector(|)
+root
+style
+text
+textUtils
+to
+ui
+value
+visible
\ No newline at end of file
diff --git a/freeplane_plugin_script/src-jsyntaxpane/org/freeplane/plugin/script/NodeIdHighLighter.java b/freeplane_plugin_script/src-jsyntaxpane/org/freeplane/plugin/script/NodeIdHighLighter.java
new file mode 100644
index 0000000..33135f9
--- /dev/null
+++ b/freeplane_plugin_script/src-jsyntaxpane/org/freeplane/plugin/script/NodeIdHighLighter.java
@@ -0,0 +1,179 @@
+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/groovy/runtime/metaclass/java/lang/StringMetaClass.java b/freeplane_plugin_script/src/groovy/runtime/metaclass/java/lang/StringMetaClass.java
new file mode 100644
index 0000000..837e993
--- /dev/null
+++ b/freeplane_plugin_script/src/groovy/runtime/metaclass/java/lang/StringMetaClass.java
@@ -0,0 +1,39 @@
+package groovy.runtime.metaclass.java.lang;
+
+import groovy.lang.DelegatingMetaClass;
+import groovy.lang.MetaClass;
+
+import org.freeplane.plugin.script.proxy.Convertible;
+
+/** Make Convertible known to class String and let String handle Convertibles as if they were Strings
+ * (via Convertible.getText(). */
+public class StringMetaClass extends DelegatingMetaClass {
+ public StringMetaClass(MetaClass delegate) {
+ super(delegate);
+ }
+
+ @Override
+ public Object invokeMethod(Object object, String methodName, Object[] arguments) {
+ replaceConvertibleByText(arguments);
+ return super.invokeMethod(object, methodName, arguments);
+ }
+
+ @Override
+ public Object invokeStaticMethod(Object object, String methodName, Object[] arguments) {
+ replaceConvertibleByText(arguments);
+ return super.invokeStaticMethod(object, methodName, arguments);
+ }
+
+ @Override
+ public Object invokeConstructor(Object[] arguments) {
+ replaceConvertibleByText(arguments);
+ return super.invokeConstructor(arguments);
+ }
+
+ private void replaceConvertibleByText(Object[] arguments) {
+ for (int i = 0; i < arguments.length; i++) {
+ if (arguments[i] instanceof Convertible)
+ arguments[i] = ((Convertible) arguments[i]).getText();
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java
new file mode 100644
index 0000000..e1e404f
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java
@@ -0,0 +1,34 @@
+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);
+ JSyntaxPaneProxy.init(context);
+ }
+
+ /*
+ * (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/EvaluationDependencies.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/EvaluationDependencies.java
new file mode 100644
index 0000000..730ccab
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/EvaluationDependencies.java
@@ -0,0 +1,96 @@
+package org.freeplane.plugin.script;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+public class EvaluationDependencies implements IExtension{
+ public enum Access {
+ NODE, BRANCH, ALL
+ }
+
+ private HashMap<NodeModel, HashSet<NodeModel>> onNodeDependencies = new HashMap<NodeModel, HashSet<NodeModel>>();
+ // FIXME: organize node and branch dependencies in a tree?
+ private HashMap<NodeModel, HashSet<NodeModel>> onBranchDependencies = new HashMap<NodeModel, HashSet<NodeModel>>();
+ private HashSet<NodeModel> onAnyNodeDependencies = new HashSet<NodeModel>();
+
+ public Set<NodeModel> getDependencies(Set<NodeModel> result, final NodeModel node) {
+ final HashSet<NodeModel> onNode = onNodeDependencies.get(node);
+ if (onNode != null)
+ addRecursively(result, onNode);
+ for (Entry<NodeModel, HashSet<NodeModel>> entry : onBranchDependencies.entrySet()) {
+ if (node.isDescendantOf(entry.getKey()))
+ addRecursively(result, entry.getValue());
+ }
+ addRecursively(result, onAnyNodeDependencies);
+// System.out.println("dependencies on(" + node + "): " + result);
+ return result;
+ }
+
+ private void addRecursively(Set<NodeModel> dependentNodes, final HashSet<NodeModel> nodesToAdd) {
+ for (NodeModel node : nodesToAdd) {
+ // avoid loops
+ if (dependentNodes.add(node))
+ dependentNodes.addAll(getDependencies(dependentNodes, node));
+ }
+ }
+
+ /** accessedNode was accessed when formulaNode was evaluated. */
+ public void accessNode(NodeModel formulaNode, NodeModel accessedNode) {
+ // FIXME: check if accessedNode is already covered by other accessModes
+ getDependencySet(accessedNode, onNodeDependencies).add(formulaNode);
+// System.out.println(formulaNode + " accesses " + accessedNode + ". current dependencies:\n" + this);
+ }
+
+ /** accessedNode.children was accessed when formulaNode was evaluated. */
+ public void accessBranch(NodeModel formulaNode, NodeModel accessedNode) {
+ // FIXME: check if accessedNode is already covered by other accessModes
+ getDependencySet(accessedNode, onBranchDependencies).add(formulaNode);
+// System.out.println(formulaNode + " accesses branch of " + accessedNode + ". current dependencies:\n" + this);
+ }
+
+ /** a method was used on the formulaNode that may use any node in the map. */
+ public void accessAll(NodeModel formulaNode) {
+ // FIXME: check if accessedNode is already covered by other accessModes
+ onAnyNodeDependencies.add(formulaNode);
+// System.out.println(formulaNode + " accesses all nodes. current dependencies:\n" + this);
+ }
+
+ private HashSet<NodeModel> getDependencySet(final NodeModel accessedNode,
+ final HashMap<NodeModel, HashSet<NodeModel>> dependenciesMap) {
+ HashSet<NodeModel> set = dependenciesMap.get(accessedNode);
+ if (set == null) {
+ set = new HashSet<NodeModel>();
+ dependenciesMap.put(accessedNode, set);
+ }
+ return set;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for (Entry<NodeModel, HashSet<NodeModel>> entry : onNodeDependencies.entrySet()) {
+ builder.append("onNode (" + entry.getKey().getText() + "):\n");
+ for (NodeModel nodeModel : entry.getValue()) {
+ builder.append(" " + nodeModel + "\n");
+ }
+ }
+ for (Entry<NodeModel, HashSet<NodeModel>> entry : onBranchDependencies.entrySet()) {
+ builder.append("onBranch (" + entry.getKey().getText() + "):\n");
+ for (NodeModel nodeModel : entry.getValue()) {
+ builder.append(" " + nodeModel + "\n");
+ }
+ }
+ if (!onAnyNodeDependencies.isEmpty()) {
+ builder.append("onAnyNode:\n");
+ for (NodeModel nodeModel : onAnyNodeDependencies) {
+ builder.append(" " + nodeModel + "\n");
+ }
+ }
+ return builder.toString();
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java
new file mode 100644
index 0000000..48a4dad
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java
@@ -0,0 +1,104 @@
+/*
+ * 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.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 script;
+ private final ExecutionMode mode;
+ private ScriptingPermissions permissions;
+
+ public ExecuteScriptAction(final String scriptName, final String menuItemName, final String script,
+ final ExecutionMode mode, final boolean cacheContent, ScriptingPermissions permissions) {
+ super(ExecuteScriptAction.makeMenuItemKey(scriptName, mode), menuItemName, null);
+ this.script = new File(script);
+ this.mode = mode;
+ this.permissions = permissions;
+ }
+
+ public static String makeMenuItemKey(final String scriptName, final ExecutionMode mode) {
+ return scriptName + "_" + mode.toString().toLowerCase();
+ }
+
+ 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.)
+ ScriptingEngine.executeScriptRecursive(node, script, permissions);
+ }
+ else {
+ ScriptingEngine.executeScript(node, script, permissions);
+ }
+ }
+ catch (ExecuteScriptException ex) {
+ LogUtils.warn("error executing script " + script + " - giving up", ex);
+ modeController.delayedRollback();
+ ScriptingEngine.showScriptExceptionErrorMessage(ex);
+ return;
+ }
+ }
+ modeController.delayedCommit();
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptException.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptException.java
new file mode 100644
index 0000000..b65013b
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptException.java
@@ -0,0 +1,17 @@
+package org.freeplane.plugin.script;
+
+public class ExecuteScriptException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public ExecuteScriptException(String message, Throwable e) {
+ super(message, e);
+ }
+
+ public ExecuteScriptException(String message) {
+ super(message);
+ }
+
+ public ExecuteScriptException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java
new file mode 100644
index 0000000..c9a7d7f
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java
@@ -0,0 +1,31 @@
+package org.freeplane.plugin.script;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class ExecuteScriptForAllNodes extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public ExecuteScriptForAllNodes() {
+ super("ExecuteScriptForAllNodes");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentController().getMap().getRootNode();
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try {
+ ScriptingEngine.performScriptOperationRecursive(node);
+ }
+ catch (ExecuteScriptException ex) {
+ LogUtils.warn(ex);
+ ScriptingEngine.showScriptExceptionErrorMessage(ex);
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java
new file mode 100644
index 0000000..d58feeb
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java
@@ -0,0 +1,44 @@
+package org.freeplane.plugin.script;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class ExecuteScriptForSelectionAction extends AMultipleNodeAction {
+ private static final long serialVersionUID = 1L;
+ private boolean success;
+
+ public ExecuteScriptForSelectionAction() {
+ super("ExecuteScriptForSelectionAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ success = true;
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try {
+ super.actionPerformed(e);
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ if (!success) {
+ return;
+ }
+ try {
+ ScriptingEngine.performScriptOperation(node);
+ }
+ catch (ExecuteScriptException ex) {
+ LogUtils.warn(ex);
+ ScriptingEngine.showScriptExceptionErrorMessage(ex);
+ success = false;
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java
new file mode 100644
index 0000000..09a9cdb
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java
@@ -0,0 +1,153 @@
+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.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");
+ private 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 boolean containsFormula(final String text) {
+ return text != null && text.length() > 1 && text.charAt(0) == '=';
+ }
+
+ 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
new file mode 100644
index 0000000..fd94e6e
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java
@@ -0,0 +1,252 @@
+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.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.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. */
+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 */
+ public Object parse(final String text) {
+ return ScannerController.getController().parse(text);
+ }
+
+ /** uses formatString to return a FormattedObject.
+ * @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);
+ }
+
+ /** 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/JSyntaxPaneProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/JSyntaxPaneProxy.java
new file mode 100644
index 0000000..d1233c2
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/JSyntaxPaneProxy.java
@@ -0,0 +1,125 @@
+/*
+ * 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.script;
+
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 6, 2010
+ */
+public class JSyntaxPaneProxy {
+ private static URLClassLoader loader;
+ private static Class<?> editorKit;
+ private static Class<?> actionUtils;
+ private static Method getLineNumberMethod;
+ private static Method setCaretPositionMethod;
+
+ static void init(BundleContext context) {
+ if (loader != null) {
+ return;
+ }
+ URL jsyntaxpaneJar;
+ URL nodehighlighterJar;
+ try {
+ final URL pluginUrl = context.getBundle().getEntry("/");
+ if (Compat.isLowerJdk(Compat.VERSION_1_6_0)) {
+ jsyntaxpaneJar = new URL(pluginUrl, "lib/jsyntaxpane/jsyntaxpane-jdk5.jar");
+ }
+ else {
+ jsyntaxpaneJar = new URL(pluginUrl, "lib/jsyntaxpane/jsyntaxpane.jar");
+ }
+ nodehighlighterJar = new URL(pluginUrl, "lib/jsyntaxpane/nodehighlighter.jar");
+ }
+ catch (MalformedURLException e1) {
+ e1.printStackTrace();
+ return;
+ }
+ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ final URL[] urls = new URL[] { jsyntaxpaneJar, nodehighlighterJar };
+ loader = new URLClassLoader(urls, JSyntaxPaneProxy.class.getClassLoader());
+ try {
+ editorKit = loader.loadClass("jsyntaxpane.DefaultSyntaxKit");
+ Thread.currentThread().setContextClassLoader(loader);
+ editorKit.getMethod("initKit").invoke(null);
+ actionUtils = loader.loadClass("jsyntaxpane.actions.ActionUtils");
+ final String components = "jsyntaxpane.components.PairsMarker" //
+ + ", jsyntaxpane.components.LineNumbersRuler" //
+ + ", jsyntaxpane.components.TokenMarker" //
+ + ", org.freeplane.plugin.script.NodeIdHighLighter";
+ final Class<?> groovySyntaxKit = loader.loadClass("jsyntaxpane.syntaxkits.GroovySyntaxKit");
+ try{
+ loader.loadClass("org.freeplane.plugin.script.NodeIdHighLighter");
+ if (Compat.isLowerJdk(Compat.VERSION_1_6_0)) {
+ final Method setPropertyMethod = editorKit.getMethod("setProperty", Class.class, String.class, String.class);
+ setPropertyMethod.invoke(null, groovySyntaxKit, "Components", components);
+ }
+ else{
+ final Method setPropertyMethod = editorKit.getMethod("setProperty", String.class, String.class);
+ setPropertyMethod.invoke(groovySyntaxKit.newInstance(), "Components", components);
+ }
+ }
+ catch (Exception e){
+ LogUtils.warn(e);
+ }
+ }
+ catch (Throwable e) {
+ LogUtils.severe(e);
+ throw new RuntimeException(e);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ }
+
+ public static int getLineOfOffset(JTextComponent mScriptTextField, int caretPosition) {
+ try {
+ if(getLineNumberMethod == null){
+ getLineNumberMethod = actionUtils.getMethod("getLineNumber", JTextComponent.class, int.class);
+ }
+ return (Integer)getLineNumberMethod.invoke(null, mScriptTextField, caretPosition);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ return 0;
+ }
+ }
+
+ public static void gotoPosition(JTextComponent mScriptTextField, int line, int col) {
+ try {
+ if(setCaretPositionMethod == null){
+ setCaretPositionMethod = actionUtils.getMethod("setCaretPosition", JTextComponent.class, int.class, int.class);
+ }
+ setCaretPositionMethod.invoke(null, mScriptTextField, line, col);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeArithmeticsCategory.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeArithmeticsCategory.java
new file mode 100644
index 0000000..ff97f56
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeArithmeticsCategory.java
@@ -0,0 +1,46 @@
+package org.freeplane.plugin.script;
+
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
+import org.codehaus.groovy.runtime.typehandling.NumberMath;
+import org.freeplane.plugin.script.proxy.Proxy;
+
+/** provides class Integer, Double etc. with support for arithmetics with nodes (<code>Number <operator> Node</code>).
+ * @see {@link NodeProxy} for <code>Node <operator> Node</code> and <code>Node <operator> Number</code>
+ */
+public class NodeArithmeticsCategory {
+ public static Number and(final Number self, final Proxy.Node node) {
+ return NumberMath.and(self, node.getTo().getNum0());
+ }
+
+ public static Number div(final Number self, final Proxy.Node node) {
+ return NumberMath.divide(self, node.getTo().getNum0());
+ }
+
+ public static Number minus(final Number self, final Proxy.Node node) {
+ return NumberMath.subtract(self, node.getTo().getNum0());
+ }
+
+ public static Number mod(final Number self, final Proxy.Node node) {
+ return NumberMath.mod(self, node.getTo().getNum0());
+ }
+
+ public static Number multiply(final Number self, final Proxy.Node node) {
+ return NumberMath.multiply(self, node.getTo().getNum0());
+ }
+
+ public static Number or(final Number self, final Proxy.Node node) {
+ return NumberMath.or(self, node.getTo().getNum0());
+ }
+
+ public static Number plus(final Number self, final Proxy.Node node) {
+ return NumberMath.add(self, node.getTo().getNum0());
+ }
+
+ public static Number power(final Number self, final Proxy.Node node) {
+ return DefaultGroovyMethods.power(self, node.getTo().getNum0());
+ }
+
+ public static Number xor(final Number self, final Proxy.Node node) {
+ return NumberMath.xor(self, node.getTo().getNum0());
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptComboBoxEditor.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptComboBoxEditor.java
new file mode 100644
index 0000000..b1fe5a2
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptComboBoxEditor.java
@@ -0,0 +1,145 @@
+/*
+ * 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.plugin.script;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JEditorPane;
+import javax.swing.JOptionPane;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class ScriptComboBoxEditor implements ComboBoxEditor {
+
+ final private JButton showEditorBtn;
+ final private List<ActionListener> actionListeners;
+ private String script;
+ private Dimension minimumSize;
+ private Rectangle bounds;
+
+ public ScriptComboBoxEditor() {
+ showEditorBtn = new JButton();
+ final String title = TextUtils.getText("EditScript");
+ UITools.addTitledBorder(showEditorBtn, title, 10);
+ showEditorBtn.setHorizontalAlignment(SwingConstants.LEFT);
+ showEditorBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ editScript(false);
+ }
+ });
+ actionListeners = new LinkedList<ActionListener>();
+ minimumSize = new Dimension(100, 60);
+ }
+
+ public Dimension getMinimumSize() {
+ return minimumSize;
+ }
+
+ public void setMinimumSize(Dimension minimumSize) {
+ this.minimumSize = minimumSize;
+ }
+
+ protected void editScript(boolean selectAll) {
+ JEditorPane textEditor = new JEditorPane();
+ textEditor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
+ final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(textEditor);
+ scrollPane.setMinimumSize(minimumSize);
+ textEditor.setContentType("text/groovy");
+ textEditor.setText(script);
+ if(selectAll){
+ textEditor.selectAll();
+ }
+ String title = TextUtils.getText("plugins/ScriptEditor/window.title");
+ final JOptionPane optionPane = new JOptionPane(scrollPane, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
+ final JDialog dialog = optionPane.createDialog(showEditorBtn, title);
+ dialog.setResizable(true);
+ if(bounds != null)
+ dialog.setBounds(bounds);
+ dialog.setVisible(true);
+ bounds = dialog.getBounds();
+ final Integer result = ((Integer)optionPane.getValue());
+ if(result == null || result != JOptionPane.OK_OPTION)
+ return;
+ script = textEditor.getText();
+ setButtonText();
+ final ActionEvent actionEvent = new ActionEvent(this, 0, null);
+ for (final ActionListener l : actionListeners) {
+ l.actionPerformed(actionEvent);
+ }
+ }
+
+ protected void setButtonText() {
+ final String text = script.substring(0, Math.min(40, script.length())).trim().replaceAll("\\s+", " ");
+ showEditorBtn.setText(text);
+ }
+
+ public Component getEditorComponent() {
+ return showEditorBtn;
+ }
+ public void setItem(Object anObject) {
+ if(anObject == null)
+ script = "";
+ else
+ this.script = (String)anObject;
+ if("".equals(script))
+ showEditorBtn.setText(" ");
+ else
+ setButtonText();
+ }
+
+ public Object getItem() {
+ return script;
+ }
+ public void selectAll() {
+ editScript(true);
+ }
+ public void addActionListener(final ActionListener l) {
+ actionListeners.add(l);
+ }
+
+ public void removeActionListener(final ActionListener l) {
+ actionListeners.remove(l);
+ }
+
+ public void setPreferredSize(Dimension preferredSize) {
+ showEditorBtn.setPreferredSize(preferredSize);
+ }
+
+ public Dimension getPreferredSize() {
+ return showEditorBtn.getPreferredSize();
+ }
+
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptContext.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptContext.java
new file mode 100644
index 0000000..c6b515b
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptContext.java
@@ -0,0 +1,125 @@
+package org.freeplane.plugin.script;
+
+import java.util.ArrayList;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+
+public class ScriptContext {
+ private static final class NodeWrapper {
+ private final NodeModel nodeModel;
+ private final String script;
+
+ public NodeWrapper(NodeModel nodeModel, String script) {
+ this.nodeModel = nodeModel;
+ // NOTE: to ignore the script for cycle detection comment out next line
+ this.script = script;
+ }
+
+ public NodeModel getNodeModel() {
+ return nodeModel;
+ }
+
+ // public String getScript() {
+ // return script;
+ // }
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((nodeModel == null) ? 0 : nodeModel.hashCode());
+ result = prime * result + ((script == null) ? 0 : script.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;
+ NodeWrapper other = (NodeWrapper) obj;
+ if (nodeModel != other.nodeModel)
+ return false;
+ if (script == null) {
+ if (other.script != null)
+ return false;
+ }
+ return script.equals(other.script);
+ }
+
+ @Override
+ public String toString() {
+ return nodeModel + "[" + script + "]";
+ }
+ }
+
+ private final UniqueStack<NodeWrapper> stack = new UniqueStack<NodeWrapper>();
+
+ public ScriptContext() {
+ }
+
+ public void accessNode(final NodeModel accessedNode) {
+ FormulaUtils.accessNode(stack.last().getNodeModel(), accessedNode);
+ }
+
+ public void accessBranch(final NodeModel accessedNode) {
+ FormulaUtils.accessBranch(stack.last().getNodeModel(), accessedNode);
+ }
+
+ public void accessAll() {
+ FormulaUtils.accessAll(stack.last().getNodeModel());
+ }
+
+ public boolean push(NodeModel nodeModel, String script) {
+ final boolean success = stack.push(new NodeWrapper(nodeModel, script));
+ if (!success) {
+ LogUtils.warn("Circular reference detected! Traceback (innermost last):\n " //
+ + stackTrace(nodeModel, script));
+ }
+ return success;
+ }
+
+ public void pop() {
+ stack.pop();
+ }
+
+ public NodeModel getStackFront() {
+ return stack.first().getNodeModel();
+ }
+
+ public String stackTrace(NodeModel nodeModel, String script) {
+ ArrayList<String> entries = new ArrayList<String>(stack.size());
+ for (NodeWrapper node : stack) {
+ entries.add(format(node.nodeModel, node.script, nodeModel));
+ }
+ entries.add(format(nodeModel, script, nodeModel));
+ return StringUtils.join(entries.iterator(), "\n -> ");
+ }
+
+ private String format(NodeModel nodeModel, String script, NodeModel nodeToHighlight) {
+ return (nodeToHighlight.equals(nodeModel) ? "* " : "") + nodeModel.createID() + " "
+ + limitLength(deformat(nodeModel.getText()), 30) //
+ + " -> " + limitLength(script, 60);
+ }
+
+ private String deformat(String string) {
+ return HtmlUtils.htmlToPlain(string).replaceAll("\\s+", " ");
+ }
+
+ private String limitLength(final String string, int maxLenght) {
+ if (string == null || maxLenght >= string.length())
+ return string;
+ maxLenght = maxLenght > 3 ? maxLenght - 3 : maxLenght;
+ return string.substring(0, maxLenght) + "...";
+ }
+
+ @Override
+ public String toString() {
+ return stack.toString();
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditor.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditor.java
new file mode 100644
index 0000000..c86c635
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditor.java
@@ -0,0 +1,179 @@
+/*
+ * 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.event.ActionEvent;
+import java.io.PrintStream;
+import java.util.ArrayList;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+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.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.plugin.script.ScriptEditorPanel.IScriptModel;
+import org.freeplane.plugin.script.ScriptEditorPanel.ScriptHolder;
+import org.freeplane.plugin.script.ScriptingEngine.IErrorHandler;
+
+/**
+ * @author foltin
+ */
+class ScriptEditor extends AFreeplaneAction {
+ final private class AttributeHolder {
+ Attribute mAttribute;
+ int mPosition;
+
+ public AttributeHolder(final Attribute pAttribute, final int pPosition) {
+ super();
+ mAttribute = pAttribute;
+ mPosition = pPosition;
+ }
+ }
+
+ final private class NodeScriptModel implements IScriptModel {
+ private boolean isDirty = false;
+// final private MModeController mMindMapController;
+ final private NodeModel mNode;
+ /**
+ * Of AttributeHolder
+ */
+ final private ArrayList<AttributeHolder> mScripts;
+
+ private NodeScriptModel(final ArrayList<AttributeHolder> pScripts, final NodeModel node) {
+ mScripts = pScripts;
+ mNode = node;
+ }
+
+ public int addNewScript() {
+ final int index = mScripts.size();
+ /**
+ * is in general different from index, as not all attributes need to
+ * be scripts.
+ */
+ final int attributeIndex = NodeAttributeTableModel.getModel(mNode).getAttributeTableLength();
+ final String scriptName = ScriptingEngine.SCRIPT_PREFIX;
+ int scriptNameSuffix = 1;
+ boolean found;
+ do {
+ found = false;
+ for (final AttributeHolder holder : mScripts) {
+ if ((scriptName + scriptNameSuffix).equals(holder.mAttribute.getName())) {
+ found = true;
+ scriptNameSuffix++;
+ break;
+ }
+ }
+ } while (found);
+ mScripts.add(new AttributeHolder(new Attribute(scriptName + scriptNameSuffix, ""), attributeIndex));
+ isDirty = true;
+ return index;
+ }
+
+ 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) {
+ final int attributeTableLength = NodeAttributeTableModel.getModel(mNode).getAttributeTableLength();
+ for (final AttributeHolder holder : mScripts) {
+ final Attribute attribute = holder.mAttribute;
+ final int position = holder.mPosition;
+ final MAttributeController attributeController = (MAttributeController) AttributeController
+ .getController();
+ if (attributeTableLength <= position) {
+ attributeController.addAttribute(mNode, attribute);
+ }
+ else if (NodeAttributeTableModel.getModel(mNode).getAttribute(position).getValue() != attribute
+ .getValue()) {
+ attributeController.setAttribute(mNode, position, attribute);
+ }
+ }
+ }
+ }
+
+ public Object executeScript(final int pIndex, final PrintStream pOutStream, final IErrorHandler pErrorHandler) {
+ final String script = getScript(pIndex).getScript();
+ ModeController mMindMapController = Controller.getCurrentModeController();
+ return ScriptingEngine.executeScript(mMindMapController.getMapController().getSelectedNode(), script,
+ pErrorHandler, pOutStream, null, ScriptingPermissions.getPermissiveScriptingPermissions());
+ }
+
+ public int getAmountOfScripts() {
+ return mScripts.size();
+ }
+
+ public ScriptHolder getScript(final int pIndex) {
+ final Attribute attribute = ((AttributeHolder) mScripts.get(pIndex)).mAttribute;
+ return new ScriptHolder(attribute.getName(), attribute.getValue().toString());
+ }
+
+ public boolean isDirty() {
+ return isDirty;
+ }
+
+ public void setScript(final int pIndex, final ScriptHolder pScript) {
+ final AttributeHolder oldHolder = (AttributeHolder) mScripts.get(pIndex);
+ if (!pScript.mScriptName.equals(oldHolder.mAttribute.getName())) {
+ isDirty = true;
+ }
+ if (!pScript.mScript.equals(oldHolder.mAttribute.getValue())) {
+ isDirty = true;
+ }
+ oldHolder.mAttribute.setName(pScript.mScriptName);
+ oldHolder.mAttribute.setValue(pScript.mScript);
+ }
+
+ public void storeDialogPositions(final ScriptEditorPanel pPanel,
+ final ScriptEditorWindowConfigurationStorage pStorage,
+ final String pWindow_preference_storage_property) {
+ pStorage.storeDialogPositions(pPanel, pWindow_preference_storage_property);
+ }
+ }
+
+ private static final long serialVersionUID = 1L;
+
+ public ScriptEditor() {
+ super("ScriptEditor");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel node = modeController.getMapController().getSelectedNode();
+ final ArrayList<AttributeHolder> scripts = new ArrayList<AttributeHolder>();
+ for (int position = 0; position < NodeAttributeTableModel.getModel(node).getAttributeTableLength(); position++) {
+ final Attribute attribute = NodeAttributeTableModel.getModel(node).getAttribute(position);
+ if (attribute.getName().startsWith(ScriptingEngine.SCRIPT_PREFIX)) {
+ scripts.add(new AttributeHolder(new Attribute(attribute), position));
+ }
+ }
+ final NodeScriptModel nodeScriptModel = new NodeScriptModel(scripts, node);
+ final ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel(nodeScriptModel, true);
+ scriptEditorPanel.setVisible(true);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java
new file mode 100644
index 0000000..a840cd5
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java
@@ -0,0 +1,467 @@
+/*
+ * 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.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.JTextComponent;
+
+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.ScriptingEngine.IErrorHandler;
+
+/**
+ */
+class ScriptEditorPanel extends JDialog {
+ 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, IErrorHandler 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) {
+ 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");
+ } 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();
+ final int lineOfOffset = JSyntaxPaneProxy.getLineOfOffset(mScriptTextField, caretPosition);
+ mStatus.setText("Line: " + (lineOfOffset + 1) + ", Column: "
+ + (caretPosition - JSyntaxPaneProxy.getLineOfOffset(mScriptTextField, lineOfOffset) + 1));
+ }
+ });
+ 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);
+ }
+
+ IErrorHandler getErrorHandler() {
+ return new IErrorHandler() {
+ public void gotoLine(final int pLineNumber) {
+ JSyntaxPaneProxy.gotoPosition(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
new file mode 100644
index 0000000..b8cc03f
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorProperty.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.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/ScriptEditorWindowConfigurationStorage.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java
new file mode 100644
index 0000000..25d0324
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java
@@ -0,0 +1,48 @@
+package org.freeplane.plugin.script;
+
+import javax.swing.JDialog;
+
+import org.freeplane.core.resources.WindowConfigurationStorage;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class ScriptEditorWindowConfigurationStorage extends WindowConfigurationStorage {
+ public ScriptEditorWindowConfigurationStorage() {
+ super("manage_style_editor_window_configuration_storage");
+ }
+
+ public static ScriptEditorWindowConfigurationStorage decorateDialog(final String marshalled, final JDialog dialog) {
+ final ScriptEditorWindowConfigurationStorage storage = new ScriptEditorWindowConfigurationStorage();
+ final XMLElement xml = storage.unmarschall(marshalled, dialog);
+ if (xml != null) {
+ storage.leftRatio = Integer.parseInt(xml.getAttribute("left_ratio", null));
+ storage.topRatio = Integer.parseInt(xml.getAttribute("top_ratio", null));
+ return storage;
+ }
+ return null;
+ }
+
+ protected int leftRatio;
+ protected int topRatio;
+
+ public int getLeftRatio() {
+ return leftRatio;
+ }
+
+ public int getTopRatio() {
+ return topRatio;
+ }
+
+ @Override
+ protected void marshallSpecificElements(final XMLElement xml) {
+ xml.setAttribute("left_ratio", Integer.toString(leftRatio));
+ xml.setAttribute("top_ratio", Integer.toString(topRatio));
+ }
+
+ public void setLeftRatio(final int leftRatio) {
+ this.leftRatio = leftRatio;
+ }
+
+ public void setTopRatio(final int topRatio) {
+ this.topRatio = topRatio;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java
new file mode 100644
index 0000000..e3e60ef
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java
@@ -0,0 +1,41 @@
+/*
+ * 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.Dimension;
+
+import javax.swing.DefaultListCellRenderer;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 23, 2011
+ */
+public class ScriptRenderer extends DefaultListCellRenderer{
+ private static final long serialVersionUID = 1L;
+
+ @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/ScriptingConfiguration.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingConfiguration.java
new file mode 100644
index 0000000..4da96a1
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingConfiguration.java
@@ -0,0 +1,390 @@
+/*
+ * 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.Arrays;
+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 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 SCRIPT_REGEX = ".*\\.groovy$";
+ private static final String JAR_REGEX = ".*\\.jar$";
+ // or use property script_directories?
+ static final String USER_SCRIPTS_DIR = "scripts";
+ private final TreeMap<String, String> nameScriptMap = new TreeMap<String, String>();
+ private final TreeMap<String, ScriptMetaData> nameScriptMetaDataMap = new TreeMap<String, ScriptMetaData>();
+ private ArrayList<String> classpath;
+ private File builtinScriptsDir;
+
+ ScriptingConfiguration() {
+ addPluginDefaults();
+ initNameScriptMap();
+ initClasspath();
+ }
+
+ 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 initNameScriptMap() {
+ final Map<File, Script> addOnScriptMap = getAddOnScriptMap();
+ for (String dir : getScriptDirs()) {
+ addScripts(createFile(dir), addOnScriptMap);
+ }
+ addScripts(getBuiltinScriptsDir(), addOnScriptMap);
+ }
+
+ public Map<File, ScriptAddOnProperties.Script> getAddOnScriptMap() {
+ List<AddOnProperties> installedAddOns = AddOnsController.getController().getInstalledAddOns();
+ Map<File, ScriptAddOnProperties.Script> result = new LinkedHashMap<File, ScriptAddOnProperties.Script>();
+ for (AddOnProperties addOnProperties : installedAddOns) {
+ if (addOnProperties.getAddOnType() == AddOnType.SCRIPT) {
+ final ScriptAddOnProperties scriptAddOnProperties = (ScriptAddOnProperties) addOnProperties;
+ final List<Script> scripts = scriptAddOnProperties.getScripts();
+ for (Script script : scripts) {
+ script.active = addOnProperties.isActive();
+ result.put(script.file, script);
+ }
+ }
+ }
+ return result;
+ }
+
+ private TreeSet<String> getScriptDirs() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String dirsString = resourceController.getProperty(ScriptingEngine.RESOURCES_SCRIPT_DIRECTORIES);
+ final TreeSet<String> dirs = new TreeSet<String>(); // remove duplicates -> Set
+ if (dirsString != null) {
+ dirs.addAll(ConfigurationUtils.decodeListValue(dirsString, false));
+ }
+ return dirs;
+ }
+
+ private File getBuiltinScriptsDir() {
+ if (builtinScriptsDir == null) {
+ final String installationBase = ResourceController.getResourceController().getInstallationBaseDir();
+ builtinScriptsDir = new File(installationBase, "scripts");
+ }
+ return builtinScriptsDir;
+ }
+
+ /**
+ * 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 addScripts(final File dir, final Map<File, Script> addOnScriptMap) {
+ if (dir.isDirectory()) {
+ final File[] files = dir.listFiles(createFilenameFilter(SCRIPT_REGEX));
+ if(files != null){
+ for (final File file : files) {
+ addScript(file, addOnScriptMap);
+ }
+ }
+ }
+ else {
+ LogUtils.warn("not a (script) directory: " + dir);
+ }
+ }
+
+ 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 scriptName = getScriptName(file, scriptConfig);
+ String name = scriptName;
+ // add suffix if the same script exists in multiple dirs
+ for (int i = 2; nameScriptMap.containsKey(name); ++i) {
+ name = scriptName + i;
+ }
+ try {
+ nameScriptMap.put(name, file.getAbsolutePath());
+ final ScriptMetaData metaData = createMetaData(file, name, scriptConfig);
+ nameScriptMetaDataMap.put(name, metaData);
+ final File parentFile = file.getParentFile();
+ if (parentFile.equals(getBuiltinScriptsDir())) {
+ metaData.setPermissions(ScriptingPermissions.getPermissiveScriptingPermissions());
+// metaData.setCacheContent(true);
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn("problems with script " + file.getAbsolutePath(), e);
+ nameScriptMap.remove(name);
+ nameScriptMetaDataMap.remove(name);
+ }
+ }
+
+ 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 getScriptName(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> getNameScriptMap() {
+ return Collections.unmodifiableSortedMap(nameScriptMap);
+ }
+
+ SortedMap<String, ScriptMetaData> getNameScriptMetaDataMap() {
+ return Collections.unmodifiableSortedMap(nameScriptMetaDataMap);
+ }
+
+ private void initClasspath() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String entries = resourceController.getProperty(ScriptingEngine.RESOURCES_SCRIPT_CLASSPATH);
+ classpath = new ArrayList<String>();
+ if (entries != null) {
+ for (String entry : ConfigurationUtils.decodeListValue(entries, false)) {
+ final File file = createFile(entry);
+ if (!file.exists()) {
+ LogUtils.warn("classpath entry '" + entry + "' 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());
+ }
+ }
+ }
+ }
+
+ ArrayList<String> getClasspath() {
+ return classpath;
+ }
+
+ 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
new file mode 100644
index 0000000..e1c679e
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingEngine.java
@@ -0,0 +1,315 @@
+/*
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 groovy.lang.Binding;
+import groovy.lang.GroovyCodeSource;
+import groovy.lang.GroovyRuntimeException;
+import groovy.lang.GroovyShell;
+import groovy.lang.Script;
+
+import java.io.File;
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Matcher;
+
+import javax.swing.JOptionPane;
+
+import org.apache.commons.lang.WordUtils;
+import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.ModuleNode;
+import org.codehaus.groovy.control.CompilationFailedException;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+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;
+import org.freeplane.main.application.FreeplaneSecurityManager;
+import org.freeplane.plugin.script.proxy.ProxyFactory;
+
+/**
+ * @author foltin
+ */
+public class ScriptingEngine {
+ public interface IErrorHandler {
+ void gotoLine(int pLineNumber);
+ }
+ public static final String RESOURCES_SCRIPT_DIRECTORIES = "script_directories";
+ public static final String RESOURCES_SCRIPT_CLASSPATH = "script_classpath";
+ public static final String SCRIPT_PREFIX = "script";
+ private static final HashMap<String, Object> sScriptCookies = new HashMap<String, Object>();
+ private static List<String> classpath;
+ private static final IErrorHandler scriptErrorHandler = new IErrorHandler() {
+ public void gotoLine(final int pLineNumber) {
+ }
+ };
+
+ /**
+ * @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
+ */
+ static Object executeScript(final NodeModel node, final String script, final IErrorHandler pErrorHandler,
+ final PrintStream pOutStream, final ScriptContext scriptContext,
+ ScriptingPermissions permissions) {
+ return executeScript(node, (Object)script, pErrorHandler,
+ pOutStream, scriptContext,
+ permissions);
+
+ }
+ static Object executeScript(final NodeModel node, final File script, final IErrorHandler pErrorHandler,
+ final PrintStream pOutStream, final ScriptContext scriptContext,
+ ScriptingPermissions permissions) {
+ return executeScript(node, (Object)script, pErrorHandler,
+ pOutStream, scriptContext,
+ permissions);
+ }
+ static private Object executeScript(final NodeModel node, final Object script, final IErrorHandler pErrorHandler,
+ final PrintStream pOutStream, final ScriptContext scriptContext,
+ ScriptingPermissions permissions) {
+ final Binding binding = new Binding();
+ binding.setVariable("c", ProxyFactory.createController(scriptContext));
+ binding.setVariable("node", ProxyFactory.createNode(node, scriptContext));
+ binding.setVariable("cookies", ScriptingEngine.sScriptCookies);
+ final PrintStream oldOut = System.out;
+ //
+ // == Security stuff ==
+ //
+ final FreeplaneSecurityManager securityManager = (FreeplaneSecurityManager) System.getSecurityManager();
+ final ScriptingSecurityManager scriptingSecurityManager;
+ final boolean needsSecurityManager = securityManager.needsFinalSecurityManager();
+ // get preferences (and store them again after the script execution,
+ // such that the scripts are not able to change them).
+ if (needsSecurityManager) {
+ if (permissions == null){
+ permissions = new ScriptingPermissions(ResourceController.getResourceController().getProperties());
+ }
+ if (!permissions.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")));
+ }
+ }
+ final boolean executeSignedScripts = permissions.isExecuteSignedScriptsWithoutRestriction();
+ final String scriptContent;
+ if(script instanceof String)
+ scriptContent = (String) script;
+ else
+ scriptContent = null;
+ if (executeSignedScripts && scriptContent != null && new SignedScriptHandler().isScriptSigned(scriptContent, pOutStream)) {
+ scriptingSecurityManager = permissions.getPermissiveScriptingSecurityManager();
+ }
+ else
+ scriptingSecurityManager = permissions.getScriptingSecurityManager();
+ }
+ else {
+ // will not be used
+ scriptingSecurityManager = null;
+ }
+ //
+ // == execute ==
+ //
+ ScriptingPermissions originalScriptingPermissions = new ScriptingPermissions(ResourceController.getResourceController().getProperties());
+ try {
+ System.setOut(pOutStream);
+ final ClassLoader classLoader = ScriptingEngine.class.getClassLoader();
+ final GroovyShell shell = new GroovyShell(classLoader, binding, createCompilerConfiguration()) {
+ /**
+ * Evaluates some script against the current Binding and returns the result
+ *
+ * @param in the stream reading the script
+ * @param fileName is the logical file name of the script (which is used to create the class name of the script)
+ */
+ @Override
+ public Object evaluate(GroovyCodeSource codeSource) throws CompilationFailedException {
+ Script script = null;
+ try {
+ script = parse(codeSource);
+ script.setBinding(getContext());
+ if (needsSecurityManager)
+ securityManager.setFinalSecurityManager(scriptingSecurityManager);
+ return script.run();
+ }
+ finally {
+ if (script != null) {
+ InvokerHelper.removeClass(script.getClass());
+ if (needsSecurityManager)
+ securityManager.removeFinalSecurityManager(scriptingSecurityManager);
+ }
+ }
+ }
+ };
+ if(script instanceof String)
+ return shell.evaluate((String)script);
+ if(script instanceof File)
+ return shell.evaluate((File)script);
+ throw new IllegalArgumentException();
+ }
+ catch (final GroovyRuntimeException e) {
+ /*
+ * Cover exceptions in normal security context (ie. no problem with
+ * (log) file writing etc.)
+ */
+ // LogUtils.warn(e);
+ final String resultString = e.getMessage();
+ pOutStream.print("message: " + resultString);
+ 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 = ScriptingEngine.findLineNumberInString(resultString, lineNumber);
+ }
+ pOutStream.print("Line number: " + lineNumber);
+ pErrorHandler.gotoLine(lineNumber);
+ throw new ExecuteScriptException(e.getMessage() + " at line " + lineNumber, e);
+ }
+ catch (final Throwable e) {
+ if (Controller.getCurrentController().getSelection() != null)
+ Controller.getCurrentModeController().getMapController().select(node);
+ throw new ExecuteScriptException(e.getMessage(), e);
+ }
+ finally {
+ System.setOut(oldOut);
+ /* restore preferences (and assure that the values are unchanged!). */
+ originalScriptingPermissions.restorePermissions();
+ }
+ }
+
+ private static CompilerConfiguration createCompilerConfiguration() {
+ CompilerConfiguration config = new CompilerConfiguration();
+ config.setScriptBaseClass(FreeplaneScriptBaseClass.class.getName());
+ if (!(classpath == null || classpath.isEmpty())) {
+ config.setClasspathList(classpath);
+ }
+ return config;
+ }
+
+ 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 ScriptingEngine.executeScript(node, script, null, null);
+ }
+
+ public static Object executeScript(NodeModel node, File script, ScriptingPermissions permissions) {
+ return ScriptingEngine.executeScript(node, script, ScriptingEngine.scriptErrorHandler, System.out, null, permissions);
+ }
+
+ public static Object executeScript(NodeModel node, String script, ScriptingPermissions permissions) {
+ return ScriptingEngine.executeScript(node, script, ScriptingEngine.scriptErrorHandler, System.out, null, permissions);
+ }
+
+ public static Object executeScript(NodeModel node, String script, PrintStream printStream) {
+ return ScriptingEngine.executeScript(node, script, ScriptingEngine.scriptErrorHandler, printStream, null, null);
+ }
+
+ public static Object executeScript(final NodeModel node, final String script, final ScriptContext scriptContext,
+ final ScriptingPermissions permissions) {
+ return ScriptingEngine.executeScript(node, script, scriptErrorHandler, System.out, scriptContext, permissions);
+ }
+
+ static Object executeScriptRecursive(final NodeModel node, final File script,
+ final ScriptingPermissions permissions) {
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel[] children = modeController.getMapController().childrenUnfolded(node)
+ .toArray(new NodeModel[] {});
+ for (final NodeModel child : children) {
+ executeScriptRecursive(child, script, permissions);
+ }
+ return executeScript(node, script, permissions);
+ }
+
+ 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;
+ }
+
+ /** 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> classpath) {
+ if (ScriptingEngine.classpath != null)
+ throw new SecurityException("reset of script classpath is forbidden.");
+ ScriptingEngine.classpath = Collections.unmodifiableList(classpath);
+ if (!classpath.isEmpty())
+ LogUtils.info("extending script's classpath by " + classpath);
+ }
+
+ static List<String> getClasspath() {
+ return classpath;
+ }
+
+ public static File getUserScriptDir() {
+ final String userDir = ResourceController.getResourceController().getFreeplaneUserDirectory();
+ return new File(userDir, ScriptingConfiguration.USER_SCRIPTS_DIR);
+ }
+ 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
new file mode 100644
index 0000000..8d84f83
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingPermissions.java
@@ -0,0 +1,144 @@
+/*
+ * 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 org.freeplane.core.resources.ResourceController;
+
+/**
+ * @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. */
+ 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 (ScriptingEngine.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);
+ }
+
+ public boolean executeScriptsWithoutAsking() {
+ return get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING);
+ }
+
+ public static List<String> getPermissionNames() {
+ return Arrays.asList(PERMISSION_NAMES);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java
new file mode 100644
index 0000000..9f15552
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java
@@ -0,0 +1,337 @@
+/*
+ * 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.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.ScriptingEngine.IErrorHandler;
+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 IErrorHandler 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(ScriptingEngine.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();
+ addPropertiesToOptionPanel();
+ final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().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();
+ ScriptingEngine.setClasspath(configuration.getClasspath());
+ modeController.addMenuContributor(new IMenuContributor() {
+ public void updateMenus(ModeController modeController, MenuBuilder builder) {
+ registerScripts(menuBuilder, configuration);
+ }
+ });
+ createUserScriptsDirectory();
+ 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 = ScriptingEngine.getUserScriptDir();
+ if (!scriptDir.exists()) {
+ LogUtils.info("creating user scripts directory " + scriptDir);
+ scriptDir.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.getNameScriptMap().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.getNameScriptMap().entrySet()) {
+ final String scriptName = entry.getKey();
+ final ScriptMetaData metaData = configuration.getNameScriptMetaDataMap().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
new file mode 100644
index 0000000..955a11e
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingSecurityManager.java
@@ -0,0 +1,290 @@
+/*
+ * 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
new file mode 100644
index 0000000..9eda0cf
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/SignedScriptHandler.java
@@ -0,0 +1,227 @@
+/*
+ * 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/UniqueStack.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/UniqueStack.java
new file mode 100644
index 0000000..e24bd53
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/UniqueStack.java
@@ -0,0 +1,61 @@
+package org.freeplane.plugin.script;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/** A minimal implementation of a stack that may contain an element only once - not threadsafe.
+ * The stack may contains null but note that null is used by {@link #pop()} to signal an empty stack. */
+public class UniqueStack<T> implements Iterable<T> {
+ private ArrayList<T> stack = new ArrayList<T>(8);
+ private HashSet<T> set = new HashSet<T>(8);
+
+ /** creates an empty stack. */
+ public UniqueStack() {
+ }
+
+ /** initializes the stack with a single element. */
+ public UniqueStack(T t) {
+ push(t);
+ }
+
+ /** returns true only if the element was actually added. */
+ public boolean push(T t) {
+ if (set.add(t)) {
+ stack.add(t);
+ return true;
+ }
+ return false;
+ }
+
+ /** returns the last element in the stack or null if it is empty. */
+ public T pop() {
+ if (stack.isEmpty()) {
+ return null;
+ } else {
+ final T last = stack.remove(stack.size() - 1);
+ set.remove(last);
+ return last;
+ }
+ }
+
+ public T first() {
+ return stack.isEmpty() ? null : stack.get(0);
+ }
+
+ public T last() {
+ return stack.isEmpty() ? null : stack.get(stack.size() - 1);
+ }
+
+ public Iterator<T> iterator() {
+ return stack.iterator();
+ }
+
+ public int size() {
+ return stack.size();
+ }
+
+ public String toString() {
+ return stack.toString();
+ }
+}
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
new file mode 100644
index 0000000..d40438e
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java
@@ -0,0 +1,230 @@
+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,
+ RowSpec.decode("top:default:grow"),}));
+
+ JLabel imageLabel = createImageLabel(addOn);
+ add(imageLabel, "1, 2");
+ JLabel title = createTitleLabel(addOn);
+ add(title, "3, 2");
+ JLabel author = createAuthorLabel(addOn);
+ add(author, "3, 4");
+ final Box box = Box.createHorizontalBox();
+ box.add(new JLabel(getText("homepage")));
+ box.add(createAddOnHomepageButton(addOn));
+ add(box, "3, 6, left, default");
+ JComponent details = createDetails(addOn);
+ add(details, "3, 7");
+ }
+
+ 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 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><b><font size='-1'>"
+ + getText("authored.by", toHtml(addOn.getAuthor())) + "</font></b></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>");
+ }
+ }
+ if (warning != null) {
+ text.append("<p><p>");
+ text.append(warning.replaceAll("</?(html|body)>", ""));
+ }
+ text.append("</body></html>");
+ final JLabel label = new JLabel(text.toString());
+ 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
new file mode 100644
index 0000000..08cfdd7
--- /dev/null
+++ b/freeplane_plugin_script/src/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.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");
+ 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/org/freeplane/plugin/script/addons/AddonRenderer.java
new file mode 100644
index 0000000..42507c9
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddonRenderer.java
@@ -0,0 +1,72 @@
+/*
+ * 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.addons;
+
+import java.awt.Component;
+import java.text.BreakIterator;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.main.addons.AddOnProperties;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 17, 2011
+ */
+ at SuppressWarnings("serial")
+public class AddonRenderer extends DefaultTableCellRenderer {
+
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+ int row, int column) {
+ if(value instanceof AddOnProperties){
+ AddOnProperties addOn = (AddOnProperties)value;
+ final String description = addOn.getDescription();
+ final String shortDescription = HtmlUtils.toXMLEscapedText(shorten(HtmlUtils.htmlToPlain(description), 120));
+ String text = "<html><body><b><font size='+1'>" + addOn.getTranslatedName() + " "
+ + addOn.getVersion().replaceAll("^v", "") + createAuthorText(addOn.getAuthor()) + "</font></b><br>"
+ + shortDescription + "</body></html>";
+ value = text;
+ setToolTipText(description);
+ }
+ final Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ return tableCellRendererComponent;
+ }
+
+ private String createAuthorText(String author) {
+ if (author == null || author.length() == 0)
+ return "";
+ return " " + ManageAddOnsDialog.getText("authored.by", author);
+ }
+
+ private String shorten(String string, int maxLength) {
+ if (string.length() <= 3 || string.length() <= maxLength)
+ return string;
+ final BreakIterator bi = BreakIterator.getSentenceInstance();
+ bi.setText(string);
+ string = string.substring(0, bi.next());
+ if (string.length() <= 3 || string.length() <= maxLength)
+ return string + "...";
+ return string.substring(0, maxLength - 3) + "...";
+ }
+
+}
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
new file mode 100644
index 0000000..424b207
--- /dev/null
+++ b/freeplane_plugin_script/src/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) {
+ }
+}
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsAction.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsAction.java
new file mode 100644
index 0000000..9ada8d2
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsAction.java
@@ -0,0 +1,25 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.main.addons.AddOnsController;
+
+public class ManageAddOnsAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private ManageAddOnsDialog dialog;
+
+ public ManageAddOnsAction() {
+ super("ManageAddOnsAction");
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ getDialog().setVisible(true);
+ }
+
+ public ManageAddOnsDialog getDialog() {
+ if (dialog == null)
+ dialog = new ManageAddOnsDialog(AddOnsController.getController().getInstalledAddOns());
+ return dialog;
+ }
+}
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
new file mode 100644
index 0000000..972708d
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java
@@ -0,0 +1,135 @@
+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/addons/ManageAddOnsPanel.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java
new file mode 100644
index 0000000..13b0144
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java
@@ -0,0 +1,299 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumnModel;
+
+import org.freeplane.core.resources.components.OptionPanelBuilder;
+import org.freeplane.core.ui.components.UITools;
+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.main.addons.AddOnsController;
+
+ at SuppressWarnings("serial")
+public class ManageAddOnsPanel extends JPanel {
+ public final static class AddOnTableModel extends AbstractTableModel {
+ private final List<AddOnProperties> addOns;
+ private HashMap<AddOnProperties, ImageIcon> icons = new HashMap<AddOnProperties, ImageIcon>();
+
+ private AddOnTableModel(List<AddOnProperties> addOns) {
+ this.addOns = new ArrayList<AddOnProperties>(addOns);
+ }
+
+ public int getRowCount() {
+ return addOns.size();
+ }
+
+ public int getColumnCount() {
+ return buttonsColumn + 1;
+ }
+
+ public Object getValueAt(int row, int col) {
+ AddOnProperties addOn = addOns.get(row);
+ switch (col) {
+ case iconColumn:
+ return createIcon(addOn);
+ case textColumn:
+ return addOn;
+ case buttonsColumn:
+ return "";
+ default:
+ throw new RuntimeException("unexpected column " + col);
+ }
+ }
+
+ private ImageIcon createIcon(final AddOnProperties addOn) {
+ ImageIcon icon = icons.get(addOn);
+ if (icon != null)
+ return icon;
+ icon = IconNotFound.createIconOrReturnNotFoundIcon(addOn.getName() + "-icon.png");
+ icons.put(addOn, icon);
+ return icon;
+ }
+
+ public Class<?> getColumnClass(int col) {
+ if (col == 0) {
+ return ImageIcon.class;
+ } else {
+ return String.class;
+ }
+ }
+
+ public boolean isCellEditable(int row, int column) {
+ return column == buttonsColumn;
+ }
+
+ public void setValueAt(Object aValue, int row, int column) {
+ fireTableCellUpdated(row, column);
+ }
+
+ public AddOnProperties getAddOnAt(int row) {
+ return addOns.get(row);
+ }
+
+ public void addAddOn(final AddOnProperties addOn) {
+ final int row = addOns.size();
+ addOns.add(addOn);
+ fireTableRowsInserted(row, row);
+ }
+
+ public void removeAddOn(final AddOnProperties addOn) {
+ final int row = addOns.indexOf(addOn);
+ if(row == -1)
+ return;
+ addOns.remove(row);
+ fireTableRowsDeleted(row, row);
+ }
+ }
+
+ private static final AddonRenderer ADDON_RENDERER = new AddonRenderer();
+ private AddOnTableModel tableModel;
+ private final static int iconColumn = 0;
+ private final static int textColumn = 1;
+ private final static int buttonsColumn = 2;
+
+ public ManageAddOnsPanel(List<AddOnProperties> addOns) {
+ super();
+ final JComponent panel = this;
+ panel.setLayout(new GridLayout(2,1));
+ tableModel = new AddOnTableModel(addOns);
+ final JTable jTable = createTable(tableModel);
+ JScrollPane tableScrollPane = new JScrollPane(jTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ tableScrollPane.getViewport().setBackground(Color.white);
+
+ final JPanel emptyPanel = new JPanel();
+ emptyPanel.setOpaque(false);
+ final JScrollPane descriptionScrollPane = new JScrollPane(emptyPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ descriptionScrollPane.getViewport().setBackground(Color.white);
+ jTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e) {
+ if(jTable.getSelectedRowCount() != 1){
+ descriptionScrollPane.setViewportView(emptyPanel);
+ }
+ else{
+ final int row = jTable.getSelectedRow();
+ final AddOnProperties addon = (AddOnProperties) tableModel.getValueAt(row, textColumn);
+ final AddOnDetailsPanel detailsPanel = new AddOnDetailsPanel(addon);
+ detailsPanel.setOpaque(false);
+ descriptionScrollPane.setViewportView(detailsPanel);
+ }
+ }
+ });
+
+ panel.add(tableScrollPane);
+ panel.add(descriptionScrollPane);
+ }
+
+ private JTable createTable(final AddOnTableModel tableModel) {
+ final JTable table = new JTable(tableModel);
+ table.setTableHeader(null);
+//FIXME: Java 6
+// table.setAutoCreateRowSorter(true);
+ final int rowHeight = 62;
+ table.setRowHeight(rowHeight);
+ table.setBackground(Color.white);
+ table.setShowVerticalLines(false);
+ final TableColumnModel columnModel = table.getColumnModel();
+ JButton[] buttons = new JButton[] { createButton(AddOnProperties.OP_CONFIGURE) //
+ , createButton(AddOnProperties.OP_DEACTIVATE) //
+ , createButton(AddOnProperties.OP_ACTIVATE) //
+ , createButton(AddOnProperties.OP_DEINSTALL) //
+ };
+ columnModel.getColumn(iconColumn).setMinWidth(rowHeight);
+ columnModel.getColumn(iconColumn).setPreferredWidth(rowHeight);
+ columnModel.getColumn(textColumn).setPreferredWidth(10000);
+ columnModel.getColumn(buttonsColumn).setMinWidth(getPreferredWidth(buttons));
+ columnModel.getColumn(buttonsColumn).setPreferredWidth(getPreferredWidth(buttons));
+ Action[] actions = new Action[] { createConfigureAction(tableModel) //
+ , createDeactivateAction(tableModel) //
+ , createActivateAction(tableModel) //
+ , createDeinstallAction(tableModel) //
+ };
+ table.getColumnModel().getColumn(textColumn).setCellRenderer(ADDON_RENDERER);
+ new ButtonsInCellRenderer(table, buttons, actions, buttonsColumn);
+ table.setFocusable(false);
+ return table;
+ }
+
+ private int getPreferredWidth(JButton[] buttons) {
+ double maxButtonWidth = 0;
+ for (JButton button : buttons) {
+ final Dimension size = button.getPreferredSize();
+ if (size.getWidth() > maxButtonWidth)
+ maxButtonWidth = size.getWidth();
+ }
+ // activate/deactivate exclude each other -> -1
+ int spacer = ButtonsInCellRenderer.BUTTON_SPACER;
+ return (int) ((buttons.length - 1) * (maxButtonWidth + spacer)) + spacer;
+ }
+
+ private AbstractAction createConfigureAction(final AddOnTableModel tableModel) {
+ return new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ final int row = Integer.parseInt(e.getActionCommand());
+ final AddOnProperties addOn = tableModel.getAddOnAt(row);
+ if (!addOn.supportsOperation(AddOnProperties.OP_CONFIGURE)) {
+ JOptionPane.showMessageDialog(ManageAddOnsPanel.this, getText("cannot.configure", addOn.getTranslatedName()), "Freeplane", JOptionPane.ERROR_MESSAGE);
+ }
+ else {
+ OptionPanelBuilder optionPanelBuilder = new OptionPanelBuilder();
+ optionPanelBuilder.load(new StringReader(addOn.getPreferencesXml()));
+ MModeController.createPropertyAction(optionPanelBuilder).actionPerformed(e);
+ }
+ }
+ };
+ }
+
+ private AbstractAction createDeactivateAction(final AddOnTableModel tableModel) {
+ return new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ final int row = Integer.parseInt(e.getActionCommand());
+ final AddOnProperties addOn = tableModel.getAddOnAt(row);
+ if (!addOn.supportsOperation(AddOnProperties.OP_DEACTIVATE)) {
+ JOptionPane.showMessageDialog(ManageAddOnsPanel.this, getText("cannot.deactivate", addOn.getTranslatedName()), "Freeplane", JOptionPane.ERROR_MESSAGE);
+ }
+ else {
+ addOn.setActive(false);
+ saveAddOn(addOn);
+ JOptionPane.showMessageDialog(ManageAddOnsPanel.this, getText("deactivation.success", addOn.getTranslatedName()), "Freeplane", JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+ };
+ }
+
+ private AbstractAction createActivateAction(final AddOnTableModel tableModel) {
+ return new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ final int row = Integer.parseInt(e.getActionCommand());
+ final AddOnProperties addOn = tableModel.getAddOnAt(row);
+ if (!addOn.supportsOperation(AddOnProperties.OP_ACTIVATE)) {
+ JOptionPane.showMessageDialog(ManageAddOnsPanel.this, getText("cannot.activate", addOn.getTranslatedName()), "Freeplane", JOptionPane.ERROR_MESSAGE);
+ }
+ else {
+ addOn.setActive(true);
+ saveAddOn(addOn);
+ JOptionPane.showMessageDialog(ManageAddOnsPanel.this, getText("activation.success", addOn.getTranslatedName()), "Freeplane", JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+ };
+ }
+
+ private AbstractAction createDeinstallAction(final AddOnTableModel tableModel) {
+ return new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ final int row = Integer.parseInt(e.getActionCommand());
+ final AddOnProperties addOn = tableModel.getAddOnAt(row);
+ if (!addOn.supportsOperation(AddOnProperties.OP_DEINSTALL)) {
+ UITools.errorMessage(getText("cannot.deinstall", addOn.getTranslatedName()));
+ }
+ else {
+ int result = JOptionPane.showConfirmDialog(ManageAddOnsPanel.this,
+ getText("really.deinstall", TextUtils.getText(addOn.getNameKey())), getText("deinstall"),
+ JOptionPane.OK_CANCEL_OPTION);
+ if (result == JOptionPane.OK_OPTION) {
+ deinstall(tableModel, addOn);
+ repaint();
+ UITools.informationMessage(getText("deinstallation.success", addOn.getTranslatedName()));
+ }
+ }
+ }
+
+ private void deinstall(final AddOnTableModel tableModel, final AddOnProperties addOn) {
+ try {
+ AddOnsController.getController().deinstall(addOn);
+ tableModel.removeAddOn(addOn);
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+ };
+ }
+
+ private JButton createButton(final String name) {
+ final JButton button = new JButton(getText(name));
+ button.setName(name);
+ return button;
+ }
+
+ private void saveAddOn(final AddOnProperties addOn) {
+ try {
+ AddOnsController.getController().save(addOn);
+ }
+ catch (IOException e) {
+ UITools.errorMessage("Cannot save add-on settings: " + e.getMessage());
+ }
+ }
+
+ public AddOnTableModel getTableModel() {
+ return tableModel;
+ }
+
+ private static String getText(String key, Object... parameters) {
+ return ManageAddOnsDialog.getText(key, parameters);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java
new file mode 100644
index 0000000..be37f05
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java
@@ -0,0 +1,152 @@
+package org.freeplane.plugin.script.addons;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Vector;
+
+import org.freeplane.main.addons.AddOnProperties;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
+import org.freeplane.plugin.script.ScriptingEngine;
+import org.freeplane.plugin.script.ScriptingPermissions;
+
+/** For all add-ons that are installed via installScriptAddon.groovy - themes and script collections. */
+public class ScriptAddOnProperties extends AddOnProperties {
+ public static class Script {
+ public String name;
+ public File file;
+ public ExecutionMode executionMode;
+ public String menuTitleKey;
+ public String menuLocation;
+ public ScriptingPermissions permissions;
+ public String keyboardShortcut;
+ public String scriptBody;
+ // transient - copy of AddOnProperties.active
+ public boolean active = true;
+
+ public String toString() {
+ return name + "(" + executionMode + "/" + menuTitleKey + "/" + menuLocation + "" + ")";
+ }
+ }
+
+ private List<Script> scripts;
+
+ public ScriptAddOnProperties(String name) {
+ super(AddOnType.SCRIPT);
+ setName(name);
+ }
+
+ public ScriptAddOnProperties(final XMLElement addOnelement) {
+ super(AddOnType.SCRIPT, addOnelement);
+ this.scripts = parseScripts(addOnelement.getChildrenNamed("scripts"));
+ validate();
+ }
+
+ private void validate() {
+ if (scripts == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: scripts may not be null");
+ for (Script script : scripts) {
+ if (script.name == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: no name");
+ if (script.file == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: Script file " + script + "not defined");
+ if (!script.file.exists())
+ throw new RuntimeException(this + ": on parsing add-on XML file: Script " + script + " does not exist");
+ if (script.executionMode == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: no execution_mode");
+ if (script.menuTitleKey == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: no menu title key");
+ if (script.menuLocation == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: no menu location");
+ if (script.permissions == null)
+ throw new RuntimeException(this + ": on parsing add-on XML file: no permissions");
+ }
+ }
+
+ private List<Script> parseScripts(Vector<XMLElement> xmlElements) {
+ final ArrayList<Script> scripts = new ArrayList<Script>();
+ if (xmlElements == null || xmlElements.isEmpty())
+ return scripts;
+ for (XMLElement scriptXmlNode : xmlElements.get(0).getChildren()) {
+ final Script script = new Script();
+ for (Entry<Object, Object> entry : scriptXmlNode.getAttributes().entrySet()) {
+ if (entry.getKey().equals("name")) {
+ script.name = (String) entry.getValue();
+ }
+ else if (entry.getKey().equals("file")) {
+ script.file = new File(entry.getValue().toString());
+ }
+ else if (entry.getKey().equals("executionMode")) {
+ script.executionMode = parseExecutionMode(entry.getValue().toString());
+ }
+ else if (entry.getKey().equals("menuTitleKey")) {
+ script.menuTitleKey = entry.getValue().toString();
+ }
+ else if (entry.getKey().equals("menuLocation")) {
+ script.menuLocation = entry.getValue().toString();
+ }
+ }
+ script.permissions = new ScriptingPermissions(scriptXmlNode.getAttributes());
+ fixUnsetFile(script);
+ scripts.add(script);
+ }
+ return scripts;
+ }
+
+ /** This code is needed to set Script.file in earlier installations.
+ * @deprecated remove before the next stable release! */
+ private void fixUnsetFile(Script script) {
+ if (script.file == null)
+ script.file = new File(ScriptingEngine.getUserScriptDir(), script.name);
+ }
+
+ public static ExecutionMode parseExecutionMode(final String executionModeString) {
+ try {
+ return ExecutionMode.valueOf(executionModeString.toUpperCase());
+ }
+ catch (Exception e) {
+ throw new RuntimeException("invalid execution mode found in " + executionModeString, e);
+ }
+ }
+
+ public List<Script> getScripts() {
+ return scripts;
+ }
+
+ public static String getNameKey(final String name) {
+ return "addons." + name;
+ }
+
+ public XMLElement toXml() {
+ final XMLElement xmlElement = super.toXml();
+ addScriptsAsChild(xmlElement);
+ return xmlElement;
+ }
+
+ private void addScriptsAsChild(XMLElement parent) {
+ XMLElement xmlElement = new XMLElement("scripts");
+ for (Script script : scripts) {
+ XMLElement scriptXmlElement = new XMLElement("script");
+ scriptXmlElement.setAttribute("name", script.name);
+ scriptXmlElement.setAttribute("file", script.file == null ? null : script.file.getPath());
+ scriptXmlElement.setAttribute("menuTitleKey", script.menuTitleKey);
+ scriptXmlElement.setAttribute("menuLocation", script.menuLocation);
+ scriptXmlElement.setAttribute("executionMode", script.executionMode.toString());
+ final List<String> permissionNames = ScriptingPermissions.getPermissionNames();
+ for (String permission : permissionNames) {
+ scriptXmlElement.setAttribute(permission, Boolean.toString(script.permissions.get(permission)));
+ }
+ xmlElement.addChild(scriptXmlElement);
+ }
+ parent.addChild(xmlElement);
+ }
+
+ @Override
+ public boolean supportsOperation(String opName) {
+ if (opName.equals(OP_DEACTIVATE))
+ return isActive() && !scripts.isEmpty();
+ return super.supportsOperation(opName);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/defaults.properties b/freeplane_plugin_script/src/org/freeplane/plugin/script/defaults.properties
new file mode 100644
index 0000000..9a3c68e
--- /dev/null
+++ b/freeplane_plugin_script/src/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 =
+script_directories = scripts
+script_classpath =
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptCondition.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptCondition.java
new file mode 100644
index 0000000..6026f65
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptCondition.java
@@ -0,0 +1,86 @@
+package org.freeplane.plugin.script.filter;
+
+import java.awt.KeyboardFocusManager;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.FilterCancelledException;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.plugin.script.ExecuteScriptException;
+import org.freeplane.plugin.script.ScriptingEngine;
+
+public class ScriptCondition extends ASelectableCondition {
+ private static final String SCRIPT_FILTER_DESCRIPTION_RESOURCE = "plugins/script_filter";
+ private static final String SCRIPT_FILTER_ERROR_RESOURCE = "plugins/script_filter_error";
+ static final String NAME = "script_condition";
+ static final String SCRIPT = "SCRIPT";
+ final private String script;
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new ScriptCondition(element.getAttribute(SCRIPT, null));
+ }
+
+ public ScriptCondition(final String script) {
+ super();
+ this.script = script;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final ByteArrayOutputStream out = new ByteArrayOutputStream();
+ final PrintStream printStream = new PrintStream(out);
+ final Object result;
+ try {
+ result = ScriptingEngine.executeScript(node, script, printStream);
+ if(result instanceof Boolean)
+ return (Boolean) result;
+ if(result instanceof Number)
+ return ((Number) result).doubleValue() != 0;
+ printStream.println(this + ": got '" + result + "' for " + node);
+ printStream.close();
+ final String info = TextUtils.format(SCRIPT_FILTER_ERROR_RESOURCE, createDescription(),
+ node.toString(), String.valueOf(result));
+ cancel(info, true);
+ }
+ catch (ExecuteScriptException e) {
+ printStream.close();
+ final String info = TextUtils.format(SCRIPT_FILTER_ERROR_RESOURCE, createDescription(),
+ node.toString(), out.toString());
+ cancel(info, false);
+ }
+ return false;
+ }
+
+ private void cancel(final String info, boolean cancel) {
+ if(cancel){
+ JOptionPane.showMessageDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), info,
+ TextUtils.getText("error"), JOptionPane.ERROR_MESSAGE);
+ }
+ else{
+ final int result = JOptionPane.showConfirmDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), info,
+ TextUtils.getText("error"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
+ if(result == JOptionPane.OK_OPTION)
+ return;
+ }
+ throw new FilterCancelledException(info);
+ }
+
+ @Override
+ protected String createDescription() {
+ return TextUtils.format(SCRIPT_FILTER_DESCRIPTION_RESOURCE, script);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(SCRIPT, script);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
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
new file mode 100644
index 0000000..4bfc516
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptConditionController.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.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)) {
+ final String script = element.getAttribute(ScriptCondition.SCRIPT, null);
+ return new ScriptCondition(script);
+ }
+ }
+ 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.xml b/freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.xml
new file mode 100644
index 0000000..5011c25
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<preferences_structure>
+ <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_directories" />
+ <string name="script_classpath" />
+ </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/org/freeplane/plugin/script/proxy/AbstractProxy.java
new file mode 100644
index 0000000..a635ee3
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AbstractProxy.java
@@ -0,0 +1,46 @@
+package org.freeplane.plugin.script.proxy;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.plugin.script.ScriptContext;
+
+public abstract class AbstractProxy<T> {
+ private final T delegate;
+ private final ScriptContext scriptContext;
+
+ AbstractProxy(final T delegate, final ScriptContext scriptContext) {
+ this.delegate = delegate;
+ this.scriptContext = scriptContext;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public boolean equals(final Object obj) {
+ if (!getClass().equals(obj.getClass())) {
+ return false;
+ }
+ return delegate.equals(((AbstractProxy) obj).getDelegate());
+ }
+
+ public T getDelegate() {
+ return delegate;
+ }
+
+ public ScriptContext getScriptContext() {
+ return scriptContext;
+ }
+
+ public MModeController getModeController() {
+ return (MModeController) Controller.getCurrentModeController();
+ }
+
+ @Override
+ public int hashCode() {
+ return delegate.hashCode() * 31 + getClass().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + ":" + delegate.toString();
+ }
+}
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
new file mode 100644
index 0000000..6d3f1ff
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AttributesProxy.java
@@ -0,0 +1,258 @@
+/**
+ *
+ */
+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.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();
+ }
+}
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
new file mode 100644
index 0000000..14c6550
--- /dev/null
+++ b/freeplane_plugin_script/src/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.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
new file mode 100644
index 0000000..8959066
--- /dev/null
+++ b/freeplane_plugin_script/src/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.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
new file mode 100644
index 0000000..9f2ed85
--- /dev/null
+++ b/freeplane_plugin_script/src/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.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/ConnectorProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorProxy.java
new file mode 100644
index 0000000..65b9911
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorProxy.java
@@ -0,0 +1,135 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.awt.Color;
+
+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.link.mindmapmode.MLinkController;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+class ConnectorProxy extends AbstractProxy<ConnectorModel> implements Proxy.Connector {
+ ConnectorProxy(final ConnectorModel connector, final ScriptContext scriptContext) {
+ super(connector, scriptContext);
+ }
+
+ public Color getColor() {
+ return getLinkController().getColor(getConnector());
+ }
+
+ public String getColorCode() {
+ return ColorUtils.colorToString(getColor());
+ }
+
+ ConnectorModel getConnector() {
+ return getDelegate();
+ }
+
+ public boolean hasEndArrow() {
+ return getConnector().getEndArrow() == ArrowType.DEFAULT;
+ }
+
+ @Deprecated
+ public ArrowType getEndArrow() {
+ return getConnector().getEndArrow();
+ }
+
+ private MLinkController getLinkController() {
+ return (MLinkController) LinkController.getController();
+ }
+
+ public String getMiddleLabel() {
+ return getConnector().getMiddleLabel();
+ }
+
+ public Node getSource() {
+ return new NodeProxy(getConnector().getSource(), getScriptContext());
+ }
+
+ public String getSourceLabel() {
+ return getConnector().getSourceLabel();
+ }
+
+ public boolean hasStartArrow() {
+ return getConnector().getStartArrow() == ArrowType.DEFAULT;
+ }
+
+ @Deprecated
+ public ArrowType getStartArrow() {
+ return getConnector().getStartArrow();
+ }
+
+ public Node getTarget() {
+ return new NodeProxy(getConnector().getTarget(), getScriptContext());
+ }
+
+ public String getTargetLabel() {
+ return getConnector().getTargetLabel();
+ }
+
+ public void setColor(final Color color) {
+ getLinkController().setConnectorColor(getConnector(), color);
+ }
+
+ public void setColorCode(final String rgbString) {
+ setColor(ColorUtils.stringToColor(rgbString));
+ }
+
+ private void setEndArrowImpl(final ArrowType arrowType) {
+ final ConnectorModel connector = getConnector();
+ getLinkController().changeArrowsOfArrowLink(connector, connector.getStartArrow(), arrowType);
+ }
+
+ public void setEndArrow(boolean showArrow) {
+ setEndArrowImpl(showArrow ? ArrowType.DEFAULT : ArrowType.NONE);
+ }
+
+ @Deprecated
+ public void setEndArrow(final ArrowType arrowType) {
+ setEndArrowImpl(arrowType);
+ }
+
+ public void setMiddleLabel(final String label) {
+ getLinkController().setMiddleLabel(getConnector(), label);
+ }
+
+ @Deprecated
+ public void setSimulatesEdge(final boolean simulatesEdge) {
+ if(simulatesEdge)
+ getLinkController().setShape(getConnector(), Shape.EDGE_LIKE);
+ else
+ getLinkController().setShape(getConnector(), Shape.CUBIC_CURVE);
+ }
+
+ public void setSourceLabel(final String label) {
+ getLinkController().setSourceLabel(getConnector(), label);
+ }
+
+ public void setStartArrow(boolean showArrow) {
+ setStartArrowImpl(showArrow ? ArrowType.DEFAULT : ArrowType.NONE);
+ }
+
+ private void setStartArrowImpl(final ArrowType arrowType) {
+ final ConnectorModel connector = getConnector();
+ getLinkController().changeArrowsOfArrowLink(connector, arrowType, connector.getEndArrow());
+ }
+
+ @Deprecated
+ public void setStartArrow(final ArrowType arrowType) {
+ setStartArrowImpl(arrowType);
+ }
+
+ public void setTargetLabel(final String label) {
+ getLinkController().setTargetLabel(getConnector(), label);
+ }
+
+ public boolean simulatesEdge() {
+ return Shape.EDGE_LIKE.equals(getConnector().getShape());
+ }
+}
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
new file mode 100644
index 0000000..fe58e6b
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ControllerProxy.java
@@ -0,0 +1,238 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.Icon;
+
+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.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) {
+ final NodeModel nodeModel = ((NodeProxy) toSelect).getDelegate();
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeModel);
+ }
+
+ public void selectBranch(final Node branchRoot) {
+ 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();
+ }
+
+ 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 getViewController().getZoom();
+ }
+
+ public void setZoom(float ratio) {
+ getViewController().setZoom(ratio);
+ }
+
+ public boolean isInteractive() {
+ return !Boolean.parseBoolean(System.getProperty("nonInteractive"));
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConversionException.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConversionException.java
new file mode 100644
index 0000000..cd6f824
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConversionException.java
@@ -0,0 +1,17 @@
+package org.freeplane.plugin.script.proxy;
+
+public class ConversionException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public ConversionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ConversionException(String message) {
+ super(message);
+ }
+
+ public ConversionException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Convertible.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Convertible.java
new file mode 100644
index 0000000..edacc01
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Convertible.java
@@ -0,0 +1,278 @@
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.GroovyObjectSupport;
+import groovy.lang.MissingMethodException;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.format.FormattedDate;
+
+/** Utility class that is used to convert node texts to different types.
+ * It's especially important for Formulas. */
+// Unfortunately it seems impossible to implement Comparable<Object> since in this case
+// TypeTransformation.compareToWithEqualityCheck() is called and will return false for
+// assert new Comparable(2) == "2"
+// instead of just calling equals, which is correctly defined
+public class Convertible extends GroovyObjectSupport /*implements Comparable<Object>*/ {
+ private final String text;
+
+ /** doesn't evaluate formulas since this would require a calculation rule or NodeModel. */
+ public Convertible(String text) {
+ this.text = text;
+ }
+
+ /** same as toString(text), i.e. conversion is done properly. */
+ public Convertible(Object text) {
+ this.text = toString(text);
+ }
+
+ /**
+ * returns a Long or a Double, whatever fits best. All Java number literals are allowed as described
+ * by {@link Long#decode(String)}
+ *
+ * @throws ConversionException if text is not a number.
+ */
+ public Number getNum() throws ConversionException {
+ try {
+ return TextUtils.toNumber(text);
+ }
+ catch (NumberFormatException e) {
+ throw new ConversionException("not a number: '" + text + "'", e);
+ }
+ }
+
+
+ /**
+ * "Safe" variant of getNum(): returns a Long or a Double if text is convertible to it or 0 otherwise
+ * (even if text is null).
+ *
+ * @throws nothing - on any error (long) 0 is returned.
+ */
+ public Number getNum0() {
+ try {
+ final Number result = getNum();
+ return result == null ? 0L : result;
+ }
+ catch (Exception e) {
+ return 0L;
+ }
+ }
+
+ public String getString() {
+ return text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public String getPlain() {
+ return text == null ? null : HtmlUtils.htmlToPlain(text);
+ }
+
+ /**
+ * returns a Date for the parsed text.
+ * The valid date patterns are "yyyy-MM-dd HH:dd:ss.SSSZ" with optional '-', ':'. ' ' may be replaced by 'T'.
+ * @throws ConversionException if the text is not convertible to a date.
+ */
+ public Date getDate() throws ConversionException {
+ return text == null ? null : parseDate(text);
+ }
+
+ private static Date parseDate(String text) throws ConversionException {
+ final Date date = FormattedDate.toDateISO(text);
+ if(date != null)
+ return date;
+ throw new ConversionException("not a date: " + text);
+ }
+
+ /**
+ * returns a Calendar for the parsed text.
+ * @throws ConversionException if the text is not convertible to a date.
+ */
+ public Calendar getCalendar() throws ConversionException {
+ if (text == null)
+ return null;
+ final Date date = parseDate(text);
+ final GregorianCalendar result = new GregorianCalendar(0, 0, 0);
+ result.setTime(date);
+ return result;
+ }
+
+ public URI getUri() throws ConversionException {
+ if (text == null)
+ return null;
+ try {
+ if (TextUtils.matchUriPattern(text))
+ return new URI(text);
+ }
+ catch (URISyntaxException e) {
+ // throw below
+ }
+ throw new ConversionException("not an uri: " + text);
+ }
+
+ /**
+ * Uses the following priority ranking to determine the type of the text:
+ * <ol>
+ * <li>null
+ * <li>Long
+ * <li>Double
+ * <li>Date
+ * <li>String
+ * </ol>
+ * @return Object - the type that fits best.
+ */
+ public Object getObject() {
+ if (text == null)
+ return null;
+ try {
+ return getNum();
+ }
+ catch (ConversionException e1) {
+ try {
+ return getDate();
+ }
+ catch (ConversionException e2) {
+ try {
+ return getUri();
+ }
+ catch (ConversionException e3) {
+ return text;
+ }
+ }
+ }
+ }
+
+ /** Allow statements like this: <code>node['attr_name'].to.num</code>. */
+ public Convertible getTo() {
+ return this;
+ }
+
+ /** returns true if the text is convertible to number. */
+ public boolean isNum() {
+ // handles null -> false
+ return TextUtils.isNumber(text);
+ }
+
+ /** returns true if the text is convertible to date. */
+ public boolean isDate() {
+ return FormattedDate.isDate(text);
+ }
+
+ /** pretend we are a String if we don't provide a property for ourselves. */
+ public Object getProperty(String property) {
+ // called methods should handle null values
+ try {
+ // disambiguate isNum()/getNum() in favor of getNum()
+ if (property.equals("num"))
+ return getNum();
+ // same for isDate()/getDate()
+ if (property.equals("date"))
+ return getDate();
+ if (property.equals("uri"))
+ return getUri();
+ return super.getProperty(property);
+ }
+ catch (ConversionException e) {
+ throw new RuntimeException(e);
+ }
+ catch (Exception e) {
+ return InvokerHelper.getMetaClass(String.class).getProperty(text, property);
+ }
+ }
+
+ /** pretend we are a String if we don't provide a method for ourselves. */
+ public Object invokeMethod(String name, Object args) {
+ try {
+ // called methods should handle null values
+ return super.invokeMethod(name, args);
+ }
+ catch (MissingMethodException mme) {
+ return InvokerHelper.getMetaClass(String.class).invokeMethod(text, name, args);
+ }
+ }
+
+ /** has special conversions for
+ * <ul>
+ * <li>Date and Calendar are converted by
+ * org.apache.commons.lang.time.DateFormatUtils.format(date, "yyyy-MM-dd'T'HH:mm:ss.SSSZ"), i.e. to
+ * GMT timestamps, e.g.: "2010-08-16T22:31:55.123+0000".
+ * <li>null is "converted" to null
+ * </ul>
+ * All other types are converted via value.toString().
+ */
+ public static String toString(Object value) {
+ if (value == null)
+ return null;
+ else if (value.getClass().equals(String.class))
+ return (String) value;
+ else if (value instanceof Date)
+ return FormattedDate.toStringISO(((Date) value));
+ else if (value instanceof Calendar)
+ return FormattedDate.toStringISO(((Calendar) value).getTime());
+ else
+ return value.toString();
+ }
+
+ // Unfortunately it seems impossible to implement Comparable<Object> since in this case
+ // TypeTransformation.compareToWithEqualityCheck() is called and will return false for
+ // assert new Comparable(2) == "2"
+ // instead of just calling equals, which is correctly defined
+ public int compareTo(Object string) {
+ if (string.getClass() == String.class)
+ return text.compareTo((String) string);
+ else
+ return 1;
+ }
+
+ public int compareTo(Convertible convertible) {
+ return text.compareTo(convertible.getText());
+ }
+
+ /** since equals handles Strings special we have to stick to that here too since
+ * equal objects have to have the same hasCode. */
+ @Override
+ public int hashCode() {
+ return text == null ? 0 : text.hashCode();
+ }
+
+ /** note: if obj is a String the result is true if String.equals(text). */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return text == null;
+ if (obj.getClass() == String.class && text != null)
+ return text.equals(obj);
+ if (!(obj instanceof Convertible))
+ return false;
+ Convertible other = (Convertible) obj;
+ if (text == null) {
+ if (other.text != null)
+ return false;
+ }
+ else if (!text.equals(other.text))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return text;
+ }
+
+ @Override
+ public void setProperty(String property, Object newValue) {
+ throw new NotImplementedException("Convertibles are immutable");
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleDate.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleDate.java
new file mode 100644
index 0000000..c0e1bbb
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleDate.java
@@ -0,0 +1,42 @@
+package org.freeplane.plugin.script.proxy;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.freeplane.features.format.FormattedDate;
+
+public class ConvertibleDate extends Convertible {
+ final private Date date;
+
+ public ConvertibleDate(final Date date) {
+ super(FormattedDate.toStringISO(date));
+ this.date = date;
+ }
+
+ @Override
+ public Date getDate() {
+ return date;
+ }
+
+ @Override
+ public Calendar getCalendar() {
+ final Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ return calendar;
+ }
+
+ @Override
+ public Object getObject() {
+ return date;
+ }
+
+ @Override
+ public boolean isNum() {
+ return false;
+ }
+
+ @Override
+ public boolean isDate() {
+ return true;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java
new file mode 100644
index 0000000..89e59a5
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java
@@ -0,0 +1,25 @@
+package org.freeplane.plugin.script.proxy;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ExecuteScriptException;
+import org.freeplane.plugin.script.FormulaUtils;
+import org.freeplane.plugin.script.ScriptContext;
+
+/**
+ * A {@link Convertible} subclass as return type of {@link Node#getTo()}. Note that the nodeModel is only
+ * accessible for formula evaluation; Node.text is only read on construction, therefore text and nodeModel
+ * are not synchronized.
+ */
+public class ConvertibleNodeText extends Convertible {
+ /**
+ * Uses the text or, in case of HTML nodes, plain text of the node as a basis.
+ *
+ * Note that nodeModel.getText() will never return null since nodeModel.setText(null)
+ * will result in a NullPointerException. So there's nothing to check here.
+ * @throws ExecuteScriptException
+ */
+ public ConvertibleNodeText(NodeModel nodeModel, ScriptContext scriptContext) {
+ super(FormulaUtils.evalIfScript(nodeModel, scriptContext, HtmlUtils.htmlToPlain(nodeModel.getText(), true)));
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java
new file mode 100644
index 0000000..01c791a
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java
@@ -0,0 +1,59 @@
+package org.freeplane.plugin.script.proxy;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.plugin.script.FormulaUtils;
+import org.freeplane.plugin.script.ScriptContext;
+
+/** Uses plain note text as a basis for conversions. */
+public class ConvertibleNoteText extends Convertible {
+ private final NodeModel nodeModel;
+
+ public ConvertibleNoteText(final NodeModel nodeModel, final ScriptContext scriptContext) {
+ super(FormulaUtils.evalIfScript(nodeModel, scriptContext, htmlToPlain(nodeModel)));
+ this.nodeModel = nodeModel;
+ }
+
+ private static String htmlToPlain(final NodeModel nodeModel) {
+ final String htmlNote = getHtmlNote(nodeModel);
+ return htmlNote == null ? null : HtmlUtils.htmlToPlain(htmlNote);
+ }
+
+ private static String getHtmlNote(final NodeModel nodeModel) {
+ return NoteModel.getNoteText(nodeModel);
+ }
+
+ /** returns the original HTML text. */
+ public String getString() {
+ return getHtmlNote(nodeModel);
+ }
+
+ /** returns the original HTML text. */
+ public String getText() {
+ return getHtmlNote(nodeModel);
+ }
+
+ public String getPlain() {
+ // for conversions we use the plain text
+ return super.getText();
+ }
+
+ /** since equals handles Strings special we have to stick to that here too since
+ * equal objects have to have the same hasCode. */
+ @Override
+ public int hashCode() {
+ return getHtmlNote(nodeModel).hashCode();
+ }
+
+ /** note: if obj is a String the result is true if String.equals(text). */
+ @Override
+ public boolean equals(final Object obj) {
+ return getHtmlNote(nodeModel).equals(obj);
+ }
+
+ @Override
+ public String toString() {
+ return getText();
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNumber.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNumber.java
new file mode 100644
index 0000000..eea2cd2
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNumber.java
@@ -0,0 +1,38 @@
+package org.freeplane.plugin.script.proxy;
+
+
+public class ConvertibleNumber extends Convertible {
+ final private Number number;
+
+ public ConvertibleNumber(final Number number) {
+ super(number);
+ this.number = number;
+ }
+
+ @Override
+ public Number getNum() {
+ return number;
+ }
+
+ @Override
+ public Number getNum0() {
+ if (number == null)
+ return 0;
+ return number;
+ }
+
+ @Override
+ public Object getObject() {
+ return number;
+ }
+
+ @Override
+ public boolean isNum() {
+ return true;
+ }
+
+ @Override
+ public boolean isDate() {
+ return false;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleText.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleText.java
new file mode 100644
index 0000000..2f3af92
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleText.java
@@ -0,0 +1,16 @@
+package org.freeplane.plugin.script.proxy;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.FormulaUtils;
+import org.freeplane.plugin.script.ScriptContext;
+
+public class ConvertibleText extends Convertible {
+ public ConvertibleText(NodeModel nodeModel, ScriptContext scriptContext, String text) {
+ super(FormulaUtils.evalIfScript(nodeModel, scriptContext, text));
+// this seems to be annoying since for loops over node lists with not all having a certain attribute its easier
+// to allow such convertibles
+// if (getText() == null)
+// throw new NullPointerException(TextUtils.format("formula.error.attributeValueIsNull", (text == null ? "null"
+// : text)));
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/EdgeProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/EdgeProxy.java
new file mode 100644
index 0000000..5ea106d
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/EdgeProxy.java
@@ -0,0 +1,55 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.awt.Color;
+
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+
+class EdgeProxy extends AbstractProxy<NodeModel> implements Proxy.Edge {
+ EdgeProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ public Color getColor() {
+ return getEdgeController().getColor(getDelegate());
+ }
+
+ public String getColorCode() {
+ return ColorUtils.colorToString(getColor());
+ }
+
+ private MEdgeController getEdgeController() {
+ return (MEdgeController) EdgeController.getController();
+ }
+
+ public EdgeStyle getType() {
+ return getEdgeController().getStyle(getDelegate());
+ }
+
+ public int getWidth() {
+ return getEdgeController().getWidth(getDelegate());
+ }
+
+ public void setColor(final Color color) {
+ getEdgeController().setColor(getDelegate(), color);
+ }
+
+ public void setColorCode(final String rgbString) {
+ setColor(ColorUtils.stringToColor(rgbString));
+ }
+
+ public void setType(final EdgeStyle type) {
+ getEdgeController().setStyle(getDelegate(), type);
+ }
+
+ public void setWidth(final int width) {
+ getEdgeController().setWidth(getDelegate(), width);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java
new file mode 100644
index 0000000..b476c10
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java
@@ -0,0 +1,78 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.view.swing.features.filepreview.ExternalResource;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+
+class ExternalObjectProxy extends AbstractProxy<NodeModel> implements Proxy.ExternalObject {
+ ExternalObjectProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ private ExternalResource getExternalObjectModel() {
+ return (ExternalResource) getDelegate().getExtension(ExternalResource.class);
+ }
+
+ public String getUri() {
+ final ExternalResource externalObject = getExternalObjectModel();
+ final URI uri = externalObject == null ? null : externalObject.getUri();
+ return uri == null ? null : uri.toString();
+ }
+
+ @Deprecated
+ public String getURI() {
+ return getUri();
+ }
+
+ private ViewerController getViewerController() {
+ return (ViewerController) getModeController().getExtension(ViewerController.class);
+ }
+
+ public float getZoom() {
+ final ExternalResource externalObject = getExternalObjectModel();
+ return externalObject == null ? 1f : externalObject.getZoom();
+ }
+
+ public void setUri(final String uri) {
+ ExternalResource externalObject = getExternalObjectModel();
+ try {
+ if (externalObject != null) {
+ if (uri == null) {
+ // remove object
+ getViewerController().undoableToggleHook(getDelegate(), null);
+ return;
+ }
+ getViewerController().undoableToggleHook(getDelegate(), externalObject);
+ externalObject = new ExternalResource(new URI(uri));
+ getViewerController().undoableToggleHook(getDelegate(), externalObject);
+ }
+ }
+ catch (final URISyntaxException e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ @Deprecated
+ public void setURI(final String uri) {
+ setUri(uri);
+ }
+
+ public void setZoom(final float zoom) {
+ final ExternalResource externalObject = getExternalObjectModel();
+ if (externalObject != null)
+ getViewerController().setZoom(getModeController(), getDelegate().getMap(), externalObject, zoom);
+ }
+
+ /** make <code>if (node.externalObject) println "has an externalObject"</code> work. */
+ public boolean asBoolean() {
+ return getExternalObjectModel() != null;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FontProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FontProxy.java
new file mode 100644
index 0000000..670a95e
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FontProxy.java
@@ -0,0 +1,84 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+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.plugin.script.ScriptContext;
+
+class FontProxy extends AbstractProxy<NodeModel> implements Proxy.Font {
+ FontProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ public String getName() {
+ return getStyleController().getFontFamilyName(getDelegate());
+ }
+
+ public int getSize() {
+ return getStyleController().getFontSize(getDelegate());
+ }
+
+ private MNodeStyleController getStyleController() {
+ return (MNodeStyleController) NodeStyleController.getController();
+ }
+
+ public boolean isBold() {
+ return getStyleController().isBold(getDelegate());
+ }
+
+ public boolean isBoldSet() {
+ return NodeStyleModel.isBold(getDelegate()) != null;
+ }
+
+ public boolean isItalic() {
+ return getStyleController().isItalic(getDelegate());
+ }
+
+ public boolean isItalicSet() {
+ return NodeStyleModel.isItalic(getDelegate()) != null;
+ }
+
+ public boolean isNameSet() {
+ return NodeStyleModel.getFontFamilyName(getDelegate()) != null;
+ }
+
+ public boolean isSizeSet() {
+ return NodeStyleModel.getFontSize(getDelegate()) != null;
+ }
+
+ public void resetBold() {
+ getStyleController().setBold(getDelegate(), null);
+ }
+
+ public void resetItalic() {
+ getStyleController().setItalic(getDelegate(), null);
+ }
+
+ public void resetName() {
+ getStyleController().setFontFamily(getDelegate(), null);
+ }
+
+ public void resetSize() {
+ getStyleController().setFontSize(getDelegate(), null);
+ }
+
+ public void setBold(final boolean bold) {
+ getStyleController().setBold(getDelegate(), bold);
+ }
+
+ public void setItalic(final boolean italic) {
+ getStyleController().setItalic(getDelegate(), italic);
+ }
+
+ public void setName(final String name) {
+ getStyleController().setFontFamily(getDelegate(), name);
+ }
+
+ public void setSize(final int size) {
+ getStyleController().setFontSize(getDelegate(), size);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FormulaCache.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FormulaCache.java
new file mode 100644
index 0000000..31c1010
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FormulaCache.java
@@ -0,0 +1,43 @@
+package org.freeplane.plugin.script.proxy;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ExecuteScriptException;
+
+public class FormulaCache implements IExtension{
+ private HashMap<String, LinkedHashMap<String, Object>> cache = new HashMap<String, LinkedHashMap<String, Object>>();
+
+ public Object get(NodeModel nodeModel, String text) {
+ final LinkedHashMap<String, Object> cacheEntry = cache.get(nodeModel.getID());
+ if (cacheEntry == null) return null;
+ final Object object = cacheEntry.get(text);
+ if(object instanceof ExecuteScriptException){
+ throw (ExecuteScriptException)object;
+ }
+ return object;
+ }
+
+ public void put(NodeModel nodeModel, String text, Object value) {
+ getOrAdd(nodeModel).put(text, value);
+ }
+
+ private LinkedHashMap<String, Object> getOrAdd(NodeModel node) {
+ LinkedHashMap<String, Object> cacheEntry = cache.get(node.getID());
+ if (cacheEntry == null) {
+ cacheEntry = new LinkedHashMap<String, Object>(8);
+ cache.put(node.getID(), cacheEntry);
+ }
+ return cacheEntry;
+ }
+
+ public void markAsDirtyIfFormulaNode(NodeModel node) {
+ final LinkedHashMap<String, Object> entry = cache.get(node.getID());
+ if (entry != null) {
+// System.out.println("clearing cache for " + node);
+ entry.clear();
+ }
+ }
+}
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
new file mode 100644
index 0000000..c5627bb
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/IconsProxy.java
@@ -0,0 +1,122 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.net.URL;
+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.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 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);
+ }
+
+ /** 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
new file mode 100644
index 0000000..2c58418
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/LinkProxy.java
@@ -0,0 +1,147 @@
+/**
+ *
+ */
+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), false);
+ }
+ }
+ catch (final URISyntaxException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ // Link R/W
+ public void setUri(URI target) {
+ if (!removeLinkIfNull(target)) {
+ getLinkController().setLink(getDelegate(), target, false);
+ }
+ }
+
+ // Link R/W
+ public void setFile(File file) {
+ if (!removeLinkIfNull(file)) {
+ getLinkController().setLink(getDelegate(), file.toURI(), false);
+ }
+ }
+
+ // 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, false);
+ 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
new file mode 100644
index 0000000..aa9f4b0
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/MapProxy.java
@@ -0,0 +1,191 @@
+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 showAnchestors, 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()), showAnchestors,
+ showDescendants, true);
+ filterController.applyFilter(filter, getDelegate(), true);
+ }
+ }
+
+ // Map: R/W
+ public void filter(final boolean showAnchestors, final boolean showDescendants, final Closure<Boolean> closure) {
+ setFilter(showAnchestors, showDescendants, closure);
+ }
+
+ // Map: R/W
+ public void redoFilter() {
+ FilterController.getCurrentFilterController().redo();
+ }
+
+ // Map: R/W
+ public void undoFilter() {
+ FilterController.getCurrentFilterController().undo();
+ }
+}
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
new file mode 100644
index 0000000..e8f1dc0
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeProxy.java
@@ -0,0 +1,697 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+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.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
+import org.freeplane.features.encrypt.Base64Coding;
+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.FreeNode;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapNavigationUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+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.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Attributes;
+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) {
+ final MTextController textController = (MTextController) TextController.getController();
+ if (details == null) {
+ textController.setDetailsHidden(getDelegate(), false);
+ textController.setDetails(getDelegate(), null);
+ }
+ else{
+ textController.setDetails(getDelegate(), convertConvertibleToHtml(details));
+ }
+ }
+
+ // 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 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 ConvertibleText(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());
+ }
+
+ // 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 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 text) {
+ final MNoteController noteController = (MNoteController) NoteController.getController();
+ noteController.setNoteText(getDelegate(), text);
+ }
+
+ // 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);
+ }
+}
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
new file mode 100644
index 0000000..8402599
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeStyleProxy.java
@@ -0,0 +1,174 @@
+/**
+ *
+ */
+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.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);
+ }
+}
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
new file mode 100644
index 0000000..f8254e4
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Proxy.java
@@ -0,0 +1,1356 @@
+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.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();
+ }
+
+ /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
+ * - read-only. */
+ interface ConnectorRO {
+ 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();
+ }
+
+ /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
+ * - read-write. */
+ interface Connector extends ConnectorRO {
+ 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);
+ }
+
+ /** Access to global state: <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();
+ }
+
+ /** Access to global state: <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. */
+ void setUri(String uri);
+
+ /** 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>. */
+ List<String> getIcons();
+
+ /** returns a list of the urls of the icons the node has. */
+ List<URL> getUrls();
+ }
+
+ /** 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);
+ }
+
+ /** 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();
+
+ /** returns the node if the map contains it or null otherwise. */
+ Node node(String id);
+
+ /** returns the physical location of the map 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 anchestors 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 anchestors 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 showAnchestors, 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 showAnchestors, 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();
+ }
+
+ /** 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")
+ * </pre>
+ * @throws ExecuteScriptException
+ * @since 1.2
+ */
+ Convertible getAt(String attributeName);
+
+ /** 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.
+ * @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 a Convertible object for the plain not text. 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().
+ * @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();
+
+ /** 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();
+ }
+
+ /** 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);
+
+ /** 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);
+
+ /** @deprecated since 1.2 - use {@link #setNote(Object)} instead. */
+ void setNoteText(String text);
+
+ /** 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);
+ }
+
+ /** 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();
+ }
+
+ /** 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);
+
+ /** @param sets the floating style for the node (aka "free node"). Should normally only 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);
+ }
+
+ /** 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/org/freeplane/plugin/script/proxy/ProxyFactory.java
new file mode 100644
index 0000000..e595178
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyFactory.java
@@ -0,0 +1,34 @@
+package org.freeplane.plugin.script.proxy;
+
+import java.util.AbstractList;
+import java.util.List;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+
+public class ProxyFactory {
+ static public Proxy.Controller createController(final ScriptContext scriptContext) {
+ return new ControllerProxy(scriptContext);
+ }
+
+ static public Proxy.Node createNode(final NodeModel node, final ScriptContext scriptContext) {
+ return new NodeProxy(node, scriptContext);
+ }
+
+ static List<Proxy.Node> createNodeList(final List<NodeModel> list, final ScriptContext scriptContext) {
+ return new AbstractList<Proxy.Node>() {
+ final private List<NodeModel> nodeModels = list;
+
+ @Override
+ public Proxy.Node get(final int index) {
+ final NodeModel nodeModel = nodeModels.get(index);
+ return new NodeProxy(nodeModel, scriptContext);
+ }
+
+ @Override
+ public int size() {
+ return nodeModels.size();
+ }
+ };
+ }
+}
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
new file mode 100644
index 0000000..6af0ef5
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyUtils.java
@@ -0,0 +1,240 @@
+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/src/org/freeplane/plugin/script/proxy/ReminderProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ReminderProxy.java
new file mode 100644
index 0000000..23d1218
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ReminderProxy.java
@@ -0,0 +1,109 @@
+package org.freeplane.plugin.script.proxy;
+
+import java.util.Date;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.view.swing.features.time.mindmapmode.ReminderExtension;
+import org.freeplane.view.swing.features.time.mindmapmode.ReminderHook;
+
+public class ReminderProxy extends AbstractProxy<NodeModel> implements Proxy.Reminder {
+ ReminderProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ // ReminderRO
+ public Date getRemindAt() {
+ final ReminderExtension extension = getDelegate().getExtension(ReminderExtension.class);
+ if (extension == null)
+ return null;
+ return new Date(extension.getRemindUserAt());
+ }
+
+ // ReminderRO
+ public String getPeriodUnit() {
+ final ReminderExtension extension = getDelegate().getExtension(ReminderExtension.class);
+ if (extension == null || extension.getPeriodUnit() == null)
+ return null;
+ return extension.getPeriodUnitAsString();
+ }
+
+ // ReminderRO
+ public Integer getPeriod() {
+ final ReminderExtension extension = getDelegate().getExtension(ReminderExtension.class);
+ if (extension == null)
+ return null;
+ return extension.getPeriod();
+ }
+
+ // ReminderRO
+ public String getScript() {
+ final ReminderExtension extension = getDelegate().getExtension(ReminderExtension.class);
+ if (extension == null)
+ return null;
+ return extension.getScript();
+ }
+
+// // Reminder
+// public void createOrReplace(Date remindAt) {
+// final ReminderHook reminderHook = Controller.getCurrentModeController().getExtension(ReminderHook.class);
+// removeOldReminder(reminderHook);
+// final ReminderExtension reminder = newReminder(remindAt);
+// reminderHook.add(getDelegate(), reminder);
+// }
+
+ private void removeOldReminder(final ReminderHook reminderHook) {
+ final ReminderExtension oldReminder = getDelegate().getExtension(ReminderExtension.class);
+ if (oldReminder != null) {
+ reminderHook.remove(getDelegate(), oldReminder);
+ }
+ }
+
+ // Reminder
+ public void createOrReplace(Date remindAt, String periodUnit, Integer period) {
+ final ReminderHook reminderHook = Controller.getCurrentModeController().getExtension(ReminderHook.class);
+ removeOldReminder(reminderHook);
+ final ReminderExtension reminder = newReminder(remindAt);
+ reminder.setPeriodUnitAsString(periodUnit);
+ reminder.setPeriod(period);
+ reminderHook.add(getDelegate(), reminder);
+ }
+
+ private ReminderExtension newReminder(Date remindAt) {
+ final ReminderExtension reminder = new ReminderExtension(getDelegate());
+ reminder.setRemindUserAt(remindAt.getTime());
+ return reminder;
+ }
+
+ // Reminder
+ public void setScript(String scriptSource) {
+ final ReminderExtension reminder = getDelegate().getExtension(ReminderExtension.class);
+ if (reminder == null)
+ throw new NullPointerException("no reminder defined for node " + this);
+ reminder.setScript(scriptSource);
+ }
+
+ // Reminder
+ public void remove() {
+ final ReminderHook reminderHook = Controller.getCurrentModeController().getExtension(ReminderHook.class);
+ removeOldReminder(reminderHook);
+ }
+
+ /** make <code>if (node.reminder) println "has reminder"</code> work. */
+ public boolean asBoolean() {
+ return getDelegate().getExtension(ReminderExtension.class) != null;
+ }
+
+ @Override
+ public String toString() {
+ final ReminderExtension reminder = getDelegate().getExtension(ReminderExtension.class);
+ if (reminder == null) {
+ return "no reminder";
+ }
+ else {
+ return "periodic reminder fires at " + reminder.getRemindUserAt() + " and then every "
+ + reminder.getPeriod() + " " + reminder.getPeriodUnit();
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptApiTest.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptApiTest.java
new file mode 100644
index 0000000..a14acd5
--- /dev/null
+++ b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptApiTest.java
@@ -0,0 +1,1094 @@
+package org.freeplane.plugin.script.proxy;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.freeplane.core.util.FreeplaneIconUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.NodeContainsCondition;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.plugin.script.proxy.Proxy.Map;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+public class ScriptApiTest {
+ ControllerProxy c;
+ NodeProxy node;
+ private Map map;
+ private Comparator<NodeProxy> nodeComparator = new Comparator<NodeProxy>() {
+ public int compare(NodeProxy o1, NodeProxy o2) {
+ return new Integer(System.identityHashCode(o1.getDelegate())).compareTo(System.identityHashCode(o2
+ .getDelegate()));
+ }
+ };
+
+ @SuppressWarnings("serial")
+ public static class TestException extends RuntimeException {
+ public TestException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public TestException(String message) {
+ super(message);
+ }
+ }
+
+ public ScriptApiTest(ControllerProxy c, NodeProxy node) {
+ this.c = c;
+ this.node = node;
+ }
+
+ public static void runAll(ControllerProxy c, NodeProxy node) {
+ final long startMillis = System.currentTimeMillis();
+ int failures = 0;
+ int errors = 0;
+ int pass = 0;
+ Method tearDown = null;
+ try {
+ tearDown = ScriptApiTest.class.getMethod("tearDown");
+ }
+ catch (Exception e) {
+ // ignore
+ }
+ for (Method method : ScriptApiTest.class.getMethods()) {
+ if (!method.getName().startsWith("test"))
+ continue;
+ // new fixture
+ final ScriptApiTest instance = new ScriptApiTest(c, node);
+ try {
+ method.invoke(instance);
+ LogUtils.info(method.getName() + ": pass");
+ pass++;
+ }
+ catch (InvocationTargetException e) {
+ if (e.getCause() instanceof TestException) {
+ LogUtils.warn(method.getName() + ": failure: " + e.getCause().getMessage(), e.getCause());
+ failures++;
+ }
+ else {
+ LogUtils.warn(method.getName() + ": error invoking test: " + e.getCause().getMessage(), e
+ .getCause());
+ errors++;
+ }
+ }
+ catch (Throwable e) {
+ LogUtils.warn(method.getName() + ": other error: " + e.getMessage(), e);
+ errors++;
+ }
+ finally {
+ try {
+ if (tearDown != null)
+ tearDown.invoke(instance);
+ }
+ catch (Throwable e) {
+ LogUtils.warn("failure executing tearDown after " + method.getName(), e);
+ }
+ }
+ }
+ double seconds = (System.currentTimeMillis() - startMillis) / 1000.;
+ String message = null;
+ String iconKey = null;
+ if (errors + failures == 0) {
+ message = "success! " + pass + " tests passed in " + seconds + " seconds";
+ iconKey = "button_ok";
+ }
+ else {
+ message = "error! test result: " + errors + " errors, " + failures + " failures; " + pass
+ + " tests passed in " + seconds + " seconds";
+ iconKey = "button_cancel";
+ }
+ LogUtils.info(message);
+ c.setStatusInfo(ViewController.STANDARD_STATUS_INFO_KEY, message, iconKey);
+ }
+
+ public void tearDown() {
+ if (map != null)
+ map.close(true, false);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_AttributesRO_get_String_name() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("first value should be found", "va1", map.getRoot().getAttributes().get("a1"));
+ assertEquals("should return null for non-existing attributes", null, map.getRoot().getAttributes().get("x"));
+ }
+
+ private Map setupMapWithSomeAttributes() {
+ createTestMap();
+ map.getRoot().getAttributes().add("a1", "va1");
+ map.getRoot().getAttributes().add("a1", "va2");
+ map.getRoot().getAttributes().add("a1", "va3");
+ map.getRoot().getAttributes().add("b1", "vb1");
+ return map;
+ }
+
+ private void assertEquals(String message, Object expected, Object actual) {
+ message = (message == null || message.length() == 0) ? "Failure" : message;
+ boolean isEqual = expected == null && actual == null || expected != null && actual != null
+ && expected.equals(actual);
+ if (!isEqual) {
+ fail(message + ". Expected: " + expected + ", but was: " + actual);
+ }
+ }
+
+ private void assertTrue(String message, boolean test) {
+ if (!test)
+ fail(message);
+ }
+
+ private void assertFalse(String message, boolean test) {
+ if (test)
+ fail(message);
+ }
+
+ private void fail(final String m) {
+ throw new TestException(m);
+ }
+
+ private Map createTestMap() {
+ map = c.newMap();
+ map.getRoot().createChild("first node");
+ map.getRoot().createChild("second node");
+ return map;
+ }
+
+ private Node firstChild(final Node node) {
+ return node.getChildren().get(0);
+ }
+
+ private Node firstChild() {
+ return firstChild(map.getRoot());
+ }
+
+ public void test_AttributesRO_getAll_String_name() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("all values should be found", list("va1", "va2", "va3"), map.getRoot().getAttributes().getAll(
+ "a1"));
+ assertEquals("all values should be found", Collections.singletonList("vb1"), map.getRoot().getAttributes()
+ .getAll("b1"));
+ assertEquals("should return empty list for non-existing attributes", Collections.EMPTY_LIST, map.getRoot()
+ .getAttributes().getAll("x"));
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_AttributesRO_getAttributeNames() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("all names should be found", list("a1", "a1", "a1", "b1"), map.getRoot().getAttributes()
+ .getAttributeNames());
+ }
+
+ public void test_AttributesRO_get_int_index() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("find by index", "va1", map.getRoot().getAttributes().get(0));
+ assertEquals("find by index", "va2", map.getRoot().getAttributes().get(1));
+ assertEquals("find by index", "va3", map.getRoot().getAttributes().get(2));
+ assertEquals("find by index", "vb1", map.getRoot().getAttributes().get(3));
+ try {
+ map.getRoot().getAttributes().get(4);
+ fail("expect IndexOutOfBoundsException on get(int) with illegal index");
+ }
+ catch (IndexOutOfBoundsException e) {
+ // OK - expected
+ }
+ }
+
+ public void test_AttributesRO_findAttribute_String_name() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("first matching attribute should be found", 0, map.getRoot().getAttributes().findFirst("a1"));
+ }
+
+ public void test_AttributesRO_size() {
+ map = setupMapWithSomeAttributes();
+ assertEquals("count attributes", 4, map.getRoot().getAttributes().size());
+ }
+
+ public void test_Attributes_set_int_index_String_value() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().set(3, "VB1");
+ map.getRoot().getAttributes().set(1, "VA2");
+ assertEquals("values should be updated", list("va1", "VA2", "va3"), map.getRoot().getAttributes().getAll(
+ "a1"));
+ assertEquals("values should be updated", list("VB1"), map.getRoot().getAttributes().getAll("b1"));
+ try {
+ map.getRoot().getAttributes().set(4, "xx");
+ fail("expect IndexOutOfBoundsException on set(int, value) with illegal index");
+ }
+ catch (IndexOutOfBoundsException e) {
+ // OK - expected
+ }
+ }
+
+ public void test_Attributes_set_int_index_String_name_String_value() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().set(1, "c1", "VC1");
+ assertEquals("values should be updated", list("va1", "va3"), map.getRoot().getAttributes().getAll("a1"));
+ assertEquals("values should be updated", 1, map.getRoot().getAttributes().findFirst("c1"));
+ assertEquals("values should be updated", "VC1", map.getRoot().getAttributes().get(1));
+ try {
+ map.getRoot().getAttributes().set(4, "xx", "yy");
+ fail("expect IndexOutOfBoundsException on set(int, name, value) with illegal index");
+ }
+ catch (IndexOutOfBoundsException e) {
+ // OK - expected
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_Attributes_remove_String_name() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().remove("a1");
+ assertEquals("first matching attribute should be removed", list("va2", "va3"), map.getRoot()
+ .getAttributes().getAll("a1"));
+ assertEquals("first matching attribute should be removed", 3, map.getRoot().getAttributes().size());
+ }
+
+ private <T> List<T> list(T... args) {
+ return Arrays.asList(args);
+ }
+
+ private <T> Set<T> set(T... args) {
+ return set(Arrays.asList(args));
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> Set<T> set(List<T> list) {
+ TreeSet<T> set = null;
+ if (list.size() > 0 && list.get(0) instanceof Node)
+ set = new TreeSet<T>((Comparator<T>) nodeComparator);
+ else
+ set = new TreeSet<T>();
+ set.addAll(list);
+ return set;
+ }
+
+ public void test_Attributes_removeAll_String_name() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().removeAll("a1");
+ assertEquals("all matching attributes should be removed", list(), map.getRoot().getAttributes()
+ .getAll("a1"));
+ assertEquals("all matching attribute should be removed", 1, map.getRoot().getAttributes().size());
+ }
+
+ public void test_Attributes_remove_int_index() {
+ map = setupMapWithSomeAttributes();
+ // remove from the rear to keep the index stable (otherwise remove(1) twice)
+ map.getRoot().getAttributes().remove(2);
+ map.getRoot().getAttributes().remove(1);
+ assertEquals("attribute should be removed", list("va1"), map.getRoot().getAttributes().getAll("a1"));
+ assertEquals("attribute should be removed", 2, map.getRoot().getAttributes().size());
+ }
+
+ public void test_Attributes_set_String_name_String_value() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().set("a1", "VA1");
+ map.getRoot().getAttributes().set("c1", "vc1");
+ assertEquals("first matching attribute should be changed", list("VA1", "va2", "va3"), map.getRoot()
+ .getAttributes().getAll("a1"));
+ assertEquals("attribute should be added", list("vc1"), map.getRoot().getAttributes().getAll("c1"));
+ assertEquals("attribute should be added", 5, map.getRoot().getAttributes().size());
+ }
+
+ public void test_Attributes_add_String_name_String_value() {
+ map = setupMapWithSomeAttributes();
+ map.getRoot().getAttributes().add("a1", "va1");
+ map.getRoot().getAttributes().set("c1", "vc1");
+ assertEquals("attribute should be added", list("va1", "va2", "va3", "va1"), map.getRoot().getAttributes()
+ .getAll("a1"));
+ assertEquals("attribute should be added", list("vc1"), map.getRoot().getAttributes().getAll("c1"));
+ assertEquals("attribute should be added", 6, map.getRoot().getAttributes().size());
+ }
+
+ //
+ // public void test_ConnectorRO_getColor() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getEndArrow() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getMiddleLabel() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getSource() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getSourceLabel() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getStartArrow() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getTarget() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_getTargetLabel() {
+ //
+ // }
+ //
+ // public void test_ConnectorRO_simulatesEdge() {
+ //
+ // }
+ //
+ // public void test_Connector_setColor_Color_color() {
+ //
+ // }
+ //
+ // public void test_Connector_setEndArrow_ArrowType_arrowType() {
+ //
+ // }
+ //
+ // public void test_Connector_setMiddleLabel_String_label() {
+ //
+ // }
+ //
+ // public void test_Connector_setSimulatesEdge_boolean_simulatesEdge() {
+ //
+ // }
+ //
+ // public void test_Connector_setSourceLabel_String_label() {
+ //
+ // }
+ //
+ // public void test_Connector_setStartArrow_ArrowType_arrowType() {
+ //
+ // }
+ //
+ // public void test_Connector_setTargetLabel_String_label() {
+ //
+ // }
+ public void test_ControllerRO_getSelected() {
+ map = c.newMap();
+ assertEquals("new root node should be selected", map.getRoot(), c.getSelected());
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final Node secondChild = map.getRoot().createChild("child 2");
+ // FIXME: why aren't the new node selected?
+ assertEquals("root node should still be selected after adding nodes", map.getRoot(), c.getSelected());
+ c.selectMultipleNodes(list(firstChild, secondChild));
+ // what's the rule?
+ assertEquals("last selected node should be returned", secondChild, c.getSelected());
+ }
+
+ public void test_ControllerRO_getSelecteds() {
+ map = c.newMap();
+ assertEquals("new root node should be selected", map.getRoot(), c.getSelected());
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final Node secondChild = map.getRoot().createChild("child 2");
+ assertEquals("root node should still be selected after adding nodes", set(map.getRoot()), set(c
+ .getSelecteds()));
+ c.selectMultipleNodes(list(firstChild, secondChild));
+ assertEquals("only the nodes selected via selectMultipleNodes should be returned",
+ set(firstChild, secondChild), set(c.getSelecteds()));
+ }
+
+ public void test_ControllerRO_getSortedSelection_boolean_differentSubtrees() {
+
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_ControllerRO_find_ICondition_condition() {
+ map = c.newMap();
+ @SuppressWarnings("unused")
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final Node secondChild = map.getRoot().createChild("child 2");
+ final List<Node> found = c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 2", false));
+ assertEquals("one matching node should be found", list(secondChild), found);
+ }
+
+ public void test_ControllerRO_find_Closure_closure() {
+
+ }
+
+ public void test_Controller_centerOnNode_Node_center() {
+ map = c.newMap();
+ final Node firstChild = map.getRoot().createChild("child 1");
+ // no actual test
+ c.centerOnNode(firstChild);
+ }
+
+ public void test_Controller_select_Node_toSelect() {
+ map = c.newMap();
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final Node secondChild = map.getRoot().createChild("child 2");
+ final Node thirdChild = map.getRoot().createChild("child 3");
+ c.select(secondChild);
+ final Set<Node> set = set(secondChild);
+ final Set<Node> selected = set(c.getSelecteds());
+ assertEquals("one node should be selected", set, selected);
+ c.select(firstChild);
+ assertEquals("one node should be selected", set(firstChild), set(c.getSelecteds()));
+ c.select(thirdChild);
+ assertEquals("one node should be selected", set(thirdChild), set(c.getSelecteds()));
+ }
+
+ public void test_Controller_selectBranch_Node_branchRoot() {
+ map = c.newMap();
+ final Node child1 = map.getRoot().createChild("child 1");
+ final Node child2 = map.getRoot().createChild("child 2");
+ final Node grandchild1 = child1.createChild("child 1.1");
+ final Node grandchild2 = child1.createChild("child 1.2");
+ final Node grandGrandChild = child1.createChild("child 1.1.1");
+ c.selectBranch(child1);
+ assertEquals("all node of the branch should be selected",
+ set(child1, grandchild1, grandchild2, grandGrandChild), set(c.getSelecteds()));
+ c.selectBranch(child2);
+ assertEquals("one node should be selected", set(child2), set(c.getSelecteds()));
+ }
+
+ public void test_Controller_selectMultipleNodes_List_Node_toSelect() {
+ // see test_ControllerRO_getSelected()
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_Controller_undo_redo_stuff() {
+ map = c.newMap();
+ map.getRoot().createChild("child 1");
+ assertFalse("node should be there before undo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
+ c.undo();
+ assertTrue("node should be away after undo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
+ c.redo();
+ assertFalse("node should be there after redo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
+ c.deactivateUndo();
+ c.undo();
+ assertTrue("node should still be there after undo since undo is deactivated", c.find(
+ new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
+ }
+
+ public void test_Controller_setStatusInfo_String_info() {
+ // no actual test
+ c.setStatusInfo("test statusinfo");
+ // no actual test - info should be removed
+ c.setStatusInfo(null);
+ }
+
+ public void test_Controller_setStatusInfo_String_infoPanelKey_String_info() {
+ // no actual test
+ final String infoPanelKey = "testStatusPanel";
+ c.setStatusInfo(infoPanelKey, "someid");
+ // no actual test - info should be removed
+ c.setStatusInfo(infoPanelKey, (String) null);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_Controller_setStatusInfo_String_infoPanelKey_Icon_icon() {
+ final List<String> keys = FreeplaneIconUtils.listStandardIconKeys();
+ assertTrue("find out about the available icons with FreeplaneIconUtils.listStandardIconKeys() -> " + keys,
+ keys.contains("button_ok"));
+ // no actual test
+ c.setStatusInfo("standard", FreeplaneIconUtils.createStandardIcon("button_ok"));
+ // no actual test - info should be removed
+ c.setStatusInfo(null);
+ }
+
+ public void test_Controller_setStatusInfo_String_infoPanelKey_String_info_String_iconKey() {
+ final List<String> keys = FreeplaneIconUtils.listStandardIconKeys();
+ final String iconKey = "button_ok";
+ assertTrue("check if FreeplaneIconUtils.listStandardIconKeys() contains '" + iconKey + "'; list content: "
+ + keys, keys.contains(iconKey));
+ // no actual test
+ final String infoPanelKey = "standard";
+ c.setStatusInfo(infoPanelKey, "hi there!", iconKey);
+ // no actual test - info should be removed
+ c.setStatusInfo(infoPanelKey, (String) null);
+ }
+
+ public void test_Controller_newMap() {
+ map = c.newMap();
+ }
+
+ //
+ // public void test_EdgeRO_getColor() {
+ //
+ // }
+ //
+ // public void test_EdgeRO_getType() {
+ //
+ // }
+ //
+ // public void test_EdgeRO_getWidth() {
+ //
+ // }
+ //
+ // public void test_Edge_setColor_Color_color() {
+ //
+ // }
+ //
+ // public void test_Edge_setType_EdgeStyle_type() {
+ //
+ // }
+ //
+ // public void test_Edge_setWidth_int_width() {
+ //
+ // }
+ //
+ // public void test_ExternalObjectRO_getURI() {
+ //
+ // }
+ //
+ // public void test_ExternalObjectRO_getZoom() {
+ //
+ // }
+ //
+ // public void test_ExternalObject_setURI_String_uri() {
+ //
+ // }
+ //
+ // public void test_ExternalObject_setZoom_float_zoom() {
+ //
+ // }
+ //
+ // public void test_FontRO_getName() {
+ //
+ // }
+ //
+ // public void test_FontRO_getSize() {
+ //
+ // }
+ //
+ // public void test_FontRO_isBold() {
+ //
+ // }
+ //
+ // public void test_FontRO_isBoldSet() {
+ //
+ // }
+ //
+ // public void test_FontRO_isItalic() {
+ //
+ // }
+ //
+ // public void test_FontRO_isItalicSet() {
+ //
+ // }
+ //
+ // public void test_FontRO_isNameSet() {
+ //
+ // }
+ //
+ // public void test_FontRO_isSizeSet() {
+ //
+ // }
+ //
+ // public void test_Font_resetBold() {
+ //
+ // }
+ //
+ // public void test_Font_resetItalic() {
+ //
+ // }
+ //
+ // public void test_Font_resetName() {
+ //
+ // }
+ //
+ // public void test_Font_resetSize() {
+ //
+ // }
+ //
+ // public void test_Font_setBold_boolean_bold() {
+ //
+ // }
+ //
+ // public void test_Font_setItalic_boolean_italic() {
+ //
+ // }
+ //
+ // public void test_Font_setName_String_name() {
+ //
+ // }
+ //
+ // public void test_Font_setSize_int_size() {
+ //
+ // }
+ //
+ // public void test_IconsRO_getIcons() {
+ //
+ // }
+ //
+ // public void test_Icons_addIcon_String_name() {
+ //
+ // }
+ //
+ // public void test_Icons_removeIcon_String_iconID() {
+ //
+ // }
+ //
+ // public void test_LinkRO_get() {
+ //
+ // }
+ //
+ // public void test_Link_set_String_target() {
+ //
+ // }
+ public void test_MapRO_getRoot() {
+ map = c.newMap();
+ assertEquals("the root node shouldn't have a parent", null, map.getRoot().getParent());
+ }
+
+ public void test_MapRO_node_String_id() {
+ map = c.newMap();
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final String id = firstChild.getId();
+ assertEquals("get by id returned wrong node", firstChild, map.node(id));
+ }
+
+ public void test_MapRO_getFile() {
+ map = c.newMap();
+ assertTrue("the file of a new map should be null", map.getFile() == null);
+ }
+
+ public void test_Map_close() {
+ Map originalMap = node.getMap();
+ map = c.newMap();
+ map.getRoot().createChild("child 1");
+ assertFalse("a new map should have been opened", originalMap.equals(map));
+ map.close(true, false);
+ assertEquals("the original map should be selected again", originalMap.getName(), c.getSelected().getMap()
+ .getName());
+ // let tearDown() some work to do...
+ map = c.newMap();
+ }
+
+ public void test_Map_save() {
+
+ }
+
+ public void test_NodeRO_getAttributes() {
+ createTestMap();
+ map.getRoot().getAttributes().add("a1", "va1");
+ assertEquals("value should be found", "va1", map.getRoot().getAttributes().get(0));
+ }
+
+ public void test_NodeRO_getChildPosition_Node_childNode() {
+ map = c.newMap();
+ final Node child1 = map.getRoot().createChild("child 1");
+ final Node child2 = map.getRoot().createChild("child 2");
+ assertEquals("wrong position", 0, map.getRoot().getChildPosition(child1));
+ assertEquals("wrong position", 1, map.getRoot().getChildPosition(child2));
+ }
+
+ public void test_NodeRO_getChildren() {
+ map = c.newMap();
+ final Node child1 = map.getRoot().createChild("child 1");
+ final Node child2 = map.getRoot().createChild("child 2");
+ final List<Node> children = map.getRoot().getChildren();
+ assertEquals("wrong children count", 2, children.size());
+ assertEquals("wrong order", child1, children.get(0));
+ assertEquals("wrong order", child2, children.get(1));
+ }
+
+ //
+ // public void test_NodeRO_getConnectorsIn() {
+ //
+ // }
+ //
+ // public void test_NodeRO_getConnectorsOut() {
+ //
+ // }
+ //
+ // public void test_NodeRO_getExternalObject() {
+ //
+ // }
+ public void test_NodeRO_getIcons() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertTrue("by default a node has no icons", root.getIcons().getIcons().isEmpty());
+ root.getIcons().add("bee");
+ assertEquals("one icon added", 1, root.getIcons().getIcons().size());
+ }
+
+ public void test_NodeRO_getLink() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertEquals("by default a node has no links", null, root.getLink().getText());
+ final String url = "file://blabla.txt";
+ root.getLink().setText(url);
+ assertEquals("a link should have been added", url, root.getLink().getText());
+ }
+
+ public void test_NodeRO_getMap() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertEquals("???", map, root.getMap());
+ }
+
+ public void test_NodeRO_getId() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertTrue("unknown node id pattern in '" + root.getId() + "'", root.getId().matches("ID_[1-9]\\d+"));
+ }
+
+ @SuppressWarnings("deprecation")
+ public void test_NodeRO_getNodeID() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertTrue("unknown node id pattern in '" + root.getNodeID() + "'", root.getNodeID().matches("ID_[1-9]\\d+"));
+ }
+
+ public void test_NodeRO_getNodeLevel_boolean_countHidden() {
+ createTestMap();
+ assertEquals("root is level 0", 0, map.getRoot().getNodeLevel(true));
+ final Node child = firstChild();
+ assertEquals("children are at level 1", 1, child.getNodeLevel(false));
+ final Node grandchild = child.createChild();
+ assertEquals("grandchildren are at level 2", 2, grandchild.getNodeLevel(false));
+ assertEquals("grandchildren are at level 2 - countHidden only matters if there are hidden nodes" //
+ , 2, grandchild.getNodeLevel(true));
+ // seems that the countHidden flag isn't testable here since it's not possible to filter nodes (and it
+ // doesn't make sense to extent the API for that), right?
+ }
+
+ public void test_NodeRO_getNote_getPlain(){
+ map = c.newMap();
+ final Node rootNode = map.getRoot();
+ final String plainText = " xx\nx ";
+ rootNode.setNote(plainText);
+ assertEquals("", HtmlUtils.plainToHTML(plainText), rootNode.getNoteText());
+ assertEquals("", HtmlUtils.plainToHTML(plainText), rootNode.getNote().getText());
+ assertEquals("", plainText, rootNode.getNote().getPlain());
+ final String xml = "<x> yyy </x>";
+ rootNode.setNote(xml);
+ assertEquals("", HtmlUtils.plainToHTML(xml), rootNode.getNoteText());
+ // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
+ assertEquals("", HtmlUtils.plainToHTML(xml), rootNode.getNote().getText());
+ assertEquals("", xml, rootNode.getNote().getPlain());
+ rootNode.setNote("<html> <em>zzzzz</em> </hmtl>");
+ assertEquals("", "zzzzz", rootNode.getNote().getPlain());
+ }
+
+ public void test_NodeRO_getNote() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ root.setNote(" xxx ");
+ // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
+ assertEquals("", HtmlUtils.plainToHTML(" xxx "), root.getNote().getText());
+ assertEquals("", HtmlUtils.plainToHTML(" xxx "), root.getNoteText());
+ root.setNote(" x\nxx ");
+ // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
+ assertEquals("", HtmlUtils.plainToHTML(" x\nxx "), root.getNote().getText());
+ assertEquals("", HtmlUtils.plainToHTML(" x\nxx "), root.getNoteText());
+ }
+
+ public void test_NodeRO_getParent() {
+ createTestMap();
+ final Node root = map.getRoot();
+ assertEquals("root has no parent", null, root.getParent());
+ final Node child = firstChild(root);
+ assertEquals("", root, child.getParent());
+ }
+
+ // public void test_NodeRO_getStyle() {
+ //
+ // }
+ //
+ public void test_NodeRO_getPlainText() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ final String plainText = " xxx ";
+ root.setText(plainText);
+ assertEquals("", plainText, root.getText());
+ assertEquals("plain text should be kept untouched", plainText, root.getPlainText());
+ final String xml = "<x> yyy </x>";
+ root.setText(xml);
+ assertEquals("xml tags are not stripped", xml, root.getPlainText());
+ root.setText("<html> <em>zzzzz</em> </hmtl>");
+ assertEquals("html tags should be stripped", "zzzzz", root.getPlainText());
+ }
+
+ public void test_NodeRO_getPlainTextContent() {
+ // getPlainTextContent() is deprecated - see #test_NodeRO_getPlainText()
+ }
+
+ public void test_NodeRO_getText() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ root.setText(" xxx ");
+ assertEquals("", " xxx ", root.getText());
+ root.setText(" x\nxx ");
+ assertEquals("", " x\nxx ", root.getText());
+ }
+
+ public void test_NodeRO_isDescendantOf_Node_p() {
+ createTestMap();
+ final Node root = map.getRoot();
+ assertTrue("a node is its own descendant", root.isDescendantOf(root));
+ assertFalse("siblings aren't descendants of each other", firstChild(root).isDescendantOf(
+ root.getChildren().get(1)));
+ assertFalse("siblings aren't descendants of each other", root.getChildren().get(1).isDescendantOf(
+ firstChild(root)));
+ assertTrue("children are descendants of their parents", firstChild(root).isDescendantOf(root));
+ final Node grandchild = firstChild(root).createChild();
+ assertTrue("grandchildren are descendants of their parents", firstChild(root).isDescendantOf(root));
+ assertTrue("grandchildren are descendants of their grandparents", grandchild.isDescendantOf(root));
+ }
+
+ public void test_NodeRO_isFolded() {
+ createTestMap();
+ final Node root = map.getRoot();
+ final Node child = firstChild();
+ final Node grandchild = child.createChild("grandchild");
+ assertFalse("initially nothing should be folded", root.isFolded());
+ assertFalse("initially nothing should be folded", child.isFolded());
+ root.setFolded(true);
+ assertFalse("root isn't foldable", root.isFolded());
+ child.setFolded(true);
+ assertTrue("node should be folded now", child.isFolded());
+ assertFalse("folding is not recursive in terms of isFolded()", grandchild.isFolded());
+ child.setFolded(false);
+ assertFalse("node should be unfolded again", child.isFolded());
+ grandchild.setFolded(true);
+ assertFalse("a node without children is not foldable", grandchild.isFolded());
+ // test undo of folding - give the new node a child first to make it foldable
+ grandchild.createChild("grandgrandchild");
+ grandchild.setFolded(true);
+ assertTrue("node should be folded now", grandchild.isFolded());
+ c.undo();
+ assertFalse("folding should be undone now", grandchild.isFolded());
+ }
+
+ public void test_NodeRO_isLeaf() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ assertTrue("even root is a leaf, if single", root.isLeaf());
+ root.createChild("child");
+ assertFalse("root is never a leaf, even without children", root.isLeaf());
+ assertTrue("child without children should be leaf", firstChild(root).isLeaf());
+ firstChild(root).createChild("grandchild");
+ assertFalse("child with children is not a leaf", firstChild(root).isLeaf());
+ }
+
+ //
+ // public void test_NodeRO_isLeft() {
+ //
+ // }
+ //
+ public void test_NodeRO_isRoot() {
+ createTestMap();
+ assertTrue("root has no parent", map.getRoot().getParent() == null);
+ }
+
+ public void test_NodeRO_isVisible() {
+ map = c.newMap();
+ map.getRoot().createChild("first node");
+ map.getRoot().createChild("second node");
+ assertTrue("initially all nodes should be visible", firstChild().isVisible());
+ new Filter(new NodeContainsCondition(TextController.FILTER_NODE, "first", false), true, true, true).applyFilter(this, Controller
+ .getCurrentController().getMap(), true);
+ assertTrue("first node should be matched by the filter", firstChild().isVisible());
+ assertFalse("second node should not be matched by the filter", map.getRoot().getChildren().get(1).isVisible());
+ c.setStatusInfo("filter", (String) null);
+ }
+
+ /** copy of {@link #test_ControllerRO_find_ICondition_condition()}. */
+ @SuppressWarnings("deprecation")
+ public void test_NodeRO_find_ICondition_condition() {
+ map = c.newMap();
+ @SuppressWarnings("unused")
+ final Node firstChild = map.getRoot().createChild("child 1");
+ final Node secondChild = map.getRoot().createChild("child 2");
+ final List<Node> found = c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 2", false));
+ assertEquals("one matching node should be found", list(secondChild), found);
+ }
+
+ // public void test_NodeRO_find_Closure_closure() {
+ //
+ // }
+ public void test_NodeRO_getLastModifiedAt() {
+ map = c.newMap();
+ final Node child = map.getRoot().createChild("a node");
+ final Date initialLastModifiedAt = child.getLastModifiedAt();
+ long diff = System.currentTimeMillis() - initialLastModifiedAt.getTime();
+ // one second should be enough
+ assertTrue("lastModifiedAt seems to be set incorrectly. It says it's " + diff + " ms ago", //
+ diff >= 0 && diff < 1000L);
+ // createChild() initially set both timestamps to the same value and changes modifiedAt directly
+ // afterwards in setText()
+ diff = initialLastModifiedAt.getTime() - child.getCreatedAt().getTime();
+ assertTrue("modifiedAt and createdAt should be set nearly to the same timestamp initially but modifiedAt = "
+ + initialLastModifiedAt.getTime() + ", createdAt = " + child.getCreatedAt().getTime(), //
+ diff >= 0 && diff < 50);
+ final Date epoch = new Date(0);
+ child.setLastModifiedAt(epoch);
+ child.setText("changed");
+ assertTrue("lastModifiedAt should be changed after changing the node text", //
+ child.getLastModifiedAt().after(epoch));
+ }
+
+ public void test_NodeRO_getCreatedAt() {
+ map = c.newMap();
+ final Node child = map.getRoot().createChild("a node");
+ final Date initialCreatedAt = child.getCreatedAt();
+ final long diff = System.currentTimeMillis() - initialCreatedAt.getTime();
+ // one second should be enough
+ assertTrue("createdAt seems to be set incorrectly. It says it's " + diff + " ms ago", //
+ diff >= 0 && diff < 1000L);
+ final Date epoch = new Date(0);
+ child.setCreatedAt(epoch);
+ child.setText("changed");
+ assertEquals("createdAt should not be changed after changing the node text", //
+ epoch, child.getCreatedAt());
+ }
+
+ // public void test_Node_addConnectorTo_Node_target() {
+ //
+ // }
+ //
+ // public void test_Node_addConnectorTo_String_targetNodeID() {
+ //
+ // }
+ public void test_Node_createChild() {
+ map = c.newMap();
+ assertEquals("", 0, map.getRoot().getChildren().size());
+ map.getRoot().createChild();
+ assertEquals("child should be created", 1, map.getRoot().getChildren().size());
+ }
+
+ public void test_Node_createChild_int_position() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ final Node child1 = root.createChild("child 1");
+ final Node child2 = root.createChild("child 2");
+ assertEquals("wrong position", 0, root.getChildPosition(child1));
+ assertEquals("wrong position", 1, root.getChildPosition(child2));
+ final Node child3 = root.createChild(0);
+ assertEquals("wrong insert position", 0, root.getChildPosition(child3));
+ assertEquals("node should be shifted", 1, root.getChildPosition(child1));
+ assertEquals("node should be shifted", 2, root.getChildPosition(child2));
+ final Node child4 = root.createChild(3);
+ assertEquals("wrong insert position", 3, root.getChildPosition(child4));
+ assertEquals("node should be shifted", 0, root.getChildPosition(child3));
+ assertEquals("node should be shifted", 1, root.getChildPosition(child1));
+ try {
+ root.createChild(-1);
+ fail("a negative position should lead to an exception");
+ }
+ catch (Throwable e) {
+ }
+ try {
+ root.createChild(5);
+ fail("too large positions should lead to an exception");
+ }
+ catch (Throwable e) {
+ }
+ }
+
+ public void test_Node_delete() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ final Node child1 = root.createChild("child 1");
+ final Node child2 = root.createChild("child 2");
+ assertEquals("", 2, root.getChildren().size());
+ child1.delete();
+ assertEquals("deletion failed", 1, root.getChildren().size());
+ assertEquals("wrong node deleted", child2, root.getChildren().get(0));
+ }
+
+ public void test_Node_moveTo_Node_parentNode() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ final Node child1 = root.createChild("child 1");
+ final Node child2 = root.createChild("child 2");
+ final Node grandchild = child1.createChild("grandchild");
+ assertEquals("child2 should have no children", 0, child2.getChildren().size());
+ grandchild.moveTo(child2);
+ assertEquals("grandchild should be a child of child2 now", child2, grandchild.getParent());
+ }
+
+ public void test_Node_moveTo_Node_parentNode_int_position() {
+ map = c.newMap();
+ final Node root = map.getRoot();
+ final Node child1 = root.createChild("child 1");
+ final Node child2 = root.createChild("child 2");
+ final Node grandchild = child1.createChild("grandchild");
+ assertEquals("wrong count of children", 2, root.getChildren().size());
+ grandchild.moveTo(root, 1);
+ assertEquals("wrong position", child1, root.getChildren().get(0));
+ assertEquals("wrong position", grandchild, root.getChildren().get(1));
+ assertEquals("wrong position", child2, root.getChildren().get(2));
+ }
+
+ //
+ // public void test_Node_removeConnector_Connector_connectorToBeRemoved() {
+ //
+ // }
+ //
+ public void test_Node_setFolded_boolean_folded() {
+ createTestMap();
+ final Node child = firstChild();
+ child.createChild("grandchild");
+ child.setFolded(true);
+ assertTrue("node should be folded now", child.isFolded());
+ child.setFolded(false);
+ assertFalse("node should be unfolded again", child.isFolded());
+ }
+
+ public void test_Node_setPlainNote_String_text() {
+ // see test_NodeRO_getPlainNote()
+ }
+
+ public void test_Node_setNoteText_String_text() {
+ // see test_NodeRO_getNote()
+ }
+
+ public void test_Node_setText_String_text() {
+ // see test_NodeRO_getText()
+ }
+
+ public void test_Node_setLastModifiedAt_Date_date() {
+ // see test_NodeRO_getLastModifiedAt()
+ }
+
+ public void test_Node_setCreatedAt_Date_date() {
+ // see test_NodeRO_getCreatedAt()
+ }
+ // public void test_NodeStyleRO_getStyle() {
+ //
+ // }
+ //
+ // public void test_NodeStyleRO_getStyleNode() {
+ //
+ // }
+ //
+ // public void test_NodeStyleRO_getBackgroundColor() {
+ //
+ // }
+ //
+ // public void test_NodeStyleRO_getEdge() {
+ //
+ // }
+ //
+ // public void test_NodeStyleRO_getFont() {
+ //
+ // }
+ //
+ // public void test_NodeStyleRO_getNodeTextColor() {
+ //
+ // }
+ //
+ // public void test_NodeStyle_setStyle_Object_key() {
+ //
+ // }
+ //
+ // public void test_NodeStyle_setBackgroundColor_Color_color() {
+ //
+ // }
+ //
+ // public void test_NodeStyle_setNodeTextColor_Color_color() {
+ //
+ // }
+}
diff --git a/freeplane_plugin_script_test/.classpath b/freeplane_plugin_script_test/.classpath
new file mode 100644
index 0000000..76bd8fc
--- /dev/null
+++ b/freeplane_plugin_script_test/.classpath
@@ -0,0 +1,8 @@
+<?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
new file mode 100644
index 0000000..85f2f14
--- /dev/null
+++ b/freeplane_plugin_script_test/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..a12b2f0
--- /dev/null
+++ b/freeplane_plugin_script_test/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..96054e0
--- /dev/null
+++ b/freeplane_plugin_script_test/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..2148e2d
--- /dev/null
+++ b/freeplane_plugin_script_test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#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
new file mode 100644
index 0000000..0251df2
--- /dev/null
+++ b/freeplane_plugin_script_test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..9c422ae
--- /dev/null
+++ b/freeplane_plugin_script_test/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+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: J2SE-1.5
+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
new file mode 100644
index 0000000..b8a0e84
--- /dev/null
+++ b/freeplane_plugin_script_test/ant/build.xml
@@ -0,0 +1,16 @@
+<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/eclipse-launcher/ScriptingConfigurationTest.launch b/freeplane_plugin_script_test/eclipse-launcher/ScriptingConfigurationTest.launch
new file mode 100644
index 0000000..8a5a91f
--- /dev/null
+++ b/freeplane_plugin_script_test/eclipse-launcher/ScriptingConfigurationTest.launch
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ScriptingConfigurationTest.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.plugin.script.ScriptingConfigurationTest"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane_plugin_script_test"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx256m"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.equinox.p2.director.app.product"/>
+<booleanAttribute key="run_in_ui_thread" value="true"/>
+<stringAttribute key="selected_target_plugins" value="org.eclipse.debug.core at default:default,org.eclipse.core.databinding.observable at default:default,org.eclipse.text at default:default,org.eclipse.core.runtime.compatibility.registry at default:false,org.eclipse.swt at default:default,org.eclipse.equinox.p2.jarprocessor at default:default,org.eclipse.core.commands at default:default,org.hamcrest.core at default:default,org.eclipse.ui.ide at default:default,org.eclipse.ecf.filetransfer at default:default,org.eclipse.ecf.ssl at default:false,org.eclipse.osgi.services at default:default,org.eclipse.equinox.security at default:default,org.eclipse.ui.navigator at default:default,org.eclipse.core.resources at default:default,org.eclipse.ui.editors at default:default,org.eclipse.core.runtime at default:true,org.eclipse.equinox.p2.metadata at default:default,org.eclipse.jdt.compiler.tool at default:false,org.eclipse.ecf at default:default,org.eclipse.ecf.identity at default:default,org.eclipse.core.variables at default:default,org.eclipse.equinox.p2.repository at default:default,org.eclipse.ecf.provider.filetransfer at default:default,org.eclipse.equinox.p2.engine at default:default,org.eclipse.jdt.compiler.apt at default:false,org.eclipse.core.expressions at default:default,org.eclipse.jdt.debug at default:default,org.eclipse.core.filebuffers at default:default,org.eclipse.team.core at default:default,org.eclipse.ecf.provider.filetransfer.ssl at default:false,org.eclipse.ui.workbench at default:default,org.eclipse.jdt.core at default:default,org.eclipse.compare.core at default:default,org.eclipse.equinox.common at 2:true,org.eclipse.team.ui at default:default,org.eclipse.equinox.p2.metadata.repository at default:default,org.eclipse.equinox.p2.core at default:default,org.eclipse.equinox.app at default:default,org.eclipse.ltk.ui.refactoring at default:default,org.eclipse.ui.views at default:default,com.ibm.icu at default:default,org.eclipse.ant.core at default:default,org.eclipse.help at default:default,org.eclipse.ui.navigator.resources at default:default,org.eclipse.equinox.registry at default:default,org.eclipse.jdt.launching at default:default,org.eclipse.core.databinding.property at default:default,javax.servlet at default:default,org.eclipse.equinox.concurrent at default:default,org.eclipse.equinox.preferences at default:default,org.eclipse.jface.text at default:default,org.eclipse.equinox.frameworkadmin.equinox at default:default,org.eclipse.equinox.p2.artifact.repository at default:default,org.eclipse.equinox.simpleconfigurator at 1:true,org.eclipse.core.resources.compatibility at default:false,org.eclipse.core.contenttype at default:default,org.eclipse.core.jobs at default:default,org.eclipse.ui.console at default:default,org.eclipse.search at default:default,org.eclipse.ltk.core.refactoring at default:default,org.eclipse.debug.ui at default:default,org.eclipse.ui.views.properties.tabbed at default:default,org.eclipse.jdt.ui at default:default,org.eclipse.compare at default:default,org.eclipse.core.databinding at default:default,org.eclipse.jface.databinding at default:default,org.eclipse.core.filesystem at default:default,org.eclipse.ui at default:default,org.eclipse.jdt.debug.ui at default:default,org.eclipse.equinox.frameworkadmin at default:default,org.eclipse.core.net at default:default,org.eclipse.osgi at -1:true,org.eclipse.ui.forms at default:default,org.eclipse.ui.workbench.texteditor at default:default,org.eclipse.jface at default:default,org.eclipse.jdt.core.manipulation at default:default,org.eclipse.equinox.simpleconfigurator.manipulator at default:default,org.eclipse.core.runtime.compatibility.auth at default:default"/>
+<stringAttribute key="selected_workspace_plugins" value="freeplane_plugin_script_test at default:false,org.freeplane.core at 2:true,freeplane_uitest at default:false,org.freeplane.uispec4j at default:default,org.freeplane.plugin.script at 1:true"/>
+<booleanAttribute key="show_selected_only" value="true"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="false"/>
+</launchConfiguration>
diff --git a/freeplane_plugin_script_test/test/org/freeplane/plugin/script/AllFreeplanePluginScriptUnitTests.java b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/AllFreeplanePluginScriptUnitTests.java
new file mode 100644
index 0000000..447f045
--- /dev/null
+++ b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/AllFreeplanePluginScriptUnitTests.java
@@ -0,0 +1,10 @@
+package org.freeplane.plugin.script;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({ ConvertibleTest.class, ScriptingConfigurationTest.class })
+public class AllFreeplanePluginScriptUnitTests {
+ //nothing
+}
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
new file mode 100644
index 0000000..0e1de5e
--- /dev/null
+++ b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ConvertibleTest.java
@@ -0,0 +1,376 @@
+package org.freeplane.plugin.script;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.main.application.FreeplaneStarter;
+import org.freeplane.plugin.script.proxy.ConversionException;
+import org.freeplane.plugin.script.proxy.Convertible;
+import org.freeplane.plugin.script.proxy.ConvertibleNoteText;
+import org.freeplane.plugin.script.proxy.ConvertibleText;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ConvertibleTest {
+ private static final String FREEPLANE_URI = "http://www.freeplane.org";
+
+ /** provides an easy mean to create a Convertible with a null text. */
+ public static final class TestConvertible extends Convertible {
+ public TestConvertible(NodeModel nodeModel, String text) {
+ super(FormulaUtils.evalIfScript(nodeModel, null, text));
+ }
+ }
+
+ @BeforeClass
+ 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 FreeplaneStarter().createController();
+ new FreeplaneStarter().createModeControllers(controller);
+ ResourceController.getResourceController().setProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
+ }
+
+ @Test
+ public void testGetNum() throws ConversionException, ExecuteScriptException {
+ assertEquals(null, convertible(null).getNum());
+ assertEquals(new Long(20), convertible("20").getNum());
+ assertEquals(new Double(0.00001), ((Double) convertible("0.00001").getNum()), 1e-9);
+ assertEquals(new Long(31), convertible("0x1f").getNum());
+ assertEquals(new Long(-31), convertible("-0x1F").getNum());
+ assertEquals(new Long(31), convertible("#1F").getNum());
+ assertEquals(new Long(-31), convertible("-#1f").getNum());
+ assertEquals(new Long(23), convertible("027").getNum());
+ assertEquals(new Long(-23), convertible("-027").getNum());
+ assertThrowsNumberConversionException("");
+ assertThrowsNumberConversionException("xyz");
+ assertThrowsNumberConversionException(" 12");
+ }
+
+ private void assertThrowsNumberConversionException(String string) {
+ boolean caughtException = false;
+ final String notANumber = string;
+ try {
+ convertible(notANumber).getNum();
+ }
+ catch (ConversionException e) {
+ caughtException = true;
+ }
+ assertTrue("should have been detected as not-a-number: \"" + notANumber + '"', caughtException);
+ }
+
+ @Test
+ public void testGetNum0() throws ConversionException, ExecuteScriptException {
+ assertEquals(new Long(0), convertible(null).getNum0());
+ assertEquals(new Long(20), convertible("20").getNum0());
+ assertEquals(new Double(0.00001), ((Double) convertible("0.00001").getNum0()), 1e-9);
+ assertEquals(new Long(31), convertible("0x1f").getNum0());
+ assertEquals(new Long(-31), convertible("-0x1F").getNum0());
+ assertEquals(new Long(31), convertible("#1F").getNum0());
+ assertEquals(new Long(-31), convertible("-#1f").getNum0());
+ assertEquals(new Long(23), convertible("027").getNum0());
+ assertEquals(new Long(-23), convertible("-027").getNum0());
+ // now the test the fallback on conversion errors
+ assertEquals(new Long(0), convertible("xyz").getNum0());
+ assertEquals(new Long(0), convertible("2010-08-16 22:31:55.123+0530").getNum0());
+ }
+
+ private Convertible convertible(String text) {
+ final MapModel mapModel = Controller.getCurrentModeController().getMapController().newModel();
+ NodeModel nodeModel = new NodeModel(mapModel);
+ return new TestConvertible(nodeModel, text);
+ }
+
+ @Test
+ public void testGetDate() throws ConversionException, ExecuteScriptException {
+ testOneDatePattern(null, null);
+ testOneDatePattern("2010-08-16 22:31:55.123+0530", "2010-08-16 22:31:55.123+0530");
+ // note that SimpleDateFormat uses local time zone for conversion - use DateFormatUtils instead!
+ final String Z = getLocalTimeZoneOffsetString();
+ testOneDatePattern("2010-08-16 22:31:55.123" + Z, "2010-08-16 22:31:55.123");
+ testOneDatePattern("2010-08-16 22:31:55", "2010-08-16 22:31:55.000");
+ testOneDatePattern("2010-08-16 22:31:55", "2010-08-16 22:31:55");
+ testOneDatePattern("2010-08-16 22:31:00", "2010-08-16 22:31");
+ testOneDatePattern("2010-08-16 00:00:00", "2010-08-16");
+ //
+ testOneDatePattern("2010-08-16 22:31:55", "2010-08-16T22:31:55.000");
+ testOneDatePattern("2010-08-16 22:31:55", "2010-08-16T22:31:55");
+ testOneDatePattern("2010-08-16 22:31:00", "2010-08-16T22:31");
+ testOneDatePattern("2010-08-16 00:00:00", "2010-08-16");
+ //
+ testOneDatePattern("2010-08-16 22:31:55", "20100816223155.000");
+ testOneDatePattern("2010-08-16 22:31:55", "20100816223155");
+ testOneDatePattern("2010-08-16 22:31:00", "201008162231");
+ testOneDatePattern("2010-08-16 00:00:00", "20100816");
+ //
+ testOneDatePattern("2010-08-16 22:31:55", "20100816T223155.000");
+ testOneDatePattern("2010-08-16 22:31:55", "20100816T223155");
+ testOneDatePattern("2010-08-16 22:31:00", "20100816T2231");
+ testOneDatePattern("2010-08-16 00:00:00", "20100816");
+ // parse errors
+ // parse error
+ boolean caughtException = false;
+ final String notADate = "2010-08-";
+ try {
+ convertible(notADate).getDate();
+ }
+ catch (ConversionException e) {
+ caughtException = true;
+ }
+ assertTrue("not a date: " + notADate, caughtException);
+ }
+
+ private void testOneDatePattern(String expected, String testInput) throws ConversionException,
+ ExecuteScriptException {
+ assertEquals("expected: " + Convertible.toString(date(expected)) + "!=" + Convertible.toString(convertible(testInput).getDate()),
+ date(expected), convertible(testInput).getDate());
+ assertEquals(calendar(expected), convertible(testInput).getCalendar());
+ }
+
+ private Calendar calendar(String expected) throws ConversionException {
+ if (expected == null)
+ return null;
+ GregorianCalendar result = new GregorianCalendar(0, 0, 0);
+ result.setTime(date(expected));
+ return result;
+ }
+
+ private Date date(String string) throws ConversionException {
+ try {
+ if (string == null)
+ return null;
+ else if (string.matches(".*\\.\\d{3}[-+]\\d{4}"))
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ").parse(string);
+ else if (string.matches(".*:\\d{2}\\.\\d{3}[-+]\\d{4}"))
+ return new SimpleDateFormat("yyyy-MM-dd HH:mmZ").parse(string);
+ else if (string.matches(".* \\d{2}:\\d{2}:\\d{2}\\.\\d{3}"))
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(string);
+ else if (string.matches(".* \\d{2}:\\d{2}:\\d{2}"))
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(string);
+ else
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(string);
+ }
+ catch (ParseException e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ private String getLocalTimeZoneOffsetString() {
+ final TimeZone timeZone = TimeZone.getDefault();
+ int offsetMinutes = (timeZone.getRawOffset() + timeZone.getDSTSavings()) / 60000;
+ return String.format("%+03d%02d", offsetMinutes / 60, offsetMinutes % 60);
+ }
+
+ @Test
+ public void testGetUrl() throws ConversionException {
+ assertEquals(null, convertible(null).getUri());
+ assertEquals(uri(FREEPLANE_URI), convertible(FREEPLANE_URI).getUri());
+ // scheme: is mandatory
+ assertThrowsUriConversionException("");
+ assertThrowsUriConversionException("scheme:");
+ assertEquals(uri("scheme:bla"), convertible("scheme:bla").getUri());
+ }
+
+ private void assertThrowsUriConversionException(String string) {
+ boolean caughtException = false;
+ final String notAnUrl = string;
+ try {
+ convertible(notAnUrl).getUri();
+ }
+ catch (ConversionException e) {
+ caughtException = true;
+ }
+ assertTrue("should have been detected as not-an-url: \"" + notAnUrl + '"', caughtException);
+ }
+
+ private URI uri(String string) {
+ try {
+ return new URI(string);
+ }
+ catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Test
+ public void testGetObject() throws ConversionException, ExecuteScriptException {
+ assertEquals(null, convertible(null).getObject());
+ // Convertibles contain the evaluated text
+ assertEquals(new Long(3), convertible("= 1 + 2").getObject());
+ assertEquals(new Long(1234567890), convertible("1234567890").getObject());
+ assertEquals(new Double(0.00001), convertible("0.00001").getObject());
+ assertEquals(date("2010-12-24 23:59:59"), convertible("2010-12-24 23:59:59").getObject());
+ assertEquals("a text", convertible("a text").getObject());
+ }
+
+ @Test
+ public void testGetPlain() throws ConversionException, ExecuteScriptException {
+ assertEquals(null, convertible(null).getPlain());
+ assertEquals("12", convertible("12").getPlain());
+ assertEquals("text", convertible("text").getPlain());
+ // text must start with <html> to get transformed
+ assertEquals("text", convertible("<html>text</html>").getPlain());
+ assertEquals("text", convertible("<html>text").getPlain());
+ assertEquals("text", convertible("<html><p>text<p></html>").getPlain());
+ assertEquals("<p>text</p>", convertible("<p>text</p>").getPlain());
+ assertEquals("<xyz>text</xyz>", convertible("<xyz>text</xyz>").getPlain());
+ assertEquals("<?xml version=\"1.0\"?><p>text</p>", convertible("<?xml version=\"1.0\"?><p>text</p>").getPlain());
+ }
+
+ @Test
+ public void testIsNum() throws ConversionException, ExecuteScriptException {
+ assertFalse(convertible(null).isNum());
+ assertTrue("Convertibles contain evaluated text", convertible("= 1 + 2").isNum());
+// broken:
+// assertTrue(convertible("0x1f").isNum());
+// assertTrue(convertible("-0x1F").isNum());
+ assertFalse("this is a known NumberUtils bug - use 0x encoding instead", convertible("#1F").isNum());
+ assertFalse("this is a known NumberUtils bug - use 0x encoding instead", convertible("-#1f").isNum());
+ assertTrue(convertible("027").isNum());
+ assertTrue(convertible("-027").isNum());
+ assertTrue(convertible("1234567890").isNum());
+ assertTrue(convertible("0.00001").isNum());
+ assertFalse(convertible("2010-12-24 23:59:59").isNum());
+ assertFalse(convertible("a text").isNum());
+ assertFalse(convertible("").isNum());
+ }
+
+ @Test
+ public void testIsDate() throws ConversionException, ExecuteScriptException {
+ assertFalse(convertible(null).isDate());
+ assertFalse(convertible("").isDate());
+ assertFalse(convertible("12").isDate());
+ assertFalse(convertible("1.2").isDate());
+ assertFalse(convertible("text").isDate());
+ assertTrue(convertible("2010-08-16 22:31:55.123+0530").isDate());
+ assertTrue(convertible("2010-08-16 22:31:55.123").isDate());
+ assertTrue(convertible("2010-08-16 22:31:55").isDate());
+ assertTrue(convertible("2010-08-16 22:31").isDate());
+ assertTrue(convertible("2010-08-16").isDate());
+ assertTrue(convertible("2010-08-16T22:31:55.123+0530").isDate());
+ assertTrue(convertible("2010-08-16T22:31:55.123").isDate());
+ assertTrue(convertible("2010-08-16T22:31:55").isDate());
+ assertTrue(convertible("2010-08-16T22:31").isDate());
+ assertTrue(convertible("2010-08-16").isDate());
+ assertTrue(convertible("20100816223155.123+0530").isDate());
+ assertTrue(convertible("20100816223155.123").isDate());
+ assertTrue(convertible("20100816223155").isDate());
+ assertTrue(convertible("201008162231").isDate());
+ assertTrue(convertible("20100816").isDate());
+ assertTrue(convertible("20100816T223155.123+0530").isDate());
+ assertTrue(convertible("20100816T223155.123").isDate());
+ assertTrue(convertible("20100816T223155").isDate());
+ assertTrue(convertible("20100816T2231").isDate());
+ assertTrue(convertible("20100816").isDate());
+ }
+
+ @Test
+ public void testGetStringAndToString() throws ConversionException, ExecuteScriptException {
+ assertGetStringAndToStringEqualsInputText(null);
+ assertGetStringAndToStringEqualsInputText("2010-08-16 22:31:55");
+ assertGetStringAndToStringEqualsInputText("12");
+ assertGetStringAndToStringEqualsInputText("1.2");
+ assertGetStringAndToStringEqualsInputText("text");
+ assertGetStringAndToStringEqualsInputText("");
+ }
+
+ private void assertGetStringAndToStringEqualsInputText(String text) {
+ assertEquals(text, convertible(text).toString());
+ assertEquals(text, convertible(text).getString());
+ assertEquals(text, convertible(text).getText());
+ }
+
+ @Test
+ public void testGetProperty() throws ConversionException, ExecuteScriptException {
+ assertEquals(null, convertible(null).getProperty("string"));
+ assertEquals(null, convertible(null).getProperty("num"));
+ assertEquals("12", convertible("12").getProperty("string"));
+ assertEquals("12", convertible("12").getProperty("text"));
+ assertEquals("12", convertible("12").getProperty("plain"));
+ assertEquals(new Long(12), convertible("12").getProperty("num"));
+ // "bytes" is a virtual property of class String (byte[] getBytes())
+ assertEquals("12", new String((byte[]) convertible("12").getProperty("bytes")));
+ assertEquals(date("2010-08-16 22:31"), convertible("2010-08-16T22:31").getProperty("date"));
+ assertEquals(calendar("2010-08-16 22:31"), convertible("2010-08-16T22:31").getProperty("calendar"));
+ assertEquals(uri(FREEPLANE_URI), convertible(FREEPLANE_URI).getProperty("uri"));
+ }
+
+ @Test
+ public void testNullObject() {
+ assertEquals(convertible(null), null);
+ assertEquals(convertible(null), convertible(null));
+ }
+
+ @Test
+ public void testInvokeMethod() throws ConversionException, ExecuteScriptException {
+ assertEquals(null, convertible(null).invokeMethod("getString", null));
+ assertEquals("12", convertible("12").invokeMethod("getString", null));
+ assertEquals("12", convertible("12").invokeMethod("getText", null));
+ assertEquals("12", convertible("12").invokeMethod("getPlain", null));
+ assertEquals(new Long(12), convertible("12").invokeMethod("getNum", null));
+ assertEquals(Boolean.TRUE, convertible("12").invokeMethod("startsWith", new Object[] { "1" }));
+ }
+
+ @Test
+ public void testConvertibleNodeTextMayNotBeNull() throws ConversionException {
+ boolean exceptionThrown = false;
+ try {
+ final NodeModel nodeModel = new NodeModel(null);
+ nodeModel.setText(null);
+ // not reached: new ConvertibleNodeText(nodeModel);
+ }
+ catch (NullPointerException e) {
+ exceptionThrown = true;
+ }
+ assertTrue("you may not set a ConvertibleNodeText's text to null!", exceptionThrown);
+ }
+
+ @Test
+ public void testConvertibleAttributeValuesMayBeNull() throws ConversionException, ExecuteScriptException {
+ new ConvertibleText(new NodeModel(null), null, null);
+ }
+
+ @Test
+ public void testOtherConvertibleNoteTextMayBeNull() throws ConversionException {
+ try {
+ // by default there are no notes, i.e. they are null
+ assertNull(new ConvertibleNoteText(new NodeModel(null), null).getText());
+ }
+ catch (Exception e) {
+ fail("null texts are allowed for other Convertibles");
+ }
+ }
+
+ @Test
+ public void testSomethingToString() throws ConversionException, ExecuteScriptException {
+ // this works but you may not set a Convertibles's text to null!
+ assertEquals(null, Convertible.toString(null));
+ testSomethingToStringImpl("12", 12L, "num");
+ testSomethingToStringImpl("1.2", 1.2d, "num");
+ final String Z = getLocalTimeZoneOffsetString();
+ // default conversion doesn't contain milliseconds
+ testSomethingToStringImpl("2010-08-16T22:31" + Z, date("2010-08-16 22:31" + Z), "date");
+ }
+
+ private void testSomethingToStringImpl(String expected, Object toConvert, String propertyName)
+ throws ConversionException, ExecuteScriptException {
+ assertEquals(expected, Convertible.toString(toConvert));
+ // the result of Convertible.toString(Xyz) must be a valid input to Convertible.getXyz()
+ assertEquals(toConvert, convertible(expected).getProperty(propertyName));
+ }
+}
diff --git a/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ScriptingConfigurationTest.java b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ScriptingConfigurationTest.java
new file mode 100644
index 0000000..ecb41d6
--- /dev/null
+++ b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ScriptingConfigurationTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.plugin.script;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
+import org.freeplane.plugin.script.ScriptingConfiguration.ScriptMetaData;
+import org.junit.Test;
+
+public class ScriptingConfigurationTest {
+ private String scriptName = "TestScript";
+
+ @Test
+ public void testAnalyseScriptContent1() {
+ // it's case insensitive
+ // it's tolerant on white space
+ String content = "// some comment" //
+ + "//@ExecutionModes (\t{ ExecutionMode.ON_selECTED_NODE" //
+ + ", \tON_SelECTED_NODE_RECURSIVELY = \"/menu_bar/help\" } )" //
+ + "// @CacheScriptContent ( true\t ) " //
+ + " def test() {}";
+ ScriptMetaData metaData = new ScriptingConfiguration().analyseScriptContent(content, scriptName);
+ assertEquals("expected only modes set in the script", 2, metaData.getExecutionModes().size());
+ assertTrue("ON_SELECTED_NODE was set", metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE));
+ final String scriptsParentLocation = ScriptingConfiguration.getScriptsParentLocations()[0];
+ assertEquals("menu location for ON_SELECTED_NODE should be default",
+ ScriptingConfiguration.getScriptsLocation(scriptsParentLocation) + "/" + scriptName,
+ metaData.getMenuLocation(ExecutionMode.ON_SELECTED_NODE));
+ assertTrue("ON_SELECTED_NODE_RECURSIVELY was set",
+ metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertEquals("menu location for ON_SELECTED_NODE_RECURSIVELY was set explicitely", "/menu_bar/help",
+ metaData.getMenuLocation(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertTrue("CacheScriptContent was set to true", metaData.cacheContent());
+ }
+
+ @Test
+ public void testAnalyseScriptContentWithTitleKey() {
+ // it's case insensitive
+ // it's tolerant on white space
+ String content = "// some comment" //
+ + "\n//@ExecutionModes (\t{\n ExecutionMode.ON_selECTED_NODE=\"/menu_bar/help[icon_button_ok]\"" //
+ + ",\n \tON_SelECTED_NODE_RECURSIVELY = \"/menu_bar/help[Test_Script]\" } )" //
+ + "\n def test() {}\n";
+ ScriptMetaData metaData = new ScriptingConfiguration().analyseScriptContent(content, scriptName);
+ final String scriptsParentLocation = ScriptingConfiguration.getScriptsParentLocations()[0];
+ assertEquals("expected only modes set in the script", 2, metaData.getExecutionModes().size());
+ assertTrue("ON_SELECTED_NODE was set", metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE));
+ assertEquals("wrong menu location", "/menu_bar/help",
+ metaData.getMenuLocation(ExecutionMode.ON_SELECTED_NODE));
+ assertEquals("wrong title key", "icon_button_ok", metaData.getTitleKey(ExecutionMode.ON_SELECTED_NODE));
+ assertTrue("ON_SELECTED_NODE_RECURSIVELY was set",
+ metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertEquals("wrong menu location", "/menu_bar/help",
+ metaData.getMenuLocation(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertEquals("wrong title key", "Test_Script", metaData.getTitleKey(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ }
+
+ @Test
+ public void testAnalyseScriptContentRemoveDuplicates() {
+ String content = "// some comment"
+ + "\n// @ExecutionModes (\t{\n ExecutionMode.ON_selECTED_NODE_recursively,\n \tON_SelECTED_NODE_RECURSIVELY } )";
+ ScriptMetaData metaData = new ScriptingConfiguration().analyseScriptContent(content, scriptName);
+ assertEquals("duplicated modes should not matter", 1, metaData.getExecutionModes().size());
+ assertTrue("ON_SELECTED_NODE_RECURSIVELY was set",
+ metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertTrue("CacheScriptContent=false is the default", !metaData.cacheContent());
+ }
+
+ @Test
+ public void testAnalyseScriptContentForFormula() {
+ String content = "=\"blabla\"" //
+ + "\n// @CacheScriptContent ( true\t ) ";
+ ScriptMetaData metaData = new ScriptingConfiguration().analyseScriptContent(content, scriptName);
+ assertEquals("single node mode should be removed for '=' scripts", 2, metaData.getExecutionModes().size());
+ assertTrue("ON_SELECTED_NODE shouldn't been removed",
+ metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE));
+ assertTrue("ON_SELECTED_NODE_RECURSIVELY shouldn't been removed",
+ metaData.getExecutionModes().contains(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY));
+ assertTrue("CacheScriptContent was set to true", metaData.cacheContent());
+ // assert that duplicate entries do no harm
+ }
+
+ @Test
+ public void testParseExecutionModes() throws Exception {
+ ScriptMetaData metaData = new ScriptMetaData("test");
+ ScriptingConfiguration.setExecutionModes(
+ "@ExecutionModes({on_selected_node=\"/menu/bla/blupp\",on_single_node=\"/menu/hi/ho\"})", metaData);
+ ScriptingConfiguration.setExecutionModes(
+ "@ExecutionModes({on_selected_node=\"/menu/bla/blupp\"on_single_node=\"/menu/hi/ho\"})", metaData);
+ ScriptingConfiguration.setExecutionModes("@ExecutionModes({on_single_node=\"/menu/hi/ho\"})", metaData);
+ ScriptingConfiguration.setExecutionModes("@ExecutionModes({on_single_node})", metaData);
+ ScriptingConfiguration.setExecutionModes("@ExecutionModes({\"/menu/hi/ho\"})", metaData);
+ ScriptingConfiguration.setExecutionModes("@ExecutionModes({})", metaData);
+ }
+}
diff --git a/freeplane_plugin_svg/.classpath b/freeplane_plugin_svg/.classpath
new file mode 100644
index 0000000..8826fdb
--- /dev/null
+++ b/freeplane_plugin_svg/.classpath
@@ -0,0 +1,30 @@
+<?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
new file mode 100644
index 0000000..9ce39b8
--- /dev/null
+++ b/freeplane_plugin_svg/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..2f065a7
--- /dev/null
+++ b/freeplane_plugin_svg/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..97df3e6
--- /dev/null
+++ b/freeplane_plugin_svg/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#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
new file mode 100644
index 0000000..b7fd690
--- /dev/null
+++ b/freeplane_plugin_svg/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#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
new file mode 100644
index 0000000..16a669c
--- /dev/null
+++ b/freeplane_plugin_svg/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#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
new file mode 100644
index 0000000..a6f69e1
--- /dev/null
+++ b/freeplane_plugin_svg/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+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
new file mode 100644
index 0000000..92d3a90
--- /dev/null
+++ b/freeplane_plugin_svg/ant/ant.properties
@@ -0,0 +1,25 @@
+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.jar:${plugin.ext.lib}/batik-swing.jar:${plugin.ext.lib}/batik-transcoder.jar:${plugin.ext.lib}/batik-util.jar:${plugin.ext.lib}/batik-xml.jar
+
+# 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
new file mode 100644
index 0000000..95f7671
--- /dev/null
+++ b/freeplane_plugin_svg/ant/build.xml
@@ -0,0 +1,61 @@
+<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/src/org/freeplane/plugin/svg/Activator.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/Activator.java
new file mode 100644
index 0000000..c2fd1c7
--- /dev/null
+++ b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/Activator.java
@@ -0,0 +1,61 @@
+package org.freeplane.plugin.svg;
+
+import java.util.Hashtable;
+
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.export.mindmapmode.ExportController;
+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.freeplane.view.swing.features.filepreview.ViewerController;
+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 {
+ 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(ModeController modeController) {
+ final ExportController exportController = ExportController.getController(modeController);
+ exportController.addExportEngine(new ExampleFileFilter("pdf", TextUtils.getText("export_pdf_text")), new ExportPdf());
+ exportController.addExportEngine(new ExampleFileFilter("svg", TextUtils.getText("export_svg_text")), new ExportSvg());
+ final ViewerController extension = (ViewerController) modeController
+ .getExtension(ViewerController.class);
+ extension.addFactory(new SvgViewerFactory());
+ }
+ }, 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(ModeController modeController) {
+ final ViewerController extension = (ViewerController) modeController
+ .getExtension(ViewerController.class);
+ extension.addFactory(new SvgViewerFactory());
+ }
+ }, 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_svg/src/org/freeplane/plugin/svg/ExportPdf.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportPdf.java
new file mode 100644
index 0000000..f25f97e
--- /dev/null
+++ b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportPdf.java
@@ -0,0 +1,94 @@
+/*
+ * 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.svg;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.apache.batik.transcoder.SVGAbstractTranscoder;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.ImageTranscoder;
+import org.apache.fop.svg.PDFTranscoder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.export.mindmapmode.ExportController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MapView;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author foltin
+ */
+class ExportPdf extends ExportVectorGraphic {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ExportPdf() {
+ }
+
+ public void export(MapModel map, File chosenFile) {
+ if (!ExportController.getContoller().checkCurrentMap(map)){
+ return;
+ }
+ try {
+ final MapView view = (MapView) Controller.getCurrentController().getViewController().getMapView();
+ if (view == null) {
+ return;
+ }
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final SVGGraphics2D g2d = fillSVGGraphics2D(view);
+ final PDFTranscoder pdfTranscoder = new PDFTranscoder();
+ /*
+ * according to https: &aid=1921334&group_id=7118 Submitted By:
+ * Frank Spangenberg (f_spangenberg) Summary: Large mind maps
+ * produce invalid PDF
+ */
+ pdfTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_MAX_HEIGHT, new Float(19200));
+ pdfTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_MAX_WIDTH, new Float(19200));
+ pdfTranscoder.addTranscodingHint(ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, 25.4f/72f/UITools.FONT_SCALE_FACTOR);
+ /* end patch */
+ final Document doc = g2d.getDOMFactory();
+ final Element rootE = doc.getDocumentElement();
+ g2d.getRoot(rootE);
+ final TranscoderInput input = new TranscoderInput(doc);
+ final FileOutputStream ostream = new FileOutputStream(chosenFile);
+ final BufferedOutputStream bufStream = new BufferedOutputStream(ostream);
+ final TranscoderOutput output = new TranscoderOutput(bufStream);
+ pdfTranscoder.transcode(input, output);
+ ostream.flush();
+ ostream.close();
+ }
+ catch (final Exception ex) {
+ org.freeplane.core.util.LogUtils.warn(ex);
+ UITools.errorMessage(ex.getLocalizedMessage());
+ }
+ finally{
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+}
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportSvg.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportSvg.java
new file mode 100644
index 0000000..6fc575e
--- /dev/null
+++ b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportSvg.java
@@ -0,0 +1,69 @@
+/*
+ * 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.svg;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.export.mindmapmode.ExportController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MapView;
+
+class ExportSvg extends ExportVectorGraphic {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void export(MapModel map, File chosenFile) {
+ if (!ExportController.getContoller().checkCurrentMap(map)){
+ return;
+ }
+ try {
+ final MapView view = (MapView) Controller.getCurrentController().getViewController().getMapView();
+ if (view == null) {
+ return;
+ }
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final SVGGraphics2D g2d = fillSVGGraphics2D(view);
+ final FileOutputStream bos = new FileOutputStream(chosenFile);
+ final BufferedOutputStream bufStream = new BufferedOutputStream(bos);
+ final OutputStreamWriter osw = new OutputStreamWriter(bufStream, "UTF-8");
+ g2d.stream(osw);
+ osw.flush();
+ bos.flush();
+ bos.close();
+ }
+ catch (final Exception ex) {
+ org.freeplane.core.util.LogUtils.warn(ex);
+ UITools.errorMessage(ex.getLocalizedMessage());
+ }
+ finally{
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+}
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportVectorGraphic.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportVectorGraphic.java
new file mode 100644
index 0000000..e4045f9
--- /dev/null
+++ b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportVectorGraphic.java
@@ -0,0 +1,69 @@
+/*
+ * 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.svg;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import org.apache.batik.dom.GenericDOMImplementation;
+import org.apache.batik.svggen.SVGGeneratorContext;
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults;
+import org.apache.batik.util.SVGConstants;
+import org.freeplane.features.export.mindmapmode.AExportEngine;
+import org.freeplane.view.swing.map.MapView;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+
+/**
+ * @author foltin
+ */
+abstract class ExportVectorGraphic extends AExportEngine {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ */
+ protected SVGGraphics2D fillSVGGraphics2D(final MapView view) {
+ final DOMImplementation impl = GenericDOMImplementation.getDOMImplementation();
+ final String namespaceURI = SVGConstants.SVG_NAMESPACE_URI;
+ final Document domFactory = impl.createDocument(namespaceURI, "svg", null);
+ final SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory);
+ ctx.setEmbeddedFontsOn(true);
+ final GraphicContextDefaults defaults = new GraphicContextDefaults();
+ defaults.setFont(new Font("Arial", Font.PLAIN, 12));
+ ctx.setGraphicContextDefaults(defaults);
+ ctx.setPrecision(12);
+ final SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);
+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+ view.preparePrinting();
+ final Rectangle innerBounds = view.getInnerBounds();
+ g2d.setSVGCanvasSize(new Dimension(innerBounds.width, innerBounds.height));
+ g2d.translate(-innerBounds.x, -innerBounds.y);
+ view.print(g2d);
+ view.endPrinting();
+ return g2d;
+ }
+
+}
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java
new file mode 100644
index 0000000..eeede75
--- /dev/null
+++ b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java
@@ -0,0 +1,134 @@
+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
new file mode 100644
index 0000000..b78f50d
--- /dev/null
+++ b/freeplane_plugin_uispec4j/.classpath
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000..cc87709
--- /dev/null
+++ b/freeplane_plugin_uispec4j/.project
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..b16829a
--- /dev/null
+++ b/freeplane_plugin_uispec4j/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#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
new file mode 100644
index 0000000..69f19e4
--- /dev/null
+++ b/freeplane_plugin_uispec4j/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#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
new file mode 100644
index 0000000..820a5c9
--- /dev/null
+++ b/freeplane_plugin_uispec4j/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..3dccc76
--- /dev/null
+++ b/freeplane_plugin_uispec4j/ant/build.xml
@@ -0,0 +1,11 @@
+<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/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java
new file mode 100644
index 0000000..32a3cd8
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java
@@ -0,0 +1,16 @@
+/**
+ *
+ */
+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
new file mode 100644
index 0000000..9dc4cc6
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/ErrorCheckHandler.java
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..35bfced
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneAdapter.java
@@ -0,0 +1,90 @@
+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
new file mode 100644
index 0000000..1af01a0
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneTestCase.java
@@ -0,0 +1,108 @@
+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
new file mode 100644
index 0000000..73f7af9
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneWindow.java
@@ -0,0 +1,47 @@
+package org.freeplane.uispec4j.framework;
+import javax.swing.JFrame;
+
+import junit.framework.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
new file mode 100644
index 0000000..fc51c48
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/Node.java
@@ -0,0 +1,169 @@
+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 junit.framework.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
new file mode 100644
index 0000000..a611aef
--- /dev/null
+++ b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/osgi/Activator.java
@@ -0,0 +1,31 @@
+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/license.txt b/license.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/license.txt
@@ -0,0 +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.
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..dc48b53
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,2 @@
+The software is distributed under General Public License version 2 or later.
+For complete build run ant in directory freeplane_framework/ant.
--
freeplane packaging
More information about the pkg-java-commits
mailing list